ng-easycommerce 0.0.691 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +17 -0
  2. package/assets/ec-i18n/ct.json +3 -0
  3. package/assets/ec-i18n/en.json +3 -0
  4. package/assets/ec-i18n/es.json +3 -0
  5. package/assets/ec-i18n/fr.json +3 -0
  6. package/assets/ec-i18n/gl.json +3 -0
  7. package/assets/ec-i18n/pr.json +3 -0
  8. package/bundles/ng-easycommerce.umd.js +1219 -653
  9. package/bundles/ng-easycommerce.umd.js.map +1 -1
  10. package/bundles/ng-easycommerce.umd.min.js +1 -1
  11. package/bundles/ng-easycommerce.umd.min.js.map +1 -1
  12. package/esm2015/lib/ec-component/account-ec/order-ec/order-ec.component.js +103 -5
  13. package/esm2015/lib/ec-component/cart-ec/cart-ec.component.js +22 -8
  14. package/esm2015/lib/ec-component/checkout-ec/checkout-ec.component.js +34 -11
  15. package/esm2015/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +18 -7
  16. package/esm2015/lib/ec-component/sidebar-ec/sidebar-ec.component.js +12 -3
  17. package/esm2015/lib/interfaces/cart-item.js +1 -1
  18. package/esm2015/lib/interfaces/cart-totals.js +1 -0
  19. package/esm2015/lib/interfaces/channel.js +1 -0
  20. package/esm2015/lib/interfaces/checkout-data.js +1 -1
  21. package/esm2015/lib/interfaces/product.js +1 -1
  22. package/esm2015/lib/services/account/orders.service.js +18 -3
  23. package/esm2015/lib/services/cart.service.js +138 -23
  24. package/esm2015/lib/services/checkout/checkout.service.js +34 -4
  25. package/esm2015/lib/utils/order-util.service.js +99 -7
  26. package/esm2015/lib/utils/price-presentation.service.js +127 -0
  27. package/esm2015/public-api.js +2 -1
  28. package/esm5/lib/ec-component/account-ec/order-ec/order-ec.component.js +111 -5
  29. package/esm5/lib/ec-component/cart-ec/cart-ec.component.js +35 -8
  30. package/esm5/lib/ec-component/checkout-ec/checkout-ec.component.js +36 -13
  31. package/esm5/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +18 -7
  32. package/esm5/lib/ec-component/sidebar-ec/sidebar-ec.component.js +12 -3
  33. package/esm5/lib/interfaces/cart-item.js +1 -1
  34. package/esm5/lib/interfaces/cart-totals.js +1 -0
  35. package/esm5/lib/interfaces/channel.js +1 -0
  36. package/esm5/lib/interfaces/checkout-data.js +1 -1
  37. package/esm5/lib/interfaces/product.js +1 -1
  38. package/esm5/lib/services/account/orders.service.js +18 -3
  39. package/esm5/lib/services/cart.service.js +154 -23
  40. package/esm5/lib/services/checkout/checkout.service.js +30 -4
  41. package/esm5/lib/utils/order-util.service.js +99 -7
  42. package/esm5/lib/utils/price-presentation.service.js +130 -0
  43. package/esm5/public-api.js +2 -1
  44. package/fesm2015/ng-easycommerce.js +1181 -652
  45. package/fesm2015/ng-easycommerce.js.map +1 -1
  46. package/fesm5/ng-easycommerce.js +1219 -654
  47. package/fesm5/ng-easycommerce.js.map +1 -1
  48. package/lib/ec-component/account-ec/order-ec/order-ec.component.d.ts +15 -0
  49. package/lib/ec-component/cart-ec/cart-ec.component.d.ts +8 -1
  50. package/lib/ec-component/checkout-ec/checkout-ec.component.d.ts +1 -1
  51. package/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.d.ts +2 -2
  52. package/lib/interfaces/cart-item.d.ts +27 -2
  53. package/lib/interfaces/cart-totals.d.ts +19 -0
  54. package/lib/interfaces/channel.d.ts +15 -0
  55. package/lib/interfaces/checkout-data.d.ts +2 -1
  56. package/lib/interfaces/product.d.ts +48 -1
  57. package/lib/services/account/orders.service.d.ts +5 -0
  58. package/lib/services/cart.service.d.ts +26 -5
  59. package/lib/utils/order-util.service.d.ts +22 -0
  60. package/lib/utils/price-presentation.service.d.ts +56 -0
  61. package/ng-easycommerce.metadata.json +1 -1
  62. package/package.json +1 -1
  63. package/public-api.d.ts +3 -0
@@ -25,12 +25,13 @@ import { OrderUtilityService } from '../utils/order-util.service';
25
25
  import { ChannelConfigService } from './channel-config.service';
26
26
  import { AnalyticsService } from '../../public-api';
27
27
  import { Router } from '@angular/router';
28
+ import { CartItemPricePresentation, CartSummaryPricePresentation, PricePresentationService } from '../utils/price-presentation.service';
28
29
  import * as i0 from "@angular/core";
29
30
  import * as i1 from "../../public-api";
30
31
  import * as i2 from "../utils/order-util.service";
31
32
  import * as i3 from "@angular/router";
32
33
  let CartService = class CartService {
33
- constructor(connection, toastrService, consts, authService, orderUtils, analyticsService, channelConfigService, router) {
34
+ constructor(connection, toastrService, consts, authService, orderUtils, analyticsService, channelConfigService, router, pricePresentationService) {
34
35
  this.connection = connection;
35
36
  this.toastrService = toastrService;
36
37
  this.consts = consts;
@@ -39,6 +40,7 @@ let CartService = class CartService {
39
40
  this.analyticsService = analyticsService;
40
41
  this.channelConfigService = channelConfigService;
41
42
  this.router = router;
43
+ this.pricePresentationService = pricePresentationService;
42
44
  this.cartItemsSubject = new BehaviorSubject([]);
43
45
  this.couponSubject = new BehaviorSubject(null);
44
46
  this.cartSubject = new BehaviorSubject(null);
@@ -433,9 +435,13 @@ let CartService = class CartService {
433
435
  this.getCartToken = () => this.cart_token;
434
436
  this.getLocale = () => this.locale;
435
437
  this.getTotalAmount = () => this.cart.pipe(map((cart) => { var _a, _b; return (_b = (_a = cart) === null || _a === void 0 ? void 0 : _a.totals) === null || _b === void 0 ? void 0 : _b.total; }));
438
+ /** Total para carrito/sidebar, sin envío persistido ni recargos de checkout. */
439
+ this.getCartTotalAmount = () => this.cart.pipe(map((cart) => this.orderUtils.getCartTotalAmount(cart)));
436
440
  this.getCountCartItems = () => this.cartItems.pipe(map((cartItems) => { var _a; return (_a = cartItems) === null || _a === void 0 ? void 0 : _a.length; }));
437
441
  this.getTaxesAmount = () => this.cart.pipe(map((cart) => { var _a, _b, _c, _d; return ((_b = (_a = cart) === null || _a === void 0 ? void 0 : _a.totals) === null || _b === void 0 ? void 0 : _b.taxes) > 0 ? (_d = (_c = cart) === null || _c === void 0 ? void 0 : _c.totals) === null || _d === void 0 ? void 0 : _d.taxes : 0; }));
438
- this.getSubTotalAmount = () => this.cart.pipe(map((cart) => { var _a, _b; return (_b = (_a = cart) === null || _a === void 0 ? void 0 : _a.totals) === null || _b === void 0 ? void 0 : _b.subtotal; }));
442
+ this.getSubTotalAmount = () => this.cart.pipe(map((cart) => this.orderUtils.getSummarySubtotalAmount(cart)));
443
+ this.getCartTaxesAmount = () => this.cart.pipe(map((cart) => this.orderUtils.getCartTaxesAmount(cart)));
444
+ this.getCartClientTaxesAmount = () => this.cart.pipe(map((cart) => this.orderUtils.getCartClientTaxesAmount(cart)));
439
445
  /**
440
446
  * Devuelve el descuento que debe mostrarse en el resumen de compra.
441
447
  *
@@ -447,10 +453,13 @@ let CartService = class CartService {
447
453
  * ```
448
454
  *
449
455
  * @remarks
450
- * Si el backend nuevo informa `totals.promotionBreakdown.orderPromotions`, se usa ese valor.
451
- * Si todavía no existe, el método hace fallback a `totals.promotion` para mantener compatibilidad.
456
+ * Si el backend nuevo informa `totals.orderDiscount`, se usa ese valor.
457
+ * En su ausencia, prioriza `totals.promotionBreakdown.orderPromotions` y
458
+ * luego hace fallback a `totals.promotion` para mantener compatibilidad.
452
459
  */
453
- this.getSummaryPromotionAmount = () => this.cart.pipe(map((cart) => this.orderUtils.getSummaryPromotionAmount(cart)));
460
+ this.getSummaryPromotionAmount = () => this.cart.pipe(map((cart) => this.getCartSummaryPricePresentation(cart).orderDiscount));
461
+ /** Descuento específico del cupón, si el backend lo informa por separado. */
462
+ this.getCouponPromotionAmount = () => this.cart.pipe(map((cart) => this.getCartSummaryPricePresentation(cart).couponDiscount));
454
463
  /**
455
464
  * Indica si existe un cupón aplicado en el carrito actual.
456
465
  *
@@ -476,6 +485,92 @@ let CartService = class CartService {
476
485
  * ```
477
486
  */
478
487
  this.getItemPricing = (item) => { var _a; return ((_a = item) === null || _a === void 0 ? void 0 : _a.pricing) || this.buildCartItemPricing(item); };
488
+ /** Resuelve la presentación nueva de una línea y conserva el fallback legacy. */
489
+ this.getCartItemPricePresentation = (item, channel) => {
490
+ var _a;
491
+ return this.pricePresentationService.getCartItemPricePresentation(item, channel || this.channelConfig, ((_a = item) === null || _a === void 0 ? void 0 : _a.linePricing) ? undefined : this.getItemPricing(item));
492
+ };
493
+ /** Resuelve el resumen visible usando linePricing sin convertir importes fiscales. */
494
+ this.getCartSummaryPricePresentation = (cart = this.cartSubject.value, channel, includeShipping = false) => {
495
+ var _a, _b, _c, _d;
496
+ const responseItems = Array.isArray((_a = cart) === null || _a === void 0 ? void 0 : _a.items) && cart.items.length ? cart.items : null;
497
+ const items = (responseItems || (this.cartItemsSubject.value || []))
498
+ .map(item => this.normalizeCartItemPricing(item));
499
+ const hasLinePricing = items.length > 0 && items.every(item => { var _a; return !!((_a = item) === null || _a === void 0 ? void 0 : _a.linePricing); });
500
+ const showGross = ((_b = (channel || this.channelConfig)) === null || _b === void 0 ? void 0 : _b.showPriceWithTaxesWhileBrowsing) === true;
501
+ const pricingKey = showGross ? 'gross' : 'net';
502
+ const taxes = this.orderUtils.getCartTaxesAmount(cart);
503
+ const clientTaxes = this.orderUtils.getCartClientTaxesAmount(cart);
504
+ const legacyShipping = includeShipping ? this.orderUtils.getSummaryShipmentAmount(cart) : null;
505
+ const shippingPricing = this.getTotalsPricing(cart, 'shipping_pricing', 'shippingPricing');
506
+ const shipping = includeShipping
507
+ ? (shippingPricing ? shippingPricing[pricingKey] : legacyShipping)
508
+ : null;
509
+ const total = includeShipping
510
+ ? Number(((_d = (_c = cart) === null || _c === void 0 ? void 0 : _c.totals) === null || _d === void 0 ? void 0 : _d.total) || 0)
511
+ : this.orderUtils.getCartTotalAmount(cart);
512
+ const orderDiscountPricing = this.getTotalsPricing(cart, 'order_discount_pricing', 'orderDiscountPricing');
513
+ const couponDiscountPricing = this.getTotalsPricing(cart, 'coupon_discount_pricing', 'couponDiscountPricing');
514
+ const couponDiscount = couponDiscountPricing
515
+ ? couponDiscountPricing[pricingKey]
516
+ : this.orderUtils.getCouponPromotionAmount(cart);
517
+ const orderDiscount = orderDiscountPricing
518
+ ? orderDiscountPricing[pricingKey]
519
+ : this.orderUtils.getOrderPromotionAmount
520
+ ? this.orderUtils.getOrderPromotionAmount(cart)
521
+ : this.orderUtils.getSummaryPromotionAmount(cart);
522
+ if (hasLinePricing) {
523
+ return {
524
+ productsBeforeDiscounts: items.reduce((total, item) => total + Number(item.linePricing.unit[pricingKey] || 0) * Number(item.quantity || 0), 0),
525
+ lineDiscounts: items.reduce((total, item) => total + Number(item.linePricing.discount[pricingKey] || 0), 0),
526
+ subtotal: items.reduce((total, item) => total + Number(item.linePricing.subtotal[pricingKey] || 0), 0),
527
+ orderDiscount,
528
+ couponDiscount,
529
+ taxes,
530
+ clientTaxes,
531
+ shipping,
532
+ total,
533
+ taxesIncludedInTotal: showGross && taxes !== 0,
534
+ source: 'linePricing'
535
+ };
536
+ }
537
+ return {
538
+ productsBeforeDiscounts: 0,
539
+ lineDiscounts: 0,
540
+ subtotal: this.orderUtils.getSummarySubtotalAmount(cart),
541
+ orderDiscount,
542
+ couponDiscount,
543
+ taxes,
544
+ clientTaxes,
545
+ shipping,
546
+ total,
547
+ taxesIncludedInTotal: false,
548
+ source: 'legacy'
549
+ };
550
+ };
551
+ /** Normaliza sólo el alias serializado del contrato de línea. */
552
+ this.normalizeCartItemPricing = (item) => {
553
+ var _a, _b;
554
+ return (Object.assign(Object.assign({}, item), { linePricing: ((_a = item) === null || _a === void 0 ? void 0 : _a.linePricing) || ((_b = item) === null || _b === void 0 ? void 0 : _b.line_pricing) }));
555
+ };
556
+ /**
557
+ * Lee el contrato nuevo sin confundir un objeto válido con fallback legacy,
558
+ * incluso cuando todos sus importes son cero.
559
+ */
560
+ this.getTotalsPricing = (cart, snakeCaseKey, camelCaseKey) => {
561
+ var _a, _b;
562
+ const totals = ((_a = cart) === null || _a === void 0 ? void 0 : _a.totals) || {};
563
+ const value = (_b = totals[snakeCaseKey], (_b !== null && _b !== void 0 ? _b : totals[camelCaseKey]));
564
+ if (!value || typeof value !== 'object')
565
+ return null;
566
+ if (![value.net, value.tax, value.gross].every(amount => Number.isFinite(Number(amount))))
567
+ return null;
568
+ return {
569
+ net: Number(value.net),
570
+ tax: Number(value.tax),
571
+ gross: Number(value.gross)
572
+ };
573
+ };
479
574
  this.addCoupon = (code) => __awaiter(this, void 0, void 0, function* () {
480
575
  try {
481
576
  let result = yield this.connection.put(this.couponApi(), { coupon: code }).toPromise();
@@ -561,6 +656,7 @@ let CartService = class CartService {
561
656
  * - mantiene la forma histórica del item consumido por los templates
562
657
  */
563
658
  this.transformItems = (server_item) => server_item.map(item => {
659
+ var _a, _b;
564
660
  item = {
565
661
  product: item.product,
566
662
  variant_id: item.product.variants[0].code,
@@ -569,7 +665,15 @@ let CartService = class CartService {
569
665
  comments: item.comments || '',
570
666
  item_id: item.id,
571
667
  total: item.total,
572
- unitPromotions: Array.isArray(item.unitPromotions) ? item.unitPromotions : []
668
+ unitPrice: (_a = item.unitPrice, (_a !== null && _a !== void 0 ? _a : item.unit_price)),
669
+ discount: item.discount,
670
+ subtotal: item.subtotal,
671
+ taxTotal: (_b = item.taxTotal, (_b !== null && _b !== void 0 ? _b : item.tax_total)),
672
+ unitPromotions: Array.isArray(item.unitPromotions)
673
+ ? item.unitPromotions
674
+ : (Array.isArray(item.unit_promotions) ? item.unit_promotions : []),
675
+ linePricing: item.linePricing || item.line_pricing,
676
+ line_pricing: item.line_pricing
573
677
  };
574
678
  item.pricing = this.buildCartItemPricing(item);
575
679
  // console.log(item.product.variants[0]);
@@ -590,34 +694,44 @@ let CartService = class CartService {
590
694
  * @example
591
695
  * ```ts
592
696
  * const pricing = this.buildCartItemPricing(item);
593
- * // pricing.basePrice => saleprice si existe, si no price
594
- * // pricing.finalPrice => basePrice + unitPromotionTotal
697
+ * // pricing.basePrice => unitPrice del backend nuevo o fallback legacy
698
+ * // pricing.finalPrice => unitPrice del backend nuevo o cálculo legacy
595
699
  * // pricing.effectiveDiscountPercent => % total contra el precio de referencia
596
700
  * ```
597
701
  */
598
702
  this.buildCartItemPricing = (item) => {
599
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4;
703
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7;
600
704
  const variant = (_c = (_b = (_a = item) === null || _a === void 0 ? void 0 : _a.product) === null || _b === void 0 ? void 0 : _b.variants) === null || _c === void 0 ? void 0 : _c[0];
601
705
  const cartAndSidebarPrices = (_d = variant) === null || _d === void 0 ? void 0 : _d.cartAndSidebarPrices;
602
706
  // Si el backend nuevo informa `cartAndSidebarPrices`, ese es el precio correcto
603
707
  // para carrito/sidebar porque excluye impuestos de orden que no se listan por ítem.
604
708
  // Si no existe, se mantiene el fallback histórico.
605
- const basePrice = this.parsePriceValue((_t = (_q = (_m = (_k = (_h = (_f = (_e = cartAndSidebarPrices) === null || _e === void 0 ? void 0 : _e.saleprice, (_f !== null && _f !== void 0 ? _f : (_g = cartAndSidebarPrices) === null || _g === void 0 ? void 0 : _g.price)), (_h !== null && _h !== void 0 ? _h : (_j = variant) === null || _j === void 0 ? void 0 : _j.saleprice)), (_k !== null && _k !== void 0 ? _k : (_l = variant) === null || _l === void 0 ? void 0 : _l.price)), (_m !== null && _m !== void 0 ? _m : (_p = (_o = item) === null || _o === void 0 ? void 0 : _o.product) === null || _p === void 0 ? void 0 : _p.saleprice)), (_q !== null && _q !== void 0 ? _q : (_s = (_r = item) === null || _r === void 0 ? void 0 : _r.product) === null || _s === void 0 ? void 0 : _s.price)), (_t !== null && _t !== void 0 ? _t : 0)));
606
- const strikePriceCandidate = this.parsePriceValue((_0 = (_x = (_v = (_u = cartAndSidebarPrices) === null || _u === void 0 ? void 0 : _u.price, (_v !== null && _v !== void 0 ? _v : (_w = variant) === null || _w === void 0 ? void 0 : _w.price)), (_x !== null && _x !== void 0 ? _x : (_z = (_y = item) === null || _y === void 0 ? void 0 : _y.product) === null || _z === void 0 ? void 0 : _z.price)), (_0 !== null && _0 !== void 0 ? _0 : 0)));
709
+ const explicitUnitPrice = this.parsePriceValue((_e = item) === null || _e === void 0 ? void 0 : _e.unitPrice);
710
+ const hasExplicitUnitPrice = Number.isFinite(explicitUnitPrice);
711
+ const basePrice = hasExplicitUnitPrice
712
+ ? explicitUnitPrice
713
+ : this.parsePriceValue((_u = (_r = (_o = (_l = (_j = (_g = (_f = cartAndSidebarPrices) === null || _f === void 0 ? void 0 : _f.saleprice, (_g !== null && _g !== void 0 ? _g : (_h = cartAndSidebarPrices) === null || _h === void 0 ? void 0 : _h.price)), (_j !== null && _j !== void 0 ? _j : (_k = variant) === null || _k === void 0 ? void 0 : _k.saleprice)), (_l !== null && _l !== void 0 ? _l : (_m = variant) === null || _m === void 0 ? void 0 : _m.price)), (_o !== null && _o !== void 0 ? _o : (_q = (_p = item) === null || _p === void 0 ? void 0 : _p.product) === null || _q === void 0 ? void 0 : _q.saleprice)), (_r !== null && _r !== void 0 ? _r : (_t = (_s = item) === null || _s === void 0 ? void 0 : _s.product) === null || _t === void 0 ? void 0 : _t.price)), (_u !== null && _u !== void 0 ? _u : 0)));
714
+ const strikePriceCandidate = this.parsePriceValue((_1 = (_y = (_w = (_v = cartAndSidebarPrices) === null || _v === void 0 ? void 0 : _v.price, (_w !== null && _w !== void 0 ? _w : (_x = variant) === null || _x === void 0 ? void 0 : _x.price)), (_y !== null && _y !== void 0 ? _y : (_0 = (_z = item) === null || _z === void 0 ? void 0 : _z.product) === null || _0 === void 0 ? void 0 : _0.price)), (_1 !== null && _1 !== void 0 ? _1 : 0)));
607
715
  const normalizedBasePrice = isNaN(basePrice) ? 0 : basePrice;
608
716
  const normalizedStrikePrice = isNaN(strikePriceCandidate) ? 0 : strikePriceCandidate;
609
- const unitPromotionTotal = Array.isArray((_1 = item) === null || _1 === void 0 ? void 0 : _1.unitPromotions)
717
+ const unitPromotionTotal = Array.isArray((_2 = item) === null || _2 === void 0 ? void 0 : _2.unitPromotions)
610
718
  ? item.unitPromotions.reduce((total, promotion) => { var _a; return total + Number(((_a = promotion) === null || _a === void 0 ? void 0 : _a.amount) || 0); }, 0)
611
719
  : 0;
612
720
  const hasStrikePrice = normalizedStrikePrice > normalizedBasePrice && normalizedBasePrice > 0;
613
- const hasUnitPromotions = Array.isArray((_2 = item) === null || _2 === void 0 ? void 0 : _2.unitPromotions) && item.unitPromotions.length > 0;
614
- const finalPrice = hasUnitPromotions ? normalizedBasePrice + unitPromotionTotal : normalizedBasePrice;
615
- const productDiscount = Number(((_4 = (_3 = item) === null || _3 === void 0 ? void 0 : _3.product) === null || _4 === void 0 ? void 0 : _4.discount) || 0);
616
- const discountPercent = !isNaN(productDiscount) && productDiscount > 0
617
- ? Math.round(productDiscount)
618
- : hasStrikePrice
619
- ? Math.round(((normalizedStrikePrice - normalizedBasePrice) / normalizedStrikePrice) * 100)
620
- : 0;
721
+ const hasUnitPromotions = Array.isArray((_3 = item) === null || _3 === void 0 ? void 0 : _3.unitPromotions) && item.unitPromotions.length > 0;
722
+ const quantity = Number(((_4 = item) === null || _4 === void 0 ? void 0 : _4.quantity) || 0);
723
+ const finalPrice = hasExplicitUnitPrice
724
+ ? normalizedBasePrice
725
+ : hasUnitPromotions ? normalizedBasePrice + unitPromotionTotal : normalizedBasePrice;
726
+ const productDiscount = this.parsePriceValue((_5 = item) === null || _5 === void 0 ? void 0 : _5.discount);
727
+ const legacyProductDiscount = Number(((_7 = (_6 = item) === null || _6 === void 0 ? void 0 : _6.product) === null || _7 === void 0 ? void 0 : _7.discount) || 0);
728
+ const discountPercent = Number.isFinite(productDiscount) && productDiscount < 0 && normalizedBasePrice > 0 && quantity > 0
729
+ ? Math.round((Math.abs(productDiscount) / (normalizedBasePrice * quantity)) * 100)
730
+ : !isNaN(legacyProductDiscount) && legacyProductDiscount > 0
731
+ ? Math.round(legacyProductDiscount)
732
+ : hasStrikePrice
733
+ ? Math.round(((normalizedStrikePrice - normalizedBasePrice) / normalizedStrikePrice) * 100)
734
+ : 0;
621
735
  const effectiveReferencePrice = hasStrikePrice ? normalizedStrikePrice : normalizedBasePrice;
622
736
  const effectiveDiscountPercent = effectiveReferencePrice > 0 && finalPrice > 0 && effectiveReferencePrice > finalPrice
623
737
  ? Math.round(((effectiveReferencePrice - finalPrice) / effectiveReferencePrice) * 100)
@@ -782,13 +896,14 @@ CartService.ctorParameters = () => [
782
896
  { type: OrderUtilityService },
783
897
  { type: AnalyticsService },
784
898
  { type: ChannelConfigService },
785
- { type: Router }
899
+ { type: Router },
900
+ { type: PricePresentationService }
786
901
  ];
787
- CartService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CartService_Factory() { return new i1.CartService(i0.ɵɵinject(i1.ConnectionService), i0.ɵɵinject(i1.ToastService), i0.ɵɵinject(i1.Constants), i0.ɵɵinject(i1.AuthService), i0.ɵɵinject(i2.OrderUtilityService), i0.ɵɵinject(i1.AnalyticsService), i0.ɵɵinject(i1.ChannelConfigService), i0.ɵɵinject(i3.Router)); }, token: i1.CartService, providedIn: "root" });
902
+ CartService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CartService_Factory() { return new i1.CartService(i0.ɵɵinject(i1.ConnectionService), i0.ɵɵinject(i1.ToastService), i0.ɵɵinject(i1.Constants), i0.ɵɵinject(i1.AuthService), i0.ɵɵinject(i2.OrderUtilityService), i0.ɵɵinject(i1.AnalyticsService), i0.ɵɵinject(i1.ChannelConfigService), i0.ɵɵinject(i3.Router), i0.ɵɵinject(i1.PricePresentationService)); }, token: i1.CartService, providedIn: "root" });
788
903
  CartService = __decorate([
789
904
  Injectable({
790
905
  providedIn: 'root'
791
906
  })
792
907
  ], CartService);
793
908
  export { CartService };
794
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL2NhcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUcxQyxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUdsRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7O0FBS3pDLElBQWEsV0FBVyxHQUF4QixNQUFhLFdBQVc7SUFrRHBCLFlBQW9CLFVBQTZCLEVBQVUsYUFBMkIsRUFBVSxNQUFpQixFQUNyRyxXQUF3QixFQUFVLFVBQStCLEVBQVUsZ0JBQWtDLEVBQzdHLG9CQUEwQyxFQUMxQyxNQUFjO1FBSE4sZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUFVLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDckcsZ0JBQVcs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IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZmluYWxpemUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBQcm9kdWN0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9wcm9kdWN0JztcbmltcG9ydCB7IENhcnRJdGVtLCBDYXJ0SXRlbVByaWNpbmcgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NhcnQtaXRlbSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENvbm5lY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vYXBpL2Nvbm5lY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICcuLi9jb3JlLmNvbnN0cyc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4vYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uL3V0aWxzL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ291cG9uSSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY291cG9uJztcbmltcG9ydCB7IE9yZGVyVXRpbGl0eVNlcnZpY2UgfSBmcm9tICcuLi91dGlscy9vcmRlci11dGlsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hlY2tvdXREYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jaGVja291dC1kYXRhJztcbmltcG9ydCB7IENhcnRBZmZvcmRhYmxlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jYXJ0L2NhcnQtYWZmb3JkYWJsZSc7XG5pbXBvcnQgeyBDaGFubmVsQ29uZmlnU2VydmljZSB9IGZyb20gJy4vY2hhbm5lbC1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBBbmFseXRpY3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vcHVibGljLWFwaSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIENhcnRTZXJ2aWNlIHtcbiAgICBwcml2YXRlIGNhcnRJdGVtc1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxDYXJ0SXRlbVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoW10pO1xuICAgIHByaXZhdGUgY291cG9uU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGFueT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuICAgIHByaXZhdGUgY2FydFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxhbnk+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcbiAgICBwcml2YXRlIHJlcXVlc3RJblByb2Nlc3MgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgICBwcml2YXRlIHByb21vdGlvbnNTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Q2hlY2tvdXREYXRhW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7XG5cbiAgICBwcml2YXRlIGJhbGFuY2VDdXN0b21lclN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDx7XG4gICAgICAgIGFsbG93QW55UGF5bWVudE1ldGhvZD86IGJvb2xlYW47XG4gICAgICAgIGFsbG93RXhjZWVkQmFsYW5jZT86IGJvb2xlYW47XG4gICAgICAgIGNyZWRpdEFtb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgICAgIHNob3dNYXg/OiBib29sZWFuO1xuICAgICAgICBzaG93UHJpY2U/OiBib29sZWFuO1xuICAgICAgICByZW1haW5pbmdDcmVkaXRzPzogbnVtYmVyO1xuICAgICAgICBhcHBseU1heE9yZGVycz86IGJvb2xlYW47XG4gICAgICAgIG1heE9yZGVycz86IG51bWJlcjtcbiAgICB9IHwgbnVsbD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuXG4gICAgcHJpdmF0ZSBpdGVtcyA9IFtdO1xuXG4gICAgcHJpdmF0ZSBjb3VudDogbnVtYmVyID0gMDtcbiAgICBwcml2YXRlIGxvY2FsZSA9IFwiXCI7XG4gICAgcHJpdmF0ZSBsb2dnZWRfaW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIGhhdmVfdG9fdXBkYXRlID0gdHJ1ZTtcbiAgICBwdWJsaWMgY2hhbm5lbENvbmZpZzogYW55ID0ge307XG4gICAgcHJpdmF0ZSBjYXJ0X2Jhc2VVcmwgPSAnc2hvcC1hcGkvJyArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICcvY2FydHMnO1xuXG4gICAgcHVibGljIGNhcnRJdGVtc0FwaSA9ICgpID0+IHRoaXMuY2FydF9iYXNlVXJsICsgJz9sb2NhbGU9JyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpO1xuICAgIHB1YmxpYyBhZGRJdGVtQXBpID0gKCkgPT4gdGhpcy5jYXJ0X2Jhc2VVcmwgKyAnLycgKyB0aGlzLmNhcnRfdG9rZW4gKyAnL2l0ZW1zJyArICc/bG9jYWxlPScgKyB0aGlzLmNvbnN0cy5nZXRMb2NhbGUoKTtcbiAgICBwdWJsaWMgYWRkQWxsSXRlbXNBcGkgPSAoKSA9PiB0aGlzLmNhcnRfYmFzZVVybCArICcvJyArIHRoaXMuY2FydF90b2tlbiArICcvbXVsdGlwbGUtaXRlbXMnICsgJz9sb2NhbGU9JyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpO1xuICAgIHB1YmxpYyB1cGRhdGVJdGVtUXVhbnRpdHlBcGkgPSAoaXRlbV9pZCkgPT4gdGhpcy5jYXJ0X2Jhc2VVcmwgKyAnLycgKyB0aGlzLmNhcnRfdG9rZW4gKyAnL2l0ZW1zLycgKyBpdGVtX2lkICsgJz9sb2NhbGU9JyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpO1xuICAgIHB1YmxpYyBkZWxldGVJdGVtQXBpID0gKGl0ZW1faWQpID0+IHRoaXMuY2FydF9iYXNlVXJsICsgJy8nICsgdGhpcy5jYXJ0X3Rva2VuICsgJy9pdGVtcy8nICsgaXRlbV9pZCArICc/bG9jYWxlPScgKyB0aGlzLmNvbnN0cy5nZXRMb2NhbGUoKTtcbiAgICBwdWJsaWMgY291cG9uQXBpID0gKCkgPT4gdGhpcy5jYXJ0X2Jhc2VVcmwgKyAnLycgKyB0aGlzLmNhcnRfdG9rZW4gKyAnL2NvdXBvbic7XG4gICAgcHVibGljIGFkZHJlc3NCb29rQXBpID0gKCkgPT4gJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0cy5nZXRDaGFubmVsKCkgKyAnL2FkZHJlc3MtYm9vayc7XG4gICAgcHVibGljIHRheGVzQXBpID0gKCkgPT4gJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0cy5nZXRDaGFubmVsKCkgKyAnL2NhcnRzL3RheCc7XG5cbiAgICBwdWJsaWMgY2FydF90b2tlbjtcbiAgICBwdWJsaWMgY2FydEl0ZW1zID0gdGhpcy5jYXJ0SXRlbXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUobWFwKGl0ZW1zID0+IHRoaXMuc3dpdGNoUHJpY2VJbkNhcnRJdGVtKGl0ZW1zKSkpXG4gICAgcHVibGljIGNvdXBvbiA9IHRoaXMuY291cG9uU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgbG9hZGluZyA9IHRoaXMucmVxdWVzdEluUHJvY2Vzcy5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgY2FydCA9IHRoaXMuY2FydFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIHByb21vdGlvbnMgPSB0aGlzLnByb21vdGlvbnNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBkZWxldGluZzogQm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBiYWxhbmNlQ3VzdG9tZXIkID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBhbGxvd0FueVBheW1lbnRNZXRob2QkID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXIkLnBpcGUobWFwKGRhdGEgPT4gZGF0YT8uYWxsb3dBbnlQYXltZW50TWV0aG9kID8/IG51bGwpKTtcbiAgICBwdWJsaWMgYWxsb3dFeGNlZWRCYWxhbmNlJCA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyJC5waXBlKG1hcChkYXRhID0+IGRhdGE/LmFsbG93RXhjZWVkQmFsYW5jZSA/PyBudWxsKSk7XG4gICAgcHVibGljIGNyZWRpdEFtb3VudCQgPSB0aGlzLmJhbGFuY2VDdXN0b21lciQucGlwZShtYXAoZGF0YSA9PiBkYXRhPy5jcmVkaXRBbW91bnQgPz8gbnVsbCkpO1xuICAgIHB1YmxpYyBzaG93TWF4JCA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyJC5waXBlKG1hcChkYXRhID0+IGRhdGE/LnNob3dNYXggPz8gbnVsbCkpO1xuICAgIHB1YmxpYyBzaG93UHJpY2UkID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXIkLnBpcGUobWFwKGRhdGEgPT4gZGF0YT8uc2hvd1ByaWNlID8/IG51bGwpKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29ubmVjdGlvbjogQ29ubmVjdGlvblNlcnZpY2UsIHByaXZhdGUgdG9hc3RyU2VydmljZTogVG9hc3RTZXJ2aWNlLCBwcml2YXRlIGNvbnN0czogQ29uc3RhbnRzLFxuICAgICAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSwgcHJpdmF0ZSBvcmRlclV0aWxzOiBPcmRlclV0aWxpdHlTZXJ2aWNlLCBwcml2YXRlIGFuYWx5dGljc1NlcnZpY2U6IEFuYWx5dGljc1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY2hhbm5lbENvbmZpZ1NlcnZpY2U6IENoYW5uZWxDb25maWdTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyKSB7XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYXJ0JykpIHx8IFtdO1xuICAgICAgICB0aGlzLmNhcnRfdG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydF90b2tlbicpIHx8IG51bGw7XG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2UubG9nZ2VkSW4uc3Vic2NyaWJlKHJlcyA9PiB0aGlzLmdldENhcnQoKSk7XG4gICAgICAgIHRoaXMuY2hhbm5lbENvbmZpZ1NlcnZpY2UuY2hhbm5lbENvbmZpZyQuc3Vic2NyaWJlKHJlcyA9PiB0aGlzLmNoYW5uZWxDb25maWcgPSByZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDYXJ0MigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FydEl0ZW1zU3ViamVjdC52YWx1ZTtcbiAgICB9XG5cbiAgICBnZXRBZGRyZXNzQm9vayA9IGFzeW5jICgpID0+XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5nZXQodGhpcy5hZGRyZXNzQm9va0FwaSgpKS5waXBlKG1hcChyZXMgPT4gcmVzPy5sZW5ndGggJiYgcmVzLm1hcChhZGRyZXMgPT4geyByZXR1cm4gYWRkcmVzICYmIHsgLi4uYWRkcmVzLCBzZWxlY3RlZDogYWRkcmVzLmRlZmF1bHQgfSB9KSB8fCBudWxsKSkudG9Qcm9taXNlKCk7XG5cbiAgICBwdWJsaWMgZ2V0VGF4ZXMgPSBhc3luYyAoKSA9PlxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLnRheGVzQXBpKCksIHsgdG9rZW46IHRoaXMuY2FydF90b2tlbiB9KS5zdWJzY3JpYmUocmVzID0+IHJlcylcblxuICAgIHByaXZhdGUgZ2V0Q2FydCA9IGFzeW5jICgpID0+XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMuY2FydEl0ZW1zQXBpKCksICgodGhpcy5jYXJ0X3Rva2VuICYmIHRoaXMuaXRlbXMubGVuZ3RoID49IDEpICYmIHsgdG9rZW46IHRoaXMuY2FydF90b2tlbiB9KSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcmVzID0+IHRoaXMuaW5pdGlhbGl6ZUNhcnQocmVzKVxuICAgICAgICApXG5cbiAgICBwcml2YXRlIGdldENhcnRCeVRva2VuID0gYXN5bmMgKCkgPT5cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5jYXJ0SXRlbXNBcGkoKSwgKCh0aGlzLmNhcnRfdG9rZW4pICYmIHsgdG9rZW46IHRoaXMuY2FydF90b2tlbiB9KSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcmVzID0+IHRoaXMuaW5pdGlhbGl6ZUNhcnQocmVzKVxuICAgICAgICApXG5cbiAgICBwcml2YXRlIGdldENhcnRCeUN1c3RvbWVyID0gYXN5bmMgKCkgPT5cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5jYXJ0SXRlbXNBcGkoKSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcmVzID0+IHRoaXMuaW5pdGlhbGl6ZUNhcnQocmVzKVxuICAgICAgICApXG5cbiAgICAvKipcbiAgICAgKiAgQHByaXZhdGVcbiAgICAgKiAgQ0FSVCBDUlVEIFNFUlZFUidTIFNZTkNST05JWkVEXG4gICAgICovXG5cbiAgICBwcml2YXRlIGluaXRpYWxpemVDYXJ0ID0gKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMuY2FydF90b2tlbiA9IHJlc3BvbnNlLnRva2VuVmFsdWU7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYXJ0X3Rva2VuJywgdGhpcy5jYXJ0X3Rva2VuKTtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSByZXNwb25zZS5sb2NhbGU7XG4gICAgICAgIC8qIGxldCBsb2NhbGVGcm9tU3RvcmFnZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdMT0NBTEUnKVxuICAgICAgICBjb25zb2xlLmxvZyhsb2NhbGVGcm9tU3RvcmFnZSlcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGVGcm9tU3RvcmFnZSA/IGxvY2FsZUZyb21TdG9yYWdlIDogcmVzcG9uc2UubG9jYWxlO1xuICAgICAgICByZXNwb25zZS5sb2NhbGUgPSB0aGlzLmxvY2FsZSAqL1xuICAgICAgICB0aGlzLnVwZGF0ZUNhcnRPYmoocmVzcG9uc2UsIGZhbHNlKTtcbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0SXRlbXModGhpcy50cmFuc2Zvcm1JdGVtcyhyZXNwb25zZS5pdGVtcykpO1xuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlYXNpZ25hIGBwcm9kdWN0LnByaWNlYCBhbCBwcmVjaW8gYmFzZSBsZWdhY3kgcXVlIGVzcGVyYSBlbCB0ZW1wbGF0ZSBoaXN0w7NyaWNvIGRlbCBjYXJyaXRvLlxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW1zIMONdGVtcyBub3JtYWxpemFkb3MgZGVsIGNhcnJpdG8uXG4gICAgICogQHJldHVybnMgTG9zIG1pc21vcyDDrXRlbXMgY29uIGBwcm9kdWN0LnByaWNlYCBhbGluZWFkbyBhbCBwcmVjaW8gYmFzZSBtb3N0cmFkbyBlbiBsYSB0YWJsYS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRXN0ZSBtw6l0b2RvIG5vIG1vZGlmaWNhIGBwcmljaW5nLmZpbmFsUHJpY2VgLiBTb2xvIHByZXNlcnZhIGNvbXBhdGliaWxpZGFkIGNvbiB0ZW1wbGF0ZXNcbiAgICAgKiB2aWVqb3MgcXVlIHRvZGF2w61hIGxlZW4gYGl0ZW0ucHJvZHVjdC5wcmljZWAgZGlyZWN0YW1lbnRlLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3dpdGNoUHJpY2VJbkNhcnRJdGVtID0gKGl0ZW1zOiBDYXJ0SXRlbVtdKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtcy5tYXAoXG4gICAgICAgICAgICBpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5wcm9kdWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByaWNpbmcgPSB0aGlzLmdldEl0ZW1QcmljaW5nKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YXJpYW50ID0gaXRlbS5wcm9kdWN0LnZhcmlhbnRzPy5bMF07XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ucHJvZHVjdC5wcmljZSA9IHByaWNpbmc/LmJhc2VQcmljZSB8fCB2YXJpYW50Py5zYWxlcHJpY2UgfHwgdmFyaWFudD8ucHJpY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtXG4gICAgICAgICAgICB9XG4gICAgICAgIClcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0ZXBDYXJ0ID0gKHJlcykgPT4ge1xuICAgICAgICByZXMuaXRlbXMubGVuZ3RoID4gMCAmJiByZXMuaXRlbXMuZm9yRWFjaChcbiAgICAgICAgICAgIGl0ZW0gPT4gIXRoaXMuaXNJdGVtSW5Mb2NhbChpdGVtLmlkKSAmJiB0aGlzLmRlbGV0ZUNhcnRJdGVtKGl0ZW0sIGZhbHNlKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmFkZEFsbFRvQ2FydChcbiAgICAgICAgICAgIHRoaXMuaXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgICAgIGl0ZW0gPT4gIXJlcy5pdGVtcy5zb21lKGV4dGVybmFsX2l0ZW0gPT4gZXh0ZXJuYWxfaXRlbS5pZCA9PSBpdGVtLml0ZW1faWQpXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIHVwZGF0ZUNhcnRJdGVtcyA9IChpdGVtcykgPT4ge1xuICAgICAgICB0aGlzLml0ZW1zID0gaXRlbXM7XG4gICAgICAgIHRoaXMuY291bnQgPSBpdGVtcy5sZW5ndGg7XG4gICAgICAgIHRoaXMuY2FydEl0ZW1zU3ViamVjdC5uZXh0KHRoaXMuaXRlbXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZUxvY2FsQ2FydCgpO1xuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2luY3Jvbml6YSBgY2FydEl0ZW1zU3ViamVjdGAgY29uIGxhIMO6bHRpbWEgcmVzcHVlc3RhIGRlbCBiYWNrZW5kLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhcnQgUmVzcHVlc3RhIGRlIGNhcnJpdG8gcmVjaWJpZGEgZGVzZGUgY3VhbHF1aWVyIGVuZHBvaW50IHF1ZSBkZXZ1ZWx2YSBgaXRlbXNgLlxuICAgICAqIEByZXR1cm5zIGB2b2lkYFxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTZSByZXV0aWxpemEgZGVzcHXDqXMgZGUgYWN0dWFsaXphciBjYW50aWRhZGVzLCBhcGxpY2FyIGN1cMOzbiBvIHJlbW92ZXIgcHJvZHVjdG9zIHBhcmEgZXZpdGFyXG4gICAgICogcXVlIGxhIHRhYmxhIHF1ZWRlIGNvbiBzdWJ0b3RhbGVzIG8gcHJvbW9jaW9uZXMgZGVzYWN0dWFsaXphZGFzLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3luY0NhcnRJdGVtc0Zyb21SZXNwb25zZSA9IChjYXJ0KSA9PiB7XG4gICAgICAgIGlmICghY2FydD8uaXRlbXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzSXRlbXMgPSB0aGlzLml0ZW1zIHx8IFtdO1xuICAgICAgICBjb25zdCBuZXh0SXRlbXMgPSB0aGlzLnRyYW5zZm9ybUl0ZW1zKGNhcnQuaXRlbXMpLm1hcCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c0l0ZW06IGFueSA9IHByZXZpb3VzSXRlbXMuZmluZChwcmV2ID0+IHByZXYuaXRlbV9pZCA9PSBpdGVtLml0ZW1faWQpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5wcmV2aW91c0l0ZW0sXG4gICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICBmYWlsZWQ6IHByZXZpb3VzSXRlbT8uZmFpbGVkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBwcmV2aW91c0l0ZW0/LmVycm9yXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUNhcnRJdGVtcyhuZXh0SXRlbXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ2FydEl0ZW1RdWFudGl0eSA9ICh2YXJpYW50X2lkLCBxdWFudGl0eSwgY29tbWVudHM/OiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRDb21tZW50cyA9IGNvbW1lbnRzICE9PSB1bmRlZmluZWQgPyAoY29tbWVudHMgPz8gJycpLnRyaW0oKSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBjb25zdCBuZXdJdGVtcyA9IHRoaXMuaXRlbXMubWFwKGl0ID0+IHtcbiAgICAgICAgICAgIGlmIChpdC52YXJpYW50X2lkICE9PSB2YXJpYW50X2lkKSByZXR1cm4gaXQ7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkOiBhbnkgPSB7IC4uLml0LCBxdWFudGl0eTogTnVtYmVyKHF1YW50aXR5KSB9O1xuICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRDb21tZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlZC5jb21tZW50cyA9IG5vcm1hbGl6ZWRDb21tZW50cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLml0ZW1zID0gbmV3SXRlbXM7XG4gICAgICAgIHRoaXMuY2FydEl0ZW1zU3ViamVjdC5uZXh0KHRoaXMuaXRlbXMpO1xuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgICAgIHRoaXMudXBkYXRlTG9jYWxDYXJ0KCk7XG4gICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdwcm9kdWN0LXVwZGF0ZWQnLCB7IHF1YW50aXR5IH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBwZW5kVG9DYXJ0ID0gKGNhcnQpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0T2JqKGNhcnQpO1xuICAgICAgICB0aGlzLnN5bmNDYXJ0SXRlbXNGcm9tUmVzcG9uc2UoY2FydCk7XG4gICAgICAgIC8vICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdwcm9kdWN0LWFkZGVkJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVDYXJ0SXRlbSA9IChjYXJ0LCBwcm9kdWN0LCB0b2FzdCA9IHRydWUpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0T2JqKGNhcnQsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5zeW5jQ2FydEl0ZW1zRnJvbVJlc3BvbnNlKGNhcnQpO1xuICAgICAgICB0b2FzdCAmJiB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgICAgIHRvYXN0ICYmIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdwcm9kdWN0LXJlbW92ZWQnKTtcbiAgICAgICAgLy8gdGhpcy5nb29nbGVBbmFseXRpY3MucmVtb3ZlRnJvbUNhcnQocHJvZHVjdCk7XG4gICAgICAgIHRoaXMuYW5hbHl0aWNzU2VydmljZS5jYWxsRXZlbnQoJ3JlbW92ZV9mcm9tX2NhcnQnLCB7IC4uLnByb2R1Y3QsIGN1cnJlbmN5OiB0aGlzLmNvbnN0cy5jdXJyZW5jeS5jb2RlIH0pXG5cbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZElmQWxscmVhZHlFeGlzdHMgPSAocHJvZHVjdCwgdmFyaWFudF9pZCwgcXVhbnRpdHlBZGQgPSAxLCBjb21tZW50cz86IHN0cmluZyB8IG51bGwpID0+XG4gICAgICAgIHRoaXMuaXRlbXMuZmluZCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtLnByb2R1Y3QuaWQgPT0gcHJvZHVjdC5pZCAmJiBpdGVtLnZhcmlhbnRfaWQgPT0gdmFyaWFudF9pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSXRlbVF1YW50aXR5KGl0ZW0sIHRoaXMuZmluZEl0ZW0ocHJvZHVjdC5pZCkucXVhbnRpdHkgKyBxdWFudGl0eUFkZCwgY29tbWVudHMpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgIHByaXZhdGUgdXBkYXRlTG9jYWxDYXJ0ID0gKCkgPT4ge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FydCcsIEpTT04uc3RyaW5naWZ5KHRoaXMuaXRlbXMpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2V0Q2FydCA9IChuZXh0PykgPT4ge1xuICAgICAgICB0aGlzLml0ZW1zID0gW107XG4gICAgICAgIHRoaXMuY2FydFN1YmplY3QubmV4dChudWxsKTtcbiAgICAgICAgdGhpcy51cGRhdGVCYWxhbmNlQXR0cmlidXRlcyhudWxsKTtcbiAgICAgICAgdGhpcy5jYXJ0X3Rva2VuID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYXJ0SXRlbXNTdWJqZWN0Lm5leHQoW10pO1xuICAgICAgICB0aGlzLmNvdW50ID0gMDtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NhcnQnLCBcIltdXCIpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnY2FydF90b2tlbicpO1xuICAgICAgICBuZXh0ICYmIG5leHQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUNhcnRPYmogPSAoY2FydCwgZW1pdEV2ZW50ID0gdHJ1ZSk6IGJvb2xlYW4gPT4ge1xuICAgICAgICB0aGlzLmNhcnRTdWJqZWN0Lm5leHQoY2FydCk7XG4gICAgICAgIHRoaXMudXBkYXRlQmFsYW5jZUF0dHJpYnV0ZXMoY2FydD8uYmFsYW5jZUN1c3RvbWVyLCBjYXJ0Py50b3RhbHM/LnRvdGFsKTtcbiAgICAgICAgZW1pdEV2ZW50ICYmIHRoaXMuYW5hbHl0aWNzU2VydmljZS5jYWxsRXZlbnQoJ2FkZF90b19jYXJ0JywgY2FydCk7XG4gICAgICAgIHRoaXMucHJvbW90aW9uc1N1YmplY3QubmV4dCh0aGlzLm9yZGVyVXRpbHMuZ2V0UHJvbW90aW9ucyhjYXJ0LCB0cnVlKSk7XG5cbiAgICAgICAgY2FydC5jb3Vwb25Db2RlXG4gICAgICAgICAgICA/IHRoaXMuZm9ybWF0Q291cG9uKGNhcnQpXG4gICAgICAgICAgICA6IHRoaXMuY291cG9uU3ViamVjdC5uZXh0KG51bGwpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzSXRlbUluTG9jYWwgPSAoaXRlbV9pZCkgPT4gdGhpcy5pdGVtcy5zb21lKGl0ZW0gPT4gaXRlbS5pdGVtX2lkID09IGl0ZW1faWQpO1xuXG4gICAgLyoqXG4gICAgICogIEBwdWJsaWNcbiAgICAgKiAgQ0FSVCBDUlVEXG4gICAgICovXG5cbiAgICBhZGRUb0NhcnQgPSAocHJvZHVjdDogUHJvZHVjdCwgcXVhbnRpdHk6IG51bWJlciwgdmFyaWFudF9pZCwgY29tbWVudHM/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucmVxdWVzdEluUHJvY2Vzcy5nZXRWYWx1ZSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmFsYW5jZSA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyU3ViamVjdC52YWx1ZTtcbiAgICAgICAgY29uc3QgYXBwbHlNYXhPcmRlcnMgPSBiYWxhbmNlPy5hcHBseU1heE9yZGVycyA/PyBmYWxzZTtcbiAgICAgICAgY29uc3QgbWF4T3JkZXJzID0gYmFsYW5jZT8ubWF4T3JkZXJzID8/IEluZmluaXR5O1xuXG4gICAgICAgIGlmIChhcHBseU1heE9yZGVycyAmJiAobWF4T3JkZXJzIDw9IDAgfHwgbWF4T3JkZXJzID09PSBudWxsKSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ21heC1vcmRlcnMtcmVhY2hlZCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmF1dGhTZXJ2aWNlLmlzQWJsZVRvQnV5KCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtdXN0LXNlbGVjdC1jdXN0b21lcicpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KHRydWUpO1xuICAgICAgICBsZXQgYWRkZWQgPSB0aGlzLmFkZElmQWxscmVhZHlFeGlzdHMocHJvZHVjdCwgdmFyaWFudF9pZCwgcXVhbnRpdHksIGNvbW1lbnRzKTtcbiAgICAgICAgaWYgKCFhZGRlZCkge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZDogYW55ID0ge1xuICAgICAgICAgICAgICAgIHByb2R1Y3RDb2RlOiBwcm9kdWN0LmlkLFxuICAgICAgICAgICAgICAgIHF1YW50aXR5OiBxdWFudGl0eSxcbiAgICAgICAgICAgICAgICB2YXJpYW50Q29kZTogdmFyaWFudF9pZCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChjb21tZW50cykge1xuICAgICAgICAgICAgICAgIHBheWxvYWQuY29tbWVudHMgPSBjb21tZW50cztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5hZGRJdGVtQXBpKCksIHBheWxvYWQpXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hbmVqYXIgbGEgcmVzcHVlc3RhIEhUVFAgZXhpdG9zYSAoY8OzZGlnbyAyMDApXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZFRvQ2FydChyZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ3Byb2R1Y3QtYWRkZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hbmVqYXIgZWwgZXJyb3IgZGUgbGEgbGxhbWFkYSBIVFRQIChjw7NkaWdvIDUwMCB1IG90cm8gZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyLnN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ8OzZGlnbyBkZSBlcnJvciA1MDAgKHRpbWVvdXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdIYSBvY3VycmlkbyB1biBlcnJvciBhbCBhZ3JlZ2FyIGFsIGNhcnJpdG8uIFZ1ZWx2YSBhIGludGVudGFybG8uJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90cm8gY8OzZGlnbyBkZSBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnRXJyb3IgaW5lc3BlcmFkby4gVnVlbHZhIGEgaW50ZW50YXJsbycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG5cbiAgICB9XG5cbiAgICBhZGRUb0xvdCA9IChwcm9kdWN0OiBQcm9kdWN0LCBxdWFudGl0eTogbnVtYmVyLCB2YXJpYW50X2lkLCBpZD8sIG9yZGVyX2l0ZW1faWQ/LCBsb3RfcXVhbnRpdHk/LCB1bml0X3ByaWNlPywgdW5pdF90b3RhbD8sIGFqdXN0ZW1lbnRfdG90YWw/LCB0b3RhbF9sb3Q/LCBsb3Rfc3RhdHVzPywgZGF0ZV9yZXF1ZXN0Pywgbm90ZXM/LCBzaGlwcGluZ19hZGRyZXNzX2lkPywgc2hpcHBpbmdfYWRkcmVzc19uYW1lPywgYWN0aW9uPykgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuYXV0aFNlcnZpY2UuaXNBYmxlVG9CdXkoKSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ211c3Qtc2VsZWN0LWN1c3RvbWVyJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFkZGVkID0gJyc7XG4gICAgICAgICFhZGRlZCAmJiB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmFkZEl0ZW1BcGkoKSwgeyBwcm9kdWN0Q29kZTogcHJvZHVjdC5pZCwgcXVhbnRpdHk6IHF1YW50aXR5LCB2YXJpYW50Q29kZTogdmFyaWFudF9pZCwgaWQ6IGlkIHx8ICcnLCBvcmRlcl9pdGVtX2lkOiBvcmRlcl9pdGVtX2lkIHx8ICcnLCBsb3RfcXVhbnRpdHk6IGxvdF9xdWFudGl0eSB8fCAnJywgdW5pdF9wcmljZTogdW5pdF9wcmljZSB8fCAnJywgdW5pdF90b3RhbDogdW5pdF90b3RhbCB8fCAnJywgYWp1c3RlbWVudF90b3RhbDogYWp1c3RlbWVudF90b3RhbCB8fCAnJywgdG90YWxfbG90OiB0b3RhbF9sb3QgfHwgJycsIGxvdF9zdGF0dXM6IGxvdF9zdGF0dXMgfHwgJycsIGRhdGVfcmVxdWVzdDogZGF0ZV9yZXF1ZXN0IHx8ICcnLCBub3Rlczogbm90ZXMgfHwgJycsIHNoaXBwaW5nX2FkZHJlc3NfaWQ6IHNoaXBwaW5nX2FkZHJlc3NfaWQgfHwgJycsIHNoaXBwaW5nX2FkZHJlc3NfbmFtZTogc2hpcHBpbmdfYWRkcmVzc19uYW1lIHx8ICcnLCBhY3Rpb246IGFjdGlvbiB8fCAnbmV3bG90JyB9KVxuICAgICAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICByZXMgPT4gdGhpcy5hcHBlbmRUb0NhcnQocmVzKSxcbiAgICAgICAgICAgICAgICBlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIGFkZFRvQ2FydFByb21pc2UgPSBhc3luYyAocHJvZHVjdDogUHJvZHVjdCwgcXVhbnRpdHk6IG51bWJlciwgdmFyaWFudF9pZCwgY29tbWVudHM/OiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hdXRoU2VydmljZS5pc0FibGVUb0J1eSgpKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbXVzdC1zZWxlY3QtY3VzdG9tZXInKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcbiAgICAgICAgbGV0IGFkZGVkID0gdGhpcy5hZGRJZkFsbHJlYWR5RXhpc3RzKHByb2R1Y3QsIHZhcmlhbnRfaWQsIHF1YW50aXR5LCBjb21tZW50cyk7XG4gICAgICAgIGlmICghYWRkZWQpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCAodGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5hZGRJdGVtQXBpKCksIHsgcHJvZHVjdENvZGU6IHByb2R1Y3QuaWQsIHF1YW50aXR5OiBxdWFudGl0eSwgdmFyaWFudENvZGU6IHZhcmlhbnRfaWQgfSkudG9Qcm9taXNlKCkpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQgfHwgcmVzdWx0LmVycm9yKSB0aGlzLmhhbmRsZUVycm9yKHJlc3VsdC5lcnJvcik7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZFRvQ2FydChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBmYWxzZSB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHRydWUgfVxuICAgIH1cblxuXG4gICAgYWRkQWxsVG9DYXJ0ID0gKGl0ZW1zOiBhbnlbXSkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuYXV0aFNlcnZpY2UuaXNBYmxlVG9CdXkoKSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ211c3Qtc2VsZWN0LWN1c3RvbWVyJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQodHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0geyBpdGVtczogdGhpcy5tZXJnZUl0ZW1zQWRkQWxsVG9DYXJ0KGl0ZW1zKSB9O1xuXG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMuYWRkQWxsSXRlbXNBcGkoKSwgcGFyYW1zKVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpLnRoZW4oXG4gICAgICAgICAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYXJ0T2JqKHJlcy5jYXJ0KSAmJiB0aGlzLnVwZGF0ZUNhcnRJdGVtcyh0aGlzLnRyYW5zZm9ybUl0ZW1zKHJlcy5jYXJ0Lml0ZW1zKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5jYXJ0X3Jlc3BvbnNlLnN0YXR1cyA9PSAnc3VjY2VzcycgJiYgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ3Byb2R1Y3RzLWFkZGVkJyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFkZFJlcGVhdE9yZGVyVG9DYXJ0KGl0ZW1zOiBhbnlbXSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jYXJ0SXRlbXNTdWJqZWN0LnZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdjYXJ0LW5vdC1lbXB0eScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmF1dGhTZXJ2aWNlLmlzQWJsZVRvQnV5KCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtdXN0LXNlbGVjdC1jdXN0b21lcicpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGl0ZW1zVG9BZGQgPSBpdGVtcy5tYXAoaXRlbSA9PiAoe1xuICAgICAgICAgICAgcHJvZHVjdENvZGU6IGl0ZW0ucHJvZHVjdC5pZCxcbiAgICAgICAgICAgIHF1YW50aXR5OiBpdGVtLnF1YW50aXR5LFxuICAgICAgICAgICAgdmFyaWFudENvZGU6IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5jb2RlXG4gICAgICAgIH0pKTtcblxuICAgICAgICBpZiAoaXRlbXNUb0FkZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCduby1wcm9kdWN0cy10by1hZGQnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIGl0ZW1zOiBpdGVtc1RvQWRkXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQodHJ1ZSk7XG5cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5hZGRBbGxJdGVtc0FwaSgpLCBwYXJhbXMpXG4gICAgICAgICAgICAudG9Qcm9taXNlKClcbiAgICAgICAgICAgIC50aGVuKHJlcyA9PiB7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzPy5zdGF0dXMgPT09ICdmYWlsdXJlJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSByZXMuZXJyb3I/LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnXycpIHx8ICd1bmtub3duX2Vycm9yJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zUmVzcG9uc2UgPSByZXM/Lml0ZW1zX3Jlc3BvbnNlIHx8IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhcnRJdGVtcyA9IHJlcz8uY2FydD8uaXRlbXMgfHwgW107XG5cbiAgICAgICAgICAgICAgICBjb25zdCBvdXRPZlN0b2NrSXRlbXMgPSBpdGVtc1Jlc3BvbnNlLmZpbHRlcihpdGVtID0+XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uc3RhdHVzID09PSAnZmFpbHVyZScgJiZcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5lcnJvcnMuc29tZShlcnJvciA9PiBlcnJvci5jb2RlID09PSAnb3V0X29mX3N0b2NrJylcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNhcnRJdGVtcy5sZW5ndGggPT09IDAgJiYgb3V0T2ZTdG9ja0l0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ2FsbC1wcm9kdWN0cy1vdXQtb2Ytc3RvY2snKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChvdXRPZlN0b2NrSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnc29tZS1wcm9kdWN0cy1vdXQtb2Ytc3RvY2snKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY2FydEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYXJ0T2JqKHJlcy5jYXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYXJ0SXRlbXModGhpcy50cmFuc2Zvcm1JdGVtcyhjYXJ0SXRlbXMpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ3Byb2R1Y3RzLWFkZGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2NhcnQnXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIG1lcmdlSXRlbXNBZGRBbGxUb0NhcnQgPSAoaXRlbXM6IGFueVtdKSA9PiB7XG4gICAgICAgIGxldCBwYXJhbXNNZXJnZSA9IFtdXG4gICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGxldCBpdGVtSW50ZXJubyA9IGl0ZW1zLmZpbmQoaXRlbVBhcmFtID0+IGl0ZW1QYXJhbS52YXJpYW50Q29kZSA9PSBpdGVtLnZhcmlhbnRfaWQpXG4gICAgICAgICAgICBwYXJhbXNNZXJnZS5wdXNoKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdENvZGU6IGl0ZW0ucHJvZHVjdC5pZCxcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFudENvZGU6IGl0ZW0udmFyaWFudF9pZCxcbiAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6IGl0ZW1JbnRlcm5vICYmIGl0ZW1JbnRlcm5vLnF1YW50aXR5IHx8IGl0ZW0ucXVhbnRpdHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgIH0pXG5cbiAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoaXRlbVBhcmFtID0+ICF0aGlzLml0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtUGFyYW0udmFyaWFudENvZGUgPT0gaXRlbS52YXJpYW50X2lkKSlcblxuICAgICAgICByZXR1cm4gWy4uLml0ZW1zLCAuLi5wYXJhbXNNZXJnZV1cbiAgICB9XG5cbiAgICB1cGRhdGVJdGVtUXVhbnRpdHkgPSAoaXRlbTogQ2FydEl0ZW0sIHF1YW50aXR5LCBjb21tZW50cz86IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICAgICAgaWYgKHRoaXMudmFsaWRhdGVRdWFudGl0eShpdGVtLCBxdWFudGl0eSkgJiYgKHRoaXMudmFsaWRhdGVQcmljZUFuZENyZWRpdHMoaXRlbSwgcXVhbnRpdHkpKSkge1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQodHJ1ZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHsgcXVhbnRpdHk6IE51bWJlcihxdWFudGl0eSkgfTtcbiAgICAgICAgICAgIGlmIChjb21tZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xlYW5lZCA9IChjb21tZW50cyA/PyAnJykudHJpbSgpO1xuICAgICAgICAgICAgICAgIHBheWxvYWQuY29tbWVudHMgPSBjbGVhbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25cbiAgICAgICAgICAgICAgICAucHV0KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUl0ZW1RdWFudGl0eUFwaSh0aGlzLmZpbmRJdGVtQnlJZFZhcmlhbnQoaXRlbS52YXJpYW50X2lkKSksXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FydE9iaihyZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zeW5jQ2FydEl0ZW1zRnJvbVJlc3BvbnNlKHJlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncHJvZHVjdC11cGRhdGVkJywgeyBxdWFudGl0eSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgdmFsaWRhdGVRdWFudGl0eSA9IChpdGVtOiBDYXJ0SXRlbSwgcXVhbnRpdHkpID0+IHtcbiAgICAgICAgaWYgKCh0aGlzLmdldENvdW50RnJvbUl0ZW1JbkNhcnQoaXRlbS5wcm9kdWN0Q29kZSkgKyBxdWFudGl0eSkgPiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ubWF4aW11bUl0ZW1zUXVhbnRpdHkpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtYXhpbXVtLWl0ZW1zLXF1YW50aXR5JywgeyBxdWFudGl0eTogaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLm1heGltdW1JdGVtc1F1YW50aXR5IH0pXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRoaXMuZ2V0Q291bnRGcm9tSXRlbUluQ2FydChpdGVtLnByb2R1Y3RDb2RlKSArIHF1YW50aXR5KSA8IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5taW5pbXVtSXRlbXNRdWFudGl0eSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ21pbmltdW0taXRlbXMtcXVhbnRpdHknLCB7IHF1YW50aXR5OiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ubWluaW11bUl0ZW1zUXVhbnRpdHkgfSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ubXVsdGlwbGVRdWFudGl0eSAmJiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ubXVsdGlwbGVRdWFudGl0eSA+IDApIHtcbiAgICAgICAgICAgIGlmICgodGhpcy5nZXRDb3VudEZyb21JdGVtSW5DYXJ0KGl0ZW0ucHJvZHVjdENvZGUpICsgcXVhbnRpdHkpICUgaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLm11bHRpcGxlUXVhbnRpdHkgIT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbXVzdC1iZS1tdWx0aXBsZScsIHsgcXVhbnRpdHk6IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5tdWx0aXBsZVF1YW50aXR5IH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHByaXZhdGUgdmFsaWRhdGVQcmljZUFuZENyZWRpdHMgPSAoaXRlbTogQ2FydEl0ZW0sIHF1YW50aXR5OiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3QgYmFsYW5jZSA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyU3ViamVjdC52YWx1ZTtcblxuICAgICAgICBpZiAoIWJhbGFuY2UgfHwgYmFsYW5jZS5jcmVkaXRBbW91bnQgPT09IG51bGwgfHwgYmFsYW5jZS5jcmVkaXRBbW91bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmFsYW5jZS5hbGxvd0FueVBheW1lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJhbGFuY2UucmVtYWluaW5nQ3JlZGl0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1bml0UHJpY2UgPSBpdGVtLnRvdGFsIC8gaXRlbS5xdWFudGl0eTtcbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFF1YW50aXR5ID0gcXVhbnRpdHkgLSBpdGVtLnF1YW50aXR5O1xuXG4gICAgICAgIGlmIChhZGRpdGlvbmFsUXVhbnRpdHkgPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsQ29zdCA9IHVuaXRQcmljZSAqIGFkZGl0aW9uYWxRdWFudGl0eTtcblxuICAgICAgICBpZiAoYWRkaXRpb25hbENvc3QgPiBiYWxhbmNlLnJlbWFpbmluZ0NyZWRpdHMpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdub3QtZW5vdWdoLWNyZWRpdHMnKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBwdWJsaWMgaGFzU3VmZmljaWVudENyZWRpdHNGb3JDYXJ0VG90YWwgPSAoKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IGJhbGFuY2UgPSB0aGlzLmJhbGFuY2VDdXN0b21lclN1YmplY3QudmFsdWU7XG5cbiAgICAgICAgaWYgKCFiYWxhbmNlIHx8IGJhbGFuY2UuY3JlZGl0QW1vdW50ID09PSBudWxsIHx8IGJhbGFuY2UuY3JlZGl0QW1vdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJhbGFuY2UuYWxsb3dBbnlQYXltZW50TWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiYWxhbmNlLnJlbWFpbmluZ0NyZWRpdHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG90YWwgPSB0aGlzLmNhcnRTdWJqZWN0LnZhbHVlPy50b3RhbHM/LnRvdGFsIHx8IDA7XG5cbiAgICAgICAgLy8gU2kgTk8gcHVlZGUgZXhjZWRlciBzYWxkbyB5IGVsIHRvdGFsIHN1cGVyYSBlbCBjcmVkaXRvLCBibG9xdWVhclxuICAgICAgICBpZiAoIWJhbGFuY2UuYWxsb3dFeGNlZWRCYWxhbmNlICYmIHRvdGFsID4gYmFsYW5jZS5jcmVkaXRBbW91bnQpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdub3QtZW5vdWdoLWNyZWRpdHMnKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBjYWxjdWxhdGVTdG9ja0NvdW50cyA9IChpdGVtOiBDYXJ0SXRlbSwgcXVhbnRpdHkpID0+IHtcbiAgICAgICAgaWYgKGl0ZW0ucHJvZHVjdC5zdG9jayA8IGl0ZW0ucXVhbnRpdHkgKyBxdWFudGl0eSkge1xuICAgICAgICAgICAgLy8gdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ291dC1vZi1zdG9jaycpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBkZWxldGVDYXJ0SXRlbSA9IChpdGVtLCB0b2FzdCA9IHRydWUpID0+IHtcbiAgICAgICAgbGV0IGlkX2J1c2NhZG8gPSB0aGlzLmZpbmRJdGVtQnlJZFZhcmlhbnQoaXRlbS52YXJpYW50X2lkKVxuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcbiAgICAgICAgLy8gICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5hZGRJdGVtQXBpKCksIHsgcHJvZHVjdENvZGU6IGl0ZW0ucHJvZHVjdC5pZCwgcXVhbnRpdHk6IDAsIHZhcmlhbnRDb2RlOiBpdGVtLnZhcmlhbnRfaWQsIGlkOiAnJywgb3JkZXJfaXRlbV9pZDogaXRlbS5pdGVtX2lkLCBsb3RfcXVhbnRpdHk6ICcnLCB1bml0X3ByaWNlOiAnJywgdW5pdF90b3RhbDogJycsIGFqdXN0ZW1lbnRfdG90YWw6ICcnLCB0b3RhbF9sb3Q6ICcnLCBsb3Rfc3RhdHVzOiAnJywgZGF0ZV9yZXF1ZXN0OiAnJywgbm90ZXM6ICAnJywgc2hpcHBpbmdfYWRkcmVzc19pZDogJycsIHNoaXBwaW5nX2FkZHJlc3NfbmFtZTogJycsIGFjdGlvbjogICdkZWxldGVvcmRlcml0ZW0nfSlcbiAgICAgICAgLy8gICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgIC8vICAgICAgICAgICAgcmVzID0+IHRoaXMucmVtb3ZlQ2FydEl0ZW0ocmVzLCBpdGVtLCB0b2FzdCksXG4gICAgICAgIC8vICAgICAgICAgICAgZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKVxuICAgICAgICAvLyAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRlbGV0ZSh0aGlzLmRlbGV0ZUl0ZW1BcGkoaWRfYnVzY2FkbykpLnN1YnNjcmliZShcbiAgICAgICAgICAgIHJlcyA9PiB7IHRoaXMucmVtb3ZlQ2FydEl0ZW0ocmVzLCBpdGVtLCB0b2FzdCk7IHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTsgfSxcbiAgICAgICAgICAgIGVyciA9PiB7IHRoaXMuaGFuZGxlRXJyb3IoZXJyKTsgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpOyB9LFxuICAgICAgICApXG4gICAgfVxuXG4gICAgY2xlYXJDYXJ0KCkge1xuICAgICAgICAvL3NvbHVjaW9uIHByb3Zpc2FvcmlhXG4gICAgICAgIGxldCBpdGVtcyA9IFsuLi50aGlzLml0ZW1zXVxuICAgICAgICB3aGlsZSAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVDYXJ0SXRlbShpdGVtcy5wb3AoKSwgZmFsc2UpXG4gICAgICAgIH1cbiAgICAgICAgLy90aGlzLnJlc2V0Q2FydCh0aGlzLmdldENhcnQpO1xuICAgIH1cblxuICAgIGNsZWFyQW5kUmVzZXRDYXJ0KCkge1xuICAgICAgICB0aGlzLnJlc2V0Q2FydCh0aGlzLmdldENhcnQpO1xuICAgIH1cblxuICAgIGNsZWFyQW5kUmVzZXRDdXN0b21lckNhcnQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiQ2xlYXJpbmcgYW5kIHJlc2V0aW5nLi4uXCIpXG4gICAgICAgIHRoaXMucmVzZXRDYXJ0KHRoaXMuZ2V0Q2FydEJ5Q3VzdG9tZXIpXG4gICAgfVxuXG4gICAgaGFuZGxlRXJyb3IgPSAoZXJyb3I6IHsgZXJyb3I6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvcGVyYXRpb24tZXJyb3ItcGFyYW0nKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpO1xuICAgIH1cblxuICAgIGdldENvdW50RnJvbUl0ZW1JbkNhcnQgPSAoY29kZVZhcmlhbnQpOiBudW1iZXIgPT4gdGhpcy5pdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS52YXJpYW50X2lkID09IGNvZGVWYXJpYW50KT8ucXVhbnRpdHkgfHwgMDtcblxuICAgIGZpbmRJdGVtQnlJZFZhcmlhbnQgPSAodmFyaWFudF9pZCkgPT4gdGhpcy5pdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS52YXJpYW50X2lkID09IHZhcmlhbnRfaWQpLml0ZW1faWRcblxuICAgIGZpbmRJdGVtID0gKHByb2R1Y3RfaWQpID0+IHRoaXMuaXRlbXMuZmluZChpdGVtID0+IGl0ZW0ucHJvZHVjdC5pZCA9PSBwcm9kdWN0X2lkKTtcblxuICAgIC8qKiBEQVRBIEZPUiBPVEhFUiBTRVJWSUNFUyAqL1xuICAgIGdldENhcnRUb2tlbiA9ICgpID0+IHRoaXMuY2FydF90b2tlbjtcblxuICAgIGdldExvY2FsZSA9ICgpID0+IHRoaXMubG9jYWxlO1xuXG4gICAgZ2V0VG90YWxBbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gY2FydD8udG90YWxzPy50b3RhbCkpO1xuXG4gICAgZ2V0Q291bnRDYXJ0SXRlbXMgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydEl0ZW1zLnBpcGUobWFwKChjYXJ0SXRlbXMpID0+IGNhcnRJdGVtcz8ubGVuZ3RoKSk7XG5cbiAgICBnZXRUYXhlc0Ftb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiBjYXJ0Py50b3RhbHM/LnRheGVzID4gMCA/IGNhcnQ/LnRvdGFscz8udGF4ZXMgOiAwKSk7XG5cbiAgICBnZXRTdWJUb3RhbEFtb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiBjYXJ0Py50b3RhbHM/LnN1YnRvdGFsKSk7XG5cbiAgICAvKipcbiAgICAgKiBEZXZ1ZWx2ZSBlbCBkZXNjdWVudG8gcXVlIGRlYmUgbW9zdHJhcnNlIGVuIGVsIHJlc3VtZW4gZGUgY29tcHJhLlxuICAgICAqXG4gICAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBjb24gZWwgbW9udG8gZGUgcHJvbW9jaW9uZXMgZGUgb3JkZW4uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogdGhpcy5zdW1tYXJ5UHJvbW90aW9uQW1vdW50JCA9IHRoaXMuY2FydFNlcnZpY2UuZ2V0U3VtbWFyeVByb21vdGlvbkFtb3VudCgpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTaSBlbCBiYWNrZW5kIG51ZXZvIGluZm9ybWEgYHRvdGFscy5wcm9tb3Rpb25CcmVha2Rvd24ub3JkZXJQcm9tb3Rpb25zYCwgc2UgdXNhIGVzZSB2YWxvci5cbiAgICAgKiBTaSB0b2RhdsOtYSBubyBleGlzdGUsIGVsIG3DqXRvZG8gaGFjZSBmYWxsYmFjayBhIGB0b3RhbHMucHJvbW90aW9uYCBwYXJhIG1hbnRlbmVyIGNvbXBhdGliaWxpZGFkLlxuICAgICAqL1xuICAgIGdldFN1bW1hcnlQcm9tb3Rpb25BbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gdGhpcy5vcmRlclV0aWxzLmdldFN1bW1hcnlQcm9tb3Rpb25BbW91bnQoY2FydCkpKTtcblxuICAgIC8qKlxuICAgICAqIEluZGljYSBzaSBleGlzdGUgdW4gY3Vww7NuIGFwbGljYWRvIGVuIGVsIGNhcnJpdG8gYWN0dWFsLlxuICAgICAqXG4gICAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBib29sZWFubyBwYXJhIGNvbnRyb2xhciBsYSB2aXNpYmlsaWRhZCBkZSBgUXVpdGFyIGN1cMOzbmAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIE5vIGRlYmUgYXRhcnNlIGEgYGdldFN1bW1hcnlQcm9tb3Rpb25BbW91bnQoKWAsIHBvcnF1ZSB1biBjdXDDs24gcHVlZGUgYWZlY3RhclxuICAgICAqIHNvbG8gcHJvbW9jaW9uZXMgdW5pdGFyaWFzIHkgZGVqYXIgZWwgZGVzY3VlbnRvIGRlIG9yZGVuIGVuIGAwYC5cbiAgICAgKi9cbiAgICBoYXNBcHBsaWVkQ291cG9uID0gKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiB0aGlzLm9yZGVyVXRpbHMuaGFzQXBwbGllZENvdXBvbihjYXJ0KSkpO1xuXG4gICAgdG9EZWNpbWFsID0gKHRvdGFsKSA9PiAodG90YWwgLSBNYXRoLmZsb29yKHRvdGFsKSA9PSAwKSA/IHRvdGFsIC8gMTAwIDogdG90YWxcblxuICAgIGdldERpc2NvdW50KCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhcnRJdGVtcy5waXBlKG1hcCgocHJvZHVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IHRvdGFsID0gdGhpcy5pdGVtcy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldiArIGN1cnIucHJvZHVjdC5zYWxlcHJpY2UgKiBjdXJyLnF1YW50aXR5O1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICBsZXQgc3VidG90YWwgPSB0aGlzLml0ZW1zLnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2ICsgY3Vyci5wcm9kdWN0LnByaWNlICogY3Vyci5xdWFudGl0eTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgcmV0dXJuIHN1YnRvdGFsIC0gdG90YWw7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPYnRpZW5lIGVsIHByZWNpbyBub3JtYWxpemFkbyBkZSB1biDDrXRlbS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtIMONdGVtIGRlIGNhcnJpdG8gbm9ybWFsaXphZG8uXG4gICAgICogQHJldHVybnMgT2JqZXRvIGBDYXJ0SXRlbVByaWNpbmdgIGxpc3RvIHBhcmEgcmVuZGVyaXphciBwcmVjaW8gYmFzZSwgdGFjaGFkbyB5IGZpbmFsLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHByaWNpbmcgPSB0aGlzLmNhcnRTZXJ2aWNlLmdldEl0ZW1QcmljaW5nKGl0ZW0pO1xuICAgICAqIGNvbnN0IHNob3dUb29sdGlwID0gcHJpY2luZy5oYXNVbml0UHJvbW90aW9ucztcbiAgICAgKiBjb25zdCBmaW5hbFByaWNlID0gcHJpY2luZy5maW5hbFByaWNlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldEl0ZW1QcmljaW5nID0gKGl0ZW06IENhcnRJdGVtKTogQ2FydEl0ZW1QcmljaW5nID0+IGl0ZW0/LnByaWNpbmcgfHwgdGhpcy5idWlsZENhcnRJdGVtUHJpY2luZyhpdGVtKTtcblxuICAgIGFkZENvdXBvbiA9IGFzeW5jIChjb2RlKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbm5lY3Rpb24ucHV0KHRoaXMuY291cG9uQXBpKCksIHsgY291cG9uOiBjb2RlIH0pLnRvUHJvbWlzZSgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5lcnJvciB8fCByZXN1bHQuZXJyb3JzKSByZXR1cm4geyBlcnJvcjogdHJ1ZSwgbWVzc2FnZTogJ2ludmFsaWQtY291cG9uJyB9O1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDYXJ0T2JqKHJlc3VsdCwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5zeW5jQ2FydEl0ZW1zRnJvbVJlc3BvbnNlKHJlc3VsdCk7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogZmFsc2UsIG1lc3NhZ2U6ICdvaycgfTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6ICdpbnZhbGlkLWNvdXBvbicgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZUNvdXBvbiA9IGFzeW5jICgpID0+IHRoaXMuY29ubmVjdGlvbi5kZWxldGUodGhpcy5jb3Vwb25BcGkoKSkucGlwZShtYXAocmVzID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0T2JqKHJlcywgZmFsc2UpO1xuICAgICAgICB0aGlzLnN5bmNDYXJ0SXRlbXNGcm9tUmVzcG9uc2UocmVzKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSkpLnRvUHJvbWlzZSgpO1xuXG4gICAgZm9ybWF0Q291cG9uID0gKGNhcnQpID0+IHtcbiAgICAgICAgbGV0IGN1cnJlbnRfY291cG9uID0gdGhpcy5jb3Vwb25TdWJqZWN0LnZhbHVlO1xuICAgICAgICBsZXQgY291cG9uOiBDb3Vwb25JID0geyBjb2RlOiBjYXJ0LmNvdXBvbkNvZGUgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IE9iamVjdC5rZXlzKGNhcnQuY2FydERpc2NvdW50cylbMF07XG4gICAgICAgICAgICBjb3Vwb24gPSB7XG4gICAgICAgICAgICAgICAgLi4uY291cG9uLFxuICAgICAgICAgICAgICAgIGFtb3VudDogKGNhcnQuY2FydERpc2NvdW50cyAmJiBjYXJ0LmNhcnREaXNjb3VudHNba2V5XS5hbW91bnQuY3VycmVudCkgfHwgMCxcbiAgICAgICAgICAgICAgICBuYW1lOiAoY2FydC5jYXJ0RGlzY291bnRzICYmIGNhcnQuY2FydERpc2NvdW50c1trZXldLm5hbWUpIHx8ICduby1uYW1lJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyB9XG4gICAgICAgIChjb3Vwb24gIT0gY3VycmVudF9jb3Vwb24pICYmIHRoaXMuY291cG9uU3ViamVjdC5uZXh0KGNvdXBvbik7XG4gICAgfVxuXG4gICAgY2hhbmdlSGF2ZVRvVXBkYXRlID0gKHZhbHVlKSA9PiB0aGlzLmhhdmVfdG9fdXBkYXRlID0gdmFsdWU7XG5cbiAgICByZWFkeUZvckNoZWNrb3V0ID0gKHN1Y2Nlc3NDYWxsYmFjaz86IEZ1bmN0aW9uLCBlcnJvckNhbGxiYWNrPzogRnVuY3Rpb24pOiBDYXJ0QWZmb3JkYWJsZSA9PiB7XG4gICAgICAgIGxldCBjYXJ0ID0gdGhpcy5jYXJ0U3ViamVjdC52YWx1ZTtcbiAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy5jYXJ0SXRlbXNTdWJqZWN0LnZhbHVlO1xuICAgICAgICBsZXQgcmVzdWx0OiBDYXJ0QWZmb3JkYWJsZSA9IHsgb2s6IHRydWUgfTtcbiAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA8IHRoaXMuY2hhbm5lbENvbmZpZy5taW5pbXVtUXVhbnRpdHlQdXJjaGFzZUl0ZW1zKSB7XG4gICAgICAgICAgICByZXN1bHQub2sgPSBmYWxzZTsgcmVzdWx0LnJlYXNvbnMucHVzaCh7IG1lc3NhZ2U6ICdub3QtZW5vdWdodC1pdGVtcycgfSlcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FydC50b3RhbHMudG90YWwgPCB0aGlzLmNoYW5uZWxDb25maWcubWluaW11bVB1cmNoYXNlQW1vdW50KSB7XG4gICAgICAgICAgICByZXN1bHQub2sgPSBmYWxzZTsgcmVzdWx0LnJlYXNvbnMucHVzaCh7IG1lc3NhZ2U6ICdub3QtZW5vdWdodC1hbW91bnQnIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1Y2Nlc3NDYWxsYmFjayB8fCBlcnJvckNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXN1bHQub2tcbiAgICAgICAgICAgICAgICA/IHN1Y2Nlc3NDYWxsYmFjayAmJiBzdWNjZXNzQ2FsbGJhY2soKVxuICAgICAgICAgICAgICAgIDogZXJyb3JDYWxsYmFjayAmJiBlcnJvckNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB1cGRhdGVJdGVtc09uRXJyb3IgPSAoaXRlbXNXaXRoRXJyb3I6IGFueVtdLCBjb2RlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coaXRlbXNXaXRoRXJyb3IpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLml0ZW1zKTtcbiAgICAgICAgbGV0IGl0ZW1zVXBkYXRlZCA9IHRoaXMuaXRlbXMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgbGV0IGl0ZW1XaXRoRXJyb3IgPSBpdGVtc1dpdGhFcnJvci5maW5kKGZhaWxlZEl0ZW0gPT4gaXRlbS5pdGVtX2lkID09IGZhaWxlZEl0ZW0uaWQpO1xuICAgICAgICAgICAgaWYgKGl0ZW1XaXRoRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpdGVtLmZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaXRlbS5lcnJvciA9IGNvZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSlcbiAgICAgICAgLy8gY29uc29sZS5sb2coaXRlbXNVcGRhdGVkKTtcbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0SXRlbXMoaXRlbXNVcGRhdGVkKTtcbiAgICB9XG5cbiAgICBsb2FkQ2FydEJ5VG9rZW4gPSBhc3luYyAodG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmNhcnRfdG9rZW4gPSB0b2tlblxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRDYXJ0QnlUb2tlbigpXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgVVRJTFNcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybWEgbG9zIMOtdGVtcyBjcnVkb3MgZGVsIGJhY2tlbmQgYWwgY29udHJhdG8gaW50ZXJubyBgQ2FydEl0ZW1gLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNlcnZlcl9pdGVtIFJlc3B1ZXN0YSBgaXRlbXNgIGRlbCBlbmRwb2ludCBkZSBjYXJyaXRvLlxuICAgICAqIEByZXR1cm5zIEFycmVnbG8gZGUgw610ZW1zIG5vcm1hbGl6YWRvcywgY2FkYSB1bm8gY29uIGBwcmljaW5nYCBwcmVjb21wdXRhZG8uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEVzdGUgZXMgZWwgcHVudG8gZG9uZGUgZWwgY29yZTpcbiAgICAgKiAtIHByZXNlcnZhIGB1bml0UHJvbW90aW9uc2BcbiAgICAgKiAtIGFybWEgYHByaWNpbmdgXG4gICAgICogLSBtYW50aWVuZSBsYSBmb3JtYSBoaXN0w7NyaWNhIGRlbCBpdGVtIGNvbnN1bWlkbyBwb3IgbG9zIHRlbXBsYXRlc1xuICAgICAqL1xuICAgIHRyYW5zZm9ybUl0ZW1zID0gKHNlcnZlcl9pdGVtKSA9PiBzZXJ2ZXJfaXRlbS5tYXAoXG4gICAgICAgIGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbSA9IHtcbiAgICAgICAgICAgICAgICBwcm9kdWN0OiBpdGVtLnByb2R1Y3QsXG4gICAgICAgICAgICAgICAgdmFyaWFudF9pZDogaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLmNvZGUsXG4gICAgICAgICAgICAgICAgbG90OiBpdGVtLm9yZGVySXRlbUxvdCxcbiAgICAgICAgICAgICAgICBxdWFudGl0eTogaXRlbS5xdWFudGl0eSxcbiAgICAgICAgICAgICAgICBjb21tZW50czogaXRlbS5jb21tZW50cyB8fCAnJyxcbiAgICAgICAgICAgICAgICBpdGVtX2lkOiBpdGVtLmlkLFxuICAgICAgICAgICAgICAgIHRvdGFsOiBpdGVtLnRvdGFsLFxuICAgICAgICAgICAgICAgIHVuaXRQcm9tb3Rpb25zOiBBcnJheS5pc0FycmF5KGl0ZW0udW5pdFByb21vdGlvbnMpID8gaXRlbS51bml0UHJvbW90aW9ucyA6IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVtLnByaWNpbmcgPSB0aGlzLmJ1aWxkQ2FydEl0ZW1QcmljaW5nKGl0ZW0pO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5zYWxlcHJpY2UpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnByaWNlKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5zYWxlcHJpY2UgPiAwID8gaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnNlbGVwcmljZSA6IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5wcmljZSk7XG4gICAgICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIC8vICAgICBpdGVtLnByb2R1Y3QucHJpY2UgPSBpdGVtLnRvdGFsIC8gaXRlbS5xdWFudGl0eS8vID8gaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnNlbGVwcmljZSA6IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5wcmljZTtcbiAgICAgICAgICAgIC8vIH0sIDEwMCk7XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfVxuICAgIClcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnV5ZSBsYSBub3JtYWxpemFjacOzbiBkZSBwcmVjaW9zIHBhcmEgdW4gw610ZW0gZGVsIGNhcnJpdG8uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbSDDjXRlbSBub3JtYWxpemFkbyBkZWwgY2Fycml0by5cbiAgICAgKiBAcmV0dXJucyBFc3RydWN0dXJhIGBDYXJ0SXRlbVByaWNpbmdgIGNvbiBwcmVjaW8gYmFzZSwgdGFjaGFkbywgZmluYWwgeSBmbGFncyBkZSBVSS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBwcmljaW5nID0gdGhpcy5idWlsZENhcnRJdGVtUHJpY2luZyhpdGVtKTtcbiAgICAgKiAvLyBwcmljaW5nLmJhc2VQcmljZSA9PiBzYWxlcHJpY2Ugc2kgZXhpc3RlLCBzaSBubyBwcmljZVxuICAgICAqIC8vIHByaWNpbmcuZmluYWxQcmljZSA9PiBiYXNlUHJpY2UgKyB1bml0UHJvbW90aW9uVG90YWxcbiAgICAgKiAvLyBwcmljaW5nLmVmZmVjdGl2ZURpc2NvdW50UGVyY2VudCA9PiAlIHRvdGFsIGNvbnRyYSBlbCBwcmVjaW8gZGUgcmVmZXJlbmNpYVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHByaXZhdGUgYnVpbGRDYXJ0SXRlbVByaWNpbmcgPSAoaXRlbTogQ2FydEl0ZW0pOiBDYXJ0SXRlbVByaWNpbmcgPT4ge1xuICAgICAgICBjb25zdCB2YXJpYW50ID0gaXRlbT8ucHJvZHVjdD8udmFyaWFudHM/LlswXTtcbiAgICAgICAgY29uc3QgY2FydEFuZFNpZGViYXJQcmljZXMgPSB2YXJpYW50Py5jYXJ0QW5kU2lkZWJhclByaWNlcztcbiAgICAgICAgLy8gU2kgZWwgYmFja2VuZCBudWV2byBpbmZvcm1hIGBjYXJ0QW5kU2lkZWJhclByaWNlc2AsIGVzZSBlcyBlbCBwcmVjaW8gY29ycmVjdG9cbiAgICAgICAgLy8gcGFyYSBjYXJyaXRvL3NpZGViYXIgcG9ycXVlIGV4Y2x1eWUgaW1wdWVzdG9zIGRlIG9yZGVuIHF1ZSBubyBzZSBsaXN0YW4gcG9yIMOtdGVtLlxuICAgICAgICAvLyBTaSBubyBleGlzdGUsIHNlIG1hbnRpZW5lIGVsIGZhbGxiYWNrIGhpc3TDs3JpY28uXG4gICAgICAgIGNvbnN0IGJhc2VQcmljZSA9IHRoaXMucGFyc2VQcmljZVZhbHVlKFxuICAgICAgICAgICAgY2FydEFuZFNpZGViYXJQcmljZXM/LnNhbGVwcmljZVxuICAgICAgICAgICAgPz8gY2FydEFuZFNpZGViYXJQcmljZXM/LnByaWNlXG4gICAgICAgICAgICA/PyB2YXJpYW50Py5zYWxlcHJpY2VcbiAgICAgICAgICAgID8/IHZhcmlhbnQ/LnByaWNlXG4gICAgICAgICAgICA/PyBpdGVtPy5wcm9kdWN0Py5zYWxlcHJpY2VcbiAgICAgICAgICAgID8/IGl0ZW0/LnByb2R1Y3Q/LnByaWNlXG4gICAgICAgICAgICA/PyAwXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHN0cmlrZVByaWNlQ2FuZGlkYXRlID0gdGhpcy5wYXJzZVByaWNlVmFsdWUoXG4gICAgICAgICAgICBjYXJ0QW5kU2lkZWJhclByaWNlcz8ucHJpY2VcbiAgICAgICAgICAgID8/IHZhcmlhbnQ/LnByaWNlXG4gICAgICAgICAgICA/PyBpdGVtPy5wcm9kdWN0Py5wcmljZVxuICAgICAgICAgICAgPz8gMFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkQmFzZVByaWNlID0gaXNOYU4oYmFzZVByaWNlKSA/IDAgOiBiYXNlUHJpY2U7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTdHJpa2VQcmljZSA9IGlzTmFOKHN0cmlrZVByaWNlQ2FuZGlkYXRlKSA/IDAgOiBzdHJpa2VQcmljZUNhbmRpZGF0ZTtcbiAgICAgICAgY29uc3QgdW5pdFByb21vdGlvblRvdGFsID0gQXJyYXkuaXNBcnJheShpdGVtPy51bml0UHJvbW90aW9ucylcbiAgICAgICAgICAgID8gaXRlbS51bml0UHJvbW90aW9ucy5yZWR1Y2UoKHRvdGFsLCBwcm9tb3Rpb24pID0+IHRvdGFsICsgTnVtYmVyKHByb21vdGlvbj8uYW1vdW50IHx8IDApLCAwKVxuICAgICAgICAgICAgOiAwO1xuICAgICAgICBjb25zdCBoYXNTdHJpa2VQcmljZSA9IG5vcm1hbGl6ZWRTdHJpa2VQcmljZSA+IG5vcm1hbGl6ZWRCYXNlUHJpY2UgJiYgbm9ybWFsaXplZEJhc2VQcmljZSA+IDA7XG4gICAgICAgIGNvbnN0IGhhc1VuaXRQcm9tb3Rpb25zID0gQXJyYXkuaXNBcnJheShpdGVtPy51bml0UHJvbW90aW9ucykgJiYgaXRlbS51bml0UHJvbW90aW9ucy5sZW5ndGggPiAwO1xuICAgICAgICBjb25zdCBmaW5hbFByaWNlID0gaGFzVW5pdFByb21vdGlvbnMgPyBub3JtYWxpemVkQmFzZVByaWNlICsgdW5pdFByb21vdGlvblRvdGFsIDogbm9ybWFsaXplZEJhc2VQcmljZTtcbiAgICAgICAgY29uc3QgcHJvZHVjdERpc2NvdW50ID0gTnVtYmVyKGl0ZW0/LnByb2R1Y3Q/LmRpc2NvdW50IHx8IDApO1xuICAgICAgICBjb25zdCBkaXNjb3VudFBlcmNlbnQgPSAhaXNOYU4ocHJvZHVjdERpc2NvdW50KSAmJiBwcm9kdWN0RGlzY291bnQgPiAwXG4gICAgICAgICAgICA/IE1hdGgucm91bmQocHJvZHVjdERpc2NvdW50KVxuICAgICAgICAgICAgOiBoYXNTdHJpa2VQcmljZVxuICAgICAgICAgICAgICAgID8gTWF0aC5yb3VuZCgoKG5vcm1hbGl6ZWRTdHJpa2VQcmljZSAtIG5vcm1hbGl6ZWRCYXNlUHJpY2UpIC8gbm9ybWFsaXplZFN0cmlrZVByaWNlKSAqIDEwMClcbiAgICAgICAgICAgICAgICA6IDA7XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZVJlZmVyZW5jZVByaWNlID0gaGFzU3RyaWtlUHJpY2UgPyBub3JtYWxpemVkU3RyaWtlUHJpY2UgOiBub3JtYWxpemVkQmFzZVByaWNlO1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVEaXNjb3VudFBlcmNlbnQgPSBlZmZlY3RpdmVSZWZlcmVuY2VQcmljZSA+IDAgJiYgZmluYWxQcmljZSA+IDAgJiYgZWZmZWN0aXZlUmVmZXJlbmNlUHJpY2UgPiBmaW5hbFByaWNlXG4gICAgICAgICAgICA/IE1hdGgucm91bmQoKChlZmZlY3RpdmVSZWZlcmVuY2VQcmljZSAtIGZpbmFsUHJpY2UpIC8gZWZmZWN0aXZlUmVmZXJlbmNlUHJpY2UpICogMTAwKVxuICAgICAgICAgICAgOiBkaXNjb3VudFBlcmNlbnQ7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJhc2VQcmljZTogbm9ybWFsaXplZEJhc2VQcmljZSxcbiAgICAgICAgICAgIHN0cmlrZVByaWNlOiBoYXNTdHJpa2VQcmljZSA/IG5vcm1hbGl6ZWRTdHJpa2VQcmljZSA6IG51bGwsXG4gICAgICAgICAgICBmaW5hbFByaWNlLFxuICAgICAgICAgICAgdW5pdFByb21vdGlvblRvdGFsLFxuICAgICAgICAgICAgaGFzU3RyaWtlUHJpY2UsXG4gICAgICAgICAgICBoYXNVbml0UHJvbW90aW9ucyxcbiAgICAgICAgICAgIGRpc2NvdW50UGVyY2VudCxcbiAgICAgICAgICAgIGVmZmVjdGl2ZURpc2NvdW50UGVyY2VudFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6YSB2YWxvcmVzIGRlIHByZWNpbyBwcm92ZW5pZW50ZXMgZGVsIGJhY2tlbmQgYSBgbnVtYmVyYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSBWYWxvciBudW3DqXJpY28gbyBzdHJpbmcgY29uIGZvcm1hdG8gbG9jYWwgKGAxMjAuMDAwYCwgYDEyMDAwMGAsIGAxMjAwMDAtMWAsIGV0Yy4pLlxuICAgICAqIEByZXR1cm5zIE7Dum1lcm8gcGFyc2VhZG8gbyBgTmFOYCBzaSBlbCB2YWxvciBubyBlcyB1dGlsaXphYmxlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTZSB1c2EgcGFyYSBzb3BvcnRhciByZXNwdWVzdGFzIGNvbiBzZXBhcmFkb3JlcyBkZSBtaWxlcywgY29tYSBkZWNpbWFsIG8gcmFuZ29zLlxuICAgICAqL1xuICAgIHByaXZhdGUgcGFyc2VQcmljZVZhbHVlID0gKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByYXcgPSB2YWx1ZS50b1N0cmluZygpLnRyaW0oKTtcbiAgICAgICAgaWYgKCFyYXcpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gcmF3LmluY2x1ZGVzKCctJykgPyByYXcuc3BsaXQoJy0nKVswXS50cmltKCkgOiByYXc7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBmaXJzdFZhbHVlXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxzL2csICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcLig/PVxcZHszfShcXER8JCkpL2csICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoJywnLCAnLicpO1xuXG4gICAgICAgIHJldHVybiBOdW1iZXIobm9ybWFsaXplZCk7XG4gICAgfVxuXG5cbiAgICBnZXRDcmVkaXRBbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXIgfCBudWxsPiA9PlxuICAgICAgICB0aGlzLmJhbGFuY2VDdXN0b21lclN1YmplY3QucGlwZShcbiAgICAgICAgICAgIG1hcCgoYmFsYW5jZUN1c3RvbWVyKSA9PiBiYWxhbmNlQ3VzdG9tZXI/LmNyZWRpdEFtb3VudCA/PyBudWxsKVxuICAgICAgICApO1xuXG4gICAgZ2V0Q2xpZW50VGF4ZXMgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gY2FydD8udG90YWxzPy50YXhlcyA+IDAgPyBjYXJ0Py50b3RhbHM/LmNsaWVudFRheGVzIDogMCkpO1xuXG4gICAgZ2V0UmVtYWluaW5nQ3JlZGl0cyA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0LnBpcGUobWFwKChiYWxhbmNlQ3VzdG9tZXIpID0+IGJhbGFuY2VDdXN0b21lcj8ucmVtYWluaW5nQ3JlZGl0cykpO1xuXG4gICAgcHVibGljIHVwZGF0ZUJhbGFuY2VBdHRyaWJ1dGVzKGJhbGFuY2U6IGFueSwgdG90YWw6IG51bWJlciB8IG51bGwgPSBudWxsKSB7XG4gICAgICAgIGlmICghYmFsYW5jZSkge1xuICAgICAgICAgICAgdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbEFtb3VudCA9IHRvdGFsID8/IDA7XG5cbiAgICAgICAgY29uc3QgYmFsYW5jZURhdGEgPSB7XG4gICAgICAgICAgICBhbGxvd0FueVBheW1lbnRNZXRob2Q6IGJhbGFuY2UuYWxsb3dBbnlQYXltZW50TWV0aG9kLFxuICAgICAgICAgICAgYWxsb3dFeGNlZWRCYWxhbmNlOiBiYWxhbmNlLmFsbG93RXhjZWVkQmFsYW5jZSxcbiAgICAgICAgICAgIGNyZWRpdEFtb3VudDogYmFsYW5jZS5jcmVkaXRBbW91bnQsXG4gICAgICAgICAgICBzaG93TWF4OiBiYWxhbmNlLnNob3dNYXgsXG4gICAgICAgICAgICBzaG93UHJpY2U6IGJhbGFuY2Uuc2hvd1ByaWNlLFxuICAgICAgICAgICAgcmVtYWluaW5nQ3JlZGl0czpcbiAgICAgICAgICAgICAgICBiYWxhbmNlLmNyZWRpdEFtb3VudCAhPSBudWxsICYmIHRvdGFsQW1vdW50ICE9IG51bGwgJiYgYmFsYW5jZS5jcmVkaXRBbW91bnQgPj0gdG90YWxBbW91bnRcbiAgICAgICAgICAgICAgICAgICAgPyBiYWxhbmNlLmNyZWRpdEFtb3VudCAtIHRvdGFsQW1vdW50XG4gICAgICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgIGFwcGx5TWF4T3JkZXJzOiBiYWxhbmNlLmFwcGx5TWF4T3JkZXJzLFxuICAgICAgICAgICAgbWF4T3JkZXJzOiBiYWxhbmNlLm1heE9yZGVyc1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuYmFsYW5jZUN1c3RvbWVyU3ViamVjdC5uZXh0KGJhbGFuY2VEYXRhKTtcbiAgICB9XG5cbn1cbiJdfQ==
909
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL2NhcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUcxQyxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUdsRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHekMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLDRCQUE0QixFQUFFLHdCQUF3QixFQUFFLE1BQU0scUNBQXFDLENBQUM7Ozs7O0FBS3hJLElBQWEsV0FBVyxHQUF4QixNQUFhLFdBQVc7SUFrRHBCLFlBQW9CLFVBQTZCLEVBQVUsYUFBMkIsRUFBVSxNQUFpQixFQUNyRyxXQUF3QixFQUFVLFVBQStCLEVBQVUsZ0JBQWtDLEVBQzdHLG9CQUEwQyxFQUMxQyxNQUFjLEVBQ2Qsd0JBQWtEO1FBSjFDLGVB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LENBQUM7SUFDbEQsQ0FBQztDQUVKLENBQUE7O1lBcGdDbUMsaUJBQWlCO1lBQXlCLFlBQVk7WUFBa0IsU0FBUztZQUN4RixXQUFXO1lBQXNCLG1CQUFtQjtZQUE0QixnQkFBZ0I7WUFDdkYsb0JBQW9CO1lBQ2xDLE1BQU07WUFDWSx3QkFBd0I7OztBQXREckQsV0FBVztJQUh2QixVQUFVLENBQUM7UUFDUixVQUFVLEVBQUUsTUFBTTtLQUNyQixDQUFDO0dBQ1csV0FBVyxDQXNqQ3ZCO1NBdGpDWSxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZmluYWxpemUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBQcm9kdWN0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9wcm9kdWN0JztcbmltcG9ydCB7IENhcnRJdGVtLCBDYXJ0SXRlbVByaWNpbmcgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NhcnQtaXRlbSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENvbm5lY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vYXBpL2Nvbm5lY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICcuLi9jb3JlLmNvbnN0cyc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4vYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uL3V0aWxzL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ291cG9uSSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY291cG9uJztcbmltcG9ydCB7IE9yZGVyVXRpbGl0eVNlcnZpY2UgfSBmcm9tICcuLi91dGlscy9vcmRlci11dGlsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hlY2tvdXREYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jaGVja291dC1kYXRhJztcbmltcG9ydCB7IENhcnRBZmZvcmRhYmxlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jYXJ0L2NhcnQtYWZmb3JkYWJsZSc7XG5pbXBvcnQgeyBDaGFubmVsQ29uZmlnU2VydmljZSB9IGZyb20gJy4vY2hhbm5lbC1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBBbmFseXRpY3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vcHVibGljLWFwaSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2hhbm5lbCc7XG5pbXBvcnQgeyBDYXJ0VG90YWxQcmljaW5nVmFsdWUsIENhcnRUb3RhbHNQcmljaW5nIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jYXJ0LXRvdGFscyc7XG5pbXBvcnQgeyBDYXJ0SXRlbVByaWNlUHJlc2VudGF0aW9uLCBDYXJ0U3VtbWFyeVByaWNlUHJlc2VudGF0aW9uLCBQcmljZVByZXNlbnRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi91dGlscy9wcmljZS1wcmVzZW50YXRpb24uc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQ2FydFNlcnZpY2Uge1xuICAgIHByaXZhdGUgY2FydEl0ZW1zU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PENhcnRJdGVtW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7XG4gICAgcHJpdmF0ZSBjb3Vwb25TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55PiA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XG4gICAgcHJpdmF0ZSBjYXJ0U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGFueT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuICAgIHByaXZhdGUgcmVxdWVzdEluUHJvY2VzcyA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICAgIHByaXZhdGUgcHJvbW90aW9uc1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxDaGVja291dERhdGFbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFtdKTtcblxuICAgIHByaXZhdGUgYmFsYW5jZUN1c3RvbWVyU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PHtcbiAgICAgICAgYWxsb3dBbnlQYXltZW50TWV0aG9kPzogYm9vbGVhbjtcbiAgICAgICAgYWxsb3dFeGNlZWRCYWxhbmNlPzogYm9vbGVhbjtcbiAgICAgICAgY3JlZGl0QW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAgICAgc2hvd01heD86IGJvb2xlYW47XG4gICAgICAgIHNob3dQcmljZT86IGJvb2xlYW47XG4gICAgICAgIHJlbWFpbmluZ0NyZWRpdHM/OiBudW1iZXI7XG4gICAgICAgIGFwcGx5TWF4T3JkZXJzPzogYm9vbGVhbjtcbiAgICAgICAgbWF4T3JkZXJzPzogbnVtYmVyO1xuICAgIH0gfCBudWxsPiA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XG5cbiAgICBwcml2YXRlIGl0ZW1zID0gW107XG5cbiAgICBwcml2YXRlIGNvdW50OiBudW1iZXIgPSAwO1xuICAgIHByaXZhdGUgbG9jYWxlID0gXCJcIjtcbiAgICBwcml2YXRlIGxvZ2dlZF9pbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgaGF2ZV90b191cGRhdGUgPSB0cnVlO1xuICAgIHB1YmxpYyBjaGFubmVsQ29uZmlnOiBhbnkgPSB7fTtcbiAgICBwcml2YXRlIGNhcnRfYmFzZVVybCA9ICdzaG9wLWFwaS8nICsgdGhpcy5jb25zdHMuZ2V0Q2hhbm5lbCgpICsgJy9jYXJ0cyc7XG5cbiAgICBwdWJsaWMgY2FydEl0ZW1zQXBpID0gKCkgPT4gdGhpcy5jYXJ0X2Jhc2VVcmwgKyAnP2xvY2FsZT0nICsgdGhpcy5jb25zdHMuZ2V0TG9jYWxlKCk7XG4gICAgcHVibGljIGFkZEl0ZW1BcGkgPSAoKSA9PiB0aGlzLmNhcnRfYmFzZVVybCArICcvJyArIHRoaXMuY2FydF90b2tlbiArICcvaXRlbXMnICsgJz9sb2NhbGU9JyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpO1xuICAgIHB1YmxpYyBhZGRBbGxJdGVtc0FwaSA9ICgpID0+IHRoaXMuY2FydF9iYXNlVXJsICsgJy8nICsgdGhpcy5jYXJ0X3Rva2VuICsgJy9tdWx0aXBsZS1pdGVtcycgKyAnP2xvY2FsZT0nICsgdGhpcy5jb25zdHMuZ2V0TG9jYWxlKCk7XG4gICAgcHVibGljIHVwZGF0ZUl0ZW1RdWFudGl0eUFwaSA9IChpdGVtX2lkKSA9PiB0aGlzLmNhcnRfYmFzZVVybCArICcvJyArIHRoaXMuY2FydF90b2tlbiArICcvaXRlbXMvJyArIGl0ZW1faWQgKyAnP2xvY2FsZT0nICsgdGhpcy5jb25zdHMuZ2V0TG9jYWxlKCk7XG4gICAgcHVibGljIGRlbGV0ZUl0ZW1BcGkgPSAoaXRlbV9pZCkgPT4gdGhpcy5jYXJ0X2Jhc2VVcmwgKyAnLycgKyB0aGlzLmNhcnRfdG9rZW4gKyAnL2l0ZW1zLycgKyBpdGVtX2lkICsgJz9sb2NhbGU9JyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpO1xuICAgIHB1YmxpYyBjb3Vwb25BcGkgPSAoKSA9PiB0aGlzLmNhcnRfYmFzZVVybCArICcvJyArIHRoaXMuY2FydF90b2tlbiArICcvY291cG9uJztcbiAgICBwdWJsaWMgYWRkcmVzc0Jvb2tBcGkgPSAoKSA9PiAnc2hvcC1hcGkvJyArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICcvYWRkcmVzcy1ib29rJztcbiAgICBwdWJsaWMgdGF4ZXNBcGkgPSAoKSA9PiAnc2hvcC1hcGkvJyArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICcvY2FydHMvdGF4JztcblxuICAgIHB1YmxpYyBjYXJ0X3Rva2VuO1xuICAgIHB1YmxpYyBjYXJ0SXRlbXMgPSB0aGlzLmNhcnRJdGVtc1N1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShtYXAoaXRlbXMgPT4gdGhpcy5zd2l0Y2hQcmljZUluQ2FydEl0ZW0oaXRlbXMpKSlcbiAgICBwdWJsaWMgY291cG9uID0gdGhpcy5jb3Vwb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBsb2FkaW5nID0gdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBjYXJ0ID0gdGhpcy5jYXJ0U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgcHJvbW90aW9ucyA9IHRoaXMucHJvbW90aW9uc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIGRlbGV0aW5nOiBCb29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGJhbGFuY2VDdXN0b21lciQgPSB0aGlzLmJhbGFuY2VDdXN0b21lclN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIGFsbG93QW55UGF5bWVudE1ldGhvZCQgPSB0aGlzLmJhbGFuY2VDdXN0b21lciQucGlwZShtYXAoZGF0YSA9PiBkYXRhPy5hbGxvd0FueVBheW1lbnRNZXRob2QgPz8gbnVsbCkpO1xuICAgIHB1YmxpYyBhbGxvd0V4Y2VlZEJhbGFuY2UkID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXIkLnBpcGUobWFwKGRhdGEgPT4gZGF0YT8uYWxsb3dFeGNlZWRCYWxhbmNlID8/IG51bGwpKTtcbiAgICBwdWJsaWMgY3JlZGl0QW1vdW50JCA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyJC5waXBlKG1hcChkYXRhID0+IGRhdGE/LmNyZWRpdEFtb3VudCA/PyBudWxsKSk7XG4gICAgcHVibGljIHNob3dNYXgkID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXIkLnBpcGUobWFwKGRhdGEgPT4gZGF0YT8uc2hvd01heCA/PyBudWxsKSk7XG4gICAgcHVibGljIHNob3dQcmljZSQgPSB0aGlzLmJhbGFuY2VDdXN0b21lciQucGlwZShtYXAoZGF0YSA9PiBkYXRhPy5zaG93UHJpY2UgPz8gbnVsbCkpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25uZWN0aW9uOiBDb25uZWN0aW9uU2VydmljZSwgcHJpdmF0ZSB0b2FzdHJTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsIHByaXZhdGUgY29uc3RzOiBDb25zdGFudHMsXG4gICAgICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLCBwcml2YXRlIG9yZGVyVXRpbHM6IE9yZGVyVXRpbGl0eVNlcnZpY2UsIHByaXZhdGUgYW5hbHl0aWNzU2VydmljZTogQW5hbHl0aWNzU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjaGFubmVsQ29uZmlnU2VydmljZTogQ2hhbm5lbENvbmZpZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgIHByaXZhdGUgcHJpY2VQcmVzZW50YXRpb25TZXJ2aWNlOiBQcmljZVByZXNlbnRhdGlvblNlcnZpY2UpIHtcblxuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5pdGVtcyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnQnKSkgfHwgW107XG4gICAgICAgIHRoaXMuY2FydF90b2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYXJ0X3Rva2VuJykgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5sb2dnZWRJbi5zdWJzY3JpYmUocmVzID0+IHRoaXMuZ2V0Q2FydCgpKTtcbiAgICAgICAgdGhpcy5jaGFubmVsQ29uZmlnU2VydmljZS5jaGFubmVsQ29uZmlnJC5zdWJzY3JpYmUocmVzID0+IHRoaXMuY2hhbm5lbENvbmZpZyA9IHJlcyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENhcnQyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYXJ0SXRlbXNTdWJqZWN0LnZhbHVlO1xuICAgIH1cblxuICAgIGdldEFkZHJlc3NCb29rID0gYXN5bmMgKCkgPT5cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLmdldCh0aGlzLmFkZHJlc3NCb29rQXBpKCkpLnBpcGUobWFwKHJlcyA9PiByZXM/Lmxlbmd0aCAmJiByZXMubWFwKGFkZHJlcyA9PiB7IHJldHVybiBhZGRyZXMgJiYgeyAuLi5hZGRyZXMsIHNlbGVjdGVkOiBhZGRyZXMuZGVmYXVsdCB9IH0pIHx8IG51bGwpKS50b1Byb21pc2UoKTtcblxuICAgIHB1YmxpYyBnZXRUYXhlcyA9IGFzeW5jICgpID0+XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMudGF4ZXNBcGkoKSwgeyB0b2tlbjogdGhpcy5jYXJ0X3Rva2VuIH0pLnN1YnNjcmliZShyZXMgPT4gcmVzKVxuXG4gICAgcHJpdmF0ZSBnZXRDYXJ0ID0gYXN5bmMgKCkgPT5cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5jYXJ0SXRlbXNBcGkoKSwgKCh0aGlzLmNhcnRfdG9rZW4gJiYgdGhpcy5pdGVtcy5sZW5ndGggPj0gMSkgJiYgeyB0b2tlbjogdGhpcy5jYXJ0X3Rva2VuIH0pKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICByZXMgPT4gdGhpcy5pbml0aWFsaXplQ2FydChyZXMpXG4gICAgICAgIClcblxuICAgIHByaXZhdGUgZ2V0Q2FydEJ5VG9rZW4gPSBhc3luYyAoKSA9PlxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmNhcnRJdGVtc0FwaSgpLCAoKHRoaXMuY2FydF90b2tlbikgJiYgeyB0b2tlbjogdGhpcy5jYXJ0X3Rva2VuIH0pKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICByZXMgPT4gdGhpcy5pbml0aWFsaXplQ2FydChyZXMpXG4gICAgICAgIClcblxuICAgIHByaXZhdGUgZ2V0Q2FydEJ5Q3VzdG9tZXIgPSBhc3luYyAoKSA9PlxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmNhcnRJdGVtc0FwaSgpKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICByZXMgPT4gdGhpcy5pbml0aWFsaXplQ2FydChyZXMpXG4gICAgICAgIClcblxuICAgIC8qKlxuICAgICAqICBAcHJpdmF0ZVxuICAgICAqICBDQVJUIENSVUQgU0VSVkVSJ1MgU1lOQ1JPTklaRURcbiAgICAgKi9cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZUNhcnQgPSAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhpcy5jYXJ0X3Rva2VuID0gcmVzcG9uc2UudG9rZW5WYWx1ZTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NhcnRfdG9rZW4nLCB0aGlzLmNhcnRfdG9rZW4pO1xuICAgICAgICB0aGlzLmxvY2FsZSA9IHJlc3BvbnNlLmxvY2FsZTtcbiAgICAgICAgLyogbGV0IGxvY2FsZUZyb21TdG9yYWdlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0xPQ0FMRScpXG4gICAgICAgIGNvbnNvbGUubG9nKGxvY2FsZUZyb21TdG9yYWdlKVxuICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZUZyb21TdG9yYWdlID8gbG9jYWxlRnJvbVN0b3JhZ2UgOiByZXNwb25zZS5sb2NhbGU7XG4gICAgICAgIHJlc3BvbnNlLmxvY2FsZSA9IHRoaXMubG9jYWxlICovXG4gICAgICAgIHRoaXMudXBkYXRlQ2FydE9iaihyZXNwb25zZSwgZmFsc2UpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNhcnRJdGVtcyh0aGlzLnRyYW5zZm9ybUl0ZW1zKHJlc3BvbnNlLml0ZW1zKSk7XG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVhc2lnbmEgYHByb2R1Y3QucHJpY2VgIGFsIHByZWNpbyBiYXNlIGxlZ2FjeSBxdWUgZXNwZXJhIGVsIHRlbXBsYXRlIGhpc3TDs3JpY28gZGVsIGNhcnJpdG8uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbXMgw410ZW1zIG5vcm1hbGl6YWRvcyBkZWwgY2Fycml0by5cbiAgICAgKiBAcmV0dXJucyBMb3MgbWlzbW9zIMOtdGVtcyBjb24gYHByb2R1Y3QucHJpY2VgIGFsaW5lYWRvIGFsIHByZWNpbyBiYXNlIG1vc3RyYWRvIGVuIGxhIHRhYmxhLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBFc3RlIG3DqXRvZG8gbm8gbW9kaWZpY2EgYHByaWNpbmcuZmluYWxQcmljZWAuIFNvbG8gcHJlc2VydmEgY29tcGF0aWJpbGlkYWQgY29uIHRlbXBsYXRlc1xuICAgICAqIHZpZWpvcyBxdWUgdG9kYXbDrWEgbGVlbiBgaXRlbS5wcm9kdWN0LnByaWNlYCBkaXJlY3RhbWVudGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzd2l0Y2hQcmljZUluQ2FydEl0ZW0gPSAoaXRlbXM6IENhcnRJdGVtW10pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW1zLm1hcChcbiAgICAgICAgICAgIGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLnByb2R1Y3QpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJpY2luZyA9IHRoaXMuZ2V0SXRlbVByaWNpbmcoaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhbnQgPSBpdGVtLnByb2R1Y3QudmFyaWFudHM/LlswXTtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5wcm9kdWN0LnByaWNlID0gcHJpY2luZz8uYmFzZVByaWNlIHx8IHZhcmlhbnQ/LnNhbGVwcmljZSB8fCB2YXJpYW50Py5wcmljZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RlcENhcnQgPSAocmVzKSA9PiB7XG4gICAgICAgIHJlcy5pdGVtcy5sZW5ndGggPiAwICYmIHJlcy5pdGVtcy5mb3JFYWNoKFxuICAgICAgICAgICAgaXRlbSA9PiAhdGhpcy5pc0l0ZW1JbkxvY2FsKGl0ZW0uaWQpICYmIHRoaXMuZGVsZXRlQ2FydEl0ZW0oaXRlbSwgZmFsc2UpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuYWRkQWxsVG9DYXJ0KFxuICAgICAgICAgICAgdGhpcy5pdGVtcy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgaXRlbSA9PiAhcmVzLml0ZW1zLnNvbWUoZXh0ZXJuYWxfaXRlbSA9PiBleHRlcm5hbF9pdGVtLmlkID09IGl0ZW0uaXRlbV9pZClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cblxuICAgIHByaXZhdGUgdXBkYXRlQ2FydEl0ZW1zID0gKGl0ZW1zKSA9PiB7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBpdGVtcztcbiAgICAgICAgdGhpcy5jb3VudCA9IGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgdGhpcy5jYXJ0SXRlbXNTdWJqZWN0Lm5leHQodGhpcy5pdGVtcyk7XG4gICAgICAgIHRoaXMudXBkYXRlTG9jYWxDYXJ0KCk7XG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaW5jcm9uaXphIGBjYXJ0SXRlbXNTdWJqZWN0YCBjb24gbGEgw7psdGltYSByZXNwdWVzdGEgZGVsIGJhY2tlbmQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2FydCBSZXNwdWVzdGEgZGUgY2Fycml0byByZWNpYmlkYSBkZXNkZSBjdWFscXVpZXIgZW5kcG9pbnQgcXVlIGRldnVlbHZhIGBpdGVtc2AuXG4gICAgICogQHJldHVybnMgYHZvaWRgXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFNlIHJldXRpbGl6YSBkZXNwdcOpcyBkZSBhY3R1YWxpemFyIGNhbnRpZGFkZXMsIGFwbGljYXIgY3Vww7NuIG8gcmVtb3ZlciBwcm9kdWN0b3MgcGFyYSBldml0YXJcbiAgICAgKiBxdWUgbGEgdGFibGEgcXVlZGUgY29uIHN1YnRvdGFsZXMgbyBwcm9tb2Npb25lcyBkZXNhY3R1YWxpemFkYXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzeW5jQ2FydEl0ZW1zRnJvbVJlc3BvbnNlID0gKGNhcnQpID0+IHtcbiAgICAgICAgaWYgKCFjYXJ0Py5pdGVtcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJldmlvdXNJdGVtcyA9IHRoaXMuaXRlbXMgfHwgW107XG4gICAgICAgIGNvbnN0IG5leHRJdGVtcyA9IHRoaXMudHJhbnNmb3JtSXRlbXMoY2FydC5pdGVtcykubWFwKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzSXRlbTogYW55ID0gcHJldmlvdXNJdGVtcy5maW5kKHByZXYgPT4gcHJldi5pdGVtX2lkID09IGl0ZW0uaXRlbV9pZCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnByZXZpb3VzSXRlbSxcbiAgICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICAgIGZhaWxlZDogcHJldmlvdXNJdGVtPy5mYWlsZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHByZXZpb3VzSXRlbT8uZXJyb3JcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlQ2FydEl0ZW1zKG5leHRJdGVtcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVDYXJ0SXRlbVF1YW50aXR5ID0gKHZhcmlhbnRfaWQsIHF1YW50aXR5LCBjb21tZW50cz86IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZENvbW1lbnRzID0gY29tbWVudHMgIT09IHVuZGVmaW5lZCA/IChjb21tZW50cyA/PyAnJykudHJpbSgpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IG5ld0l0ZW1zID0gdGhpcy5pdGVtcy5tYXAoaXQgPT4ge1xuICAgICAgICAgICAgaWYgKGl0LnZhcmlhbnRfaWQgIT09IHZhcmlhbnRfaWQpIHJldHVybiBpdDtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWQ6IGFueSA9IHsgLi4uaXQsIHF1YW50aXR5OiBOdW1iZXIocXVhbnRpdHkpIH07XG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZENvbW1lbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVkLmNvbW1lbnRzID0gbm9ybWFsaXplZENvbW1lbnRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaXRlbXMgPSBuZXdJdGVtcztcbiAgICAgICAgdGhpcy5jYXJ0SXRlbXNTdWJqZWN0Lm5leHQodGhpcy5pdGVtcyk7XG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICAgICAgdGhpcy51cGRhdGVMb2NhbENhcnQoKTtcbiAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ3Byb2R1Y3QtdXBkYXRlZCcsIHsgcXVhbnRpdHkgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcHBlbmRUb0NhcnQgPSAoY2FydCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZUNhcnRPYmooY2FydCk7XG4gICAgICAgIHRoaXMuc3luY0NhcnRJdGVtc0Zyb21SZXNwb25zZShjYXJ0KTtcbiAgICAgICAgLy8gICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ3Byb2R1Y3QtYWRkZWQnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZUNhcnRJdGVtID0gKGNhcnQsIHByb2R1Y3QsIHRvYXN0ID0gdHJ1ZSkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZUNhcnRPYmooY2FydCwgZmFsc2UpO1xuICAgICAgICB0aGlzLnN5bmNDYXJ0SXRlbXNGcm9tUmVzcG9uc2UoY2FydCk7XG4gICAgICAgIHRvYXN0ICYmIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICAgICAgdG9hc3QgJiYgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ3Byb2R1Y3QtcmVtb3ZlZCcpO1xuICAgICAgICAvLyB0aGlzLmdvb2dsZUFuYWx5dGljcy5yZW1vdmVGcm9tQ2FydChwcm9kdWN0KTtcbiAgICAgICAgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLmNhbGxFdmVudCgncmVtb3ZlX2Zyb21fY2FydCcsIHsgLi4ucHJvZHVjdCwgY3VycmVuY3k6IHRoaXMuY29uc3RzLmN1cnJlbmN5LmNvZGUgfSlcblxuICAgIH1cblxuICAgIHByaXZhdGUgYWRkSWZBbGxyZWFkeUV4aXN0cyA9IChwcm9kdWN0LCB2YXJpYW50X2lkLCBxdWFudGl0eUFkZCA9IDEsIGNvbW1lbnRzPzogc3RyaW5nIHwgbnVsbCkgPT5cbiAgICAgICAgdGhpcy5pdGVtcy5maW5kKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0ucHJvZHVjdC5pZCA9PSBwcm9kdWN0LmlkICYmIGl0ZW0udmFyaWFudF9pZCA9PSB2YXJpYW50X2lkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVJdGVtUXVhbnRpdHkoaXRlbSwgdGhpcy5maW5kSXRlbShwcm9kdWN0LmlkKS5xdWFudGl0eSArIHF1YW50aXR5QWRkLCBjb21tZW50cyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgcHJpdmF0ZSB1cGRhdGVMb2NhbENhcnQgPSAoKSA9PiB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYXJ0JywgSlNPTi5zdHJpbmdpZnkodGhpcy5pdGVtcykpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzZXRDYXJ0ID0gKG5leHQ/KSA9PiB7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBbXTtcbiAgICAgICAgdGhpcy5jYXJ0U3ViamVjdC5uZXh0KG51bGwpO1xuICAgICAgICB0aGlzLnVwZGF0ZUJhbGFuY2VBdHRyaWJ1dGVzKG51bGwpO1xuICAgICAgICB0aGlzLmNhcnRfdG9rZW4gPSBudWxsO1xuICAgICAgICB0aGlzLmNhcnRJdGVtc1N1YmplY3QubmV4dChbXSk7XG4gICAgICAgIHRoaXMuY291bnQgPSAwO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FydCcsIFwiW11cIik7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdjYXJ0X3Rva2VuJyk7XG4gICAgICAgIG5leHQgJiYgbmV4dCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ2FydE9iaiA9IChjYXJ0LCBlbWl0RXZlbnQgPSB0cnVlKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIHRoaXMuY2FydFN1YmplY3QubmV4dChjYXJ0KTtcbiAgICAgICAgdGhpcy51cGRhdGVCYWxhbmNlQXR0cmlidXRlcyhjYXJ0Py5iYWxhbmNlQ3VzdG9tZXIsIGNhcnQ/LnRvdGFscz8udG90YWwpO1xuICAgICAgICBlbWl0RXZlbnQgJiYgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLmNhbGxFdmVudCgnYWRkX3RvX2NhcnQnLCBjYXJ0KTtcbiAgICAgICAgdGhpcy5wcm9tb3Rpb25zU3ViamVjdC5uZXh0KHRoaXMub3JkZXJVdGlscy5nZXRQcm9tb3Rpb25zKGNhcnQsIHRydWUpKTtcblxuICAgICAgICBjYXJ0LmNvdXBvbkNvZGVcbiAgICAgICAgICAgID8gdGhpcy5mb3JtYXRDb3Vwb24oY2FydClcbiAgICAgICAgICAgIDogdGhpcy5jb3Vwb25TdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNJdGVtSW5Mb2NhbCA9IChpdGVtX2lkKSA9PiB0aGlzLml0ZW1zLnNvbWUoaXRlbSA9PiBpdGVtLml0ZW1faWQgPT0gaXRlbV9pZCk7XG5cbiAgICAvKipcbiAgICAgKiAgQHB1YmxpY1xuICAgICAqICBDQVJUIENSVURcbiAgICAgKi9cblxuICAgIGFkZFRvQ2FydCA9IChwcm9kdWN0OiBQcm9kdWN0LCBxdWFudGl0eTogbnVtYmVyLCB2YXJpYW50X2lkLCBjb21tZW50cz86IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAodGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLmdldFZhbHVlKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiYWxhbmNlID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0LnZhbHVlO1xuICAgICAgICBjb25zdCBhcHBseU1heE9yZGVycyA9IGJhbGFuY2U/LmFwcGx5TWF4T3JkZXJzID8/IGZhbHNlO1xuICAgICAgICBjb25zdCBtYXhPcmRlcnMgPSBiYWxhbmNlPy5tYXhPcmRlcnMgPz8gSW5maW5pdHk7XG5cbiAgICAgICAgaWYgKGFwcGx5TWF4T3JkZXJzICYmIChtYXhPcmRlcnMgPD0gMCB8fCBtYXhPcmRlcnMgPT09IG51bGwpKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbWF4LW9yZGVycy1yZWFjaGVkJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYXV0aFNlcnZpY2UuaXNBYmxlVG9CdXkoKSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ211c3Qtc2VsZWN0LWN1c3RvbWVyJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQodHJ1ZSk7XG4gICAgICAgIGxldCBhZGRlZCA9IHRoaXMuYWRkSWZBbGxyZWFkeUV4aXN0cyhwcm9kdWN0LCB2YXJpYW50X2lkLCBxdWFudGl0eSwgY29tbWVudHMpO1xuICAgICAgICBpZiAoIWFkZGVkKSB7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgcHJvZHVjdENvZGU6IHByb2R1Y3QuaWQsXG4gICAgICAgICAgICAgICAgcXVhbnRpdHk6IHF1YW50aXR5LFxuICAgICAgICAgICAgICAgIHZhcmlhbnRDb2RlOiB2YXJpYW50X2lkLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGNvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5jb21tZW50cyA9IGNvbW1lbnRzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmFkZEl0ZW1BcGkoKSwgcGF5bG9hZClcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgICByZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFuZWphciBsYSByZXNwdWVzdGEgSFRUUCBleGl0b3NhIChjw7NkaWdvIDIwMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kVG9DYXJ0KHJlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncHJvZHVjdC1hZGRlZCcpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFuZWphciBlbCBlcnJvciBkZSBsYSBsbGFtYWRhIEhUVFAgKGPDs2RpZ28gNTAwIHUgb3RybyBlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIuc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDw7NkaWdvIGRlIGVycm9yIDUwMCAodGltZW91dClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ0hhIG9jdXJyaWRvIHVuIGVycm9yIGFsIGFncmVnYXIgYWwgY2Fycml0by4gVnVlbHZhIGEgaW50ZW50YXJsby4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RybyBjw7NkaWdvIGRlIGVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdFcnJvciBpbmVzcGVyYWRvLiBWdWVsdmEgYSBpbnRlbnRhcmxvJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICB9XG5cblxuICAgIH1cblxuICAgIGFkZFRvTG90ID0gKHByb2R1Y3Q6IFByb2R1Y3QsIHF1YW50aXR5OiBudW1iZXIsIHZhcmlhbnRfaWQsIGlkPywgb3JkZXJfaXRlbV9pZD8sIGxvdF9xdWFudGl0eT8sIHVuaXRfcHJpY2U/LCB1bml0X3RvdGFsPywgYWp1c3RlbWVudF90b3RhbD8sIHRvdGFsX2xvdD8sIGxvdF9zdGF0dXM/LCBkYXRlX3JlcXVlc3Q/LCBub3Rlcz8sIHNoaXBwaW5nX2FkZHJlc3NfaWQ/LCBzaGlwcGluZ19hZGRyZXNzX25hbWU/LCBhY3Rpb24/KSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hdXRoU2VydmljZS5pc0FibGVUb0J1eSgpKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbXVzdC1zZWxlY3QtY3VzdG9tZXInKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWRkZWQgPSAnJztcbiAgICAgICAgIWFkZGVkICYmIHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMuYWRkSXRlbUFwaSgpLCB7IHByb2R1Y3RDb2RlOiBwcm9kdWN0LmlkLCBxdWFudGl0eTogcXVhbnRpdHksIHZhcmlhbnRDb2RlOiB2YXJpYW50X2lkLCBpZDogaWQgfHwgJycsIG9yZGVyX2l0ZW1faWQ6IG9yZGVyX2l0ZW1faWQgfHwgJycsIGxvdF9xdWFudGl0eTogbG90X3F1YW50aXR5IHx8ICcnLCB1bml0X3ByaWNlOiB1bml0X3ByaWNlIHx8ICcnLCB1bml0X3RvdGFsOiB1bml0X3RvdGFsIHx8ICcnLCBhanVzdGVtZW50X3RvdGFsOiBhanVzdGVtZW50X3RvdGFsIHx8ICcnLCB0b3RhbF9sb3Q6IHRvdGFsX2xvdCB8fCAnJywgbG90X3N0YXR1czogbG90X3N0YXR1cyB8fCAnJywgZGF0ZV9yZXF1ZXN0OiBkYXRlX3JlcXVlc3QgfHwgJycsIG5vdGVzOiBub3RlcyB8fCAnJywgc2hpcHBpbmdfYWRkcmVzc19pZDogc2hpcHBpbmdfYWRkcmVzc19pZCB8fCAnJywgc2hpcHBpbmdfYWRkcmVzc19uYW1lOiBzaGlwcGluZ19hZGRyZXNzX25hbWUgfHwgJycsIGFjdGlvbjogYWN0aW9uIHx8ICduZXdsb3QnIH0pXG4gICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgIHJlcyA9PiB0aGlzLmFwcGVuZFRvQ2FydChyZXMpLFxuICAgICAgICAgICAgICAgIGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycilcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgYWRkVG9DYXJ0UHJvbWlzZSA9IGFzeW5jIChwcm9kdWN0OiBQcm9kdWN0LCBxdWFudGl0eTogbnVtYmVyLCB2YXJpYW50X2lkLCBjb21tZW50cz86IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmF1dGhTZXJ2aWNlLmlzQWJsZVRvQnV5KCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtdXN0LXNlbGVjdC1jdXN0b21lcicpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KHRydWUpO1xuICAgICAgICBsZXQgYWRkZWQgPSB0aGlzLmFkZElmQWxscmVhZHlFeGlzdHMocHJvZHVjdCwgdmFyaWFudF9pZCwgcXVhbnRpdHksIGNvbW1lbnRzKTtcbiAgICAgICAgaWYgKCFhZGRlZCkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0ICh0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmFkZEl0ZW1BcGkoKSwgeyBwcm9kdWN0Q29kZTogcHJvZHVjdC5pZCwgcXVhbnRpdHk6IHF1YW50aXR5LCB2YXJpYW50Q29kZTogdmFyaWFudF9pZCB9KS50b1Byb21pc2UoKSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCB8fCByZXN1bHQuZXJyb3IpIHRoaXMuaGFuZGxlRXJyb3IocmVzdWx0LmVycm9yKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kVG9DYXJ0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGZhbHNlIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSB9XG4gICAgfVxuXG5cbiAgICBhZGRBbGxUb0NhcnQgPSAoaXRlbXM6IGFueVtdKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hdXRoU2VydmljZS5pc0FibGVUb0J1eSgpKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbXVzdC1zZWxlY3QtY3VzdG9tZXInKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7IGl0ZW1zOiB0aGlzLm1lcmdlSXRlbXNBZGRBbGxUb0NhcnQoaXRlbXMpIH07XG5cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5hZGRBbGxJdGVtc0FwaSgpLCBwYXJhbXMpXG4gICAgICAgICAgICAudG9Qcm9taXNlKCkudGhlbihcbiAgICAgICAgICAgICAgICByZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcnRPYmoocmVzLmNhcnQpICYmIHRoaXMudXBkYXRlQ2FydEl0ZW1zKHRoaXMudHJhbnNmb3JtSXRlbXMocmVzLmNhcnQuaXRlbXMpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLmNhcnRfcmVzcG9uc2Uuc3RhdHVzID09ICdzdWNjZXNzJyAmJiB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncHJvZHVjdHMtYWRkZWQnKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWRkUmVwZWF0T3JkZXJUb0NhcnQoaXRlbXM6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNhcnRJdGVtc1N1YmplY3QudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ2NhcnQtbm90LWVtcHR5Jyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYXV0aFNlcnZpY2UuaXNBYmxlVG9CdXkoKSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ211c3Qtc2VsZWN0LWN1c3RvbWVyJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXRlbXNUb0FkZCA9IGl0ZW1zLm1hcChpdGVtID0+ICh7XG4gICAgICAgICAgICBwcm9kdWN0Q29kZTogaXRlbS5wcm9kdWN0LmlkLFxuICAgICAgICAgICAgcXVhbnRpdHk6IGl0ZW0ucXVhbnRpdHksXG4gICAgICAgICAgICB2YXJpYW50Q29kZTogaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLmNvZGVcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGlmIChpdGVtc1RvQWRkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ25vLXByb2R1Y3RzLXRvLWFkZCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgaXRlbXM6IGl0ZW1zVG9BZGRcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcblxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmFkZEFsbEl0ZW1zQXBpKCksIHBhcmFtcylcbiAgICAgICAgICAgIC50b1Byb21pc2UoKVxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcblxuICAgICAgICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IHJlcy5lcnJvcj8udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICdfJykgfHwgJ3Vua25vd25fZXJyb3InO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdyhlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbXNSZXNwb25zZSA9IHJlcz8uaXRlbXNfcmVzcG9uc2UgfHwgW107XG4gICAgICAgICAgICAgICAgY29uc3QgY2FydEl0ZW1zID0gcmVzPy5jYXJ0Py5pdGVtcyB8fCBbXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG91dE9mU3RvY2tJdGVtcyA9IGl0ZW1zUmVzcG9uc2UuZmlsdGVyKGl0ZW0gPT5cbiAgICAgICAgICAgICAgICAgICAgaXRlbS5zdGF0dXMgPT09ICdmYWlsdXJlJyAmJlxuICAgICAgICAgICAgICAgICAgICBpdGVtLmVycm9ycy5zb21lKGVycm9yID0+IGVycm9yLmNvZGUgPT09ICdvdXRfb2Zfc3RvY2snKVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2FydEl0ZW1zLmxlbmd0aCA9PT0gMCAmJiBvdXRPZlN0b2NrSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnYWxsLXByb2R1Y3RzLW91dC1vZi1zdG9jaycpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG91dE9mU3RvY2tJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdzb21lLXByb2R1Y3RzLW91dC1vZi1zdG9jaycpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjYXJ0SXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcnRPYmoocmVzLmNhcnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcnRJdGVtcyh0aGlzLnRyYW5zZm9ybUl0ZW1zKGNhcnRJdGVtcykpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncHJvZHVjdHMtYWRkZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvY2FydCddKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWVyZ2VJdGVtc0FkZEFsbFRvQ2FydCA9IChpdGVtczogYW55W10pID0+IHtcbiAgICAgICAgbGV0IHBhcmFtc01lcmdlID0gW11cbiAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgbGV0IGl0ZW1JbnRlcm5vID0gaXRlbXMuZmluZChpdGVtUGFyYW0gPT4gaXRlbVBhcmFtLnZhcmlhbnRDb2RlID09IGl0ZW0udmFyaWFudF9pZClcbiAgICAgICAgICAgIHBhcmFtc01lcmdlLnB1c2goXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0Q29kZTogaXRlbS5wcm9kdWN0LmlkLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYW50Q29kZTogaXRlbS52YXJpYW50X2lkLFxuICAgICAgICAgICAgICAgICAgICBxdWFudGl0eTogaXRlbUludGVybm8gJiYgaXRlbUludGVybm8ucXVhbnRpdHkgfHwgaXRlbS5xdWFudGl0eVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgfSlcblxuICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpdGVtUGFyYW0gPT4gIXRoaXMuaXRlbXMuZmluZChpdGVtID0+IGl0ZW1QYXJhbS52YXJpYW50Q29kZSA9PSBpdGVtLnZhcmlhbnRfaWQpKVxuXG4gICAgICAgIHJldHVybiBbLi4uaXRlbXMsIC4uLnBhcmFtc01lcmdlXVxuICAgIH1cblxuICAgIHVwZGF0ZUl0ZW1RdWFudGl0eSA9IChpdGVtOiBDYXJ0SXRlbSwgcXVhbnRpdHksIGNvbW1lbnRzPzogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgICAgICBpZiAodGhpcy52YWxpZGF0ZVF1YW50aXR5KGl0ZW0sIHF1YW50aXR5KSAmJiAodGhpcy52YWxpZGF0ZVByaWNlQW5kQ3JlZGl0cyhpdGVtLCBxdWFudGl0eSkpKSB7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcblxuICAgICAgICAgICAgY29uc3QgcGF5bG9hZDogYW55ID0geyBxdWFudGl0eTogTnVtYmVyKHF1YW50aXR5KSB9O1xuICAgICAgICAgICAgaWYgKGNvbW1lbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGVhbmVkID0gKGNvbW1lbnRzID8/ICcnKS50cmltKCk7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5jb21tZW50cyA9IGNsZWFuZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblxuICAgICAgICAgICAgICAgIC5wdXQoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSXRlbVF1YW50aXR5QXBpKHRoaXMuZmluZEl0ZW1CeUlkVmFyaWFudChpdGVtLnZhcmlhbnRfaWQpKSxcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgICByZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYXJ0T2JqKHJlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmNDYXJ0SXRlbXNGcm9tUmVzcG9uc2UocmVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdwcm9kdWN0LXVwZGF0ZWQnLCB7IHF1YW50aXR5IH0pO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICB2YWxpZGF0ZVF1YW50aXR5ID0gKGl0ZW06IENhcnRJdGVtLCBxdWFudGl0eSkgPT4ge1xuICAgICAgICBpZiAoKHRoaXMuZ2V0Q291bnRGcm9tSXRlbUluQ2FydChpdGVtLnByb2R1Y3RDb2RlKSArIHF1YW50aXR5KSA+IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5tYXhpbXVtSXRlbXNRdWFudGl0eSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ21heGltdW0taXRlbXMtcXVhbnRpdHknLCB7IHF1YW50aXR5OiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ubWF4aW11bUl0ZW1zUXVhbnRpdHkgfSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIGlmICgodGhpcy5nZXRDb3VudEZyb21JdGVtSW5DYXJ0KGl0ZW0ucHJvZHVjdENvZGUpICsgcXVhbnRpdHkpIDwgaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLm1pbmltdW1JdGVtc1F1YW50aXR5KSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbWluaW11bS1pdGVtcy1xdWFudGl0eScsIHsgcXVhbnRpdHk6IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5taW5pbXVtSXRlbXNRdWFudGl0eSB9KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5tdWx0aXBsZVF1YW50aXR5ICYmIGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5tdWx0aXBsZVF1YW50aXR5ID4gMCkge1xuICAgICAgICAgICAgaWYgKCh0aGlzLmdldENvdW50RnJvbUl0ZW1JbkNhcnQoaXRlbS5wcm9kdWN0Q29kZSkgKyBxdWFudGl0eSkgJSBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ubXVsdGlwbGVRdWFudGl0eSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtdXN0LWJlLW11bHRpcGxlJywgeyBxdWFudGl0eTogaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLm11bHRpcGxlUXVhbnRpdHkgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2YWxpZGF0ZVByaWNlQW5kQ3JlZGl0cyA9IChpdGVtOiBDYXJ0SXRlbSwgcXVhbnRpdHk6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBiYWxhbmNlID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0LnZhbHVlO1xuXG4gICAgICAgIGlmICghYmFsYW5jZSB8fCBiYWxhbmNlLmNyZWRpdEFtb3VudCA9PT0gbnVsbCB8fCBiYWxhbmNlLmNyZWRpdEFtb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiYWxhbmNlLmFsbG93QW55UGF5bWVudE1ldGhvZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmFsYW5jZS5yZW1haW5pbmdDcmVkaXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVuaXRQcmljZSA9IGl0ZW0udG90YWwgLyBpdGVtLnF1YW50aXR5O1xuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUXVhbnRpdHkgPSBxdWFudGl0eSAtIGl0ZW0ucXVhbnRpdHk7XG5cbiAgICAgICAgaWYgKGFkZGl0aW9uYWxRdWFudGl0eSA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxDb3N0ID0gdW5pdFByaWNlICogYWRkaXRpb25hbFF1YW50aXR5O1xuXG4gICAgICAgIGlmIChhZGRpdGlvbmFsQ29zdCA+IGJhbGFuY2UucmVtYWluaW5nQ3JlZGl0cykge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ25vdC1lbm91Z2gtY3JlZGl0cycpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIHB1YmxpYyBoYXNTdWZmaWNpZW50Q3JlZGl0c0ZvckNhcnRUb3RhbCA9ICgpOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3QgYmFsYW5jZSA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyU3ViamVjdC52YWx1ZTtcblxuICAgICAgICBpZiAoIWJhbGFuY2UgfHwgYmFsYW5jZS5jcmVkaXRBbW91bnQgPT09IG51bGwgfHwgYmFsYW5jZS5jcmVkaXRBbW91bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmFsYW5jZS5hbGxvd0FueVBheW1lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJhbGFuY2UucmVtYWluaW5nQ3JlZGl0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbCA9IHRoaXMuY2FydFN1YmplY3QudmFsdWU/LnRvdGFscz8udG90YWwgfHwgMDtcblxuICAgICAgICAvLyBTaSBOTyBwdWVkZSBleGNlZGVyIHNhbGRvIHkgZWwgdG90YWwgc3VwZXJhIGVsIGNyZWRpdG8sIGJsb3F1ZWFyXG4gICAgICAgIGlmICghYmFsYW5jZS5hbGxvd0V4Y2VlZEJhbGFuY2UgJiYgdG90YWwgPiBiYWxhbmNlLmNyZWRpdEFtb3VudCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ25vdC1lbm91Z2gtY3JlZGl0cycpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIGNhbGN1bGF0ZVN0b2NrQ291bnRzID0gKGl0ZW06IENhcnRJdGVtLCBxdWFudGl0eSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5wcm9kdWN0LnN0b2NrIDwgaXRlbS5xdWFudGl0eSArIHF1YW50aXR5KSB7XG4gICAgICAgICAgICAvLyB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3V0LW9mLXN0b2NrJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGRlbGV0ZUNhcnRJdGVtID0gKGl0ZW0sIHRvYXN0ID0gdHJ1ZSkgPT4ge1xuICAgICAgICBsZXQgaWRfYnVzY2FkbyA9IHRoaXMuZmluZEl0ZW1CeUlkVmFyaWFudChpdGVtLnZhcmlhbnRfaWQpXG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KHRydWUpO1xuICAgICAgICAvLyAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmFkZEl0ZW1BcGkoKSwgeyBwcm9kdWN0Q29kZTogaXRlbS5wcm9kdWN0LmlkLCBxdWFudGl0eTogMCwgdmFyaWFudENvZGU6IGl0ZW0udmFyaWFudF9pZCwgaWQ6ICcnLCBvcmRlcl9pdGVtX2lkOiBpdGVtLml0ZW1faWQsIGxvdF9xdWFudGl0eTogJycsIHVuaXRfcHJpY2U6ICcnLCB1bml0X3RvdGFsOiAnJywgYWp1c3RlbWVudF90b3RhbDogJycsIHRvdGFsX2xvdDogJycsIGxvdF9zdGF0dXM6ICcnLCBkYXRlX3JlcXVlc3Q6ICcnLCBub3RlczogICcnLCBzaGlwcGluZ19hZGRyZXNzX2lkOiAnJywgc2hpcHBpbmdfYWRkcmVzc19uYW1lOiAnJywgYWN0aW9uOiAgJ2RlbGV0ZW9yZGVyaXRlbSd9KVxuICAgICAgICAvLyAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgLy8gICAgICAgICAgICByZXMgPT4gdGhpcy5yZW1vdmVDYXJ0SXRlbShyZXMsIGl0ZW0sIHRvYXN0KSxcbiAgICAgICAgLy8gICAgICAgICAgICBlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpXG4gICAgICAgIC8vICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZGVsZXRlKHRoaXMuZGVsZXRlSXRlbUFwaShpZF9idXNjYWRvKSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcmVzID0+IHsgdGhpcy5yZW1vdmVDYXJ0SXRlbShyZXMsIGl0ZW0sIHRvYXN0KTsgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpOyB9LFxuICAgICAgICAgICAgZXJyID0+IHsgdGhpcy5oYW5kbGVFcnJvcihlcnIpOyB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7IH0sXG4gICAgICAgIClcbiAgICB9XG5cbiAgICBjbGVhckNhcnQoKSB7XG4gICAgICAgIC8vc29sdWNpb24gcHJvdmlzYW9yaWFcbiAgICAgICAgbGV0IGl0ZW1zID0gWy4uLnRoaXMuaXRlbXNdXG4gICAgICAgIHdoaWxlIChpdGVtcyAmJiBpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZUNhcnRJdGVtKGl0ZW1zLnBvcCgpLCBmYWxzZSlcbiAgICAgICAgfVxuICAgICAgICAvL3RoaXMucmVzZXRDYXJ0KHRoaXMuZ2V0Q2FydCk7XG4gICAgfVxuXG4gICAgY2xlYXJBbmRSZXNldENhcnQoKSB7XG4gICAgICAgIHRoaXMucmVzZXRDYXJ0KHRoaXMuZ2V0Q2FydCk7XG4gICAgfVxuXG4gICAgY2xlYXJBbmRSZXNldEN1c3RvbWVyQ2FydCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJDbGVhcmluZyBhbmQgcmVzZXRpbmcuLi5cIilcbiAgICAgICAgdGhpcy5yZXNldENhcnQodGhpcy5nZXRDYXJ0QnlDdXN0b21lcilcbiAgICB9XG5cbiAgICBoYW5kbGVFcnJvciA9IChlcnJvcjogeyBlcnJvcjogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ29wZXJhdGlvbi1lcnJvci1wYXJhbScpO1xuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgfVxuXG4gICAgZ2V0Q291bnRGcm9tSXRlbUluQ2FydCA9IChjb2RlVmFyaWFudCk6IG51bWJlciA9PiB0aGlzLml0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtLnZhcmlhbnRfaWQgPT0gY29kZVZhcmlhbnQpPy5xdWFudGl0eSB8fCAwO1xuXG4gICAgZmluZEl0ZW1CeUlkVmFyaWFudCA9ICh2YXJpYW50X2lkKSA9PiB0aGlzLml0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtLnZhcmlhbnRfaWQgPT0gdmFyaWFudF9pZCkuaXRlbV9pZFxuXG4gICAgZmluZEl0ZW0gPSAocHJvZHVjdF9pZCkgPT4gdGhpcy5pdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS5wcm9kdWN0LmlkID09IHByb2R1Y3RfaWQpO1xuXG4gICAgLyoqIERBVEEgRk9SIE9USEVSIFNFUlZJQ0VTICovXG4gICAgZ2V0Q2FydFRva2VuID0gKCkgPT4gdGhpcy5jYXJ0X3Rva2VuO1xuXG4gICAgZ2V0TG9jYWxlID0gKCkgPT4gdGhpcy5sb2NhbGU7XG5cbiAgICBnZXRUb3RhbEFtb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiBjYXJ0Py50b3RhbHM/LnRvdGFsKSk7XG5cbiAgICAvKiogVG90YWwgcGFyYSBjYXJyaXRvL3NpZGViYXIsIHNpbiBlbnbDrW8gcGVyc2lzdGlkbyBuaSByZWNhcmdvcyBkZSBjaGVja291dC4gKi9cbiAgICBnZXRDYXJ0VG90YWxBbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gdGhpcy5vcmRlclV0aWxzLmdldENhcnRUb3RhbEFtb3VudChjYXJ0KSkpO1xuXG4gICAgZ2V0Q291bnRDYXJ0SXRlbXMgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydEl0ZW1zLnBpcGUobWFwKChjYXJ0SXRlbXMpID0+IGNhcnRJdGVtcz8ubGVuZ3RoKSk7XG5cbiAgICBnZXRUYXhlc0Ftb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiBjYXJ0Py50b3RhbHM/LnRheGVzID4gMCA/IGNhcnQ/LnRvdGFscz8udGF4ZXMgOiAwKSk7XG5cbiAgICBnZXRTdWJUb3RhbEFtb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiB0aGlzLm9yZGVyVXRpbHMuZ2V0U3VtbWFyeVN1YnRvdGFsQW1vdW50KGNhcnQpKSk7XG5cbiAgICBnZXRDYXJ0VGF4ZXNBbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gdGhpcy5vcmRlclV0aWxzLmdldENhcnRUYXhlc0Ftb3VudChjYXJ0KSkpO1xuXG4gICAgZ2V0Q2FydENsaWVudFRheGVzQW1vdW50ID0gKCk6IE9ic2VydmFibGU8bnVtYmVyPiA9PlxuICAgICAgICB0aGlzLmNhcnQucGlwZShtYXAoKGNhcnQpID0+IHRoaXMub3JkZXJVdGlscy5nZXRDYXJ0Q2xpZW50VGF4ZXNBbW91bnQoY2FydCkpKTtcblxuICAgIC8qKlxuICAgICAqIERldnVlbHZlIGVsIGRlc2N1ZW50byBxdWUgZGViZSBtb3N0cmFyc2UgZW4gZWwgcmVzdW1lbiBkZSBjb21wcmEuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIGNvbiBlbCBtb250byBkZSBwcm9tb2Npb25lcyBkZSBvcmRlbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiB0aGlzLnN1bW1hcnlQcm9tb3Rpb25BbW91bnQkID0gdGhpcy5jYXJ0U2VydmljZS5nZXRTdW1tYXJ5UHJvbW90aW9uQW1vdW50KCk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFNpIGVsIGJhY2tlbmQgbnVldm8gaW5mb3JtYSBgdG90YWxzLm9yZGVyRGlzY291bnRgLCBzZSB1c2EgZXNlIHZhbG9yLlxuICAgICAqIEVuIHN1IGF1c2VuY2lhLCBwcmlvcml6YSBgdG90YWxzLnByb21vdGlvbkJyZWFrZG93bi5vcmRlclByb21vdGlvbnNgIHlcbiAgICAgKiBsdWVnbyBoYWNlIGZhbGxiYWNrIGEgYHRvdGFscy5wcm9tb3Rpb25gIHBhcmEgbWFudGVuZXIgY29tcGF0aWJpbGlkYWQuXG4gICAgICovXG4gICAgZ2V0U3VtbWFyeVByb21vdGlvbkFtb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiB0aGlzLmdldENhcnRTdW1tYXJ5UHJpY2VQcmVzZW50YXRpb24oY2FydCkub3JkZXJEaXNjb3VudCkpO1xuXG4gICAgLyoqIERlc2N1ZW50byBlc3BlY8OtZmljbyBkZWwgY3Vww7NuLCBzaSBlbCBiYWNrZW5kIGxvIGluZm9ybWEgcG9yIHNlcGFyYWRvLiAqL1xuICAgIGdldENvdXBvblByb21vdGlvbkFtb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bGw+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gdGhpcy5nZXRDYXJ0U3VtbWFyeVByaWNlUHJlc2VudGF0aW9uKGNhcnQpLmNvdXBvbkRpc2NvdW50KSk7XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2Egc2kgZXhpc3RlIHVuIGN1cMOzbiBhcGxpY2FkbyBlbiBlbCBjYXJyaXRvIGFjdHVhbC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIE9ic2VydmFibGUgYm9vbGVhbm8gcGFyYSBjb250cm9sYXIgbGEgdmlzaWJpbGlkYWQgZGUgYFF1aXRhciBjdXDDs25gLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBObyBkZWJlIGF0YXJzZSBhIGBnZXRTdW1tYXJ5UHJvbW90aW9uQW1vdW50KClgLCBwb3JxdWUgdW4gY3Vww7NuIHB1ZWRlIGFmZWN0YXJcbiAgICAgKiBzb2xvIHByb21vY2lvbmVzIHVuaXRhcmlhcyB5IGRlamFyIGVsIGRlc2N1ZW50byBkZSBvcmRlbiBlbiBgMGAuXG4gICAgICovXG4gICAgaGFzQXBwbGllZENvdXBvbiA9ICgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gdGhpcy5vcmRlclV0aWxzLmhhc0FwcGxpZWRDb3Vwb24oY2FydCkpKTtcblxuICAgIHRvRGVjaW1hbCA9ICh0b3RhbCkgPT4gKHRvdGFsIC0gTWF0aC5mbG9vcih0b3RhbCkgPT0gMCkgPyB0b3RhbCAvIDEwMCA6IHRvdGFsXG5cbiAgICBnZXREaXNjb3VudCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jYXJ0SXRlbXMucGlwZShtYXAoKHByb2R1Y3QpID0+IHtcbiAgICAgICAgICAgIGxldCB0b3RhbCA9IHRoaXMuaXRlbXMucmVkdWNlKChwcmV2LCBjdXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXYgKyBjdXJyLnByb2R1Y3Quc2FsZXByaWNlICogY3Vyci5xdWFudGl0eTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgbGV0IHN1YnRvdGFsID0gdGhpcy5pdGVtcy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldiArIGN1cnIucHJvZHVjdC5wcmljZSAqIGN1cnIucXVhbnRpdHk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIHJldHVybiBzdWJ0b3RhbCAtIHRvdGFsO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT2J0aWVuZSBlbCBwcmVjaW8gbm9ybWFsaXphZG8gZGUgdW4gw610ZW0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbSDDjXRlbSBkZSBjYXJyaXRvIG5vcm1hbGl6YWRvLlxuICAgICAqIEByZXR1cm5zIE9iamV0byBgQ2FydEl0ZW1QcmljaW5nYCBsaXN0byBwYXJhIHJlbmRlcml6YXIgcHJlY2lvIGJhc2UsIHRhY2hhZG8geSBmaW5hbC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBwcmljaW5nID0gdGhpcy5jYXJ0U2VydmljZS5nZXRJdGVtUHJpY2luZyhpdGVtKTtcbiAgICAgKiBjb25zdCBzaG93VG9vbHRpcCA9IHByaWNpbmcuaGFzVW5pdFByb21vdGlvbnM7XG4gICAgICogY29uc3QgZmluYWxQcmljZSA9IHByaWNpbmcuZmluYWxQcmljZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXRJdGVtUHJpY2luZyA9IChpdGVtOiBDYXJ0SXRlbSk6IENhcnRJdGVtUHJpY2luZyA9PiBpdGVtPy5wcmljaW5nIHx8IHRoaXMuYnVpbGRDYXJ0SXRlbVByaWNpbmcoaXRlbSk7XG5cbiAgICAvKiogUmVzdWVsdmUgbGEgcHJlc2VudGFjacOzbiBudWV2YSBkZSB1bmEgbMOtbmVhIHkgY29uc2VydmEgZWwgZmFsbGJhY2sgbGVnYWN5LiAqL1xuICAgIGdldENhcnRJdGVtUHJpY2VQcmVzZW50YXRpb24gPSAoaXRlbTogQ2FydEl0ZW0sIGNoYW5uZWw/OiBDaGFubmVsKTogQ2FydEl0ZW1QcmljZVByZXNlbnRhdGlvbiA9PlxuICAgICAgICB0aGlzLnByaWNlUHJlc2VudGF0aW9uU2VydmljZS5nZXRDYXJ0SXRlbVByaWNlUHJlc2VudGF0aW9uKFxuICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgIGNoYW5uZWwgfHwgdGhpcy5jaGFubmVsQ29uZmlnLFxuICAgICAgICAgICAgaXRlbT8ubGluZVByaWNpbmcgPyB1bmRlZmluZWQgOiB0aGlzLmdldEl0ZW1QcmljaW5nKGl0ZW0pXG4gICAgICAgICk7XG5cbiAgICAvKiogUmVzdWVsdmUgZWwgcmVzdW1lbiB2aXNpYmxlIHVzYW5kbyBsaW5lUHJpY2luZyBzaW4gY29udmVydGlyIGltcG9ydGVzIGZpc2NhbGVzLiAqL1xuICAgIGdldENhcnRTdW1tYXJ5UHJpY2VQcmVzZW50YXRpb24gPSAoXG4gICAgICAgIGNhcnQ6IGFueSA9IHRoaXMuY2FydFN1YmplY3QudmFsdWUsXG4gICAgICAgIGNoYW5uZWw/OiBDaGFubmVsLFxuICAgICAgICBpbmNsdWRlU2hpcHBpbmc6IGJvb2xlYW4gPSBmYWxzZVxuICAgICk6IENhcnRTdW1tYXJ5UHJpY2VQcmVzZW50YXRpb24gPT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZUl0ZW1zID0gQXJyYXkuaXNBcnJheShjYXJ0Py5pdGVtcykgJiYgY2FydC5pdGVtcy5sZW5ndGggPyBjYXJ0Lml0ZW1zIDogbnVsbDtcbiAgICAgICAgY29uc3QgaXRlbXM6IENhcnRJdGVtW10gPSAocmVzcG9uc2VJdGVtcyB8fCAodGhpcy5jYXJ0SXRlbXNTdWJqZWN0LnZhbHVlIHx8IFtdKSlcbiAgICAgICAgICAgIC5tYXAoaXRlbSA9PiB0aGlzLm5vcm1hbGl6ZUNhcnRJdGVtUHJpY2luZyhpdGVtKSk7XG4gICAgICAgIGNvbnN0IGhhc0xpbmVQcmljaW5nID0gaXRlbXMubGVuZ3RoID4gMCAmJiBpdGVtcy5ldmVyeShpdGVtID0+ICEhaXRlbT8ubGluZVByaWNpbmcpO1xuICAgICAgICBjb25zdCBzaG93R3Jvc3MgPSAoY2hhbm5lbCB8fCB0aGlzLmNoYW5uZWxDb25maWcpPy5zaG93UHJpY2VXaXRoVGF4ZXNXaGlsZUJyb3dzaW5nID09PSB0cnVlO1xuICAgICAgICBjb25zdCBwcmljaW5nS2V5ID0gc2hvd0dyb3NzID8gJ2dyb3NzJyA6ICduZXQnO1xuICAgICAgICBjb25zdCB0YXhlcyA9IHRoaXMub3JkZXJVdGlscy5nZXRDYXJ0VGF4ZXNBbW91bnQoY2FydCk7XG4gICAgICAgIGNvbnN0IGNsaWVudFRheGVzID0gdGhpcy5vcmRlclV0aWxzLmdldENhcnRDbGllbnRUYXhlc0Ftb3VudChjYXJ0KTtcbiAgICAgICAgY29uc3QgbGVnYWN5U2hpcHBpbmcgPSBpbmNsdWRlU2hpcHBpbmcgPyB0aGlzLm9yZGVyVXRpbHMuZ2V0U3VtbWFyeVNoaXBtZW50QW1vdW50KGNhcnQpIDogbnVsbDtcbiAgICAgICAgY29uc3Qgc2hpcHBpbmdQcmljaW5nID0gdGhpcy5nZXRUb3RhbHNQcmljaW5nKGNhcnQsICdzaGlwcGluZ19wcmljaW5nJywgJ3NoaXBwaW5nUHJpY2luZycpO1xuICAgICAgICBjb25zdCBzaGlwcGluZyA9IGluY2x1ZGVTaGlwcGluZ1xuICAgICAgICAgICAgPyAoc2hpcHBpbmdQcmljaW5nID8gc2hpcHBpbmdQcmljaW5nW3ByaWNpbmdLZXldIDogbGVnYWN5U2hpcHBpbmcpXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gaW5jbHVkZVNoaXBwaW5nXG4gICAgICAgICAgICA/IE51bWJlcihjYXJ0Py50b3RhbHM/LnRvdGFsIHx8IDApXG4gICAgICAgICAgICA6IHRoaXMub3JkZXJVdGlscy5nZXRDYXJ0VG90YWxBbW91bnQoY2FydCk7XG4gICAgICAgIGNvbnN0IG9yZGVyRGlzY291bnRQcmljaW5nID0gdGhpcy5nZXRUb3RhbHNQcmljaW5nKGNhcnQsICdvcmRlcl9kaXNjb3VudF9wcmljaW5nJywgJ29yZGVyRGlzY291bnRQcmljaW5nJyk7XG4gICAgICAgIGNvbnN0IGNvdXBvbkRpc2NvdW50UHJpY2luZyA9IHRoaXMuZ2V0VG90YWxzUHJpY2luZyhjYXJ0LCAnY291cG9uX2Rpc2NvdW50X3ByaWNpbmcnLCAnY291cG9uRGlzY291bnRQcmljaW5nJyk7XG4gICAgICAgIGNvbnN0IGNvdXBvbkRpc2NvdW50ID0gY291cG9uRGlzY291bnRQcmljaW5nXG4gICAgICAgICAgICA/IGNvdXBvbkRpc2NvdW50UHJpY2luZ1twcmljaW5nS2V5XVxuICAgICAgICAgICAgOiB0aGlzLm9yZGVyVXRpbHMuZ2V0Q291cG9uUHJvbW90aW9uQW1vdW50KGNhcnQpO1xuICAgICAgICBjb25zdCBvcmRlckRpc2NvdW50ID0gb3JkZXJEaXNjb3VudFByaWNpbmdcbiAgICAgICAgICAgID8gb3JkZXJEaXNjb3VudFByaWNpbmdbcHJpY2luZ0tleV1cbiAgICAgICAgICAgIDogdGhpcy5vcmRlclV0aWxzLmdldE9yZGVyUHJvbW90aW9uQW1vdW50XG4gICAgICAgICAgICAgICAgPyB0aGlzLm9yZGVyVXRpbHMuZ2V0T3JkZXJQcm9tb3Rpb25BbW91bnQoY2FydClcbiAgICAgICAgICAgICAgICA6IHRoaXMub3JkZXJVdGlscy5nZXRTdW1tYXJ5UHJvbW90aW9uQW1vdW50KGNhcnQpO1xuXG4gICAgICAgIGlmIChoYXNMaW5lUHJpY2luZykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBwcm9kdWN0c0JlZm9yZURpc2NvdW50czogaXRlbXMucmVkdWNlKCh0b3RhbCwgaXRlbTogYW55KSA9PlxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArIE51bWJlcihpdGVtLmxpbmVQcmljaW5nLnVuaXRbcHJpY2luZ0tleV0gfHwgMCkgKiBOdW1iZXIoaXRlbS5xdWFudGl0eSB8fCAwKSwgMCksXG4gICAgICAgICAgICAgICAgbGluZURpc2NvdW50czogaXRlbXMucmVkdWNlKCh0b3RhbCwgaXRlbTogYW55KSA9PlxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArIE51bWJlcihpdGVtLmxpbmVQcmljaW5nLmRpc2NvdW50W3ByaWNpbmdLZXldIHx8IDApLCAwKSxcbiAgICAgICAgICAgICAgICBzdWJ0b3RhbDogaXRlbXMucmVkdWNlKCh0b3RhbCwgaXRlbTogYW55KSA9PlxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArIE51bWJlcihpdGVtLmxpbmVQcmljaW5nLnN1YnRvdGFsW3ByaWNpbmdLZXldIHx8IDApLCAwKSxcbiAgICAgICAgICAgICAgICBvcmRlckRpc2NvdW50LFxuICAgICAgICAgICAgICAgIGNvdXBvbkRpc2NvdW50LFxuICAgICAgICAgICAgICAgIHRheGVzLFxuICAgICAgICAgICAgICAgIGNsaWVudFRheGVzLFxuICAgICAgICAgICAgICAgIHNoaXBwaW5nLFxuICAgICAgICAgICAgICAgIHRvdGFsLFxuICAgICAgICAgICAgICAgIHRheGVzSW5jbHVkZWRJblRvdGFsOiBzaG93R3Jvc3MgJiYgdGF4ZXMgIT09IDAsXG4gICAgICAgICAgICAgICAgc291cmNlOiAnbGluZVByaWNpbmcnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByb2R1Y3RzQmVmb3JlRGlzY291bnRzOiAwLFxuICAgICAgICAgICAgbGluZURpc2NvdW50czogMCxcbiAgICAgICAgICAgIHN1YnRvdGFsOiB0aGlzLm9yZGVyVXRpbHMuZ2V0U3VtbWFyeVN1YnRvdGFsQW1vdW50KGNhcnQpLFxuICAgICAgICAgICAgb3JkZXJEaXNjb3VudCxcbiAgICAgICAgICAgIGNvdXBvbkRpc2NvdW50LFxuICAgICAgICAgICAgdGF4ZXMsXG4gICAgICAgICAgICBjbGllbnRUYXhlcyxcbiAgICAgICAgICAgIHNoaXBwaW5nLFxuICAgICAgICAgICAgdG90YWwsXG4gICAgICAgICAgICB0YXhlc0luY2x1ZGVkSW5Ub3RhbDogZmFsc2UsXG4gICAgICAgICAgICBzb3VyY2U6ICdsZWdhY3knXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIC8qKiBOb3JtYWxpemEgc8OzbG8gZWwgYWxpYXMgc2VyaWFsaXphZG8gZGVsIGNvbnRyYXRvIGRlIGzDrW5lYS4gKi9cbiAgICBwcml2YXRlIG5vcm1hbGl6ZUNhcnRJdGVtUHJpY2luZyA9IChpdGVtOiBhbnkpOiBDYXJ0SXRlbSA9PiAoe1xuICAgICAgICAuLi5pdGVtLFxuICAgICAgICBsaW5lUHJpY2luZzogaXRlbT8ubGluZVByaWNpbmcgfHwgaXRlbT8ubGluZV9wcmljaW5nXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBMZWUgZWwgY29udHJhdG8gbnVldm8gc2luIGNvbmZ1bmRpciB1biBvYmpldG8gdsOhbGlkbyBjb24gZmFsbGJhY2sgbGVnYWN5LFxuICAgICAqIGluY2x1c28gY3VhbmRvIHRvZG9zIHN1cyBpbXBvcnRlcyBzb24gY2Vyby5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFRvdGFsc1ByaWNpbmcgPSAoXG4gICAgICAgIGNhcnQ6IGFueSxcbiAgICAgICAgc25ha2VDYXNlS2V5OiBrZXlvZiBDYXJ0VG90YWxzUHJpY2luZyxcbiAgICAgICAgY2FtZWxDYXNlS2V5OiBrZXlvZiBDYXJ0VG90YWxzUHJpY2luZ1xuICAgICk6IENhcnRUb3RhbFByaWNpbmdWYWx1ZSB8IG51bGwgPT4ge1xuICAgICAgICBjb25zdCB0b3RhbHMgPSBjYXJ0Py50b3RhbHMgfHwge307XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdG90YWxzW3NuYWtlQ2FzZUtleV0gPz8gdG90YWxzW2NhbWVsQ2FzZUtleV07XG4gICAgICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghW3ZhbHVlLm5ldCwgdmFsdWUudGF4LCB2YWx1ZS5ncm9zc10uZXZlcnkoYW1vdW50ID0+IE51bWJlci5pc0Zpbml0ZShOdW1iZXIoYW1vdW50KSkpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmV0OiBOdW1iZXIodmFsdWUubmV0KSxcbiAgICAgICAgICAgIHRheDogTnVtYmVyKHZhbHVlLnRheCksXG4gICAgICAgICAgICBncm9zczogTnVtYmVyKHZhbHVlLmdyb3NzKVxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBhZGRDb3Vwb24gPSBhc3luYyAoY29kZSk6IFByb21pc2U8YW55PiA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5jb25uZWN0aW9uLnB1dCh0aGlzLmNvdXBvbkFwaSgpLCB7IGNvdXBvbjogY29kZSB9KS50b1Byb21pc2UoKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuZXJyb3IgfHwgcmVzdWx0LmVycm9ycykgcmV0dXJuIHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6ICdpbnZhbGlkLWNvdXBvbicgfTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FydE9iaihyZXN1bHQsIGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuc3luY0NhcnRJdGVtc0Zyb21SZXNwb25zZShyZXN1bHQpO1xuICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGZhbHNlLCBtZXNzYWdlOiAnb2snIH07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiAnaW52YWxpZC1jb3Vwb24nIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmVDb3Vwb24gPSBhc3luYyAoKSA9PiB0aGlzLmNvbm5lY3Rpb24uZGVsZXRlKHRoaXMuY291cG9uQXBpKCkpLnBpcGUobWFwKHJlcyA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FydE9iaihyZXMsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5zeW5jQ2FydEl0ZW1zRnJvbVJlc3BvbnNlKHJlcyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pKS50b1Byb21pc2UoKTtcblxuICAgIGZvcm1hdENvdXBvbiA9IChjYXJ0KSA9PiB7XG4gICAgICAgIGxldCBjdXJyZW50X2NvdXBvbiA9IHRoaXMuY291cG9uU3ViamVjdC52YWx1ZTtcbiAgICAgICAgbGV0IGNvdXBvbjogQ291cG9uSSA9IHsgY29kZTogY2FydC5jb3Vwb25Db2RlIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBPYmplY3Qua2V5cyhjYXJ0LmNhcnREaXNjb3VudHMpWzBdO1xuICAgICAgICAgICAgY291cG9uID0ge1xuICAgICAgICAgICAgICAgIC4uLmNvdXBvbixcbiAgICAgICAgICAgICAgICBhbW91bnQ6IChjYXJ0LmNhcnREaXNjb3VudHMgJiYgY2FydC5jYXJ0RGlzY291bnRzW2tleV0uYW1vdW50LmN1cnJlbnQpIHx8IDAsXG4gICAgICAgICAgICAgICAgbmFtZTogKGNhcnQuY2FydERpc2NvdW50cyAmJiBjYXJ0LmNhcnREaXNjb3VudHNba2V5XS5uYW1lKSB8fCAnbm8tbmFtZSdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICAoY291cG9uICE9IGN1cnJlbnRfY291cG9uKSAmJiB0aGlzLmNvdXBvblN1YmplY3QubmV4dChjb3Vwb24pO1xuICAgIH1cblxuICAgIGNoYW5nZUhhdmVUb1VwZGF0ZSA9ICh2YWx1ZSkgPT4gdGhpcy5oYXZlX3RvX3VwZGF0ZSA9IHZhbHVlO1xuXG4gICAgcmVhZHlGb3JDaGVja291dCA9IChzdWNjZXNzQ2FsbGJhY2s/OiBGdW5jdGlvbiwgZXJyb3JDYWxsYmFjaz86IEZ1bmN0aW9uKTogQ2FydEFmZm9yZGFibGUgPT4ge1xuICAgICAgICBsZXQgY2FydCA9IHRoaXMuY2FydFN1YmplY3QudmFsdWU7XG4gICAgICAgIGxldCBpdGVtcyA9IHRoaXMuY2FydEl0ZW1zU3ViamVjdC52YWx1ZTtcbiAgICAgICAgbGV0IHJlc3VsdDogQ2FydEFmZm9yZGFibGUgPSB7IG9rOiB0cnVlIH07XG4gICAgICAgIGlmIChpdGVtcy5sZW5ndGggPCB0aGlzLmNoYW5uZWxDb25maWcubWluaW11bVF1YW50aXR5UHVyY2hhc2VJdGVtcykge1xuICAgICAgICAgICAgcmVzdWx0Lm9rID0gZmFsc2U7IHJlc3VsdC5yZWFzb25zLnB1c2goeyBtZXNzYWdlOiAnbm90LWVub3VnaHQtaXRlbXMnIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhcnQudG90YWxzLnRvdGFsIDwgdGhpcy5jaGFubmVsQ29uZmlnLm1pbmltdW1QdXJjaGFzZUFtb3VudCkge1xuICAgICAgICAgICAgcmVzdWx0Lm9rID0gZmFsc2U7IHJlc3VsdC5yZWFzb25zLnB1c2goeyBtZXNzYWdlOiAnbm90LWVub3VnaHQtYW1vdW50JyB9KVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdWNjZXNzQ2FsbGJhY2sgfHwgZXJyb3JDYWxsYmFjaykge1xuICAgICAgICAgICAgcmVzdWx0Lm9rXG4gICAgICAgICAgICAgICAgPyBzdWNjZXNzQ2FsbGJhY2sgJiYgc3VjY2Vzc0NhbGxiYWNrKClcbiAgICAgICAgICAgICAgICA6IGVycm9yQ2FsbGJhY2sgJiYgZXJyb3JDYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdXBkYXRlSXRlbXNPbkVycm9yID0gKGl0ZW1zV2l0aEVycm9yOiBhbnlbXSwgY29kZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW1zV2l0aEVycm9yKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5pdGVtcyk7XG4gICAgICAgIGxldCBpdGVtc1VwZGF0ZWQgPSB0aGlzLml0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGxldCBpdGVtV2l0aEVycm9yID0gaXRlbXNXaXRoRXJyb3IuZmluZChmYWlsZWRJdGVtID0+IGl0ZW0uaXRlbV9pZCA9PSBmYWlsZWRJdGVtLmlkKTtcbiAgICAgICAgICAgIGlmIChpdGVtV2l0aEVycm9yKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5mYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGl0ZW0uZXJyb3IgPSBjb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0pXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW1zVXBkYXRlZCk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FydEl0ZW1zKGl0ZW1zVXBkYXRlZCk7XG4gICAgfVxuXG4gICAgbG9hZENhcnRCeVRva2VuID0gYXN5bmMgKHRva2VuOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5jYXJ0X3Rva2VuID0gdG9rZW5cbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0Q2FydEJ5VG9rZW4oKVxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIFVUSUxTXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm1hIGxvcyDDrXRlbXMgY3J1ZG9zIGRlbCBiYWNrZW5kIGFsIGNvbnRyYXRvIGludGVybm8gYENhcnRJdGVtYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZXJ2ZXJfaXRlbSBSZXNwdWVzdGEgYGl0ZW1zYCBkZWwgZW5kcG9pbnQgZGUgY2Fycml0by5cbiAgICAgKiBAcmV0dXJucyBBcnJlZ2xvIGRlIMOtdGVtcyBub3JtYWxpemFkb3MsIGNhZGEgdW5vIGNvbiBgcHJpY2luZ2AgcHJlY29tcHV0YWRvLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBFc3RlIGVzIGVsIHB1bnRvIGRvbmRlIGVsIGNvcmU6XG4gICAgICogLSBwcmVzZXJ2YSBgdW5pdFByb21vdGlvbnNgXG4gICAgICogLSBhcm1hIGBwcmljaW5nYFxuICAgICAqIC0gbWFudGllbmUgbGEgZm9ybWEgaGlzdMOzcmljYSBkZWwgaXRlbSBjb25zdW1pZG8gcG9yIGxvcyB0ZW1wbGF0ZXNcbiAgICAgKi9cbiAgICB0cmFuc2Zvcm1JdGVtcyA9IChzZXJ2ZXJfaXRlbSkgPT4gc2VydmVyX2l0ZW0ubWFwKFxuICAgICAgICBpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0gPSB7XG4gICAgICAgICAgICAgICAgcHJvZHVjdDogaXRlbS5wcm9kdWN0LFxuICAgICAgICAgICAgICAgIHZhcmlhbnRfaWQ6IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5jb2RlLFxuICAgICAgICAgICAgICAgIGxvdDogaXRlbS5vcmRlckl0ZW1Mb3QsXG4gICAgICAgICAgICAgICAgcXVhbnRpdHk6IGl0ZW0ucXVhbnRpdHksXG4gICAgICAgICAgICAgICAgY29tbWVudHM6IGl0ZW0uY29tbWVudHMgfHwgJycsXG4gICAgICAgICAgICAgICAgaXRlbV9pZDogaXRlbS5pZCxcbiAgICAgICAgICAgICAgICB0b3RhbDogaXRlbS50b3RhbCxcbiAgICAgICAgICAgICAgICB1bml0UHJpY2U6IGl0ZW0udW5pdFByaWNlID8/IGl0ZW0udW5pdF9wcmljZSxcbiAgICAgICAgICAgICAgICBkaXNjb3VudDogaXRlbS5kaXNjb3VudCxcbiAgICAgICAgICAgICAgICBzdWJ0b3RhbDogaXRlbS5zdWJ0b3RhbCxcbiAgICAgICAgICAgICAgICB0YXhUb3RhbDogaXRlbS50YXhUb3RhbCA/PyBpdGVtLnRheF90b3RhbCxcbiAgICAgICAgICAgICAgICB1bml0UHJvbW90aW9uczogQXJyYXkuaXNBcnJheShpdGVtLnVuaXRQcm9tb3Rpb25zKVxuICAgICAgICAgICAgICAgICAgICA/IGl0ZW0udW5pdFByb21vdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgOiAoQXJyYXkuaXNBcnJheShpdGVtLnVuaXRfcHJvbW90aW9ucykgPyBpdGVtLnVuaXRfcHJvbW90aW9ucyA6IFtdKSxcbiAgICAgICAgICAgICAgICBsaW5lUHJpY2luZzogaXRlbS5saW5lUHJpY2luZyB8fCBpdGVtLmxpbmVfcHJpY2luZyxcbiAgICAgICAgICAgICAgICBsaW5lX3ByaWNpbmc6IGl0ZW0ubGluZV9wcmljaW5nXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVtLnByaWNpbmcgPSB0aGlzLmJ1aWxkQ2FydEl0ZW1QcmljaW5nKGl0ZW0pO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5zYWxlcHJpY2UpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnByaWNlKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5zYWxlcHJpY2UgPiAwID8gaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnNlbGVwcmljZSA6IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5wcmljZSk7XG4gICAgICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIC8vICAgICBpdGVtLnByb2R1Y3QucHJpY2UgPSBpdGVtLnRvdGFsIC8gaXRlbS5xdWFudGl0eS8vID8gaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLnNlbGVwcmljZSA6IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5wcmljZTtcbiAgICAgICAgICAgIC8vIH0sIDEwMCk7XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfVxuICAgIClcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnV5ZSBsYSBub3JtYWxpemFjacOzbiBkZSBwcmVjaW9zIHBhcmEgdW4gw610ZW0gZGVsIGNhcnJpdG8uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbSDDjXRlbSBub3JtYWxpemFkbyBkZWwgY2Fycml0by5cbiAgICAgKiBAcmV0dXJucyBFc3RydWN0dXJhIGBDYXJ0SXRlbVByaWNpbmdgIGNvbiBwcmVjaW8gYmFzZSwgdGFjaGFkbywgZmluYWwgeSBmbGFncyBkZSBVSS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBwcmljaW5nID0gdGhpcy5idWlsZENhcnRJdGVtUHJpY2luZyhpdGVtKTtcbiAgICAgKiAvLyBwcmljaW5nLmJhc2VQcmljZSA9PiB1bml0UHJpY2UgZGVsIGJhY2tlbmQgbnVldm8gbyBmYWxsYmFjayBsZWdhY3lcbiAgICAgKiAvLyBwcmljaW5nLmZpbmFsUHJpY2UgPT4gdW5pdFByaWNlIGRlbCBiYWNrZW5kIG51ZXZvIG8gY8OhbGN1bG8gbGVnYWN5XG4gICAgICogLy8gcHJpY2luZy5lZmZlY3RpdmVEaXNjb3VudFBlcmNlbnQgPT4gJSB0b3RhbCBjb250cmEgZWwgcHJlY2lvIGRlIHJlZmVyZW5jaWFcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwcml2YXRlIGJ1aWxkQ2FydEl0ZW1QcmljaW5nID0gKGl0ZW06IENhcnRJdGVtKTogQ2FydEl0ZW1QcmljaW5nID0+IHtcbiAgICAgICAgY29uc3QgdmFyaWFudCA9IGl0ZW0/LnByb2R1Y3Q/LnZhcmlhbnRzPy5bMF07XG4gICAgICAgIGNvbnN0IGNhcnRBbmRTaWRlYmFyUHJpY2VzID0gdmFyaWFudD8uY2FydEFuZFNpZGViYXJQcmljZXM7XG4gICAgICAgIC8vIFNpIGVsIGJhY2tlbmQgbnVldm8gaW5mb3JtYSBgY2FydEFuZFNpZGViYXJQcmljZXNgLCBlc2UgZXMgZWwgcHJlY2lvIGNvcnJlY3RvXG4gICAgICAgIC8vIHBhcmEgY2Fycml0by9zaWRlYmFyIHBvcnF1ZSBleGNsdXllIGltcHVlc3RvcyBkZSBvcmRlbiBxdWUgbm8gc2UgbGlzdGFuIHBvciDDrXRlbS5cbiAgICAgICAgLy8gU2kgbm8gZXhpc3RlLCBzZSBtYW50aWVuZSBlbCBmYWxsYmFjayBoaXN0w7NyaWNvLlxuICAgICAgICBjb25zdCBleHBsaWNpdFVuaXRQcmljZSA9IHRoaXMucGFyc2VQcmljZVZhbHVlKGl0ZW0/LnVuaXRQcmljZSk7XG4gICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0VW5pdFByaWNlID0gTnVtYmVyLmlzRmluaXRlKGV4cGxpY2l0VW5pdFByaWNlKTtcbiAgICAgICAgY29uc3QgYmFzZVByaWNlID0gaGFzRXhwbGljaXRVbml0UHJpY2VcbiAgICAgICAgICAgID8gZXhwbGljaXRVbml0UHJpY2VcbiAgICAgICAgICAgIDogdGhpcy5wYXJzZVByaWNlVmFsdWUoXG4gICAgICAgICAgICAgICAgY2FydEFuZFNpZGViYXJQcmljZXM/LnNhbGVwcmljZVxuICAgICAgICAgICAgICAgID8/IGNhcnRBbmRTaWRlYmFyUHJpY2VzPy5wcmljZVxuICAgICAgICAgICAgICAgID8/IHZhcmlhbnQ/LnNhbGVwcmljZVxuICAgICAgICAgICAgICAgID8/IHZhcmlhbnQ/LnByaWNlXG4gICAgICAgICAgICAgICAgPz8gaXRlbT8ucHJvZHVjdD8uc2FsZXByaWNlXG4gICAgICAgICAgICAgICAgPz8gaXRlbT8ucHJvZHVjdD8ucHJpY2VcbiAgICAgICAgICAgICAgICA/PyAwXG4gICAgICAgICAgICApO1xuICAgICAgICBjb25zdCBzdHJpa2VQcmljZUNhbmRpZGF0ZSA9IHRoaXMucGFyc2VQcmljZVZhbHVlKFxuICAgICAgICAgICAgY2FydEFuZFNpZGViYXJQcmljZXM/LnByaWNlXG4gICAgICAgICAgICA/PyB2YXJpYW50Py5wcmljZVxuICAgICAgICAgICAgPz8gaXRlbT8ucHJvZHVjdD8ucHJpY2VcbiAgICAgICAgICAgID8/IDBcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEJhc2VQcmljZSA9IGlzTmFOKGJhc2VQcmljZSkgPyAwIDogYmFzZVByaWNlO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkU3RyaWtlUHJpY2UgPSBpc05hTihzdHJpa2VQcmljZUNhbmRpZGF0ZSkgPyAwIDogc3RyaWtlUHJpY2VDYW5kaWRhdGU7XG4gICAgICAgIGNvbnN0IHVuaXRQcm9tb3Rpb25Ub3RhbCA9IEFycmF5LmlzQXJyYXkoaXRlbT8udW5pdFByb21vdGlvbnMpXG4gICAgICAgICAgICA/IGl0ZW0udW5pdFByb21vdGlvbnMucmVkdWNlKCh0b3RhbCwgcHJvbW90aW9uKSA9PiB0b3RhbCArIE51bWJlcihwcm9tb3Rpb24/LmFtb3VudCB8fCAwKSwgMClcbiAgICAgICAgICAgIDogMDtcbiAgICAgICAgY29uc3QgaGFzU3RyaWtlUHJpY2UgPSBub3JtYWxpemVkU3RyaWtlUHJpY2UgPiBub3JtYWxpemVkQmFzZVByaWNlICYmIG5vcm1hbGl6ZWRCYXNlUHJpY2UgPiAwO1xuICAgICAgICBjb25zdCBoYXNVbml0UHJvbW90aW9ucyA9IEFycmF5LmlzQXJyYXkoaXRlbT8udW5pdFByb21vdGlvbnMpICYmIGl0ZW0udW5pdFByb21vdGlvbnMubGVuZ3RoID4gMDtcbiAgICAgICAgY29uc3QgcXVhbnRpdHkgPSBOdW1iZXIoaXRlbT8ucXVhbnRpdHkgfHwgMCk7XG4gICAgICAgIGNvbnN0IGZpbmFsUHJpY2UgPSBoYXNFeHBsaWNpdFVuaXRQcmljZVxuICAgICAgICAgICAgPyBub3JtYWxpemVkQmFzZVByaWNlXG4gICAgICAgICAgICA6IGhhc1VuaXRQcm9tb3Rpb25zID8gbm9ybWFsaXplZEJhc2VQcmljZSArIHVuaXRQcm9tb3Rpb25Ub3RhbCA6IG5vcm1hbGl6ZWRCYXNlUHJpY2U7XG4gICAgICAgIGNvbnN0IHByb2R1Y3REaXNjb3VudCA9IHRoaXMucGFyc2VQcmljZVZhbHVlKGl0ZW0/LmRpc2NvdW50KTtcbiAgICAgICAgY29uc3QgbGVnYWN5UHJvZHVjdERpc2NvdW50ID0gTnVtYmVyKGl0ZW0/LnByb2R1Y3Q/LmRpc2NvdW50IHx8IDApO1xuICAgICAgICBjb25zdCBkaXNjb3VudFBlcmNlbnQgPSBOdW1iZXIuaXNGaW5pdGUocHJvZHVjdERpc2NvdW50KSAmJiBwcm9kdWN0RGlzY291bnQgPCAwICYmIG5vcm1hbGl6ZWRCYXNlUHJpY2UgPiAwICYmIHF1YW50aXR5ID4gMFxuICAgICAgICAgICAgPyBNYXRoLnJvdW5kKChNYXRoLmFicyhwcm9kdWN0RGlzY291bnQpIC8gKG5vcm1hbGl6ZWRCYXNlUHJpY2UgKiBxdWFudGl0eSkpICogMTAwKVxuICAgICAgICAgICAgOiAhaXNOYU4obGVnYWN5UHJvZHVjdERpc2NvdW50KSAmJiBsZWdhY3lQcm9kdWN0RGlzY291bnQgPiAwXG4gICAgICAgICAgICAgICAgPyBNYXRoLnJvdW5kKGxlZ2FjeVByb2R1Y3REaXNjb3VudClcbiAgICAgICAgICAgICAgICA6IGhhc1N0cmlrZVByaWNlXG4gICAgICAgICAgICAgICAgICAgID8gTWF0aC5yb3VuZCgoKG5vcm1hbGl6ZWRTdHJpa2VQcmljZSAtIG5vcm1hbGl6ZWRCYXNlUHJpY2UpIC8gbm9ybWFsaXplZFN0cmlrZVByaWNlKSAqIDEwMClcbiAgICAgICAgICAgICAgICAgICAgOiAwO1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVSZWZlcmVuY2VQcmljZSA9IGhhc1N0cmlrZVByaWNlID8gbm9ybWFsaXplZFN0cmlrZVByaWNlIDogbm9ybWFsaXplZEJhc2VQcmljZTtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlRGlzY291bnRQZXJjZW50ID0gZWZmZWN0aXZlUmVmZXJlbmNlUHJpY2UgPiAwICYmIGZpbmFsUHJpY2UgPiAwICYmIGVmZmVjdGl2ZVJlZmVyZW5jZVByaWNlID4gZmluYWxQcmljZVxuICAgICAgICAgICAgPyBNYXRoLnJvdW5kKCgoZWZmZWN0aXZlUmVmZXJlbmNlUHJpY2UgLSBmaW5hbFByaWNlKSAvIGVmZmVjdGl2ZVJlZmVyZW5jZVByaWNlKSAqIDEwMClcbiAgICAgICAgICAgIDogZGlzY291bnRQZXJjZW50O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiYXNlUHJpY2U6IG5vcm1hbGl6ZWRCYXNlUHJpY2UsXG4gICAgICAgICAgICBzdHJpa2VQcmljZTogaGFzU3RyaWtlUHJpY2UgPyBub3JtYWxpemVkU3RyaWtlUHJpY2UgOiBudWxsLFxuICAgICAgICAgICAgZmluYWxQcmljZSxcbiAgICAgICAgICAgIHVuaXRQcm9tb3Rpb25Ub3RhbCxcbiAgICAgICAgICAgIGhhc1N0cmlrZVByaWNlLFxuICAgICAgICAgICAgaGFzVW5pdFByb21vdGlvbnMsXG4gICAgICAgICAgICBkaXNjb3VudFBlcmNlbnQsXG4gICAgICAgICAgICBlZmZlY3RpdmVEaXNjb3VudFBlcmNlbnRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemEgdmFsb3JlcyBkZSBwcmVjaW8gcHJvdmVuaWVudGVzIGRlbCBiYWNrZW5kIGEgYG51bWJlcmAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgVmFsb3IgbnVtw6lyaWNvIG8gc3RyaW5nIGNvbiBmb3JtYXRvIGxvY2FsIChgMTIwLjAwMGAsIGAxMjAwMDBgLCBgMTIwMDAwLTFgLCBldGMuKS5cbiAgICAgKiBAcmV0dXJucyBOw7ptZXJvIHBhcnNlYWRvIG8gYE5hTmAgc2kgZWwgdmFsb3Igbm8gZXMgdXRpbGl6YWJsZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogU2UgdXNhIHBhcmEgc29wb3J0YXIgcmVzcHVlc3RhcyBjb24gc2VwYXJhZG9yZXMgZGUgbWlsZXMsIGNvbWEgZGVjaW1hbCBvIHJhbmdvcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcnNlUHJpY2VWYWx1ZSA9ICh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG51bWJlciA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJhdyA9IHZhbHVlLnRvU3RyaW5nKCkudHJpbSgpO1xuICAgICAgICBpZiAoIXJhdykge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0VmFsdWUgPSByYXcuaW5jbHVkZXMoJy0nKSA/IHJhdy5zcGxpdCgnLScpWzBdLnRyaW0oKSA6IHJhdztcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGZpcnN0VmFsdWVcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXHMvZywgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFwuKD89XFxkezN9KFxcRHwkKSkvZywgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgnLCcsICcuJyk7XG5cbiAgICAgICAgcmV0dXJuIE51bWJlcihub3JtYWxpemVkKTtcbiAgICB9XG5cblxuICAgIGdldENyZWRpdEFtb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bGw+ID0+XG4gICAgICAgIHRoaXMuYmFsYW5jZUN1c3RvbWVyU3ViamVjdC5waXBlKFxuICAgICAgICAgICAgbWFwKChiYWxhbmNlQ3VzdG9tZXIpID0+IGJhbGFuY2VDdXN0b21lcj8uY3JlZGl0QW1vdW50ID8/IG51bGwpXG4gICAgICAgICk7XG5cbiAgICBnZXRDbGllbnRUYXhlcyA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiBjYXJ0Py50b3RhbHM/LnRheGVzID4gMCA/IGNhcnQ/LnRvdGFscz8uY2xpZW50VGF4ZXMgOiAwKSk7XG5cbiAgICBnZXRSZW1haW5pbmdDcmVkaXRzID0gKCk6IE9ic2VydmFibGU8bnVtYmVyPiA9PlxuICAgICAgICB0aGlzLmJhbGFuY2VDdXN0b21lclN1YmplY3QucGlwZShtYXAoKGJhbGFuY2VDdXN0b21lcikgPT4gYmFsYW5jZUN1c3RvbWVyPy5yZW1haW5pbmdDcmVkaXRzKSk7XG5cbiAgICBwdWJsaWMgdXBkYXRlQmFsYW5jZUF0dHJpYnV0ZXMoYmFsYW5jZTogYW55LCB0b3RhbDogbnVtYmVyIHwgbnVsbCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCFiYWxhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLmJhbGFuY2VDdXN0b21lclN1YmplY3QubmV4dChudWxsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvdGFsQW1vdW50ID0gdG90YWwgPz8gMDtcblxuICAgICAgICBjb25zdCBiYWxhbmNlRGF0YSA9IHtcbiAgICAgICAgICAgIGFsbG93QW55UGF5bWVudE1ldGhvZDogYmFsYW5jZS5hbGxvd0FueVBheW1lbnRNZXRob2QsXG4gICAgICAgICAgICBhbGxvd0V4Y2VlZEJhbGFuY2U6IGJhbGFuY2UuYWxsb3dFeGNlZWRCYWxhbmNlLFxuICAgICAgICAgICAgY3JlZGl0QW1vdW50OiBiYWxhbmNlLmNyZWRpdEFtb3VudCxcbiAgICAgICAgICAgIHNob3dNYXg6IGJhbGFuY2Uuc2hvd01heCxcbiAgICAgICAgICAgIHNob3dQcmljZTogYmFsYW5jZS5zaG93UHJpY2UsXG4gICAgICAgICAgICByZW1haW5pbmdDcmVkaXRzOlxuICAgICAgICAgICAgICAgIGJhbGFuY2UuY3JlZGl0QW1vdW50ICE9IG51bGwgJiYgdG90YWxBbW91bnQgIT0gbnVsbCAmJiBiYWxhbmNlLmNyZWRpdEFtb3VudCA+PSB0b3RhbEFtb3VudFxuICAgICAgICAgICAgICAgICAgICA/IGJhbGFuY2UuY3JlZGl0QW1vdW50IC0gdG90YWxBbW91bnRcbiAgICAgICAgICAgICAgICAgICAgOiAwLFxuICAgICAgICAgICAgYXBwbHlNYXhPcmRlcnM6IGJhbGFuY2UuYXBwbHlNYXhPcmRlcnMsXG4gICAgICAgICAgICBtYXhPcmRlcnM6IGJhbGFuY2UubWF4T3JkZXJzXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0Lm5leHQoYmFsYW5jZURhdGEpO1xuICAgIH1cblxufVxuIl19