UNPKG

@getopenpay/openpay-js-react

Version:

Accept payments through OpenPay, right on your site

9,355 lines 1.16 MB
import { connectToChild as Hn } from "penpal";
import { z as n } from "zod";
import xe from "chalk";
import { v4 as Fe } from "uuid";
import { jsx as ue, Fragment as mr } from "react/jsx-runtime";
import { createContext as xi, useContext as Ti, useState as be, useRef as Ri, useMemo as hr, useEffect as Er } from "react";
function Ni(e, r) {
  var t = Object.setPrototypeOf;
  t ? t(e, r) : e.__proto__ = r;
}
function Li(e, r) {
  r === void 0 && (r = e.constructor);
  var t = Error.captureStackTrace;
  t && t(e, r);
}
var Mi = /* @__PURE__ */ (function() {
  var e = function(t, o) {
    return e = Object.setPrototypeOf || {
      __proto__: []
    } instanceof Array && function(i, a) {
      i.__proto__ = a;
    } || function(i, a) {
      for (var s in a)
        Object.prototype.hasOwnProperty.call(a, s) && (i[s] = a[s]);
    }, e(t, o);
  };
  return function(r, t) {
    if (typeof t != "function" && t !== null) throw new TypeError("Class extends value " + String(t) + " is not a constructor or null");
    e(r, t);
    function o() {
      this.constructor = r;
    }
    r.prototype = t === null ? Object.create(t) : (o.prototype = t.prototype, new o());
  };
})();
(function(e) {
  Mi(r, e);
  function r(t, o) {
    var i = this.constructor, a = e.call(this, t, o) || this;
    return Object.defineProperty(a, "name", {
      value: i.name,
      enumerable: !1,
      configurable: !0
    }), Ni(a, i.prototype), Li(a), a;
  }
  return r;
})(Error);
const x = n.string().trim().min(1, { message: "Please fill in this field" }), v = n.string().trim().optional(), U = (e) => n.nullable(e.optional());
var L = /* @__PURE__ */ ((e) => (e.FIRST_NAME = "firstName", e.LAST_NAME = "lastName", e.PHONE = "phone", e.EMAIL = "email", e.LINE1 = "line1", e.LINE2 = "line2", e.LINE3 = "line3", e.CITY = "city", e.STATE = "state", e.COUNTRY = "country", e.ZIP_CODE = "zipCode", e.SHIPPING_LINE1 = "shippingAddressLine1", e.SHIPPING_LINE2 = "shippingAddressLine2", e.SHIPPING_LINE3 = "shippingAddressLine3", e.SHIPPING_CITY = "shippingAddressCity", e.SHIPPING_STATE = "shippingAddressState", e.SHIPPING_COUNTRY = "shippingAddressCountry", e.SHIPPING_ZIP_CODE = "shippingAddressZipCode", e.IS_SHIPPING_SAME_AS_BILLING = "isShippingSameAsBilling", e.PROMOTION_CODE = "promotionCode", e.IS_BUSINESS_PURCHASE = "isBusinessPurchase", e.BUSINESS_NAME = "businessName", e.TAX_ID = "taxId", e.TAX_ID_TYPE = "taxIdType", e))(L || {});
const zn = n.nativeEnum(L);
var Bn = /* @__PURE__ */ ((e) => (e.CARD_NUMBER = "cardNumber", e.CARD_EXPIRY = "cardExpiry", e.CARD_CVC = "cardCvc", e))(Bn || {});
const Yn = n.nativeEnum(Bn), ji = n.union([zn, Yn]);
var wt = /* @__PURE__ */ ((e) => (e.CARD = "card", e.CARD_NUMBER = "card-number", e.CARD_EXPIRY = "card-expiry", e.CARD_CVC = "card-cvc", e.CDE_BRIDGE = "cde-bridge", e))(wt || {});
n.enum(["card", "card-number", "card-expiry", "card-cvc", "cde-bridge"]);
const Qt = n.object({
  provider: n.string(),
  processor_name: U(n.string()),
  metadata: U(n.record(n.string(), n.any()))
}), Oi = n.object({
  id: n.string()
}), Xt = n.object({
  backgroundColor: v,
  color: v,
  fontFamily: v,
  fontSize: v,
  fontWeight: v,
  margin: v,
  padding: v,
  letterSpacing: v,
  lineHeight: v,
  hideIcon: v,
  placeholderStyle: n.object({
    color: v,
    fontSize: v,
    fontWeight: v,
    fontFamily: v,
    letterSpacing: v,
    lineHeight: v
  }).optional()
});
Xt.extend({
  disableAutoFill: v,
  placeholder: n.object({
    cardNumber: v,
    expiry: v,
    cvc: v
  }).optional()
});
Xt.extend({
  disableAutoFill: v,
  placeholder: n.string().optional(),
  /**
   * The card icon at the start of the card number input field
   * It won't affect after the icon changed to card brand after the user input the card number
   */
  icon: n.object({
    color: n.string().optional()
  }).optional()
});
Xt.extend({
  disableAutoFill: v,
  placeholder: n.string().optional()
});
Xt.extend({
  disableAutoFill: v,
  placeholder: n.string().optional()
});
const de = n.enum([
  // Element -> Form
  "LAYOUT",
  "LOADED",
  "BLUR",
  "FOCUS",
  "CHANGE",
  "TOKENIZE_STARTED",
  "CHECKOUT_STARTED",
  "PAYMENT_FLOW_STARTED",
  "TOKENIZE_SUCCESS",
  "CHECKOUT_SUCCESS",
  "LOAD_ERROR",
  "VALIDATION_ERROR",
  "TOKENIZE_ERROR",
  "CHECKOUT_ERROR",
  "SETUP_PAYMENT_METHOD_SUCCESS",
  // Form -> Element
  "TOKENIZE",
  "CHECKOUT",
  "START_PAYMENT_FLOW"
]), Di = de.extract(["TOKENIZE_STARTED", "CHECKOUT_STARTED"]), Ui = n.object({ type: Di }), Fi = de.extract(["BLUR", "FOCUS", "CHANGE"]), Gi = n.object({
  type: Fi,
  elementType: Yn,
  errors: n.array(n.string()).optional(),
  obfuscatedValue: n.string().optional()
}), qi = de.extract(["LOAD_ERROR", "TOKENIZE_ERROR", "CHECKOUT_ERROR"]), Vi = n.object({
  type: qi,
  message: x,
  headers: n.record(n.string(), n.string()).optional()
}), $i = de.extract(["VALIDATION_ERROR"]), Hi = n.object({
  type: $i,
  elementType: ji,
  errors: n.array(n.string())
}), zi = n.object({
  type: n.literal(de.enum.LAYOUT),
  height: x
}), Bi = n.object({
  type: n.literal(de.enum.LOADED),
  sessionId: x,
  totalAmountAtoms: n.number(),
  currency: v,
  checkoutPaymentMethods: n.array(Qt)
}), Yi = n.object({
  type: n.literal(de.enum.PAYMENT_FLOW_STARTED),
  nextActionMetadata: n.record(n.string(), n.any()),
  paymentFlowMetadata: n.any().optional(),
  startPFMetadata: n.optional(n.record(n.string(), n.any()))
}), Zi = n.object({
  type: n.literal(de.enum.SETUP_PAYMENT_METHOD_SUCCESS),
  paymentMethodId: n.string()
}), Ze = n.object({
  email: x.email({ message: "Please enter a valid email address" }),
  firstName: x,
  lastName: x,
  promotionCode: v,
  line1: v,
  line2: v,
  line3: v,
  city: v,
  state: v,
  country: x,
  zipCode: v,
  isShippingSameAsBilling: n.custom().optional().default(!0),
  shippingAddressLine1: v,
  shippingAddressLine2: v,
  shippingAddressLine3: v,
  shippingAddressCity: v,
  shippingAddressState: v,
  shippingAddressCountry: v,
  shippingAddressZipCode: v,
  businessName: v,
  taxId: v,
  taxIdType: v
}), Ki = n.object({
  email: x.email({ message: "Please enter a valid email address" }),
  firstName: v,
  lastName: v,
  promotionCode: v,
  line1: v,
  line2: v,
  line3: v,
  city: v,
  state: v,
  country: x,
  zipCode: v,
  isShippingSameAsBilling: n.custom().optional().default(!0),
  shippingAddressLine1: v,
  shippingAddressLine2: v,
  shippingAddressLine3: v,
  shippingAddressCity: v,
  shippingAddressState: v,
  shippingAddressCountry: v,
  shippingAddressZipCode: v,
  businessName: v,
  taxId: v,
  taxIdType: v
});
n.object({
  line1: x,
  city: x,
  state: x,
  country: x
});
n.object({
  shippingAddressCountry: x,
  shippingAddressZipCode: x
});
n.object({
  shippingAddressLine1: x,
  shippingAddressCity: x,
  shippingAddressState: x,
  shippingAddressCountry: x,
  shippingAddressZipCode: x
});
const Ji = de.extract(["TOKENIZE", "CHECKOUT", "START_PAYMENT_FLOW"]), Wi = n.object({
  type: Ji,
  sessionId: x,
  checkoutPaymentMethod: Qt,
  paymentFlowMetadata: n.any().optional(),
  doNotUseLegacyCCFlow: n.boolean().optional(),
  existingCCPMId: v,
  paymentRouteId: v
}).extend(Ze.shape), Qi = n.object({
  type: n.literal(de.enum.TOKENIZE_SUCCESS),
  isReadyForCheckout: n.boolean()
}), Xi = n.object({
  type: n.literal(de.enum.CHECKOUT_SUCCESS),
  invoiceUrls: n.array(n.string()),
  subscriptionIds: n.array(n.string()),
  customerId: n.string(),
  paymentMethodId: v
}), ea = n.discriminatedUnion("type", [
  Ui,
  Gi,
  Vi,
  Hi,
  zi,
  Bi,
  Wi,
  Qi,
  Xi,
  Yi,
  Zi
]);
n.object({
  payload: ea,
  nonce: x,
  formId: x,
  elementId: x
});
n.object({
  amountAtom: n.number(),
  /**
   * The three-letter ISO 4217 currency code for the payment.
   */
  currency: x
});
n.enum(["apple_pay", "google_pay"]);
n.object({
  secure_token: n.string(),
  promotion_code: n.string().optional()
});
n.object({
  secure_token: n.string(),
  existing_cc_pm_id: U(n.string()),
  their_pm_id: U(n.string()),
  checkout_attempt_id: U(n.string()),
  processor_specific_metadata: U(n.record(n.string(), n.any()))
});
const Sr = n.object({
  invoice_urls: n.array(n.string()),
  subscription_ids: n.array(n.string()),
  customer_id: n.string(),
  payment_method_id: U(n.string()),
  processors_used: U(n.array(n.string()))
}), ta = n.object({
  elementType: n.string(),
  errors: n.array(n.string())
});
n.object({
  session_id: n.string()
});
const ra = n.object({
  success: n.literal(!1),
  error_type: n.literal("validation_error"),
  errors: n.array(ta)
});
n.discriminatedUnion("success", [
  n.object({ success: n.literal(!0) }),
  ra
]);
n.object({
  session_id: n.string(),
  checkout_payment_method: Qt,
  non_cde_form_fields: Ze,
  do_not_use_legacy_cc_flow: n.boolean().optional(),
  existing_cc_pm_id: U(n.string()),
  extra_metadata: n.record(n.string(), n.any()),
  payment_route_id: U(n.string()),
  customer_language: U(n.string())
});
n.object({
  session_id: n.string(),
  checkout_payment_method: Qt,
  non_cde_form_fields: Ze,
  extra_metadata: n.record(n.string(), n.any()).optional(),
  payment_route_id: U(n.string()),
  customer_language: U(n.string())
});
n.object({
  status: n.enum([
    "success",
    "failure",
    "cancelled"
    /* CANCELLED */
  ]),
  href: n.string().optional().nullable()
});
n.object({
  href: n.string().optional().nullable()
});
n.object({
  type: n.string(),
  redirect_url: n.string(),
  initial_intent_id: n.string(),
  consent_id: n.string(),
  their_pm_id: n.string().optional()
});
const na = n.object({
  bank_name: n.string(),
  display_name: n.string(),
  resources: n.object({
    logo_url: n.string().optional()
  })
}), oa = n.object({
  type: n.string(),
  redirect_url: U(n.string()),
  initial_intent_id: U(n.string()),
  consent_id: U(n.string()),
  their_pm_id: U(n.string()),
  payment_session: U(n.record(n.string(), n.any())),
  available_banks: U(n.array(na))
});
n.discriminatedUnion("present", [
  n.object({ present: n.literal(!0), href: n.string() }),
  n.object({ present: n.literal(!1) })
]);
n.object({
  payment_methods: n.array(Oi),
  pay_first_success_response: U(Sr),
  required_user_actions: U(n.array(oa)),
  post_checkout_redirect_to: U(n.string()),
  checkout_success_response: U(Sr)
});
const ia = n.object({
  institutionNumber: n.string(),
  transitNumber: n.string(),
  accountNumber: n.string(),
  accountType: n.enum(["personal", "business"])
});
n.object({
  status: n.enum(["success", "failure"]),
  payload: ia.optional()
});
const aa = n.object({
  sortCode: n.string(),
  accountNumber: n.string(),
  accountType: n.enum(["personal", "business"])
});
n.object({
  status: n.enum(["success", "failure"]),
  payload: aa.optional()
});
const sa = n.object({
  iban: n.string(),
  accountType: n.enum(["personal", "business"])
});
n.object({
  status: n.enum(["success", "failure"]),
  payload: sa.optional()
});
const ca = n.object({
  account_number: n.string(),
  aba_routing_number: n.string()
}), la = n.object({
  institution_number: n.string(),
  transit_number: n.string(),
  account_number: n.string()
}), ua = n.object({
  account_number: n.string(),
  sort_code: n.string()
}), da = n.object({
  iban: n.string()
});
n.object({
  status: n.enum(["success", "failure"]),
  payload: n.union([
    ca,
    la,
    ua,
    da,
    n.object({ error: n.string() })
  ]).optional()
});
const S = (e) => n.nullable(e.optional());
n.string().trim().min(1, { message: "Cannot be blank" });
n.object({
  cde_response_type: n.literal("error"),
  message: n.string(),
  headers: n.record(n.string(), n.string()).optional()
});
n.enum(["usd", "brl"]);
const Zn = n.object({
  name: n.string(),
  amount_atom_off: S(n.number()),
  percent_off: S(n.number()),
  currency: S(n.string()),
  duration: n.string(),
  duration_in_months: S(n.number())
}), Kn = n.object({
  amount_subtotal_atom: n.number().int(),
  amount_total_atom: n.number().int(),
  currency: n.string(),
  description: S(n.string()),
  price_id: n.string(),
  billing_interval: S(n.string()),
  billing_interval_count: S(n.number().int()),
  quantity: n.number().int()
}), pa = n.record(n.string(), n.any()), ma = n.object({
  name: n.string(),
  settings: S(pa)
}), et = n.object({
  provider: n.string(),
  processor_name: S(n.string()),
  metadata: S(n.record(n.string(), n.any()))
}), ha = n.object({
  quantity: n.number()
}), fa = n.object({
  id: S(n.string()),
  billing_interval: S(n.string()),
  billing_interval_count: S(n.number().int()),
  subscription_items: n.array(ha),
  trial_start: S(n.string()),
  trial_end: S(n.string())
}), Jn = n.object({
  amount_atom: n.number()
}), _a = n.object({
  amount_atom: n.number(),
  amount_atom_considering_discount_applied: n.number(),
  currency: n.string(),
  discount_amount_atoms: n.array(Jn),
  subscription_item_id: n.string()
}), ya = n.object({
  coupon: Zn
}), ga = n.object({
  currency: n.string(),
  discounts: n.array(ya),
  hosted_invoice_url: S(n.string()),
  lines: n.array(_a),
  remaining_amount_atom: n.number(),
  tax_amount_atom: n.number(),
  total_amount_atom: n.number(),
  total_discount_amount_atoms: n.array(Jn)
}), nn = n.object({
  created: n.array(fa),
  invoices: n.array(ga),
  processors_used: S(n.array(n.string())),
  payment_method_id: S(n.string())
}), ba = n.object({
  preview: nn,
  preview_post_trial: S(nn),
  coupons: n.array(Zn)
}), on = n.object({
  status: n.literal("open"),
  locale: S(n.string()),
  token: n.string(),
  email: S(n.string()),
  checkout_settings: n.record(n.string(), n.any()),
  line_items: n.array(Kn),
  amount_subtotal_atom: n.number().int(),
  amount_total_atom: n.number().int(),
  brand: ma,
  subs_preview: S(ba),
  // Null in setup mode
  methods_available: n.array(et),
  return_url: S(n.string()),
  success_url: S(n.string()),
  final_feature_rollout_settings: S(n.record(n.string(), n.any()))
}), wa = n.discriminatedUnion("mode", [
  n.object({
    mode: n.literal("setup"),
    currency: n.nullable(n.undefined())
  }).extend(on.shape),
  n.object({
    mode: n.enum(["payment", "subscription"]),
    currency: n.string()
  }).extend(on.shape)
]), va = n.object({
  status: n.literal("complete")
}), Pa = n.object({
  status: n.literal("expired")
});
n.union([wa, va, Pa]);
n.object({
  logo: n.string(),
  icon: n.string(),
  primary_color: n.string(),
  secondary_color: n.string()
});
n.object({
  secure_token: n.string(),
  pm_id: n.string()
});
const Ft = n.object({
  line1: n.string().optional(),
  line2: n.string().optional(),
  line3: n.string().optional(),
  city: n.string().optional(),
  state: n.string().optional(),
  country: n.string(),
  zip_code: n.string().optional()
});
n.object({
  secure_token: n.string(),
  payment_input: n.any(),
  // Should follow AnyPaymentInput from CDE
  customer_email: n.string(),
  customer_last_name: n.string().optional(),
  customer_first_name: n.string().optional(),
  customer_address: Ft,
  customer_shipping_address: Ft.optional(),
  line_items: n.array(Kn),
  total_amount_atom: n.number().int(),
  cancel_at_end: n.boolean(),
  checkout_payment_method: et,
  promotion_code: n.string().optional(),
  do_not_use_legacy_cc_flow: n.boolean().optional(),
  use_confirmed_pm_id: S(n.string()),
  payment_route_id: S(n.string())
});
n.object({
  payment_method_id: n.string()
});
n.object({
  id: n.string(),
  return_url: n.string()
});
const Ea = n.object({
  type: n.string(),
  loc: n.array(n.string()),
  msg: n.string(),
  url: n.string()
});
n.array(Ea);
const Sa = n.object({
  new_customer_email: n.string().optional(),
  new_customer_last_name: n.string().optional(),
  new_customer_first_name: n.string().optional(),
  customer_business_name: n.string().optional(),
  customer_tax_id: n.string().optional(),
  customer_tax_id_type: n.string().optional(),
  new_customer_address: Ft,
  new_customer_shipping_address: Ft.optional()
}), ka = n.object({
  price_id: n.string(),
  quantity: n.number().int()
}), Wn = n.object({
  line_items: n.array(ka),
  promotion_code: n.string().optional(),
  displayed_total_amount_atom: n.number().int()
}), Ca = n.object({
  processor_specific_metadata: S(n.record(n.string(), n.any()))
});
n.object({
  payment_provider: n.string(),
  checkout_payment_method: et,
  existing_cc_pm_id: n.string().optional(),
  their_existing_pm_id: n.string().optional(),
  use_pay_first_flow: n.boolean().optional(),
  pay_first_flow_cart_info: Wn.optional(),
  customer_language: n.string().optional()
}).extend(Sa.shape).extend(Ca.shape);
n.object({
  required_user_actions: n.array(n.record(n.string(), n.any())),
  checkout_attempt_id: S(n.string())
});
n.object({
  fields: Ki,
  checkoutPaymentMethod: et,
  payment_route_id: S(n.string())
});
n.object({
  session_id: n.string(),
  non_cde_form_fields: Ze,
  checkout_payment_method: et,
  extra_metadata: n.record(n.string(), n.any()),
  // This is optional in CDE, but not in OJS moving forward
  use_unified_cc_flow: S(n.boolean()),
  pay_first_flow_cart_info: Wn.optional(),
  payment_route_id: S(n.string()),
  customer_language: n.string().optional(),
  existing_cc_pm_id: S(n.string())
});
n.object({
  required_user_actions: n.array(n.record(n.string(), n.any())),
  cc_pm_id: n.string(),
  checkout_success_response: S(Sr),
  checkout_attempt_id: S(n.string())
});
n.record(n.any());
n.object({
  first_name: S(n.string()),
  last_name: S(n.string()),
  line1: S(n.string()),
  line2: S(n.string()),
  line3: S(n.string()),
  city: S(n.string()),
  state: S(n.string()),
  country: S(n.string()),
  zip_code: S(n.string()),
  email: S(n.string()),
  billing_email: S(n.string()),
  phone_number: S(n.string()),
  business_name: S(n.string()),
  tax_id: S(n.string()),
  tax_id_type: S(n.string()),
  update_processor_customer: S(n.boolean())
});
n.object({
  id: n.string(),
  email: S(n.string()),
  first_name: S(n.string()),
  last_name: S(n.string()),
  phone_number: S(n.string()),
  billing_email: S(n.string()),
  address: S(n.record(n.string(), n.any()))
});
n.object({
  message: n.string()
});
n.object({
  error_code: n.string()
});
n.object({
  checkout_payment_method: et,
  processor_specific_metadata: n.record(n.any()).optional(),
  payment_route_id: S(n.string())
});
n.object({
  next_action_metadata: S(n.record(n.any()))
});
n.object({
  events: n.array(
    n.object({
      event_name: n.string(),
      device_token: n.string(),
      properties: n.record(n.any()).optional(),
      context_properties: n.record(n.any()).optional()
    })
  )
});
n.any().optional();
n.object({
  device_token: n.string()
});
n.object({});
n.object({
  _unified_cc_action_name: n.string(),
  _unified_cc_pccs_id: n.string()
}).catchall(n.any());
const Ia = n.object({
  type: n.string(),
  loc: n.array(n.string()),
  msg: n.string(),
  url: n.string()
});
n.array(Ia);
const Aa = n.object({
  code: n.string(),
  message: n.string(),
  path: n.array(n.string())
});
n.array(Aa);
const xa = (e, r, t) => ((...o) => {
  try {
    return r(...o);
  } catch (i) {
    t(`[form] Error running callback (${e}):`, i);
    return;
  }
}), Mr = (e) => {
  const r = (...o) => {
    window.console.log(`${xe.green.bold("ojs/")}${xe.bold.gray(`${e}`)}	`, ...o);
  }, t = (...o) => {
    window.console.warn(`${xe.red.bold("ojs/")}${xe.bold.gray(`${e}`)}	`, ...o);
  };
  return {
    log: r,
    err: t,
    log__: r,
    err__: t
  };
};
var kr = function(e, r) {
  return kr = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(t, o) {
    t.__proto__ = o;
  } || function(t, o) {
    for (var i in o) Object.prototype.hasOwnProperty.call(o, i) && (t[i] = o[i]);
  }, kr(e, r);
};
function Re(e, r) {
  if (typeof r != "function" && r !== null)
    throw new TypeError("Class extends value " + String(r) + " is not a constructor or null");
  kr(e, r);
  function t() {
    this.constructor = e;
  }
  e.prototype = r === null ? Object.create(r) : (t.prototype = r.prototype, new t());
}
function Ta(e, r, t, o) {
  function i(a) {
    return a instanceof t ? a : new t(function(s) {
      s(a);
    });
  }
  return new (t || (t = Promise))(function(a, s) {
    function c(d) {
      try {
        u(o.next(d));
      } catch (_) {
        s(_);
      }
    }
    function l(d) {
      try {
        u(o.throw(d));
      } catch (_) {
        s(_);
      }
    }
    function u(d) {
      d.done ? a(d.value) : i(d.value).then(c, l);
    }
    u((o = o.apply(e, r || [])).next());
  });
}
function Qn(e, r) {
  var t = { label: 0, sent: function() {
    if (a[0] & 1) throw a[1];
    return a[1];
  }, trys: [], ops: [] }, o, i, a, s = Object.create((typeof Iterator == "function" ? Iterator : Object).prototype);
  return s.next = c(0), s.throw = c(1), s.return = c(2), typeof Symbol == "function" && (s[Symbol.iterator] = function() {
    return this;
  }), s;
  function c(u) {
    return function(d) {
      return l([u, d]);
    };
  }
  function l(u) {
    if (o) throw new TypeError("Generator is already executing.");
    for (; s && (s = 0, u[0] && (t = 0)), t; ) try {
      if (o = 1, i && (a = u[0] & 2 ? i.return : u[0] ? i.throw || ((a = i.return) && a.call(i), 0) : i.next) && !(a = a.call(i, u[1])).done) return a;
      switch (i = 0, a && (u = [u[0] & 2, a.value]), u[0]) {
        case 0:
        case 1:
          a = u;
          break;
        case 4:
          return t.label++, { value: u[1], done: !1 };
        case 5:
          t.label++, i = u[1], u = [0];
          continue;
        case 7:
          u = t.ops.pop(), t.trys.pop();
          continue;
        default:
          if (a = t.trys, !(a = a.length > 0 && a[a.length - 1]) && (u[0] === 6 || u[0] === 2)) {
            t = 0;
            continue;
          }
          if (u[0] === 3 && (!a || u[1] > a[0] && u[1] < a[3])) {
            t.label = u[1];
            break;
          }
          if (u[0] === 6 && t.label < a[1]) {
            t.label = a[1], a = u;
            break;
          }
          if (a && t.label < a[2]) {
            t.label = a[2], t.ops.push(u);
            break;
          }
          a[2] && t.ops.pop(), t.trys.pop();
          continue;
      }
      u = r.call(e, t);
    } catch (d) {
      u = [6, d], i = 0;
    } finally {
      o = a = 0;
    }
    if (u[0] & 5) throw u[1];
    return { value: u[0] ? u[1] : void 0, done: !0 };
  }
}
function Ke(e) {
  var r = typeof Symbol == "function" && Symbol.iterator, t = r && e[r], o = 0;
  if (t) return t.call(e);
  if (e && typeof e.length == "number") return {
    next: function() {
      return e && o >= e.length && (e = void 0), { value: e && e[o++], done: !e };
    }
  };
  throw new TypeError(r ? "Object is not iterable." : "Symbol.iterator is not defined.");
}
function Gt(e, r) {
  var t = typeof Symbol == "function" && e[Symbol.iterator];
  if (!t) return e;
  var o = t.call(e), i, a = [], s;
  try {
    for (; (r === void 0 || r-- > 0) && !(i = o.next()).done; ) a.push(i.value);
  } catch (c) {
    s = { error: c };
  } finally {
    try {
      i && !i.done && (t = o.return) && t.call(o);
    } finally {
      if (s) throw s.error;
    }
  }
  return a;
}
function qt(e, r, t) {
  if (t || arguments.length === 2) for (var o = 0, i = r.length, a; o < i; o++)
    (a || !(o in r)) && (a || (a = Array.prototype.slice.call(r, 0, o)), a[o] = r[o]);
  return e.concat(a || Array.prototype.slice.call(r));
}
function He(e) {
  return this instanceof He ? (this.v = e, this) : new He(e);
}
function Ra(e, r, t) {
  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
  var o = t.apply(e, r || []), i, a = [];
  return i = Object.create((typeof AsyncIterator == "function" ? AsyncIterator : Object).prototype), c("next"), c("throw"), c("return", s), i[Symbol.asyncIterator] = function() {
    return this;
  }, i;
  function s(p) {
    return function(h) {
      return Promise.resolve(h).then(p, _);
    };
  }
  function c(p, h) {
    o[p] && (i[p] = function(y) {
      return new Promise(function(g, w) {
        a.push([p, y, g, w]) > 1 || l(p, y);
      });
    }, h && (i[p] = h(i[p])));
  }
  function l(p, h) {
    try {
      u(o[p](h));
    } catch (y) {
      f(a[0][3], y);
    }
  }
  function u(p) {
    p.value instanceof He ? Promise.resolve(p.value.v).then(d, _) : f(a[0][2], p);
  }
  function d(p) {
    l("next", p);
  }
  function _(p) {
    l("throw", p);
  }
  function f(p, h) {
    p(h), a.shift(), a.length && l(a[0][0], a[0][1]);
  }
}
function Na(e) {
  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
  var r = e[Symbol.asyncIterator], t;
  return r ? r.call(e) : (e = typeof Ke == "function" ? Ke(e) : e[Symbol.iterator](), t = {}, o("next"), o("throw"), o("return"), t[Symbol.asyncIterator] = function() {
    return this;
  }, t);
  function o(a) {
    t[a] = e[a] && function(s) {
      return new Promise(function(c, l) {
        s = e[a](s), i(c, l, s.done, s.value);
      });
    };
  }
  function i(a, s, c, l) {
    Promise.resolve(l).then(function(u) {
      a({ value: u, done: c });
    }, s);
  }
}
function B(e) {
  return typeof e == "function";
}
function er(e) {
  var r = function(o) {
    Error.call(o), o.stack = new Error().stack;
  }, t = e(r);
  return t.prototype = Object.create(Error.prototype), t.prototype.constructor = t, t;
}
var fr = er(function(e) {
  return function(t) {
    e(this), this.message = t ? t.length + ` errors occurred during unsubscription:
` + t.map(function(o, i) {
      return i + 1 + ") " + o.toString();
    }).join(`
  `) : "", this.name = "UnsubscriptionError", this.errors = t;
  };
});
function Vt(e, r) {
  if (e) {
    var t = e.indexOf(r);
    0 <= t && e.splice(t, 1);
  }
}
var vt = (function() {
  function e(r) {
    this.initialTeardown = r, this.closed = !1, this._parentage = null, this._finalizers = null;
  }
  return e.prototype.unsubscribe = function() {
    var r, t, o, i, a;
    if (!this.closed) {
      this.closed = !0;
      var s = this._parentage;
      if (s)
        if (this._parentage = null, Array.isArray(s))
          try {
            for (var c = Ke(s), l = c.next(); !l.done; l = c.next()) {
              var u = l.value;
              u.remove(this);
            }
          } catch (y) {
            r = { error: y };
          } finally {
            try {
              l && !l.done && (t = c.return) && t.call(c);
            } finally {
              if (r) throw r.error;
            }
          }
        else
          s.remove(this);
      var d = this.initialTeardown;
      if (B(d))
        try {
          d();
        } catch (y) {
          a = y instanceof fr ? y.errors : [y];
        }
      var _ = this._finalizers;
      if (_) {
        this._finalizers = null;
        try {
          for (var f = Ke(_), p = f.next(); !p.done; p = f.next()) {
            var h = p.value;
            try {
              an(h);
            } catch (y) {
              a = a ?? [], y instanceof fr ? a = qt(qt([], Gt(a)), Gt(y.errors)) : a.push(y);
            }
          }
        } catch (y) {
          o = { error: y };
        } finally {
          try {
            p && !p.done && (i = f.return) && i.call(f);
          } finally {
            if (o) throw o.error;
          }
        }
      }
      if (a)
        throw new fr(a);
    }
  }, e.prototype.add = function(r) {
    var t;
    if (r && r !== this)
      if (this.closed)
        an(r);
      else {
        if (r instanceof e) {
          if (r.closed || r._hasParent(this))
            return;
          r._addParent(this);
        }
        (this._finalizers = (t = this._finalizers) !== null && t !== void 0 ? t : []).push(r);
      }
  }, e.prototype._hasParent = function(r) {
    var t = this._parentage;
    return t === r || Array.isArray(t) && t.includes(r);
  }, e.prototype._addParent = function(r) {
    var t = this._parentage;
    this._parentage = Array.isArray(t) ? (t.push(r), t) : t ? [t, r] : r;
  }, e.prototype._removeParent = function(r) {
    var t = this._parentage;
    t === r ? this._parentage = null : Array.isArray(t) && Vt(t, r);
  }, e.prototype.remove = function(r) {
    var t = this._finalizers;
    t && Vt(t, r), r instanceof e && r._removeParent(this);
  }, e.EMPTY = (function() {
    var r = new e();
    return r.closed = !0, r;
  })(), e;
})(), Xn = vt.EMPTY;
function eo(e) {
  return e instanceof vt || e && "closed" in e && B(e.remove) && B(e.add) && B(e.unsubscribe);
}
function an(e) {
  B(e) ? e() : e.unsubscribe();
}
var La = {
  Promise: void 0
}, Ma = {
  setTimeout: function(e, r) {
    for (var t = [], o = 2; o < arguments.length; o++)
      t[o - 2] = arguments[o];
    return setTimeout.apply(void 0, qt([e, r], Gt(t)));
  },
  clearTimeout: function(e) {
    return clearTimeout(e);
  },
  delegate: void 0
};
function to(e) {
  Ma.setTimeout(function() {
    throw e;
  });
}
function sn() {
}
function Lt(e) {
  e();
}
var jr = (function(e) {
  Re(r, e);
  function r(t) {
    var o = e.call(this) || this;
    return o.isStopped = !1, t ? (o.destination = t, eo(t) && t.add(o)) : o.destination = Da, o;
  }
  return r.create = function(t, o, i) {
    return new Cr(t, o, i);
  }, r.prototype.next = function(t) {
    this.isStopped || this._next(t);
  }, r.prototype.error = function(t) {
    this.isStopped || (this.isStopped = !0, this._error(t));
  }, r.prototype.complete = function() {
    this.isStopped || (this.isStopped = !0, this._complete());
  }, r.prototype.unsubscribe = function() {
    this.closed || (this.isStopped = !0, e.prototype.unsubscribe.call(this), this.destination = null);
  }, r.prototype._next = function(t) {
    this.destination.next(t);
  }, r.prototype._error = function(t) {
    try {
      this.destination.error(t);
    } finally {
      this.unsubscribe();
    }
  }, r.prototype._complete = function() {
    try {
      this.destination.complete();
    } finally {
      this.unsubscribe();
    }
  }, r;
})(vt), ja = (function() {
  function e(r) {
    this.partialObserver = r;
  }
  return e.prototype.next = function(r) {
    var t = this.partialObserver;
    if (t.next)
      try {
        t.next(r);
      } catch (o) {
        Ct(o);
      }
  }, e.prototype.error = function(r) {
    var t = this.partialObserver;
    if (t.error)
      try {
        t.error(r);
      } catch (o) {
        Ct(o);
      }
    else
      Ct(r);
  }, e.prototype.complete = function() {
    var r = this.partialObserver;
    if (r.complete)
      try {
        r.complete();
      } catch (t) {
        Ct(t);
      }
  }, e;
})(), Cr = (function(e) {
  Re(r, e);
  function r(t, o, i) {
    var a = e.call(this) || this, s;
    return B(t) || !t ? s = {
      next: t ?? void 0,
      error: o ?? void 0,
      complete: i ?? void 0
    } : s = t, a.destination = new ja(s), a;
  }
  return r;
})(jr);
function Ct(e) {
  to(e);
}
function Oa(e) {
  throw e;
}
var Da = {
  closed: !0,
  next: sn,
  error: Oa,
  complete: sn
}, Or = (function() {
  return typeof Symbol == "function" && Symbol.observable || "@@observable";
})();
function Ua(e) {
  return e;
}
function Fa(e) {
  return e.length === 0 ? Ua : e.length === 1 ? e[0] : function(t) {
    return e.reduce(function(o, i) {
      return i(o);
    }, t);
  };
}
var ve = (function() {
  function e(r) {
    r && (this._subscribe = r);
  }
  return e.prototype.lift = function(r) {
    var t = new e();
    return t.source = this, t.operator = r, t;
  }, e.prototype.subscribe = function(r, t, o) {
    var i = this, a = qa(r) ? r : new Cr(r, t, o);
    return Lt(function() {
      var s = i, c = s.operator, l = s.source;
      a.add(c ? c.call(a, l) : l ? i._subscribe(a) : i._trySubscribe(a));
    }), a;
  }, e.prototype._trySubscribe = function(r) {
    try {
      return this._subscribe(r);
    } catch (t) {
      r.error(t);
    }
  }, e.prototype.forEach = function(r, t) {
    var o = this;
    return t = cn(t), new t(function(i, a) {
      var s = new Cr({
        next: function(c) {
          try {
            r(c);
          } catch (l) {
            a(l), s.unsubscribe();
          }
        },
        error: a,
        complete: i
      });
      o.subscribe(s);
    });
  }, e.prototype._subscribe = function(r) {
    var t;
    return (t = this.source) === null || t === void 0 ? void 0 : t.subscribe(r);
  }, e.prototype[Or] = function() {
    return this;
  }, e.prototype.pipe = function() {
    for (var r = [], t = 0; t < arguments.length; t++)
      r[t] = arguments[t];
    return Fa(r)(this);
  }, e.prototype.toPromise = function(r) {
    var t = this;
    return r = cn(r), new r(function(o, i) {
      var a;
      t.subscribe(function(s) {
        return a = s;
      }, function(s) {
        return i(s);
      }, function() {
        return o(a);
      });
    });
  }, e.create = function(r) {
    return new e(r);
  }, e;
})();
function cn(e) {
  var r;
  return (r = e ?? La.Promise) !== null && r !== void 0 ? r : Promise;
}
function Ga(e) {
  return e && B(e.next) && B(e.error) && B(e.complete);
}
function qa(e) {
  return e && e instanceof jr || Ga(e) && eo(e);
}
function Va(e) {
  return B(e?.lift);
}
function $a(e) {
  return function(r) {
    if (Va(r))
      return r.lift(function(t) {
        try {
          return e(t, this);
        } catch (o) {
          this.error(o);
        }
      });
    throw new TypeError("Unable to lift unknown Observable type");
  };
}
function Ha(e, r, t, o, i) {
  return new za(e, r, t, o, i);
}
var za = (function(e) {
  Re(r, e);
  function r(t, o, i, a, s, c) {
    var l = e.call(this, t) || this;
    return l.onFinalize = s, l.shouldUnsubscribe = c, l._next = o ? function(u) {
      try {
        o(u);
      } catch (d) {
        t.error(d);
      }
    } : e.prototype._next, l._error = a ? function(u) {
      try {
        a(u);
      } catch (d) {
        t.error(d);
      } finally {
        this.unsubscribe();
      }
    } : e.prototype._error, l._complete = i ? function() {
      try {
        i();
      } catch (u) {
        t.error(u);
      } finally {
        this.unsubscribe();
      }
    } : e.prototype._complete, l;
  }
  return r.prototype.unsubscribe = function() {
    var t;
    if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {
      var o = this.closed;
      e.prototype.unsubscribe.call(this), !o && ((t = this.onFinalize) === null || t === void 0 || t.call(this));
    }
  }, r;
})(jr), Ba = er(function(e) {
  return function() {
    e(this), this.name = "ObjectUnsubscribedError", this.message = "object unsubscribed";
  };
}), ro = (function(e) {
  Re(r, e);
  function r() {
    var t = e.call(this) || this;
    return t.closed = !1, t.currentObservers = null, t.observers = [], t.isStopped = !1, t.hasError = !1, t.thrownError = null, t;
  }
  return r.prototype.lift = function(t) {
    var o = new ln(this, this);
    return o.operator = t, o;
  }, r.prototype._throwIfClosed = function() {
    if (this.closed)
      throw new Ba();
  }, r.prototype.next = function(t) {
    var o = this;
    Lt(function() {
      var i, a;
      if (o._throwIfClosed(), !o.isStopped) {
        o.currentObservers || (o.currentObservers = Array.from(o.observers));
        try {
          for (var s = Ke(o.currentObservers), c = s.next(); !c.done; c = s.next()) {
            var l = c.value;
            l.next(t);
          }
        } catch (u) {
          i = { error: u };
        } finally {
          try {
            c && !c.done && (a = s.return) && a.call(s);
          } finally {
            if (i) throw i.error;
          }
        }
      }
    });
  }, r.prototype.error = function(t) {
    var o = this;
    Lt(function() {
      if (o._throwIfClosed(), !o.isStopped) {
        o.hasError = o.isStopped = !0, o.thrownError = t;
        for (var i = o.observers; i.length; )
          i.shift().error(t);
      }
    });
  }, r.prototype.complete = function() {
    var t = this;
    Lt(function() {
      if (t._throwIfClosed(), !t.isStopped) {
        t.isStopped = !0;
        for (var o = t.observers; o.length; )
          o.shift().complete();
      }
    });
  }, r.prototype.unsubscribe = function() {
    this.isStopped = this.closed = !0, this.observers = this.currentObservers = null;
  }, Object.defineProperty(r.prototype, "observed", {
    get: function() {
      var t;
      return ((t = this.observers) === null || t === void 0 ? void 0 : t.length) > 0;
    },
    enumerable: !1,
    configurable: !0
  }), r.prototype._trySubscribe = function(t) {
    return this._throwIfClosed(), e.prototype._trySubscribe.call(this, t);
  }, r.prototype._subscribe = function(t) {
    return this._throwIfClosed(), this._checkFinalizedStatuses(t), this._innerSubscribe(t);
  }, r.prototype._innerSubscribe = function(t) {
    var o = this, i = this, a = i.hasError, s = i.isStopped, c = i.observers;
    return a || s ? Xn : (this.currentObservers = null, c.push(t), new vt(function() {
      o.currentObservers = null, Vt(c, t);
    }));
  }, r.prototype._checkFinalizedStatuses = function(t) {
    var o = this, i = o.hasError, a = o.thrownError, s = o.isStopped;
    i ? t.error(a) : s && t.complete();
  }, r.prototype.asObservable = function() {
    var t = new ve();
    return t.source = this, t;
  }, r.create = function(t, o) {
    return new ln(t, o);
  }, r;
})(ve), ln = (function(e) {
  Re(r, e);
  function r(t, o) {
    var i = e.call(this) || this;
    return i.destination = t, i.source = o, i;
  }
  return r.prototype.next = function(t) {
    var o, i;
    (i = (o = this.destination) === null || o === void 0 ? void 0 : o.next) === null || i === void 0 || i.call(o, t);
  }, r.prototype.error = function(t) {
    var o, i;
    (i = (o = this.destination) === null || o === void 0 ? void 0 : o.error) === null || i === void 0 || i.call(o, t);
  }, r.prototype.complete = function() {
    var t, o;
    (o = (t = this.destination) === null || t === void 0 ? void 0 : t.complete) === null || o === void 0 || o.call(t);
  }, r.prototype._subscribe = function(t) {
    var o, i;
    return (i = (o = this.source) === null || o === void 0 ? void 0 : o.subscribe(t)) !== null && i !== void 0 ? i : Xn;
  }, r;
})(ro), Ya = {
  now: function() {
    return Date.now();
  }
}, Za = (function(e) {
  Re(r, e);
  function r(t, o) {
    return e.call(this) || this;
  }
  return r.prototype.schedule = function(t, o) {
    return this;
  }, r;
})(vt), un = {
  setInterval: function(e, r) {
    for (var t = [], o = 2; o < arguments.length; o++)
      t[o - 2] = arguments[o];
    return setInterval.apply(void 0, qt([e, r], Gt(t)));
  },
  clearInterval: function(e) {
    return clearInterval(e);
  },
  delegate: void 0
}, Ka = (function(e) {
  Re(r, e);
  function r(t, o) {
    var i = e.call(this, t, o) || this;
    return i.scheduler = t, i.work = o, i.pending = !1, i;
  }
  return r.prototype.schedule = function(t, o) {
    var i;
    if (o === void 0 && (o = 0), this.closed)
      return this;
    this.state = t;
    var a = this.id, s = this.scheduler;
    return a != null && (this.id = this.recycleAsyncId(s, a, o)), this.pending = !0, this.delay = o, this.id = (i = this.id) !== null && i !== void 0 ? i : this.requestAsyncId(s, this.id, o), this;
  }, r.prototype.requestAsyncId = function(t, o, i) {
    return i === void 0 && (i = 0), un.setInterval(t.flush.bind(t, this), i);
  }, r.prototype.recycleAsyncId = function(t, o, i) {
    if (i === void 0 && (i = 0), i != null && this.delay === i && this.pending === !1)
      return o;
    o != null && un.clearInterval(o);
  }, r.prototype.execute = function(t, o) {
    if (this.closed)
      return new Error("executing a cancelled action");
    this.pending = !1;
    var i = this._execute(t, o);
    if (i)
      return i;
    this.pending === !1 && this.id != null && (this.id = this.recycleAsyncId(this.scheduler, this.id, null));
  }, r.prototype._execute = function(t, o) {
    var i = !1, a;
    try {
      this.work(t);
    } catch (s) {
      i = !0, a = s || new Error("Scheduled action threw falsy error");
    }
    if (i)
      return this.unsubscribe(), a;
  }, r.prototype.unsubscribe = function() {
    if (!this.closed) {
      var t = this, o = t.id, i = t.scheduler, a = i.actions;
      this.work = this.state = this.scheduler = null, this.pending = !1, Vt(a, this), o != null && (this.id = this.recycleAsyncId(i, o, null)), this.delay = null, e.prototype.unsubscribe.call(this);
    }
  }, r;
})(Za), dn = (function() {
  function e(r, t) {
    t === void 0 && (t = e.now), this.schedulerActionCtor = r, this.now = t;
  }
  return e.prototype.schedule = function(r, t, o) {
    return t === void 0 && (t = 0), new this.schedulerActionCtor(this, r).schedule(o, t);
  }, e.now = Ya.now, e;
})(), Ja = (function(e) {
  Re(r, e);
  function r(t, o) {
    o === void 0 && (o = dn.now);
    var i = e.call(this, t, o) || this;
    return i.actions = [], i._active = !1, i;
  }
  return r.prototype.flush = function(t) {
    var o = this.actions;
    if (this._active) {
      o.push(t);
      return;
    }
    var i;
    this._active = !0;
    do
      if (i = t.execute(t.state, t.delay))
        break;
    while (t = o.shift());
    if (this._active = !1, i) {
      for (; t = o.shift(); )
        t.unsubscribe();
      throw i;
    }
  }, r;
})(dn), Wa = new Ja(Ka), Qa = (function(e) {
  return e && typeof e.length == "number" && typeof e != "function";
});
function Xa(e) {
  return B(e?.then);
}
function es(e) {
  return B(e[Or]);
}
function ts(e) {
  return Symbol.asyncIterator && B(e?.[Symbol.asyncIterator]);
}
function rs(e) {
  return new TypeError("You provided " + (e !== null && typeof e == "object" ? "an invalid object" : "'" + e + "'") + " where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.");
}
function ns() {
  return typeof Symbol != "function" || !Symbol.iterator ? "@@iterator" : Symbol.iterator;
}
var os = ns();
function is(e) {
  return B(e?.[os]);
}
function as(e) {
  return Ra(this, arguments, function() {
    var t, o, i, a;
    return Qn(this, function(s) {
      switch (s.label) {
        case 0:
          t = e.getReader(), s.label = 1;
        case 1:
          s.trys.push([1, , 9, 10]), s.label = 2;
        case 2:
          return [4, He(t.read())];
        case 3:
          return o = s.sent(), i = o.value, a = o.done, a ? [4, He(void 0)] : [3, 5];
        case 4:
          return [2, s.sent()];
        case 5:
          return [4, He(i)];
        case 6:
          return [4, s.sent()];
        case 7:
          return s.sent(), [3, 2];
        case 8:
          return [3, 10];
        case 9:
          return t.releaseLock(), [7];
        case 10:
          return [2];
      }
    });
  });
}
function ss(e) {
  return B(e?.getReader);
}
function cs(e) {
  if (e instanceof ve)
    return e;
  if (e != null) {
    if (es(e))
      return ls(e);
    if (Qa(e))
      return us(e);
    if (Xa(e))
      return ds(e);
    if (ts(e))
      return no(e);
    if (is(e))
      return ps(e);
    if (ss(e))
      return ms(e);
  }
  throw rs(e);
}
function ls(e) {
  return new ve(function(r) {
    var t = e[Or]();
    if (B(t.subscribe))
      return t.subscribe(r);
    throw new TypeError("Provided object does not correctly implement Symbol.observable");
  });
}
function us(e) {
  return new ve(function(r) {
    for (var t = 0; t < e.length && !r.closed; t++)
      r.next(e[t]);
    r.complete();
  });
}
function ds(e) {
  return new ve(function(r) {
    e.then(function(t) {
      r.closed || (r.next(t), r.complete());
    }, function(t) {
      return r.error(t);
    }).then(null, to);
  });
}
function ps(e) {
  return new ve(function(r) {
    var t, o;
    try {
      for (var i = Ke(e), a = i.next(); !a.done; a = i.next()) {
        var s = a.value;
        if (r.next(s), r.closed)
          return;
      }
    } catch (c) {
      t = { error: c };
    } finally {
      try {
        a && !a.done && (o = i.return) && o.call(i);
      } finally {
        if (t) throw t.error;
      }
    }
    r.complete();
  });
}
function no(e) {
  return new ve(function(r) {
    hs(e, r).catch(function(t) {
      return r.error(t);
    });
  });
}
function ms(e) {
  return no(as(e));
}
function hs(e, r) {
  var t, o, i, a;
  return Ta(this, void 0, void 0, function() {
    var s, c;
    return Qn(this, function(l) {
      switch (l.label) {
        case 0:
          l.trys.push([0, 5, 6, 11]), t = Na(e), l.label = 1;
        case 1:
          return [4, t.next()];
        case 2:
          if (o = l.sent(), !!o.done) return [3, 4];
          if (s = o.value, r.next(s), r.closed)
            return [2];
          l.label = 3;
        case 3:
          return [3, 1];
        case 4:
          return [3, 11];
        case 5:
          return c = l.sent(), i = { error: c }, [3, 11];
        case 6:
          return l.trys.push([6, , 9, 10]), o && !o.done && (a = t.return) ? [4, a.call(t)] : [3, 8];
        case 7:
          l.sent(), l.label = 8;
        case 8:
          return [3, 10];
        case 9:
          if (i) throw i.error;
          return [7];
        case 10:
          return [7];
        case 11:
          return r.complete(), [2];
      }
    });
  });
}
function fs(e, r, t, o, i) {
  o === void 0 && (o = 0), i === void 0 && (i = !1);
  var a = r.schedule(function() {
    t(), i ? e.add(this.schedule(null, o)) : this.unsubscribe();
  }, o);
  if (e.add(a), !i)
    return a;
}
function _s(e, r) {
  var t = B(e) ? e : function() {
    return e;
  }, o = function(i) {
    return i.error(t());
  };
  return new ve(o);
}
var ys = er(function(e) {
  return function() {
    e(this), this.name = "EmptyError", this.message = "no elements in sequence";
  };
});
function gs(e, r) {
  return new Promise(function(t, o) {
    var i = !1, a;
    e.subscribe({
      next: function(s) {
        a = s, i = !0;
      },
      error: o,
      complete: function() {
        i ? t(a) : o(new ys());
      }
    });
  });
}
function bs(e) {
  return e instanceof Date && !isNaN(e);
}
var ws = er(function(e) {
  return function(t) {
    t === void 0 && (t = null), e(this), this.message = "Timeout has occurred", this.name = "TimeoutError", this.info = t;
  };
});
function vs(e, r) {
  var t = bs(e) ? { first: e } : typeof e == "number" ? { each: e } : e, o = t.first, i = t.each, a = t.with, s = a === void 0 ? Ps : a, c = t.scheduler, l = c === void 0 ? Wa : c, u = t.meta, d = u === void 0 ? null : u;
  if (o == null && i == null)
    throw new TypeError("No timeout provided.");
  return $a(function(_, f) {
    var p, h, y = null, g = 0, w = function(E) {
      h = fs(f, l, function() {
        try {
          p.unsubscribe(), cs(s({
            meta: d,
            lastValue: y,
            seen: g
          })).subscribe(f);
        } catch (I) {
          f.error(I);
        }
      }, E);
    };
    p = _.subscribe(Ha(f, function(E) {
      h?.unsubscribe(), g++, f.next(y = E), i > 0 && w(i);
    }, void 0, void 0, function() {
      h?.closed || h?.unsubscribe(), y = null;
    })), !g && w(o != null ? typeof o == "number" ? o : +o - l.now() : i);
  });
}
function Ps(e) {
  throw new ws(e);
}
class Es {
  constructor() {
    this.set = (r) => {
      if (this._current.status === "success")
        throw new Error("LoadedOnce is already in success state");
      this._current = { status: "success", isSuccess: !0, loadedValue: r }, this._subject.next(r), this._subject.complete();
    }, this.throw = (r, t) => {
      if (this._current.status === "success")
        throw new Error("LoadedOnce is already in success state");
      this._current = { status: "error", isSuccess: !1, error: r, errMsg: t }, this._subject.error(r);
    }, this.getValueIfLoadedElse = (r) => this._current.status === "success" ? this._current.loadedValue : r, this.subscribe = (r) => {
      if (this._current.status === "success") {
        r(this._current);
        return;
      }
      this._current.status === "error" && r(this._current);
      const t = this._subject.subscribe({
        next: () => {
          if (this._current.status !== "success")
            throw new Error("Invalid state (next): please make sure to update _current before the subject");
          r(this._current), t.unsubscribe();
        },
        error: () => {
          if (this._current.status !== "error")
            throw new Error("Invalid state (error): please make sure to update _current before the subject");
          r(this._current);
        }
      });
    }, this.waitForLoad = (r) => {
      if (this._current.status === "success") return Promise.resolve(this._current.loadedValue);
      if (this._current.status === "error") return Promise.reject(this._current.error);
      this._current.status !== "initial" && Cs(this._current);
      const t = {
        first: r.timeoutSec * 1e3,
        with: () => _s(() => new Error(r.timeoutErrMsg))
      };
      return gs(this._subject.pipe(vs(t)));
    }, this._current = { status: "initial", isSuccess: !1 }, this._subject = new ro();
  }
  get current() {
    return this._current;
  }
}
n.enum(["dev", "stg", "prod"]);
const Ss = {
  prod: "https://connto.getopenpay.com",
  stg: "https://connto.openpaystaging.com",
  dev: "http://localhost:8000"
}, ks = (e) => Ss[e];
function Cs(e) {
  throw new Error(`Unhandled case: ${e}`);
}
const Ce = () => {
  if (!(typeof window > "u"))
    return window;
}, Is = new Es(), pn = "op_metrics_queue", As = 3, xs = 3, Ts = 1e3, { log__: It } = Mr("op-metrics");
class Rs {
  constructor() {
    this.queue = [], this.processingQueue = !1, this.batchTimeout = null, this.lastEventTimestamp = 0, this.offlineListener = () => {
      It("Network offline, metrics will be queued"), this.cancelBatchProcessing();
    }, this.onlineListener = () => {
      It("Network online, processing metrics queue"), this.processQueue();
    }, this.loadQueueFromStorage(), Ce()?.addEventListener("offline", this.offlineListener), Ce()?.addEventListener("online", this.onlineListener);
  }
  addEvent(r, t, o) {
    const i = {
      eventName: r,
      properties: t || {},
      contextProperties: o || {},
      nonce: Fe(),
      timestamp: Date.now(),
      datetime: (/* @__PURE__ */ new Date()).toISOString(),
      attemptCount: 0,
      timeDiffFromPreviousEvent: this.lastEventTimestamp ? Date.now() - this.lastEventTimestamp : 0
    };
    this.lastEventTimestamp = i.timestamp, this.queue.push(i), this.saveQueueToStorage(), this.scheduleBatchProcessing();
  }
  loadQueueFromStorage() {
    try {
      const r = Ce()?.localStorage?.getItem(pn);
      r && (this.queue = JSON.parse(r));
    } catch {
      this.queue = [], this.saveQueueToStorage();
    }
  }
  saveQueueToStorage() {
    Ce()?.localStorage.setItem(pn, JSON.stringify(this.queue));
  }
  scheduleBatchProcessing() {
    const r = Ce();
    r && navigator.onLine && !this.processingQueue && this.queue.length > 0 && !this.batchTimeout && (this.batchTimeout = r.setTimeout(() => {
      this.batchTimeout = null, this.processQueue();
    }, Ts));
  }
  cancelBatchProcessing() {
    this.batchTimeout && (Ce()?.clearTimeout(this.batchTimeout), this.batchTimeout = null), this.processingQueue = !1;
  }
  processQueue() {
    !navigator.onLine || this.processingQueue || this.queue.length === 0 || (this.processingQueue = !0, this.sendBatch().finally(() => {
      this.processingQueue = !1, this.queue.length > 0 && this.scheduleBatchProcessing();
    }));
  }
  async sendBatch() {
    if (this.queue.length === 0) return;
    const r = Is.getValueIfLoadedElse(void 0);
    if (!r) {
      It("Metrics context not available, will retry later");
      return;
    }
    const t = this.queue.slice(0, xs);
    try {
      const o = {
        events: t.map((c) => ({
          event_name: c.eventName,
          device_token: r.deviceToken,
          context_properties: {
            ...r,
            ...c.contextProperties
          },
          properties: {
            nonce: c.nonce,
            datetime: c.datetime,
            timestamp: c.timestamp,
            time_diff_from_previous_event: c.timeDiffFromPreviousEvent,
            checkout_secure_token: r.checkoutSecureToken,
            ...c.properties
          }
        }))
      }, i = ks(r.environment), a = new URL("/metrics/public/capture", i);
      (await fetch(a.toString(), {
        method: "POST",
        headers: {
          "Content-Type": "application/json"
        },
        body: JSON.stringify(o),
        keepalive: !0
        // To send events even if the page is unloaded
      })).ok ? (this.queue = this.queue.slice(t.length), this.saveQueueToStorage()) : this.handleFailedBatch(t);
    } catch (o) {
      It("Error sending metrics batch:", o), this.handleFailedBatch(t);
    }
  }
  handleFailedBatch(r) {
    r.forEach((o) => {
      o.attemptCount++;
    });
    const t = r.filter((o) => o.attemptCount < As);
    this.queue = this.queue.slice(r.length), this.queue = [...t, ...this.queue], this.saveQueueToStorage();
  }
  cleanup() {
    Ce()?.removeEventListener("offline", this.offlineListener), Ce()?.removeEventListener("online", this.onlineListener), this.cancelBatchProcessing();
  }
}
new Rs();
n.object({
  stripe_pk: n.string(),
  client_secret: n.string(),
  stripe_pm_id: n.string()
});
n.object({
  type: n.string(),
  client_secret: n.string(),
  stripe_pk: n.string()
});
const Ns = (e) => {
  const r = {};
  return Object.entries(e).forEach(([t, o]) => {
    try {
      const i = zn.parse(t);
      Array.isArray(o) ? r[i] = o : Array.isArray(o._errors) && (r[i] = o._errors);
    } catch {
      return;
    }
  }), r;
}, { log__: Ls, err__: Ms } = Mr("common-cc"), js = ({
  require_zip_code: e,
  require_full_billing_address: r,
  require_full_shipping_address: t,
  payment_method: o
}) => {
  const i = {};
  return o === "ach" && (i[L.FIRST_NAME] = n.string().min(2, { message: "Minimum length is 2" }), i[L.LAST_NAME] = n.string().min(2, { message: "Minimum length is 2" })), e && (i[L.ZIP_CODE] = x), r && (i[L.LINE1] = x, i[L.CITY] = x, i[L.STATE] = x, i[L.COUNTRY] = x, i[L.ZIP_CODE] = x), t && (i[L.SHIPPING_LINE1] = x, i[L.SHIPPING_CITY] = x, i[L.SHIPPING_STATE] = x, i[L.SHIPPING_COUNTRY] = x, i[L.SHIPPING_ZIP_CODE] = x), Object.keys(i).length === 0 ? Ze : Ze.extend(i);
}, zm = (e, r, t = {}) => {
  if (t) {
    Ls(`Received default field values: ${JSON.stringify(t)}`);
    const a = Object.keys(t);
    for (let s = 0; s < a.length; s++) {
      const c = a[s], l = t[c];
      e[c] || (e[c] = l);
    }
  }
  e[L.IS_SHIPPING_SAME_AS_BILLING] = !!e[L.IS_SHIPPING_SAME_AS_BILLING], e[L.IS_SHIPPING_SAME_AS_BILLING] && (e[L.SHIPPING_LINE1] = e[L.LINE1], e[L.SHIPPING_LINE2] = e[L.LINE2], e[L.SHIPPING_LINE3] = e[L.LINE3], e[L.SHIPPING_CITY] = e[L.CITY], e[L.SHIPPING_STATE] = e[L.STATE], e[L.SHIPPING_COUNTRY] = e[L.COUNTRY], e[L.SHIPPING_ZIP_CODE] = e[L.ZIP_CODE]);
  const i = js(t).safeParse(e);
  if (!i.success) {
    const a = i.error.format(), s = Ns(a), c = Object.keys(s);
    for (let l = 0; l < c.length; l++) {
      const u = c[l], d = s[u];
      r(u, d, u);
    }
    throw Ms("Got validation errors in non-CDE form fields", s), new Error("Almost there! Just a few things highlighted above to fix before you can submit.");
  }
  return i.data;
}, Dr = n.enum(["stripe", "airwallex", "authorize_net", "adyen", "paypal", "pockyt", "loop"]);
Dr.Enum.stripe;
n.object({
  "op-airwallex-3ds-url": n.string(),
  "op-airwallex-initial-intent-id": n.string(),
  "op-airwallex-consent-id": n.string()
});
n.object({
  provider: n.literal("apple_pay"),
  processor_name: n.literal("airwallex"),
  metadata: n.object({
    processor_account_id: n.string(),
    processor_account_name: n.string()
  })
});
n.object({
  provider: n.literal("google_pay"),
  processor_name: n.literal("airwallex"),
  metadata: n.object({
    processor_account_id: n.string(),
    processor_account_name: n.string(),
    google_pay_merchant_id: n.string().nullish()
  })
});
const mn = {
  isAvailable: !1,
  isLoading: !0,
  startFlow: async () => {
  }
};
n.object({
  data: n.object({
    messageHeaders: n.record(n.string(), n.any()),
    errors: n.array(n.any()),
    messageType: n.string(),
    messageBody: n.record(n.string(), n.any())
  }),
  origin: n.literal("https://applepay.cdn-apple.com")
});
const Os = n.enum(["test", "live", "live-us", "live-in", "live-apse", "live-au"]);
n.enum([
  "ar",
  "bg-BG",
  "ca-ES",
  "cs-CZ",
  "da-DK",
  "de-DE",
  "el-GR",
  "en-US",
  "es-ES",
  "et-EE",
  "fi-FI",
  "fr-FR",
  "hr-HR",
  "hu-HU",
  "is-IS",
  "it-IT",
  "ja-JP",
  "ko-KR",
  "lt-LT",
  "lv-LV",
  "nl-NL",
  "no-NO",
  "pl-PL",
  "pt-BR",
  "pt-PT",
  "ro-RO",
  "ru-RU",
  "sk-SK",
  "sl-SI",
  "sv-SE",
  "zh-CN",
  "zh-TW"
]);
n.object({
  "op-account-id": n.string(),
  "op-adyen-client-key": n.string(),
  "op-adyen-environment": Os,
  "op-adyen-action": n.string()
});
n.object({
  provider: n.literal("apple_pay"),
  processor_name: n.literal("adyen"),
  metadata: n.object({
    processor_account_id: n.string(),
    processor_account_name: n.string()
  })
});
n.object({
  provider: n.literal("google_pay"),
  processor_name: n.literal("adyen"),
  metadata: n.object({
    processor_account_id: n.string(),
    processor_account_name: n.string(),
    google_pay_merchant_id: n.string().nullish()
  })
});
n.object({
  provider: n.literal("apple_pay"),
  processor_name: n.literal("authorize_net"),
  metadata: n.object({
    processor_account_id: n.string(),
    processor_account_name: n.string()
  })
});
n.object({
  provider: n.literal("google_pay"),
  processor_name: n.literal("authorize_net"),
  metadata: n.object({
    processor_account_id: n.string(),
    processor_account_name: n.string(),
    google_pay_merchant_id: n.string().nullish()
  })
});
n.object({
  step_up_url: n.string(),
  access_token: n.string(),
  dd_url: U(n.string()),
  dd_token: U(n.string()),
  merchant_data: n.string()
});
n.object({
  "op-pockyt-3ds-url": n.string(),
  "op-pockyt-txn-no": n.string(),
  "op-pockyt-ref-no": n.string()
});
n.object({
  stripe_pk: n.string(),
  client_secret: n.string(),
  stripe_pm_id: n.string()
});
n.array(
  n.object({
    our_existing_pm_id: n.string()
  })
).length(1);
n.object({
  processor_name: n.literal("loop"),
  provider: n.literal("crypto"),
  metadata: n.object({
    merchant_id: n.string(),
    entity_id: n.string(),
    api_token: n.string(),
    supported_currencies: n.array(n.string()),
    environment: n.string()
  })
});
var Ds = /* @__PURE__ */ ((e) => (e.Local = "local", e.Development = "development", e.Staging = "staging", e.Demo = "demo", e.Production = "production", e))(Ds || {}), Us = /* @__PURE__ */ ((e) => (e.METHOD_CREATION_FAILED = "methodCreationFailed", e.INSUFFICIENT_BALANCE = "insufficientBalance", e.INSUFFICIENT_AUTHORIZATION = "insufficientAuthorization", e.SIGNED_MESSAGE_REQUIRED = "signedMessageRequired", e.CUSTOMER_CREATION_FAILED = "customerCreationFailed", e.PAYMENT_FAILED = "paymentFailed", e.TRANSACTION_FAILED = "transactionFailed", e))(Us || {}), Fs = /* @__PURE__ */ ((e) => (e.IDLE = "idle", e.CONFIRMING_BALANCE = "confirmingBalance", e.CONFIRMING_AUTHORIZATION = "confirmingAuthorization", e.UPDATING_AUTHORIZATION = "updatingAuthorization", e.SIGNING_MESSAGE = "signingMessage", e.CREATING_CUSTOMER = "creatingCustomer", e.CREATING_PAYMENT_METHOD = "creatingPaymentMethod", e.PROCESSING_PAYMENT = "processingPayment", e.CREATING_PAYMENT = "creatingPayment", e.CONFIRMING_PAYMENT = "confirmingPayment", e.COMPLETE = "complete", e.AUTHORIZED = "authorized", e))(Fs || {});
const Gs = {
  isAvailable: !1,
  isLoading: !0,
  config: null,
  widget: null
};
n.object({
  provider: n.literal("paypal"),
  metadata: n.object({ client_id: n.string() }),
  processor_name: n.literal("paypal")
});
n.object({
  processor_name: n.literal("pockyt"),
  provider: n.literal("paypal")
});
n.array(
  n.object({
    paypal_iframe_url: n.string(),
    verify_token: n.string()
  })
).length(1);
n.object({
  provider: n.literal("stripe_link"),
  processor_name: n.literal("stripe"),
  metadata: n.object({
    stripe_pk: n.string()
  })
});
n.array(
  n.object({
    our_existing_pm_id: n.string()
  })
).length(1);
n.object({
  provider: n.union([n.literal("apple_pay"), n.literal("google_pay")]),
  processor_name: n.literal("stripe"),
  metadata: n.object({
    stripe_pk: n.string()
  })
});
const { err__: qs } = Mr("form-callbacks"), ae = n.function().optional(), hn = n.object({
  onFocus: ae,
  onBlur: ae,
  onChange: ae,
  onLoad: ae,
  onLoadError: ae,
  onValidationError: ae,
  onCheckoutStarted: ae,
  onCheckoutSuccess: ae,
  onSetupPaymentMethodSuccess: ae,
  onCheckoutError: ae,
  onPaymentRequestLoad: ae
}), ge = class ge {
  constructor() {
    this.setCallbacks = (r) => {
      this._callbacks = ge.createEmptyCallbacks(), Object.entries(r).forEach(([t, o]) => {
        const i = xa(t, o ?? ge.NOOP, qs);
        this._callbacks[t] = i;
      });
    }, this._callbacks = ge.createEmptyCallbacks();
  }
  /**
   * Returns a read-only version of the callbacks object.
   */
  get get() {
    return { ...this._callbacks };
  }
};
ge.NOOP = () => {
}, ge.createEmptyCallbacks = () => {
  const r = {};
  return Object.keys(hn.keyof().enum).forEach((t) => {
    r[t] = ge.NOOP;
  }), r;
}, ge.fromObject = (r) => {
  const t = new ge();
  return t.setCallbacks(hn.parse(r)), t;
};
let Ir = ge;
var oo = /* @__PURE__ */ ((e) => (e.card = "card", e.pockytPaypal = "pockyt-paypal", e.applePay = "apple-pay", e.googlePay = "google-pay", e.loopCrypto = "loop-crypto", e.paypal = "paypal", e.stripeLink = "stripe-link", e.airwallexGooglePay = "airwallex-google-pay", e.airwallexApplePay = "airwallex-apple-pay", e.authorizenetGooglePay = "authorizenet-google-pay", e.authorizenetApplePay = "authorizenet-apple-pay", e.adyenGooglePay = "adyen-google-pay", e.adyenApplePay = "adyen-apple-pay", e.airwallexACH = "airwallex-ach", e.airwallexEFT = "airwallex-eft", e.airwallexBACS = "airwallex-bacs", e.airwallexSEPA = "airwallex-sepa", e))(oo || {});
n.nativeEnum(oo);
const fn = {
  isLoading: !0,
  isAvailable: !1,
  processors: [],
  startFlow: async () => {
    console.warn(
      `startFlow triggered while payment request is still not ready. 
      You can check the ".isLoading" param to know when a payment request is still loading, 
      and ".isAvailable" to know if a payment request is available.`
    );
  }
}, Vs = (e) => {
  const r = [e.airwallexApplePay, e.authorizeNetApplePay, e.adyenApplePay], t = [];
  r.forEach((i) => {
    const a = i.publisher.getValueIfLoadedElse(null);
    a?.isAvailable && t.push(a);
  });
  const o = e.stripePR.publisher.getValueIfLoadedElse(null);
  return o?.isAvailable && o.availableProviders.applePay && t.push({
    isAvailable: !0,
    isLoading: !1,
    processor: Dr.Enum.stripe,
    startFlow: (a) => o.startFlow("apple_pay", {
      overridePaymentRequest: a?.overridePaymentRequest
    })
  }), {
    processors: t.map((i) => i.processor),
    isAvailable: t.length > 0,
    isLoading: !1,
    startFlow: (i) => Hs(t, i)
  };
}, $s = (e) => {
  const r = [e.airwallexGooglePay, e.authorizeNetGooglePay, e.adyenGooglePay], t = [];
  r.forEach((i) => {
    const a = i.publisher.getValueIfLoadedElse(null);
    a?.isAvailable && t.push(a);
  });
  const o = e.stripePR.publisher.getValueIfLoadedElse(null);
  return o?.isAvailable && o.availableProviders.googlePay && t.push({
    isAvailable: !0,
    isLoading: !1,
    processor: Dr.Enum.stripe,
    startFlow: (a) => o.startFlow("google_pay", {
      overridePaymentRequest: a?.overridePaymentRequest
    })
  }), {
    processors: t.map((i) => i.processor),
    isAvailable: t.length > 0,
    isLoading: !1,
    startFlow: (i) => zs(t, i)
  };
}, Hs = (e, r) => {
  if (r?.processor) {
    const o = e.find((i) => i.processor === r.processor);
    if (o?.isAvailable)
      return o.startFlow(r);
    throw new Error(`Specified Apple Pay processor ${r.processor} is not available`);
  }
  const t = e.find((o) => o.isAvailable);
  if (t)
    return t.startFlow(r);
  throw new Error("No available Apple Pay processor found");
}, zs = (e, r) => {
  if (r?.processor) {
    const o = e.find((i) => i.processor === r.processor);
    if (o?.isAvailable)
      return o.startFlow(r);
    throw new Error(`Specified Google Pay processor ${r.processor} is not available`);
  }
  const t = e.find((o) => o.isAvailable);
  if (t)
    return t.startFlow(r);
  throw new Error("No available Google Pay processor found");
}, Bs = (e) => JSON.stringify(e), io = xi({
  formId: "",
  formHeight: "",
  referrer: void 0,
  checkoutSecureToken: void 0,
  registerIframe: () => {
  },
  baseUrl: ""
}), Ys = () => {
  const e = Ti(io);
  if (!e)
    throw new Error("useOpenPayElements must be used within an OpenPayElementsProvider");
  return e;
}, tr = (e) => {
  const { elementType: r, styles: t } = e, { formId: o, referrer: i, formHeight: a, checkoutSecureToken: s, registerIframe: c, baseUrl: l } = Ys(), u = r.toLowerCase(), [d, _] = be(!1), f = Ri(null), p = hr(() => t ? Bs(t) : "", [t]), h = hr(() => ({
    border: "none",
    width: "100%",
    height: a
  }), [a]), y = hr(() => {
    if (!s || !i) return "";
    const w = new URLSearchParams();
    return w.append("referer", i), w.append("styles", p), w.append("formId", o), w.append("secureToken", s), w.toString();
  }, [p, o, i, s]);
  if (Er(() => _(!0), []), Er(() => {
    !f.current || !d || c(r, f.current);
  }, [d]), !s)
    return console.error("[form] Cannot render partially initialized frame"), /* @__PURE__ */ ue("div", {});
  const g = new URL(`/app/v1/${u}-element/`, l);
  return g.search = y, /* @__PURE__ */ ue(
    "iframe",
    {
      id: `ojs-${u}-element`,
      name: `${u}-element`,
      className: "ojs-iframe",
      src: g.toString(),
      style: h,
      ref: f
    }
  );
}, Bm = ({ styles: e }) => /* @__PURE__ */ ue(tr, { styles: e, elementType: wt.CARD }), Ym = ({ styles: e }) => /* @__PURE__ */ ue(tr, { styles: e, elementType: wt.CARD_CVC }), Zm = ({ styles: e }) => /* @__PURE__ */ ue(tr, { styles: e, elementType: wt.CARD_EXPIRY }), Km = ({ styles: e }) => /* @__PURE__ */ ue(tr, { styles: e, elementType: wt.CARD_NUMBER });
function Zs(e, r) {
  var t = Object.setPrototypeOf;
  t ? t(e, r) : e.__proto__ = r;
}
function Ks(e, r) {
  r === void 0 && (r = e.constructor);
  var t = Error.captureStackTrace;
  t && t(e, r);
}
var Js = /* @__PURE__ */ (function() {
  var e = function(r, t) {
    return e = Object.setPrototypeOf || {
      __proto__: []
    } instanceof Array && function(o, i) {
      o.__proto__ = i;
    } || function(o, i) {
      for (var a in i)
        Object.prototype.hasOwnProperty.call(i, a) && (o[a] = i[a]);
    }, e(r, t);
  };
  return function(r, t) {
    if (typeof t != "function" && t !== null) throw new TypeError("Class extends value " + String(t) + " is not a constructor or null");
    e(r, t);
    function o() {
      this.constructor = r;
    }
    r.prototype = t === null ? Object.create(t) : (o.prototype = t.prototype, new o());
  };
})(), Ws = (function(e) {
  Js(r, e);
  function r(t, o) {
    var i = this.constructor, a = e.call(this, t, o) || this;
    return Object.defineProperty(a, "name", {
      value: i.name,
      enumerable: !1,
      configurable: !0
    }), Zs(a, i.prototype), Ks(a), a;
  }
  return r;
})(Error);
const T = n.string().trim().min(1, { message: "Please fill in this field" }), P = n.string().trim().optional(), F = (e) => n.nullable(e.optional());
var m = /* @__PURE__ */ ((e) => (e.FIRST_NAME = "firstName", e.LAST_NAME = "lastName", e.PHONE = "phone", e.EMAIL = "email", e.LINE1 = "line1", e.LINE2 = "line2", e.LINE3 = "line3", e.CITY = "city", e.STATE = "state", e.COUNTRY = "country", e.ZIP_CODE = "zipCode", e.SHIPPING_LINE1 = "shippingAddressLine1", e.SHIPPING_LINE2 = "shippingAddressLine2", e.SHIPPING_LINE3 = "shippingAddressLine3", e.SHIPPING_CITY = "shippingAddressCity", e.SHIPPING_STATE = "shippingAddressState", e.SHIPPING_COUNTRY = "shippingAddressCountry", e.SHIPPING_ZIP_CODE = "shippingAddressZipCode", e.IS_SHIPPING_SAME_AS_BILLING = "isShippingSameAsBilling", e.PROMOTION_CODE = "promotionCode", e.IS_BUSINESS_PURCHASE = "isBusinessPurchase", e.BUSINESS_NAME = "businessName", e.TAX_ID = "taxId", e.TAX_ID_TYPE = "taxIdType", e))(m || {});
const ao = n.nativeEnum(m);
var so = /* @__PURE__ */ ((e) => (e.CARD_NUMBER = "cardNumber", e.CARD_EXPIRY = "cardExpiry", e.CARD_CVC = "cardCvc", e))(so || {});
const co = n.nativeEnum(so), lo = n.union([ao, co]);
var we = /* @__PURE__ */ ((e) => (e.CARD = "card", e.CARD_NUMBER = "card-number", e.CARD_EXPIRY = "card-expiry", e.CARD_CVC = "card-cvc", e.CDE_BRIDGE = "cde-bridge", e))(we || {});
const Qs = n.enum(["card", "card-number", "card-expiry", "card-cvc", "cde-bridge"]), rr = n.object({
  provider: n.string(),
  processor_name: F(n.string()),
  metadata: F(n.record(n.string(), n.any()))
}), Xs = n.object({
  id: n.string()
}), nr = n.object({
  backgroundColor: P,
  color: P,
  fontFamily: P,
  fontSize: P,
  fontWeight: P,
  margin: P,
  padding: P,
  letterSpacing: P,
  lineHeight: P,
  hideIcon: P,
  placeholderStyle: n.object({
    color: P,
    fontSize: P,
    fontWeight: P,
    fontFamily: P,
    letterSpacing: P,
    lineHeight: P
  }).optional()
});
nr.extend({
  disableAutoFill: P,
  placeholder: n.object({
    cardNumber: P,
    expiry: P,
    cvc: P
  }).optional()
});
nr.extend({
  disableAutoFill: P,
  placeholder: n.string().optional(),
  /**
   * The card icon at the start of the card number input field
   * It won't affect after the icon changed to card brand after the user input the card number
   */
  icon: n.object({
    color: n.string().optional()
  }).optional()
});
nr.extend({
  disableAutoFill: P,
  placeholder: n.string().optional()
});
nr.extend({
  disableAutoFill: P,
  placeholder: n.string().optional()
});
const pe = n.enum([
  // Element -> Form
  "LAYOUT",
  "LOADED",
  "BLUR",
  "FOCUS",
  "CHANGE",
  "TOKENIZE_STARTED",
  "CHECKOUT_STARTED",
  "PAYMENT_FLOW_STARTED",
  "TOKENIZE_SUCCESS",
  "CHECKOUT_SUCCESS",
  "LOAD_ERROR",
  "VALIDATION_ERROR",
  "TOKENIZE_ERROR",
  "CHECKOUT_ERROR",
  "SETUP_PAYMENT_METHOD_SUCCESS",
  // Form -> Element
  "TOKENIZE",
  "CHECKOUT",
  "START_PAYMENT_FLOW"
]), ec = pe.extract(["TOKENIZE_STARTED", "CHECKOUT_STARTED"]), tc = n.object({ type: ec }), rc = pe.extract(["BLUR", "FOCUS", "CHANGE"]), nc = n.object({
  type: rc,
  elementType: co,
  errors: n.array(n.string()).optional(),
  obfuscatedValue: n.string().optional()
}), oc = pe.extract(["LOAD_ERROR", "TOKENIZE_ERROR", "CHECKOUT_ERROR"]), ic = n.object({
  type: oc,
  message: T,
  headers: n.record(n.string(), n.string()).optional()
}), ac = pe.extract(["VALIDATION_ERROR"]), sc = n.object({
  type: ac,
  elementType: lo,
  errors: n.array(n.string())
}), cc = n.object({
  type: n.literal(pe.enum.LAYOUT),
  height: T
}), lc = n.object({
  type: n.literal(pe.enum.LOADED),
  sessionId: T,
  totalAmountAtoms: n.number(),
  currency: P,
  checkoutPaymentMethods: n.array(rr)
}), uc = n.object({
  type: n.literal(pe.enum.PAYMENT_FLOW_STARTED),
  nextActionMetadata: n.record(n.string(), n.any()),
  paymentFlowMetadata: n.any().optional(),
  startPFMetadata: n.optional(n.record(n.string(), n.any()))
}), dc = n.object({
  type: n.literal(pe.enum.SETUP_PAYMENT_METHOD_SUCCESS),
  paymentMethodId: n.string()
}), Je = n.object({
  email: T.email({ message: "Please enter a valid email address" }),
  firstName: T,
  lastName: T,
  promotionCode: P,
  line1: P,
  line2: P,
  line3: P,
  city: P,
  state: P,
  country: T,
  zipCode: P,
  isShippingSameAsBilling: n.custom().optional().default(!0),
  shippingAddressLine1: P,
  shippingAddressLine2: P,
  shippingAddressLine3: P,
  shippingAddressCity: P,
  shippingAddressState: P,
  shippingAddressCountry: P,
  shippingAddressZipCode: P,
  businessName: P,
  taxId: P,
  taxIdType: P
}), pc = n.object({
  email: T.email({ message: "Please enter a valid email address" }),
  firstName: P,
  lastName: P,
  promotionCode: P,
  line1: P,
  line2: P,
  line3: P,
  city: P,
  state: P,
  country: T,
  zipCode: P,
  isShippingSameAsBilling: n.custom().optional().default(!0),
  shippingAddressLine1: P,
  shippingAddressLine2: P,
  shippingAddressLine3: P,
  shippingAddressCity: P,
  shippingAddressState: P,
  shippingAddressCountry: P,
  shippingAddressZipCode: P,
  businessName: P,
  taxId: P,
  taxIdType: P
});
n.object({
  line1: T,
  city: T,
  state: T,
  country: T
});
n.object({
  shippingAddressCountry: T,
  shippingAddressZipCode: T
});
n.object({
  shippingAddressLine1: T,
  shippingAddressCity: T,
  shippingAddressState: T,
  shippingAddressCountry: T,
  shippingAddressZipCode: T
});
const mc = pe.extract(["TOKENIZE", "CHECKOUT", "START_PAYMENT_FLOW"]), hc = n.object({
  type: mc,
  sessionId: T,
  checkoutPaymentMethod: rr,
  paymentFlowMetadata: n.any().optional(),
  doNotUseLegacyCCFlow: n.boolean().optional(),
  existingCCPMId: P,
  paymentRouteId: P
}).extend(Je.shape), fc = n.object({
  type: n.literal(pe.enum.TOKENIZE_SUCCESS),
  isReadyForCheckout: n.boolean()
}), _c = n.object({
  type: n.literal(pe.enum.CHECKOUT_SUCCESS),
  invoiceUrls: n.array(n.string()),
  subscriptionIds: n.array(n.string()),
  customerId: n.string(),
  paymentMethodId: P
}), yc = n.discriminatedUnion("type", [
  tc,
  nc,
  ic,
  sc,
  cc,
  lc,
  hc,
  fc,
  _c,
  uc,
  dc
]), gc = n.object({
  payload: yc,
  nonce: T,
  formId: T,
  elementId: T
});
n.object({
  amountAtom: n.number(),
  /**
   * The three-letter ISO 4217 currency code for the payment.
   */
  currency: T
});
n.enum(["apple_pay", "google_pay"]);
n.object({
  secure_token: n.string(),
  promotion_code: n.string().optional()
});
n.object({
  secure_token: n.string(),
  existing_cc_pm_id: F(n.string()),
  their_pm_id: F(n.string()),
  checkout_attempt_id: F(n.string()),
  processor_specific_metadata: F(n.record(n.string(), n.any()))
});
const ht = n.object({
  invoice_urls: n.array(n.string()),
  subscription_ids: n.array(n.string()),
  customer_id: n.string(),
  payment_method_id: F(n.string()),
  processors_used: F(n.array(n.string()))
}), bc = n.object({
  elementType: n.string(),
  errors: n.array(n.string())
});
n.object({
  session_id: n.string()
});
const wc = n.object({
  success: n.literal(!1),
  error_type: n.literal("validation_error"),
  errors: n.array(bc)
}), vc = n.discriminatedUnion("success", [
  n.object({ success: n.literal(!0) }),
  wc
]);
n.object({
  session_id: n.string(),
  checkout_payment_method: rr,
  non_cde_form_fields: Je,
  do_not_use_legacy_cc_flow: n.boolean().optional(),
  existing_cc_pm_id: F(n.string()),
  extra_metadata: n.record(n.string(), n.any()),
  payment_route_id: F(n.string()),
  customer_language: F(n.string())
});
n.object({
  session_id: n.string(),
  checkout_payment_method: rr,
  non_cde_form_fields: Je,
  extra_metadata: n.record(n.string(), n.any()).optional(),
  payment_route_id: F(n.string()),
  customer_language: F(n.string())
});
var M = /* @__PURE__ */ ((e) => (e.SUCCESS = "success", e.FAILURE = "failure", e.CANCELLED = "cancelled", e))(M || {});
const uo = n.object({
  status: n.enum([
    "success",
    "failure",
    "cancelled"
    /* CANCELLED */
  ]),
  href: n.string().optional().nullable()
});
n.object({
  href: n.string().optional().nullable()
});
const Pc = n.object({
  type: n.string(),
  redirect_url: n.string(),
  initial_intent_id: n.string(),
  consent_id: n.string(),
  their_pm_id: n.string().optional()
}), Ec = n.object({
  bank_name: n.string(),
  display_name: n.string(),
  resources: n.object({
    logo_url: n.string().optional()
  })
}), po = n.object({
  type: n.string(),
  redirect_url: F(n.string()),
  initial_intent_id: F(n.string()),
  consent_id: F(n.string()),
  their_pm_id: F(n.string()),
  payment_session: F(n.record(n.string(), n.any())),
  available_banks: F(n.array(Ec))
}), Sc = n.discriminatedUnion("present", [
  n.object({ present: n.literal(!0), href: n.string() }),
  n.object({ present: n.literal(!1) })
]), kc = n.object({
  payment_methods: n.array(Xs),
  pay_first_success_response: F(ht),
  required_user_actions: F(n.array(po)),
  post_checkout_redirect_to: F(n.string()),
  checkout_success_response: F(ht)
}), Cc = n.object({
  institutionNumber: n.string(),
  transitNumber: n.string(),
  accountNumber: n.string(),
  accountType: n.enum(["personal", "business"])
});
n.object({
  status: n.enum(["success", "failure"]),
  payload: Cc.optional()
});
const Ic = n.object({
  sortCode: n.string(),
  accountNumber: n.string(),
  accountType: n.enum(["personal", "business"])
});
n.object({
  status: n.enum(["success", "failure"]),
  payload: Ic.optional()
});
const Ac = n.object({
  iban: n.string(),
  accountType: n.enum(["personal", "business"])
});
n.object({
  status: n.enum(["success", "failure"]),
  payload: Ac.optional()
});
const xc = n.object({
  account_number: n.string(),
  aba_routing_number: n.string()
}), Tc = n.object({
  institution_number: n.string(),
  transit_number: n.string(),
  account_number: n.string()
}), Rc = n.object({
  account_number: n.string(),
  sort_code: n.string()
}), Nc = n.object({
  iban: n.string()
}), Lc = n.object({
  status: n.enum(["success", "failure"]),
  payload: n.union([
    xc,
    Tc,
    Rc,
    Nc,
    n.object({ error: n.string() })
  ]).optional()
}), k = (e) => n.nullable(e.optional());
n.string().trim().min(1, { message: "Cannot be blank" });
const Mc = n.object({
  cde_response_type: n.literal("error"),
  message: n.string(),
  headers: n.record(n.string(), n.string()).optional()
});
n.enum(["usd", "brl"]);
const mo = n.object({
  name: n.string(),
  amount_atom_off: k(n.number()),
  percent_off: k(n.number()),
  currency: k(n.string()),
  duration: n.string(),
  duration_in_months: k(n.number())
}), ho = n.object({
  amount_subtotal_atom: n.number().int(),
  amount_total_atom: n.number().int(),
  currency: n.string(),
  description: k(n.string()),
  price_id: n.string(),
  billing_interval: k(n.string()),
  billing_interval_count: k(n.number().int()),
  quantity: n.number().int()
}), jc = n.record(n.string(), n.any()), Oc = n.object({
  name: n.string(),
  settings: k(jc)
}), tt = n.object({
  provider: n.string(),
  processor_name: k(n.string()),
  metadata: k(n.record(n.string(), n.any()))
}), Dc = n.object({
  quantity: n.number()
}), Uc = n.object({
  id: k(n.string()),
  billing_interval: k(n.string()),
  billing_interval_count: k(n.number().int()),
  subscription_items: n.array(Dc),
  trial_start: k(n.string()),
  trial_end: k(n.string())
}), fo = n.object({
  amount_atom: n.number()
}), Fc = n.object({
  amount_atom: n.number(),
  amount_atom_considering_discount_applied: n.number(),
  currency: n.string(),
  discount_amount_atoms: n.array(fo),
  subscription_item_id: n.string()
}), Gc = n.object({
  coupon: mo
}), qc = n.object({
  currency: n.string(),
  discounts: n.array(Gc),
  hosted_invoice_url: k(n.string()),
  lines: n.array(Fc),
  remaining_amount_atom: n.number(),
  tax_amount_atom: n.number(),
  total_amount_atom: n.number(),
  total_discount_amount_atoms: n.array(fo)
}), _n = n.object({
  created: n.array(Uc),
  invoices: n.array(qc),
  processors_used: k(n.array(n.string())),
  payment_method_id: k(n.string())
}), _o = n.object({
  preview: _n,
  preview_post_trial: k(_n),
  coupons: n.array(mo)
}), yn = n.object({
  status: n.literal("open"),
  locale: k(n.string()),
  token: n.string(),
  email: k(n.string()),
  checkout_settings: n.record(n.string(), n.any()),
  line_items: n.array(ho),
  amount_subtotal_atom: n.number().int(),
  amount_total_atom: n.number().int(),
  brand: Oc,
  subs_preview: k(_o),
  // Null in setup mode
  methods_available: n.array(tt),
  return_url: k(n.string()),
  success_url: k(n.string()),
  final_feature_rollout_settings: k(n.record(n.string(), n.any()))
}), yo = n.discriminatedUnion("mode", [
  n.object({
    mode: n.literal("setup"),
    currency: n.nullable(n.undefined())
  }).extend(yn.shape),
  n.object({
    mode: n.enum(["payment", "subscription"]),
    currency: n.string()
  }).extend(yn.shape)
]), Vc = n.object({
  status: n.literal("complete")
}), $c = n.object({
  status: n.literal("expired")
});
n.union([yo, Vc, $c]);
n.object({
  logo: n.string(),
  icon: n.string(),
  primary_color: n.string(),
  secondary_color: n.string()
});
n.object({
  secure_token: n.string(),
  pm_id: n.string()
});
const $t = n.object({
  line1: n.string().optional(),
  line2: n.string().optional(),
  line3: n.string().optional(),
  city: n.string().optional(),
  state: n.string().optional(),
  country: n.string(),
  zip_code: n.string().optional()
});
n.object({
  secure_token: n.string(),
  payment_input: n.any(),
  // Should follow AnyPaymentInput from CDE
  customer_email: n.string(),
  customer_last_name: n.string().optional(),
  customer_first_name: n.string().optional(),
  customer_address: $t,
  customer_shipping_address: $t.optional(),
  line_items: n.array(ho),
  total_amount_atom: n.number().int(),
  cancel_at_end: n.boolean(),
  checkout_payment_method: tt,
  promotion_code: n.string().optional(),
  do_not_use_legacy_cc_flow: n.boolean().optional(),
  use_confirmed_pm_id: k(n.string()),
  payment_route_id: k(n.string())
});
const go = n.object({
  payment_method_id: n.string()
});
n.object({
  id: n.string(),
  return_url: n.string()
});
const Hc = n.object({
  type: n.string(),
  loc: n.array(n.string()),
  msg: n.string(),
  url: n.string()
});
n.array(Hc);
const zc = n.object({
  new_customer_email: n.string().optional(),
  new_customer_last_name: n.string().optional(),
  new_customer_first_name: n.string().optional(),
  customer_business_name: n.string().optional(),
  customer_tax_id: n.string().optional(),
  customer_tax_id_type: n.string().optional(),
  new_customer_address: $t,
  new_customer_shipping_address: $t.optional()
}), Bc = n.object({
  price_id: n.string(),
  quantity: n.number().int()
}), bo = n.object({
  line_items: n.array(Bc),
  promotion_code: n.string().optional(),
  displayed_total_amount_atom: n.number().int()
}), Yc = n.object({
  processor_specific_metadata: k(n.record(n.string(), n.any()))
});
n.object({
  payment_provider: n.string(),
  checkout_payment_method: tt,
  existing_cc_pm_id: n.string().optional(),
  their_existing_pm_id: n.string().optional(),
  use_pay_first_flow: n.boolean().optional(),
  pay_first_flow_cart_info: bo.optional(),
  customer_language: n.string().optional()
}).extend(zc.shape).extend(Yc.shape);
const wo = n.object({
  required_user_actions: n.array(n.record(n.string(), n.any())),
  checkout_attempt_id: k(n.string())
});
n.object({
  fields: pc,
  checkoutPaymentMethod: tt,
  payment_route_id: k(n.string())
});
n.object({
  session_id: n.string(),
  non_cde_form_fields: Je,
  checkout_payment_method: tt,
  extra_metadata: n.record(n.string(), n.any()),
  // This is optional in CDE, but not in OJS moving forward
  use_unified_cc_flow: k(n.boolean()),
  pay_first_flow_cart_info: bo.optional(),
  payment_route_id: k(n.string()),
  customer_language: n.string().optional(),
  existing_cc_pm_id: k(n.string())
});
const Zc = n.object({
  required_user_actions: n.array(n.record(n.string(), n.any())),
  cc_pm_id: n.string(),
  checkout_success_response: k(ht),
  checkout_attempt_id: k(n.string())
});
n.record(n.any());
n.object({
  first_name: k(n.string()),
  last_name: k(n.string()),
  line1: k(n.string()),
  line2: k(n.string()),
  line3: k(n.string()),
  city: k(n.string()),
  state: k(n.string()),
  country: k(n.string()),
  zip_code: k(n.string()),
  email: k(n.string()),
  billing_email: k(n.string()),
  phone_number: k(n.string()),
  business_name: k(n.string()),
  tax_id: k(n.string()),
  tax_id_type: k(n.string()),
  update_processor_customer: k(n.boolean())
});
n.object({
  id: n.string(),
  email: k(n.string()),
  first_name: k(n.string()),
  last_name: k(n.string()),
  phone_number: k(n.string()),
  billing_email: k(n.string()),
  address: k(n.record(n.string(), n.any()))
});
n.object({
  message: n.string()
});
const Kc = n.object({
  error_code: n.string()
});
n.object({
  checkout_payment_method: tt,
  processor_specific_metadata: n.record(n.any()).optional(),
  payment_route_id: k(n.string())
});
const Jc = n.object({
  next_action_metadata: k(n.record(n.any()))
});
n.object({
  events: n.array(
    n.object({
      event_name: n.string(),
      device_token: n.string(),
      properties: n.record(n.any()).optional(),
      context_properties: n.record(n.any()).optional()
    })
  )
});
n.any().optional();
n.object({
  device_token: n.string()
});
const Wc = n.object({}), Qc = n.object({
  _unified_cc_action_name: n.string(),
  _unified_cc_pccs_id: n.string()
}).catchall(n.any()), Xc = n.object({
  type: n.string(),
  loc: n.array(n.string()),
  msg: n.string(),
  url: n.string()
}), el = n.array(Xc), tl = n.object({
  code: n.string(),
  message: n.string(),
  path: n.array(n.string())
}), rl = n.array(tl), nl = {
  "failed to fetch": "Connection error: please double check if you are connected to the internet, then try again"
}, Ar = (e) => {
  const r = e.toLowerCase().trim();
  return nl[r] ?? e;
}, ol = (e) => {
  try {
    return typeof JSON.parse(e) == "object";
  } catch {
    return !1;
  }
}, il = (e) => e.length === 1 ? Ar(e[0].msg) : `Please fix the following errors:
${e.map((r) => `• ${Ar(r.msg)}`).join(`
`)}`, al = (e) => `Encountered the following errors:
${e.map((r) => `- ${r.path.join("/")}: ${r.message}`).join(`
`)}`, ne = (e) => {
  if (e instanceof Error)
    if (ol(e.message)) {
      const r = JSON.parse(e.message);
      return el.safeParse(r).success ? il(r) : rl.safeParse(r).success ? al(r) : (console.warn(`Encountered unknown stringified JSON object:
${e.message}`), e.message);
    } else
      return Ar(e.message);
  if (typeof e == "object")
    try {
      return JSON.stringify(e);
    } catch (r) {
      return r + "";
    }
  else
    return e + "";
}, sl = (e, r, t) => ((...o) => {
  try {
    return r(...o);
  } catch (i) {
    t(`[form] Error running callback (${e}):`, i);
    return;
  }
}), cl = (e) => e.reduce((r, t) => r + t, 0), vo = (e) => {
  e.preventDefault(), e.returnValue = !0;
}, ll = () => {
  window.addEventListener("beforeunload", vo);
}, ul = () => {
  window.removeEventListener("beforeunload", vo);
}, J = (e) => {
  let r = !1;
  return async (t) => {
    if (r) {
      console.warn("Skipping submission because it is already in progress");
      return;
    }
    r = !0;
    try {
      t.context.preventNavigationDuringSubmission && ll(), t.formCallbacks.get.onCheckoutStarted?.(), b("checkout_started", {
        cpm: t.checkoutPaymentMethod
      });
      const o = await e(t);
      if (b("checkout_success", {
        cpm: t.checkoutPaymentMethod,
        ...o
      }), uu(), o.mode === "setup")
        t.formCallbacks.get.onSetupPaymentMethodSuccess(o.result.payment_method_id);
      else if (o.mode === "checkout")
        t.formCallbacks.get.onCheckoutSuccess(
          o.result.invoice_urls,
          o.result.subscription_ids,
          o.result.customer_id,
          o.result.processors_used ?? [],
          o.result.payment_method_id ?? ""
        );
      else
        throw new Error(`Unhandled mode: ${o}`);
    } catch (o) {
      r = !1;
      const i = ne(o), a = await qo(t.context.anyCdeConnection, i);
      t.formCallbacks.get.onCheckoutError(i, a), b("checkout_error", { cpm: t.checkoutPaymentMethod, errorMessage: i, errorCode: a, error: o });
    } finally {
      r = !1, t.context.preventNavigationDuringSubmission && ul();
    }
  };
}, Ee = (e) => async (r) => {
  try {
    return await e(r);
  } catch (t) {
    const { err__: o } = R("init-error-catcher"), i = ne(t), a = await qo(r.context.anyCdeConnection, i);
    return o(a, i, t), b("init_flow_error", { errorMessage: i, errorCode: a, error: t }), { isAvailable: !1, reason: i, errorCode: a, isLoading: !1 };
  }
}, R = (e) => {
  const r = (...o) => {
    window.console.log(`${xe.green.bold("ojs/")}${xe.bold.gray(`${e}`)}	`, ...o);
  }, t = (...o) => {
    window.console.warn(`${xe.red.bold("ojs/")}${xe.bold.gray(`${e}`)}	`, ...o);
  };
  return {
    log: r,
    err: t,
    log__: r,
    err__: t
  };
};
var xr = function(e, r) {
  return xr = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(t, o) {
    t.__proto__ = o;
  } || function(t, o) {
    for (var i in o) Object.prototype.hasOwnProperty.call(o, i) && (t[i] = o[i]);
  }, xr(e, r);
};
function Ne(e, r) {
  if (typeof r != "function" && r !== null)
    throw new TypeError("Class extends value " + String(r) + " is not a constructor or null");
  xr(e, r);
  function t() {
    this.constructor = e;
  }
  e.prototype = r === null ? Object.create(r) : (t.prototype = r.prototype, new t());
}
function dl(e, r, t, o) {
  function i(a) {
    return a instanceof t ? a : new t(function(s) {
      s(a);
    });
  }
  return new (t || (t = Promise))(function(a, s) {
    function c(d) {
      try {
        u(o.next(d));
      } catch (_) {
        s(_);
      }
    }
    function l(d) {
      try {
        u(o.throw(d));
      } catch (_) {
        s(_);
      }
    }
    function u(d) {
      d.done ? a(d.value) : i(d.value).then(c, l);
    }
    u((o = o.apply(e, [])).next());
  });
}
function Po(e, r) {
  var t = { label: 0, sent: function() {
    if (a[0] & 1) throw a[1];
    return a[1];
  }, trys: [], ops: [] }, o, i, a, s = Object.create((typeof Iterator == "function" ? Iterator : Object).prototype);
  return s.next = c(0), s.throw = c(1), s.return = c(2), typeof Symbol == "function" && (s[Symbol.iterator] = function() {
    return this;
  }), s;
  function c(u) {
    return function(d) {
      return l([u, d]);
    };
  }
  function l(u) {
    if (o) throw new TypeError("Generator is already executing.");
    for (; s && (s = 0, u[0] && (t = 0)), t; ) try {
      if (o = 1, i && (a = u[0] & 2 ? i.return : u[0] ? i.throw || ((a = i.return) && a.call(i), 0) : i.next) && !(a = a.call(i, u[1])).done) return a;
      switch (i = 0, a && (u = [u[0] & 2, a.value]), u[0]) {
        case 0:
        case 1:
          a = u;
          break;
        case 4:
          return t.label++, { value: u[1], done: !1 };
        case 5:
          t.label++, i = u[1], u = [0];
          continue;
        case 7:
          u = t.ops.pop(), t.trys.pop();
          continue;
        default:
          if (a = t.trys, !(a = a.length > 0 && a[a.length - 1]) && (u[0] === 6 || u[0] === 2)) {
            t = 0;
            continue;
          }
          if (u[0] === 3 && (!a || u[1] > a[0] && u[1] < a[3])) {
            t.label = u[1];
            break;
          }
          if (u[0] === 6 && t.label < a[1]) {
            t.label = a[1], a = u;
            break;
          }
          if (a && t.label < a[2]) {
            t.label = a[2], t.ops.push(u);
            break;
          }
          a[2] && t.ops.pop(), t.trys.pop();
          continue;
      }
      u = r.call(e, t);
    } catch (d) {
      u = [6, d], i = 0;
    } finally {
      o = a = 0;
    }
    if (u[0] & 5) throw u[1];
    return { value: u[0] ? u[1] : void 0, done: !0 };
  }
}
function We(e) {
  var r = typeof Symbol == "function" && Symbol.iterator, t = r && e[r], o = 0;
  if (t) return t.call(e);
  if (e && typeof e.length == "number") return {
    next: function() {
      return e && o >= e.length && (e = void 0), { value: e && e[o++], done: !e };
    }
  };
  throw new TypeError(r ? "Object is not iterable." : "Symbol.iterator is not defined.");
}
function Ht(e, r) {
  var t = typeof Symbol == "function" && e[Symbol.iterator];
  if (!t) return e;
  var o = t.call(e), i, a = [], s;
  try {
    for (; (r === void 0 || r-- > 0) && !(i = o.next()).done; ) a.push(i.value);
  } catch (c) {
    s = { error: c };
  } finally {
    try {
      i && !i.done && (t = o.return) && t.call(o);
    } finally {
      if (s) throw s.error;
    }
  }
  return a;
}
function zt(e, r, t) {
  if (arguments.length === 2) for (var o = 0, i = r.length, a; o < i; o++)
    (a || !(o in r)) && (a || (a = Array.prototype.slice.call(r, 0, o)), a[o] = r[o]);
  return e.concat(a || Array.prototype.slice.call(r));
}
function ze(e) {
  return this instanceof ze ? (this.v = e, this) : new ze(e);
}
function pl(e, r, t) {
  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
  var o = t.apply(e, r || []), i, a = [];
  return i = Object.create((typeof AsyncIterator == "function" ? AsyncIterator : Object).prototype), c("next"), c("throw"), c("return", s), i[Symbol.asyncIterator] = function() {
    return this;
  }, i;
  function s(p) {
    return function(h) {
      return Promise.resolve(h).then(p, _);
    };
  }
  function c(p, h) {
    o[p] && (i[p] = function(y) {
      return new Promise(function(g, w) {
        a.push([p, y, g, w]) > 1 || l(p, y);
      });
    }, h && (i[p] = h(i[p])));
  }
  function l(p, h) {
    try {
      u(o[p](h));
    } catch (y) {
      f(a[0][3], y);
    }
  }
  function u(p) {
    p.value instanceof ze ? Promise.resolve(p.value.v).then(d, _) : f(a[0][2], p);
  }
  function d(p) {
    l("next", p);
  }
  function _(p) {
    l("throw", p);
  }
  function f(p, h) {
    p(h), a.shift(), a.length && l(a[0][0], a[0][1]);
  }
}
function ml(e) {
  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
  var r = e[Symbol.asyncIterator], t;
  return r ? r.call(e) : (e = typeof We == "function" ? We(e) : e[Symbol.iterator](), t = {}, o("next"), o("throw"), o("return"), t[Symbol.asyncIterator] = function() {
    return this;
  }, t);
  function o(a) {
    t[a] = e[a] && function(s) {
      return new Promise(function(c, l) {
        s = e[a](s), i(c, l, s.done, s.value);
      });
    };
  }
  function i(a, s, c, l) {
    Promise.resolve(l).then(function(u) {
      a({ value: u, done: c });
    }, s);
  }
}
function Y(e) {
  return typeof e == "function";
}
function or(e) {
  var r = function(o) {
    Error.call(o), o.stack = new Error().stack;
  }, t = e(r);
  return t.prototype = Object.create(Error.prototype), t.prototype.constructor = t, t;
}
var _r = or(function(e) {
  return function(r) {
    e(this), this.message = r ? r.length + ` errors occurred during unsubscription:
` + r.map(function(t, o) {
      return o + 1 + ") " + t.toString();
    }).join(`
  `) : "", this.name = "UnsubscriptionError", this.errors = r;
  };
});
function Bt(e, r) {
  if (e) {
    var t = e.indexOf(r);
    0 <= t && e.splice(t, 1);
  }
}
var Pt = (function() {
  function e(r) {
    this.initialTeardown = r, this.closed = !1, this._parentage = null, this._finalizers = null;
  }
  return e.prototype.unsubscribe = function() {
    var r, t, o, i, a;
    if (!this.closed) {
      this.closed = !0;
      var s = this._parentage;
      if (s)
        if (this._parentage = null, Array.isArray(s))
          try {
            for (var c = We(s), l = c.next(); !l.done; l = c.next()) {
              var u = l.value;
              u.remove(this);
            }
          } catch (y) {
            r = { error: y };
          } finally {
            try {
              l && !l.done && (t = c.return) && t.call(c);
            } finally {
              if (r) throw r.error;
            }
          }
        else
          s.remove(this);
      var d = this.initialTeardown;
      if (Y(d))
        try {
          d();
        } catch (y) {
          a = y instanceof _r ? y.errors : [y];
        }
      var _ = this._finalizers;
      if (_) {
        this._finalizers = null;
        try {
          for (var f = We(_), p = f.next(); !p.done; p = f.next()) {
            var h = p.value;
            try {
              gn(h);
            } catch (y) {
              a = a ?? [], y instanceof _r ? a = zt(zt([], Ht(a)), Ht(y.errors)) : a.push(y);
            }
          }
        } catch (y) {
          o = { error: y };
        } finally {
          try {
            p && !p.done && (i = f.return) && i.call(f);
          } finally {
            if (o) throw o.error;
          }
        }
      }
      if (a)
        throw new _r(a);
    }
  }, e.prototype.add = function(r) {
    var t;
    if (r && r !== this)
      if (this.closed)
        gn(r);
      else {
        if (r instanceof e) {
          if (r.closed || r._hasParent(this))
            return;
          r._addParent(this);
        }
        (this._finalizers = (t = this._finalizers) !== null && t !== void 0 ? t : []).push(r);
      }
  }, e.prototype._hasParent = function(r) {
    var t = this._parentage;
    return t === r || Array.isArray(t) && t.includes(r);
  }, e.prototype._addParent = function(r) {
    var t = this._parentage;
    this._parentage = Array.isArray(t) ? (t.push(r), t) : t ? [t, r] : r;
  }, e.prototype._removeParent = function(r) {
    var t = this._parentage;
    t === r ? this._parentage = null : Array.isArray(t) && Bt(t, r);
  }, e.prototype.remove = function(r) {
    var t = this._finalizers;
    t && Bt(t, r), r instanceof e && r._removeParent(this);
  }, e.EMPTY = (function() {
    var r = new e();
    return r.closed = !0, r;
  })(), e;
})(), Eo = Pt.EMPTY;
function So(e) {
  return e instanceof Pt || e && "closed" in e && Y(e.remove) && Y(e.add) && Y(e.unsubscribe);
}
function gn(e) {
  Y(e) ? e() : e.unsubscribe();
}
var hl = {
  Promise: void 0
}, fl = {
  setTimeout: function(e, r) {
    for (var t = [], o = 2; o < arguments.length; o++)
      t[o - 2] = arguments[o];
    return setTimeout.apply(void 0, zt([e, r], Ht(t)));
  },
  clearTimeout: function(e) {
    return clearTimeout(e);
  },
  delegate: void 0
};
function ko(e) {
  fl.setTimeout(function() {
    throw e;
  });
}
function bn() {
}
function Mt(e) {
  e();
}
var Ur = (function(e) {
  Ne(r, e);
  function r(t) {
    var o = e.call(this) || this;
    return o.isStopped = !1, t ? (o.destination = t, So(t) && t.add(o)) : o.destination = gl, o;
  }
  return r.create = function(t, o, i) {
    return new Tr(t, o, i);
  }, r.prototype.next = function(t) {
    this.isStopped || this._next(t);
  }, r.prototype.error = function(t) {
    this.isStopped || (this.isStopped = !0, this._error(t));
  }, r.prototype.complete = function() {
    this.isStopped || (this.isStopped = !0, this._complete());
  }, r.prototype.unsubscribe = function() {
    this.closed || (this.isStopped = !0, e.prototype.unsubscribe.call(this), this.destination = null);
  }, r.prototype._next = function(t) {
    this.destination.next(t);
  }, r.prototype._error = function(t) {
    try {
      this.destination.error(t);
    } finally {
      this.unsubscribe();
    }
  }, r.prototype._complete = function() {
    try {
      this.destination.complete();
    } finally {
      this.unsubscribe();
    }
  }, r;
})(Pt), _l = (function() {
  function e(r) {
    this.partialObserver = r;
  }
  return e.prototype.next = function(r) {
    var t = this.partialObserver;
    if (t.next)
      try {
        t.next(r);
      } catch (o) {
        At(o);
      }
  }, e.prototype.error = function(r) {
    var t = this.partialObserver;
    if (t.error)
      try {
        t.error(r);
      } catch (o) {
        At(o);
      }
    else
      At(r);
  }, e.prototype.complete = function() {
    var r = this.partialObserver;
    if (r.complete)
      try {
        r.complete();
      } catch (t) {
        At(t);
      }
  }, e;
})(), Tr = (function(e) {
  Ne(r, e);
  function r(t, o, i) {
    var a = e.call(this) || this, s;
    return Y(t) || !t ? s = {
      next: t ?? void 0,
      error: o ?? void 0,
      complete: i ?? void 0
    } : s = t, a.destination = new _l(s), a;
  }
  return r;
})(Ur);
function At(e) {
  ko(e);
}
function yl(e) {
  throw e;
}
var gl = {
  closed: !0,
  next: bn,
  error: yl,
  complete: bn
}, Fr = (function() {
  return typeof Symbol == "function" && Symbol.observable || "@@observable";
})();
function bl(e) {
  return e;
}
function wl(e) {
  return e.length === 0 ? bl : e.length === 1 ? e[0] : function(r) {
    return e.reduce(function(t, o) {
      return o(t);
    }, r);
  };
}
var Pe = (function() {
  function e(r) {
    r && (this._subscribe = r);
  }
  return e.prototype.lift = function(r) {
    var t = new e();
    return t.source = this, t.operator = r, t;
  }, e.prototype.subscribe = function(r, t, o) {
    var i = this, a = Pl(r) ? r : new Tr(r, t, o);
    return Mt(function() {
      var s = i, c = s.operator, l = s.source;
      a.add(c ? c.call(a, l) : l ? i._subscribe(a) : i._trySubscribe(a));
    }), a;
  }, e.prototype._trySubscribe = function(r) {
    try {
      return this._subscribe(r);
    } catch (t) {
      r.error(t);
    }
  }, e.prototype.forEach = function(r, t) {
    var o = this;
    return t = wn(t), new t(function(i, a) {
      var s = new Tr({
        next: function(c) {
          try {
            r(c);
          } catch (l) {
            a(l), s.unsubscribe();
          }
        },
        error: a,
        complete: i
      });
      o.subscribe(s);
    });
  }, e.prototype._subscribe = function(r) {
    var t;
    return (t = this.source) === null || t === void 0 ? void 0 : t.subscribe(r);
  }, e.prototype[Fr] = function() {
    return this;
  }, e.prototype.pipe = function() {
    for (var r = [], t = 0; t < arguments.length; t++)
      r[t] = arguments[t];
    return wl(r)(this);
  }, e.prototype.toPromise = function(r) {
    var t = this;
    return r = wn(r), new r(function(o, i) {
      var a;
      t.subscribe(function(s) {
        return a = s;
      }, function(s) {
        return i(s);
      }, function() {
        return o(a);
      });
    });
  }, e.create = function(r) {
    return new e(r);
  }, e;
})();
function wn(e) {
  var r;
  return (r = e ?? hl.Promise) !== null && r !== void 0 ? r : Promise;
}
function vl(e) {
  return e && Y(e.next) && Y(e.error) && Y(e.complete);
}
function Pl(e) {
  return e && e instanceof Ur || vl(e) && So(e);
}
function El(e) {
  return Y(e?.lift);
}
function Sl(e) {
  return function(r) {
    if (El(r))
      return r.lift(function(t) {
        try {
          return e(t, this);
        } catch (o) {
          this.error(o);
        }
      });
    throw new TypeError("Unable to lift unknown Observable type");
  };
}
function kl(e, r, t, o, i) {
  return new Cl(e, r, t, o, i);
}
var Cl = (function(e) {
  Ne(r, e);
  function r(t, o, i, a, s, c) {
    var l = e.call(this, t) || this;
    return l.onFinalize = s, l.shouldUnsubscribe = c, l._next = o ? function(u) {
      try {
        o(u);
      } catch (d) {
        t.error(d);
      }
    } : e.prototype._next, l._error = a ? function(u) {
      try {
        a(u);
      } catch (d) {
        t.error(d);
      } finally {
        this.unsubscribe();
      }
    } : e.prototype._error, l._complete = i ? function() {
      try {
        i();
      } catch (u) {
        t.error(u);
      } finally {
        this.unsubscribe();
      }
    } : e.prototype._complete, l;
  }
  return r.prototype.unsubscribe = function() {
    var t;
    if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {
      var o = this.closed;
      e.prototype.unsubscribe.call(this), !o && ((t = this.onFinalize) === null || t === void 0 || t.call(this));
    }
  }, r;
})(Ur), Il = or(function(e) {
  return function() {
    e(this), this.name = "ObjectUnsubscribedError", this.message = "object unsubscribed";
  };
}), Co = (function(e) {
  Ne(r, e);
  function r() {
    var t = e.call(this) || this;
    return t.closed = !1, t.currentObservers = null, t.observers = [], t.isStopped = !1, t.hasError = !1, t.thrownError = null, t;
  }
  return r.prototype.lift = function(t) {
    var o = new vn(this, this);
    return o.operator = t, o;
  }, r.prototype._throwIfClosed = function() {
    if (this.closed)
      throw new Il();
  }, r.prototype.next = function(t) {
    var o = this;
    Mt(function() {
      var i, a;
      if (o._throwIfClosed(), !o.isStopped) {
        o.currentObservers || (o.currentObservers = Array.from(o.observers));
        try {
          for (var s = We(o.currentObservers), c = s.next(); !c.done; c = s.next()) {
            var l = c.value;
            l.next(t);
          }
        } catch (u) {
          i = { error: u };
        } finally {
          try {
            c && !c.done && (a = s.return) && a.call(s);
          } finally {
            if (i) throw i.error;
          }
        }
      }
    });
  }, r.prototype.error = function(t) {
    var o = this;
    Mt(function() {
      if (o._throwIfClosed(), !o.isStopped) {
        o.hasError = o.isStopped = !0, o.thrownError = t;
        for (var i = o.observers; i.length; )
          i.shift().error(t);
      }
    });
  }, r.prototype.complete = function() {
    var t = this;
    Mt(function() {
      if (t._throwIfClosed(), !t.isStopped) {
        t.isStopped = !0;
        for (var o = t.observers; o.length; )
          o.shift().complete();
      }
    });
  }, r.prototype.unsubscribe = function() {
    this.isStopped = this.closed = !0, this.observers = this.currentObservers = null;
  }, Object.defineProperty(r.prototype, "observed", {
    get: function() {
      var t;
      return ((t = this.observers) === null || t === void 0 ? void 0 : t.length) > 0;
    },
    enumerable: !1,
    configurable: !0
  }), r.prototype._trySubscribe = function(t) {
    return this._throwIfClosed(), e.prototype._trySubscribe.call(this, t);
  }, r.prototype._subscribe = function(t) {
    return this._throwIfClosed(), this._checkFinalizedStatuses(t), this._innerSubscribe(t);
  }, r.prototype._innerSubscribe = function(t) {
    var o = this, i = this, a = i.hasError, s = i.isStopped, c = i.observers;
    return a || s ? Eo : (this.currentObservers = null, c.push(t), new Pt(function() {
      o.currentObservers = null, Bt(c, t);
    }));
  }, r.prototype._checkFinalizedStatuses = function(t) {
    var o = this, i = o.hasError, a = o.thrownError, s = o.isStopped;
    i ? t.error(a) : s && t.complete();
  }, r.prototype.asObservable = function() {
    var t = new Pe();
    return t.source = this, t;
  }, r.create = function(t, o) {
    return new vn(t, o);
  }, r;
})(Pe), vn = (function(e) {
  Ne(r, e);
  function r(t, o) {
    var i = e.call(this) || this;
    return i.destination = t, i.source = o, i;
  }
  return r.prototype.next = function(t) {
    var o, i;
    (i = (o = this.destination) === null || o === void 0 ? void 0 : o.next) === null || i === void 0 || i.call(o, t);
  }, r.prototype.error = function(t) {
    var o, i;
    (i = (o = this.destination) === null || o === void 0 ? void 0 : o.error) === null || i === void 0 || i.call(o, t);
  }, r.prototype.complete = function() {
    var t, o;
    (o = (t = this.destination) === null || t === void 0 ? void 0 : t.complete) === null || o === void 0 || o.call(t);
  }, r.prototype._subscribe = function(t) {
    var o, i;
    return (i = (o = this.source) === null || o === void 0 ? void 0 : o.subscribe(t)) !== null && i !== void 0 ? i : Eo;
  }, r;
})(Co), Al = {
  now: function() {
    return Date.now();
  }
}, xl = (function(e) {
  Ne(r, e);
  function r(t, o) {
    return e.call(this) || this;
  }
  return r.prototype.schedule = function(t, o) {
    return this;
  }, r;
})(Pt), Pn = {
  setInterval: function(e, r) {
    for (var t = [], o = 2; o < arguments.length; o++)
      t[o - 2] = arguments[o];
    return setInterval.apply(void 0, zt([e, r], Ht(t)));
  },
  clearInterval: function(e) {
    return clearInterval(e);
  },
  delegate: void 0
}, Tl = (function(e) {
  Ne(r, e);
  function r(t, o) {
    var i = e.call(this, t, o) || this;
    return i.scheduler = t, i.work = o, i.pending = !1, i;
  }
  return r.prototype.schedule = function(t, o) {
    var i;
    if (o === void 0 && (o = 0), this.closed)
      return this;
    this.state = t;
    var a = this.id, s = this.scheduler;
    return a != null && (this.id = this.recycleAsyncId(s, a, o)), this.pending = !0, this.delay = o, this.id = (i = this.id) !== null && i !== void 0 ? i : this.requestAsyncId(s, this.id, o), this;
  }, r.prototype.requestAsyncId = function(t, o, i) {
    return i === void 0 && (i = 0), Pn.setInterval(t.flush.bind(t, this), i);
  }, r.prototype.recycleAsyncId = function(t, o, i) {
    if (i === void 0 && (i = 0), i != null && this.delay === i && this.pending === !1)
      return o;
    o != null && Pn.clearInterval(o);
  }, r.prototype.execute = function(t, o) {
    if (this.closed)
      return new Error("executing a cancelled action");
    this.pending = !1;
    var i = this._execute(t, o);
    if (i)
      return i;
    this.pending === !1 && this.id != null && (this.id = this.recycleAsyncId(this.scheduler, this.id, null));
  }, r.prototype._execute = function(t, o) {
    var i = !1, a;
    try {
      this.work(t);
    } catch (s) {
      i = !0, a = s || new Error("Scheduled action threw falsy error");
    }
    if (i)
      return this.unsubscribe(), a;
  }, r.prototype.unsubscribe = function() {
    if (!this.closed) {
      var t = this, o = t.id, i = t.scheduler, a = i.actions;
      this.work = this.state = this.scheduler = null, this.pending = !1, Bt(a, this), o != null && (this.id = this.recycleAsyncId(i, o, null)), this.delay = null, e.prototype.unsubscribe.call(this);
    }
  }, r;
})(xl), En = (function() {
  function e(r, t) {
    t === void 0 && (t = e.now), this.schedulerActionCtor = r, this.now = t;
  }
  return e.prototype.schedule = function(r, t, o) {
    return t === void 0 && (t = 0), new this.schedulerActionCtor(this, r).schedule(o, t);
  }, e.now = Al.now, e;
})(), Rl = (function(e) {
  Ne(r, e);
  function r(t, o) {
    o === void 0 && (o = En.now);
    var i = e.call(this, t, o) || this;
    return i.actions = [], i._active = !1, i;
  }
  return r.prototype.flush = function(t) {
    var o = this.actions;
    if (this._active) {
      o.push(t);
      return;
    }
    var i;
    this._active = !0;
    do
      if (i = t.execute(t.state, t.delay))
        break;
    while (t = o.shift());
    if (this._active = !1, i) {
      for (; t = o.shift(); )
        t.unsubscribe();
      throw i;
    }
  }, r;
})(En), Nl = new Rl(Tl), Ll = (function(e) {
  return e && typeof e.length == "number" && typeof e != "function";
});
function Ml(e) {
  return Y(e?.then);
}
function jl(e) {
  return Y(e[Fr]);
}
function Ol(e) {
  return Symbol.asyncIterator && Y(e?.[Symbol.asyncIterator]);
}
function Dl(e) {
  return new TypeError("You provided " + (e !== null && typeof e == "object" ? "an invalid object" : "'" + e + "'") + " where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.");
}
function Ul() {
  return typeof Symbol != "function" || !Symbol.iterator ? "@@iterator" : Symbol.iterator;
}
var Fl = Ul();
function Gl(e) {
  return Y(e?.[Fl]);
}
function ql(e) {
  return pl(this, arguments, function() {
    var r, t, o, i;
    return Po(this, function(a) {
      switch (a.label) {
        case 0:
          r = e.getReader(), a.label = 1;
        case 1:
          a.trys.push([1, , 9, 10]), a.label = 2;
        case 2:
          return [4, ze(r.read())];
        case 3:
          return t = a.sent(), o = t.value, i = t.done, i ? [4, ze(void 0)] : [3, 5];
        case 4:
          return [2, a.sent()];
        case 5:
          return [4, ze(o)];
        case 6:
          return [4, a.sent()];
        case 7:
          return a.sent(), [3, 2];
        case 8:
          return [3, 10];
        case 9:
          return r.releaseLock(), [7];
        case 10:
          return [2];
      }
    });
  });
}
function Vl(e) {
  return Y(e?.getReader);
}
function $l(e) {
  if (e instanceof Pe)
    return e;
  if (e != null) {
    if (jl(e))
      return Hl(e);
    if (Ll(e))
      return zl(e);
    if (Ml(e))
      return Bl(e);
    if (Ol(e))
      return Io(e);
    if (Gl(e))
      return Yl(e);
    if (Vl(e))
      return Zl(e);
  }
  throw Dl(e);
}
function Hl(e) {
  return new Pe(function(r) {
    var t = e[Fr]();
    if (Y(t.subscribe))
      return t.subscribe(r);
    throw new TypeError("Provided object does not correctly implement Symbol.observable");
  });
}
function zl(e) {
  return new Pe(function(r) {
    for (var t = 0; t < e.length && !r.closed; t++)
      r.next(e[t]);
    r.complete();
  });
}
function Bl(e) {
  return new Pe(function(r) {
    e.then(function(t) {
      r.closed || (r.next(t), r.complete());
    }, function(t) {
      return r.error(t);
    }).then(null, ko);
  });
}
function Yl(e) {
  return new Pe(function(r) {
    var t, o;
    try {
      for (var i = We(e), a = i.next(); !a.done; a = i.next()) {
        var s = a.value;
        if (r.next(s), r.closed)
          return;
      }
    } catch (c) {
      t = { error: c };
    } finally {
      try {
        a && !a.done && (o = i.return) && o.call(i);
      } finally {
        if (t) throw t.error;
      }
    }
    r.complete();
  });
}
function Io(e) {
  return new Pe(function(r) {
    Kl(e, r).catch(function(t) {
      return r.error(t);
    });
  });
}
function Zl(e) {
  return Io(ql(e));
}
function Kl(e, r) {
  var t, o, i, a;
  return dl(this, void 0, void 0, function() {
    var s, c;
    return Po(this, function(l) {
      switch (l.label) {
        case 0:
          l.trys.push([0, 5, 6, 11]), t = ml(e), l.label = 1;
        case 1:
          return [4, t.next()];
        case 2:
          if (o = l.sent(), !!o.done) return [3, 4];
          if (s = o.value, r.next(s), r.closed)
            return [2];
          l.label = 3;
        case 3:
          return [3, 1];
        case 4:
          return [3, 11];
        case 5:
          return c = l.sent(), i = { error: c }, [3, 11];
        case 6:
          return l.trys.push([6, , 9, 10]), o && !o.done && (a = t.return) ? [4, a.call(t)] : [3, 8];
        case 7:
          l.sent(), l.label = 8;
        case 8:
          return [3, 10];
        case 9:
          if (i) throw i.error;
          return [7];
        case 10:
          return [7];
        case 11:
          return r.complete(), [2];
      }
    });
  });
}
function Jl(e, r, t, o, i) {
  o === void 0 && (o = 0), i === void 0 && (i = !1);
  var a = r.schedule(function() {
    t(), i ? e.add(this.schedule(null, o)) : this.unsubscribe();
  }, o);
  if (e.add(a), !i)
    return a;
}
function Wl(e, r) {
  var t = Y(e) ? e : function() {
    return e;
  }, o = function(i) {
    return i.error(t());
  };
  return new Pe(o);
}
var Ql = or(function(e) {
  return function() {
    e(this), this.name = "EmptyError", this.message = "no elements in sequence";
  };
});
function Xl(e, r) {
  return new Promise(function(t, o) {
    var i = !1, a;
    e.subscribe({
      next: function(s) {
        a = s, i = !0;
      },
      error: o,
      complete: function() {
        i ? t(a) : o(new Ql());
      }
    });
  });
}
function eu(e) {
  return e instanceof Date && !isNaN(e);
}
var tu = or(function(e) {
  return function(r) {
    r === void 0 && (r = null), e(this), this.message = "Timeout has occurred", this.name = "TimeoutError", this.info = r;
  };
});
function ru(e, r) {
  var t = eu(e) ? { first: e } : typeof e == "number" ? { each: e } : e, o = t.first, i = t.each, a = t.with, s = a === void 0 ? nu : a, c = t.scheduler, l = c === void 0 ? Nl : c, u = t.meta, d = u === void 0 ? null : u;
  if (o == null && i == null)
    throw new TypeError("No timeout provided.");
  return Sl(function(_, f) {
    var p, h, y = null, g = 0, w = function(E) {
      h = Jl(f, l, function() {
        try {
          p.unsubscribe(), $l(s({
            meta: d,
            lastValue: y,
            seen: g
          })).subscribe(f);
        } catch (I) {
          f.error(I);
        }
      }, E);
    };
    p = _.subscribe(kl(f, function(E) {
      h?.unsubscribe(), g++, f.next(y = E), i > 0 && w(i);
    }, void 0, void 0, function() {
      h?.closed || h?.unsubscribe(), y = null;
    })), !g && w(o != null ? typeof o == "number" ? o : +o - l.now() : i);
  });
}
function nu(e) {
  throw new tu(e);
}
class pt {
  constructor() {
    this.set = (r) => {
      if (this._current.status === "success")
        throw new Error("LoadedOnce is already in success state");
      this._current = { status: "success", isSuccess: !0, loadedValue: r }, this._subject.next(r), this._subject.complete();
    }, this.throw = (r, t) => {
      if (this._current.status === "success")
        throw new Error("LoadedOnce is already in success state");
      this._current = { status: "error", isSuccess: !1, error: r, errMsg: t }, this._subject.error(r);
    }, this.getValueIfLoadedElse = (r) => this._current.status === "success" ? this._current.loadedValue : r, this.subscribe = (r) => {
      if (this._current.status === "success") {
        r(this._current);
        return;
      }
      this._current.status === "error" && r(this._current);
      const t = this._subject.subscribe({
        next: () => {
          if (this._current.status !== "success")
            throw new Error("Invalid state (next): please make sure to update _current before the subject");
          r(this._current), t.unsubscribe();
        },
        error: () => {
          if (this._current.status !== "error")
            throw new Error("Invalid state (error): please make sure to update _current before the subject");
          r(this._current);
        }
      });
    }, this.waitForLoad = (r) => {
      if (this._current.status === "success") return Promise.resolve(this._current.loadedValue);
      if (this._current.status === "error") return Promise.reject(this._current.error);
      this._current.status !== "initial" && Et(this._current);
      const t = {
        first: r.timeoutSec * 1e3,
        with: () => Wl(() => new Error(r.timeoutErrMsg))
      };
      return Xl(this._subject.pipe(ru(t)));
    }, this._current = { status: "initial", isSuccess: !1 }, this._subject = new Co();
  }
  get current() {
    return this._current;
  }
}
const Sn = n.enum(["dev", "stg", "prod"]), ou = {
  prod: "https://connto.getopenpay.com",
  stg: "https://connto.openpaystaging.com",
  dev: "http://localhost:8000"
}, iu = (e) => ou[e], yr = {}, Ao = async (e) => {
  if (yr[e])
    return yr[e];
  try {
    const r = await fetch(new URL("/health/environment", e)).then((o) => o.json()), t = Sn.parse(r.environment);
    return yr[e] = t, t;
  } catch {
    return Sn.Values.prod;
  }
};
function Et(e) {
  throw new Error(`Unhandled case: ${e}`);
}
const ir = (e, r) => Object.fromEntries(Object.entries(e).filter(([t]) => !r.includes(t))), z = () => {
  if (!(typeof window > "u"))
    return window;
}, Rr = new pt(), kn = "op_metrics_queue", au = 3, su = 3, cu = 1e3, { log__: xt } = R("op-metrics");
class lu {
  constructor() {
    this.queue = [], this.processingQueue = !1, this.batchTimeout = null, this.lastEventTimestamp = 0, this.offlineListener = () => {
      xt("Network offline, metrics will be queued"), this.cancelBatchProcessing();
    }, this.onlineListener = () => {
      xt("Network online, processing metrics queue"), this.processQueue();
    }, this.loadQueueFromStorage(), z()?.addEventListener("offline", this.offlineListener), z()?.addEventListener("online", this.onlineListener);
  }
  addEvent(r, t, o) {
    const i = {
      eventName: r,
      properties: t || {},
      contextProperties: o || {},
      nonce: Fe(),
      timestamp: Date.now(),
      datetime: (/* @__PURE__ */ new Date()).toISOString(),
      attemptCount: 0,
      timeDiffFromPreviousEvent: this.lastEventTimestamp ? Date.now() - this.lastEventTimestamp : 0
    };
    this.lastEventTimestamp = i.timestamp, this.queue.push(i), this.saveQueueToStorage(), this.scheduleBatchProcessing();
  }
  loadQueueFromStorage() {
    try {
      const r = z()?.localStorage?.getItem(kn);
      r && (this.queue = JSON.parse(r));
    } catch {
      this.queue = [], this.saveQueueToStorage();
    }
  }
  saveQueueToStorage() {
    z()?.localStorage.setItem(kn, JSON.stringify(this.queue));
  }
  scheduleBatchProcessing() {
    const r = z();
    r && navigator.onLine && !this.processingQueue && this.queue.length > 0 && !this.batchTimeout && (this.batchTimeout = r.setTimeout(() => {
      this.batchTimeout = null, this.processQueue();
    }, cu));
  }
  cancelBatchProcessing() {
    this.batchTimeout && (z()?.clearTimeout(this.batchTimeout), this.batchTimeout = null), this.processingQueue = !1;
  }
  processQueue() {
    !navigator.onLine || this.processingQueue || this.queue.length === 0 || (this.processingQueue = !0, this.sendBatch().finally(() => {
      this.processingQueue = !1, this.queue.length > 0 && this.scheduleBatchProcessing();
    }));
  }
  async sendBatch() {
    if (this.queue.length === 0) return;
    const r = Rr.getValueIfLoadedElse(void 0);
    if (!r) {
      xt("Metrics context not available, will retry later");
      return;
    }
    const t = this.queue.slice(0, su);
    try {
      const o = {
        events: t.map((s) => ({
          event_name: s.eventName,
          device_token: r.deviceToken,
          context_properties: {
            ...r,
            ...s.contextProperties
          },
          properties: {
            nonce: s.nonce,
            datetime: s.datetime,
            timestamp: s.timestamp,
            time_diff_from_previous_event: s.timeDiffFromPreviousEvent,
            checkout_secure_token: r.checkoutSecureToken,
            ...s.properties
          }
        }))
      }, i = iu(r.environment), a = new URL("/metrics/public/capture", i);
      (await fetch(a.toString(), {
        method: "POST",
        headers: {
          "Content-Type": "application/json"
        },
        body: JSON.stringify(o),
        keepalive: !0
        // To send events even if the page is unloaded
      })).ok ? (this.queue = this.queue.slice(t.length), this.saveQueueToStorage()) : this.handleFailedBatch(t);
    } catch (o) {
      xt("Error sending metrics batch:", o), this.handleFailedBatch(t);
    }
  }
  handleFailedBatch(r) {
    r.forEach((o) => {
      o.attemptCount++;
    });
    const t = r.filter((o) => o.attemptCount < au);
    this.queue = this.queue.slice(r.length), this.queue = [...t, ...this.queue], this.saveQueueToStorage();
  }
  cleanup() {
    z()?.removeEventListener("offline", this.offlineListener), z()?.removeEventListener("online", this.onlineListener), this.cancelBatchProcessing();
  }
}
const Gr = new lu(), b = (e, r, t) => {
  Gr.addEvent(e, r, t);
}, uu = () => {
  Gr.processQueue();
}, xo = (e) => {
  const r = ne(e.reason);
  b("unhandled_rejection_error", {
    error_message: r,
    error_name: e.reason
  });
}, To = (e) => {
  const r = ne(e.error);
  b("uncaught_error", {
    error_message: r,
    error_name: e.error?.name,
    error_stack: e.error?.stack,
    file_name: e.filename,
    line_number: e.lineno,
    column_number: e.colno
  });
};
let Yt = null;
const du = async () => {
  if (typeof window > "u") return null;
  try {
    return Yt = (await import("./lifecycle-D1BdEbZs-BvuQx__u.js")).default, Yt;
  } catch (e) {
    return console.warn("Failed to load page-lifecycle:", e), null;
  }
}, Ro = (e) => {
  b("page_lifecycle_state_change", {
    old_state: e.oldState,
    new_state: e.newState
  }), (e.newState === "hidden" || e.newState === "passive") && Gr.processQueue();
}, pu = async () => {
  z()?.addEventListener("error", To), z()?.addEventListener("unhandledrejection", xo);
  const e = await du();
  e && e.addEventListener("statechange", Ro);
}, mu = async () => {
  z()?.removeEventListener("error", To), z()?.removeEventListener("unhandledrejection", xo), z() && Yt && Yt.removeEventListener("statechange", Ro);
}, hu = n.object({
  stripe_pk: n.string(),
  client_secret: n.string(),
  stripe_pm_id: n.string()
}), fu = n.object({
  type: n.string(),
  client_secret: n.string(),
  stripe_pk: n.string()
}), _u = {
  usd: "usd",
  brl: "brl"
}, ar = async (e) => {
  for (let r = 0; r < 10; r++)
    Cn() || await sr(500);
  if (!Cn())
    throw console.log("Stripe JS not found."), new Error("Stripe JS not found.");
  return new Stripe(e);
}, yu = async (e, r) => {
  const t = await ar(e);
  return {
    elements: t.elements(r),
    stripe: t
  };
}, gu = async (e, r, t, o, i) => {
  const a = await ar(e), s = _u[t.toLowerCase().trim()];
  return a.paymentRequest({
    // TODO: replace this with stripe account country as soon as we support it
    country: "US",
    currency: s,
    total: {
      label: "Total",
      amount: r,
      pending: o
    },
    // requestShipping: true,
    requestPayerName: !0,
    requestPayerEmail: !0,
    disableWallets: []
  });
}, sr = (e) => new Promise((r) => {
  setTimeout(r, e);
}), Cn = () => "Stripe" in window, bu = async (e) => new Promise((r, t) => {
  try {
    e.on("paymentmethod", async (o) => {
      console.log("paymentmethod EVT:: ", o), r(o);
    }), e.on("token", async (o) => {
      console.log("token EVT:: ", o);
    }), e.on("cancel", () => {
      t(new Error("Payment cancelled, please click Submit again to pay"));
    });
  } catch (o) {
    t(o);
  }
}), wu = async (e, r) => {
  if (!e.stripe_pk || !e.client_secret)
    throw new Error(`Invalid next action metadata format: ${JSON.stringify(e)}`);
  const t = await (await ar(e.stripe_pk)).confirmCardSetup(e.client_secret, {
    payment_method: r.paymentMethod.id
  });
  if (t.error)
    throw r.complete("fail"), new Error(`Payment failed: ${t.error.message ?? "unknown"}`);
  return r.complete("success"), t;
}, vu = async (e) => {
  const r = await (await ar(e.stripe_pk)).confirmCardSetup(e.client_secret, {
    payment_method: e.stripe_pm_id
  }), t = r.setupIntent?.status;
  if (t === "succeeded")
    console.log("[3DS] CONFIRMING PM:", e.stripe_pm_id), console.log("[3DS] Setup intent created:", r.setupIntent);
  else throw t === "canceled" ? new Error("Payment cancelled, please click Submit again to pay") : new Error(
    `${r.error?.message ?? r.setupIntent?.last_setup_error?.message ?? "Payment failed, please click submit again to pay."}`
  );
};
var Pu = typeof globalThis == "object" ? globalThis : typeof self == "object" ? self : typeof window == "object" ? window : typeof global == "object" ? global : {}, Oe = "1.9.0", In = /^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;
function Eu(e) {
  var r = /* @__PURE__ */ new Set([e]), t = /* @__PURE__ */ new Set(), o = e.match(In);
  if (!o)
    return function() {
      return !1;
    };
  var i = {
    major: +o[1],
    minor: +o[2],
    patch: +o[3],
    prerelease: o[4]
  };
  if (i.prerelease != null)
    return function(c) {
      return c === e;
    };
  function a(c) {
    return t.add(c), !1;
  }
  function s(c) {
    return r.add(c), !0;
  }
  return function(c) {
    if (r.has(c))
      return !0;
    if (t.has(c))
      return !1;
    var l = c.match(In);
    if (!l)
      return a(c);
    var u = {
      major: +l[1],
      minor: +l[2],
      patch: +l[3],
      prerelease: l[4]
    };
    return u.prerelease != null || i.major !== u.major ? a(c) : i.major === 0 ? i.minor === u.minor && i.patch <= u.patch ? s(c) : a(c) : i.minor <= u.minor ? s(c) : a(c);
  };
}
var Su = Eu(Oe), ku = Oe.split(".")[0], ft = Symbol.for("opentelemetry.js.api." + ku), _t = Pu;
function qr(e, r, t, o) {
  var i;
  o === void 0 && (o = !1);
  var a = _t[ft] = (i = _t[ft]) !== null && i !== void 0 ? i : {
    version: Oe
  };
  if (!o && a[e]) {
    var s = new Error("@opentelemetry/api: Attempted duplicate registration of API: " + e);
    return t.error(s.stack || s.message), !1;
  }
  if (a.version !== Oe) {
    var s = new Error("@opentelemetry/api: Registration of version v" + a.version + " for " + e + " does not match previously registered API v" + Oe);
    return t.error(s.stack || s.message), !1;
  }
  return a[e] = r, t.debug("@opentelemetry/api: Registered a global for " + e + " v" + Oe + "."), !0;
}
function yt(e) {
  var r, t, o = (r = _t[ft]) === null || r === void 0 ? void 0 : r.version;
  if (!(!o || !Su(o)))
    return (t = _t[ft]) === null || t === void 0 ? void 0 : t[e];
}
function Vr(e, r) {
  r.debug("@opentelemetry/api: Unregistering a global for " + e + " v" + Oe + ".");
  var t = _t[ft];
  t && delete t[e];
}
var Cu = function(e, r) {
  var t = typeof Symbol == "function" && e[Symbol.iterator];
  if (!t) return e;
  var o = t.call(e), i, a = [], s;
  try {
    for (; (r === void 0 || r-- > 0) && !(i = o.next()).done; ) a.push(i.value);
  } catch (c) {
    s = { error: c };
  } finally {
    try {
      i && !i.done && (t = o.return) && t.call(o);
    } finally {
      if (s) throw s.error;
    }
  }
  return a;
}, Iu = function(e, r, t) {
  if (arguments.length === 2) for (var o = 0, i = r.length, a; o < i; o++)
    (a || !(o in r)) && (a || (a = Array.prototype.slice.call(r, 0, o)), a[o] = r[o]);
  return e.concat(a || Array.prototype.slice.call(r));
}, Au = (
  /** @class */
  (function() {
    function e(r) {
      this._namespace = r.namespace || "DiagComponentLogger";
    }
    return e.prototype.debug = function() {
      for (var r = [], t = 0; t < arguments.length; t++)
        r[t] = arguments[t];
      return it("debug", this._namespace, r);
    }, e.prototype.error = function() {
      for (var r = [], t = 0; t < arguments.length; t++)
        r[t] = arguments[t];
      return it("error", this._namespace, r);
    }, e.prototype.info = function() {
      for (var r = [], t = 0; t < arguments.length; t++)
        r[t] = arguments[t];
      return it("info", this._namespace, r);
    }, e.prototype.warn = function() {
      for (var r = [], t = 0; t < arguments.length; t++)
        r[t] = arguments[t];
      return it("warn", this._namespace, r);
    }, e.prototype.verbose = function() {
      for (var r = [], t = 0; t < arguments.length; t++)
        r[t] = arguments[t];
      return it("verbose", this._namespace, r);
    }, e;
  })()
);
function it(e, r, t) {
  var o = yt("diag");
  if (o)
    return t.unshift(r), o[e].apply(o, Iu([], Cu(t), !1));
}
var re;
(function(e) {
  e[e.NONE = 0] = "NONE", e[e.ERROR = 30] = "ERROR", e[e.WARN = 50] = "WARN", e[e.INFO = 60] = "INFO", e[e.DEBUG = 70] = "DEBUG", e[e.VERBOSE = 80] = "VERBOSE", e[e.ALL = 9999] = "ALL";
})(re || (re = {}));
function xu(e, r) {
  e < re.NONE ? e = re.NONE : e > re.ALL && (e = re.ALL), r = r || {};
  function t(o, i) {
    var a = r[o];
    return typeof a == "function" && e >= i ? a.bind(r) : function() {
    };
  }
  return {
    error: t("error", re.ERROR),
    warn: t("warn", re.WARN),
    info: t("info", re.INFO),
    debug: t("debug", re.DEBUG),
    verbose: t("verbose", re.VERBOSE)
  };
}
var Tu = function(e, r) {
  var t = typeof Symbol == "function" && e[Symbol.iterator];
  if (!t) return e;
  var o = t.call(e), i, a = [], s;
  try {
    for (; (r === void 0 || r-- > 0) && !(i = o.next()).done; ) a.push(i.value);
  } catch (c) {
    s = { error: c };
  } finally {
    try {
      i && !i.done && (t = o.return) && t.call(o);
    } finally {
      if (s) throw s.error;
    }
  }
  return a;
}, Ru = function(e, r, t) {
  if (arguments.length === 2) for (var o = 0, i = r.length, a; o < i; o++)
    (a || !(o in r)) && (a || (a = Array.prototype.slice.call(r, 0, o)), a[o] = r[o]);
  return e.concat(a || Array.prototype.slice.call(r));
}, Nu = "diag", Zt = (
  /** @class */
  (function() {
    function e() {
      function r(i) {
        return function() {
          for (var a = [], s = 0; s < arguments.length; s++)
            a[s] = arguments[s];
          var c = yt("diag");
          if (c)
            return c[i].apply(c, Ru([], Tu(a), !1));
        };
      }
      var t = this, o = function(i, a) {
        var s, c, l;
        if (a === void 0 && (a = { logLevel: re.INFO }), i === t) {
          var u = new Error("Cannot use diag as the logger for itself. Please use a DiagLogger implementation like ConsoleDiagLogger or a custom implementation");
          return t.error((s = u.stack) !== null && s !== void 0 ? s : u.message), !1;
        }
        typeof a == "number" && (a = {
          logLevel: a
        });
        var d = yt("diag"), _ = xu((c = a.logLevel) !== null && c !== void 0 ? c : re.INFO, i);
        if (d && !a.suppressOverrideMessage) {
          var f = (l = new Error().stack) !== null && l !== void 0 ? l : "<failed to generate stacktrace>";
          d.warn("Current logger will be overwritten from " + f), _.warn("Current logger will overwrite one already registered from " + f);
        }
        return qr("diag", _, t, !0);
      };
      t.setLogger = o, t.disable = function() {
        Vr(Nu, t);
      }, t.createComponentLogger = function(i) {
        return new Au(i);
      }, t.verbose = r("verbose"), t.debug = r("debug"), t.info = r("info"), t.warn = r("warn"), t.error = r("error");
    }
    return e.instance = function() {
      return this._instance || (this._instance = new e()), this._instance;
    }, e;
  })()
);
function Lu(e) {
  return Symbol.for(e);
}
var Mu = (
  /** @class */
  /* @__PURE__ */ (function() {
    function e(r) {
      var t = this;
      t._currentContext = r ? new Map(r) : /* @__PURE__ */ new Map(), t.getValue = function(o) {
        return t._currentContext.get(o);
      }, t.setValue = function(o, i) {
        var a = new e(t._currentContext);
        return a._currentContext.set(o, i), a;
      }, t.deleteValue = function(o) {
        var i = new e(t._currentContext);
        return i._currentContext.delete(o), i;
      };
    }
    return e;
  })()
), ju = new Mu(), Ou = function(e, r) {
  var t = typeof Symbol == "function" && e[Symbol.iterator];
  if (!t) return e;
  var o = t.call(e), i, a = [], s;
  try {
    for (; (r === void 0 || r-- > 0) && !(i = o.next()).done; ) a.push(i.value);
  } catch (c) {
    s = { error: c };
  } finally {
    try {
      i && !i.done && (t = o.return) && t.call(o);
    } finally {
      if (s) throw s.error;
    }
  }
  return a;
}, Du = function(e, r, t) {
  if (arguments.length === 2) for (var o = 0, i = r.length, a; o < i; o++)
    (a || !(o in r)) && (a || (a = Array.prototype.slice.call(r, 0, o)), a[o] = r[o]);
  return e.concat(a || Array.prototype.slice.call(r));
}, Uu = (
  /** @class */
  (function() {
    function e() {
    }
    return e.prototype.active = function() {
      return ju;
    }, e.prototype.with = function(r, t, o) {
      for (var i = [], a = 3; a < arguments.length; a++)
        i[a - 3] = arguments[a];
      return t.call.apply(t, Du([o], Ou(i), !1));
    }, e.prototype.bind = function(r, t) {
      return t;
    }, e.prototype.enable = function() {
      return this;
    }, e.prototype.disable = function() {
      return this;
    }, e;
  })()
), Fu = function(e, r) {
  var t = typeof Symbol == "function" && e[Symbol.iterator];
  if (!t) return e;
  var o = t.call(e), i, a = [], s;
  try {
    for (; (r === void 0 || r-- > 0) && !(i = o.next()).done; ) a.push(i.value);
  } catch (c) {
    s = { error: c };
  } finally {
    try {
      i && !i.done && (t = o.return) && t.call(o);
    } finally {
      if (s) throw s.error;
    }
  }
  return a;
}, Gu = function(e, r, t) {
  if (arguments.length === 2) for (var o = 0, i = r.length, a; o < i; o++)
    (a || !(o in r)) && (a || (a = Array.prototype.slice.call(r, 0, o)), a[o] = r[o]);
  return e.concat(a || Array.prototype.slice.call(r));
}, gr = "context", qu = new Uu(), $r = (
  /** @class */
  (function() {
    function e() {
    }
    return e.getInstance = function() {
      return this._instance || (this._instance = new e()), this._instance;
    }, e.prototype.setGlobalContextManager = function(r) {
      return qr(gr, r, Zt.instance());
    }, e.prototype.active = function() {
      return this._getContextManager().active();
    }, e.prototype.with = function(r, t, o) {
      for (var i, a = [], s = 3; s < arguments.length; s++)
        a[s - 3] = arguments[s];
      return (i = this._getContextManager()).with.apply(i, Gu([r, t, o], Fu(a), !1));
    }, e.prototype.bind = function(r, t) {
      return this._getContextManager().bind(r, t);
    }, e.prototype._getContextManager = function() {
      return yt(gr) || qu;
    }, e.prototype.disable = function() {
      this._getContextManager().disable(), Vr(gr, Zt.instance());
    }, e;
  })()
), Nr;
(function(e) {
  e[e.NONE = 0] = "NONE", e[e.SAMPLED = 1] = "SAMPLED";
})(Nr || (Nr = {}));
var No = "0000000000000000", Lo = "00000000000000000000000000000000", Vu = {
  traceId: Lo,
  spanId: No,
  traceFlags: Nr.NONE
}, mt = (
  /** @class */
  (function() {
    function e(r) {
      r === void 0 && (r = Vu), this._spanContext = r;
    }
    return e.prototype.spanContext = function() {
      return this._spanContext;
    }, e.prototype.setAttribute = function(r, t) {
      return this;
    }, e.prototype.setAttributes = function(r) {
      return this;
    }, e.prototype.addEvent = function(r, t) {
      return this;
    }, e.prototype.addLink = function(r) {
      return this;
    }, e.prototype.addLinks = function(r) {
      return this;
    }, e.prototype.setStatus = function(r) {
      return this;
    }, e.prototype.updateName = function(r) {
      return this;
    }, e.prototype.end = function(r) {
    }, e.prototype.isRecording = function() {
      return !1;
    }, e.prototype.recordException = function(r, t) {
    }, e;
  })()
), Hr = Lu("OpenTelemetry Context Key SPAN");
function zr(e) {
  return e.getValue(Hr) || void 0;
}
function $u() {
  return zr($r.getInstance().active());
}
function Br(e, r) {
  return e.setValue(Hr, r);
}
function Hu(e) {
  return e.deleteValue(Hr);
}
function zu(e, r) {
  return Br(e, new mt(r));
}
function Mo(e) {
  var r;
  return (r = zr(e)) === null || r === void 0 ? void 0 : r.spanContext();
}
var Bu = /^([0-9a-f]{32})$/i, Yu = /^[0-9a-f]{16}$/i;
function Zu(e) {
  return Bu.test(e) && e !== Lo;
}
function Ku(e) {
  return Yu.test(e) && e !== No;
}
function jo(e) {
  return Zu(e.traceId) && Ku(e.spanId);
}
function Ju(e) {
  return new mt(e);
}
var br = $r.getInstance(), Oo = (
  /** @class */
  (function() {
    function e() {
    }
    return e.prototype.startSpan = function(r, t, o) {
      o === void 0 && (o = br.active());
      var i = !!t?.root;
      if (i)
        return new mt();
      var a = o && Mo(o);
      return Wu(a) && jo(a) ? new mt(a) : new mt();
    }, e.prototype.startActiveSpan = function(r, t, o, i) {
      var a, s, c;
      if (!(arguments.length < 2)) {
        arguments.length === 2 ? c = t : arguments.length === 3 ? (a = t, c = o) : (a = t, s = o, c = i);
        var l = s ?? br.active(), u = this.startSpan(r, a, l), d = Br(l, u);
        return br.with(d, c, void 0, u);
      }
    }, e;
  })()
);
function Wu(e) {
  return typeof e == "object" && typeof e.spanId == "string" && typeof e.traceId == "string" && typeof e.traceFlags == "number";
}
var Qu = new Oo(), Xu = (
  /** @class */
  (function() {
    function e(r, t, o, i) {
      this._provider = r, this.name = t, this.version = o, this.options = i;
    }
    return e.prototype.startSpan = function(r, t, o) {
      return this._getTracer().startSpan(r, t, o);
    }, e.prototype.startActiveSpan = function(r, t, o, i) {
      var a = this._getTracer();
      return Reflect.apply(a.startActiveSpan, a, arguments);
    }, e.prototype._getTracer = function() {
      if (this._delegate)
        return this._delegate;
      var r = this._provider.getDelegateTracer(this.name, this.version, this.options);
      return r ? (this._delegate = r, this._delegate) : Qu;
    }, e;
  })()
), ed = (
  /** @class */
  (function() {
    function e() {
    }
    return e.prototype.getTracer = function(r, t, o) {
      return new Oo();
    }, e;
  })()
), td = new ed(), An = (
  /** @class */
  (function() {
    function e() {
    }
    return e.prototype.getTracer = function(r, t, o) {
      var i;
      return (i = this.getDelegateTracer(r, t, o)) !== null && i !== void 0 ? i : new Xu(this, r, t, o);
    }, e.prototype.getDelegate = function() {
      var r;
      return (r = this._delegate) !== null && r !== void 0 ? r : td;
    }, e.prototype.setDelegate = function(r) {
      this._delegate = r;
    }, e.prototype.getDelegateTracer = function(r, t, o) {
      var i;
      return (i = this._delegate) === null || i === void 0 ? void 0 : i.getTracer(r, t, o);
    }, e;
  })()
), gt;
(function(e) {
  e[e.INTERNAL = 0] = "INTERNAL", e[e.SERVER = 1] = "SERVER", e[e.CLIENT = 2] = "CLIENT", e[e.PRODUCER = 3] = "PRODUCER", e[e.CONSUMER = 4] = "CONSUMER";
})(gt || (gt = {}));
var Te;
(function(e) {
  e[e.UNSET = 0] = "UNSET", e[e.OK = 1] = "OK", e[e.ERROR = 2] = "ERROR";
})(Te || (Te = {}));
var Be = $r.getInstance(), wr = "trace", rd = (
  /** @class */
  (function() {
    function e() {
      this._proxyTracerProvider = new An(), this.wrapSpanContext = Ju, this.isSpanContextValid = jo, this.deleteSpan = Hu, this.getSpan = zr, this.getActiveSpan = $u, this.getSpanContext = Mo, this.setSpan = Br, this.setSpanContext = zu;
    }
    return e.getInstance = function() {
      return this._instance || (this._instance = new e()), this._instance;
    }, e.prototype.setGlobalTracerProvider = function(r) {
      var t = qr(wr, this._proxyTracerProvider, Zt.instance());
      return t && this._proxyTracerProvider.setDelegate(r), t;
    }, e.prototype.getTracerProvider = function() {
      return yt(wr) || this._proxyTracerProvider;
    }, e.prototype.getTracer = function(r, t) {
      return this.getTracerProvider().getTracer(r, t);
    }, e.prototype.disable = function() {
      Vr(wr, Zt.instance()), this._proxyTracerProvider = new An();
    }, e;
  })()
), Qe = rd.getInstance();
const nd = async (e, r, t) => {
  const o = Qe.getTracer("openpay-js"), i = Be.active(), a = o.startSpan(
    `cde.${r.type}`,
    {
      kind: gt.CLIENT,
      attributes: {
        "message.type": r.type,
        ...e.tracingContext && {
          "ojs.checkoutSecureToken": e.tracingContext.checkoutSecureToken,
          "ojs.deviceToken": e.tracingContext.deviceToken,
          "ojs.formId": e.tracingContext.formId,
          "ojs.version": e.tracingContext.version,
          "ojs.release_version": e.tracingContext.releaseVersion,
          "ojs.base_url": e.tracingContext.baseUrl,
          "ojs.referrer": e.tracingContext.referrer
        },
        "cde.message.type": r.type,
        "cde.message.payload": JSON.stringify(r.payload)
      }
    },
    i
  );
  return Be.with(Qe.setSpan(i, a), async () => {
    try {
      const s = await t();
      return a.setStatus({ code: Te.OK }), s;
    } catch (s) {
      throw a.setStatus({
        code: Te.ERROR,
        message: s instanceof Error ? s.message : "Unknown error"
      }), s;
    } finally {
      a.end();
    }
  });
}, Tt = async (e, r) => {
  const t = Qe.getTracer("openpay-js"), o = Be.active(), i = t.startSpan(
    `form.${e.spanName}`,
    {
      kind: gt.CLIENT,
      attributes: {
        "ojs.checkoutSecureToken": e.checkoutSecureToken,
        "ojs.deviceToken": e.deviceToken,
        "ojs.formId": e.formId,
        "ojs.version": e.version,
        "ojs.release_version": e.releaseVersion,
        "ojs.base_url": e.baseUrl,
        "ojs.referrer": e.referrer,
        ...e.paymentRouteId && { "payment.route_id": e.paymentRouteId }
      }
    },
    o
  );
  try {
    const a = await r();
    return i.setStatus({ code: Te.OK }), a;
  } catch (a) {
    const s = a instanceof Error ? a.message : "Unknown error";
    throw i.setStatus({
      code: Te.ERROR,
      message: s
    }), a;
  } finally {
    i.end();
  }
};
class Do extends Ws {
  constructor(r) {
    const t = `${r.message}`;
    super(t), this.response = r;
  }
  get originalErrorMessage() {
    return this.response.message;
  }
}
const W = async (e, r, t, o) => nd(e, r, async () => {
  o && b(o, {
    ...r
  });
  const i = await e.send(r);
  if (id(i)) {
    const a = navigator.connection;
    throw b("cde_response_error", {
      error_message: i.message,
      message_type: r.type,
      user_agent: navigator.userAgent,
      online: navigator.onLine,
      has_focus: document.hasFocus(),
      href: window.location.href,
      document_visibility_state: document.visibilityState,
      connection_downlink: a?.downlink,
      connection_effective_type: a?.effectiveType,
      connection_rtt: a?.rtt,
      connection_save_data: a?.saveData
    }), new Do(i);
  }
  if (!od(i, t)) {
    const a = t.safeParse(i);
    throw a.success ? new Error("Invalid state") : (console.error("OJS queryApi got a schema error. Expected schema:", t, "Actual:", i), a.error);
  }
  return o && b(o, {
    ...i
  }), i;
}), od = (e, r) => r.safeParse(e).success, id = (e) => Mc.safeParse(e).success, ad = async (e, r) => await W(e, { type: "get_checkout_preview", payload: r }, _o), D = async (e) => await W(e, { type: "get_prefill", payload: {} }, yo), ie = async (e, r) => await W(
  e,
  { type: "v2_start_payment_flow", payload: r },
  wo,
  "start_payment_flow"
), Uo = async (e, r) => await W(
  e,
  { type: "start_payment_flow_for_cc", payload: r },
  Zc,
  "start_payment_flow_for_cc"
), sd = async (e, r) => {
  b("start_payment_flow_for_pr", {
    ...r
  });
  const t = await W(e, { type: "start_payment_flow_for_pr", payload: r }, wo);
  return b("start_payment_flow_for_pr_result", {
    ...t
  }), t;
}, G = async (e, r) => await W(
  e,
  { type: "confirm_payment_flow", payload: r },
  kc,
  "confirm_payment_flow"
), cd = async (e, r) => await W(
  e,
  { type: "finalize_setup_payment_method", payload: r },
  go,
  "finalize_setup_payment_method"
), ld = async (e, r) => await W(
  e,
  { type: "check_if_popup_window_verified", payload: r },
  Sc,
  "check_if_popup_window_verified"
), ud = async (e, r, t) => {
  const o = await ad(e, {
    secure_token: r,
    promotion_code: t
  }), i = new Set(o.preview.invoices.map((c) => c.currency));
  if (i.size !== 1)
    throw new Error(`Expected exactly one currency, got ${i.size}`);
  const a = i.values().next().value ?? "usd", s = cl(o.preview.invoices.map((c) => c.remaining_amount_atom));
  return {
    currency: a,
    amountAtom: s
  };
}, Se = async (e, r, t, o) => {
  if (t)
    return { amountAtom: 0, currency: "usd" };
  {
    o = o || void 0, sessionStorage.getItem("promoCode") && !o && (o = sessionStorage.getItem("promoCode"));
    const i = await ud(e, r, o);
    return { amountAtom: i.amountAtom, currency: i.currency };
  }
}, Fo = async (e, r) => {
  if (e.size === 0)
    throw new Error("No CDE connections found");
  return await Promise.all(
    Array.from(e.values()).map(
      (t) => W(t, { type: "tokenize_card", payload: r }, vc)
    )
  );
}, xn = async (e, r) => await W(
  e,
  { type: "checkout_card_elements", payload: r },
  ht,
  "checkout_card_elements"
), dd = async (e, r) => await W(e, { type: "setup_payment_method", payload: r }, go, "setup_checkout"), Yr = async (e, r) => await W(e, { type: "checkout", payload: r }, ht, "perform_checkout"), Go = 1e3, pd = async (e, r, t, o) => {
  console.log(r);
  const i = await Hn({
    iframe: e,
    debug: !0,
    timeout: Go,
    childOrigin: "*"
    // TODO: use with proper childOrigin
  }).promise, a = await W(i, { type: t }, o);
  return console.log("🟢 CDE connection successful! Stopping polling... Result:", a), a;
}, cr = async (e, r) => await W(
  e,
  { type: "prepare_payment_flow", payload: r },
  Jc,
  "prepare_payment_flow"
), qo = async (e, r) => {
  try {
    return (await W(
      e,
      { type: "get_standardized_error_code", payload: { message: r } },
      Kc
    )).error_code;
  } catch (t) {
    return console.error("[cde-client] Error during getStandardizedErrorCode:", ne(t)), "PAYMENT_FAILED_GENERIC";
  }
}, md = async (e, r) => await W(
  e,
  { type: "set_user_device_token", payload: { device_token: r } },
  Wc
), hd = async (e) => {
  if (typeof e != "object" || !e) return !1;
  try {
    const r = { type: "ping" }, t = await e.send(r);
    if (t !== !0)
      throw new Error(`Expected 'true' after ping, got ${JSON.stringify(t)}`);
    return !0;
  } catch (r) {
    return console.error("Invalid CDE connection check:", r), !1;
  }
}, fd = (e, r) => !!e && r, Vo = "https://cde.getopenpay.com", $o = "0123456789ABCDEFGHJKMNPQRSTVWXYZ", Kt = 32, _d = 16, Ho = 10, Tn = 281474976710655;
var De;
(function(e) {
  e.Base32IncorrectEncoding = "B32_ENC_INVALID", e.DecodeTimeInvalidCharacter = "DEC_TIME_CHAR", e.DecodeTimeValueMalformed = "DEC_TIME_MALFORMED", e.EncodeTimeNegative = "ENC_TIME_NEG", e.EncodeTimeSizeExceeded = "ENC_TIME_SIZE_EXCEED", e.EncodeTimeValueMalformed = "ENC_TIME_MALFORMED", e.PRNGDetectFailure = "PRNG_DETECT", e.ULIDInvalid = "ULID_INVALID", e.Unexpected = "UNEXPECTED", e.UUIDInvalid = "UUID_INVALID";
})(De || (De = {}));
class ct extends Error {
  constructor(r, t) {
    super(`${t} (${r})`), this.name = "ULIDError", this.code = r;
  }
}
function yd(e) {
  const r = Math.floor(e() * Kt) % Kt;
  return $o.charAt(r);
}
function gd(e) {
  const r = bd(), t = r && (r.crypto || r.msCrypto) || null;
  if (typeof t?.getRandomValues == "function")
    return () => {
      const o = new Uint8Array(1);
      return t.getRandomValues(o), o[0] / 255;
    };
  if (typeof t?.randomBytes == "function")
    return () => t.randomBytes(1).readUInt8() / 255;
  throw new ct(De.PRNGDetectFailure, "Failed to find a reliable PRNG");
}
function bd() {
  return Pd() ? self : typeof window < "u" ? window : typeof global < "u" ? global : typeof globalThis < "u" ? globalThis : null;
}
function wd(e, r) {
  let t = "";
  for (; e > 0; e--)
    t = yd(r) + t;
  return t;
}
function vd(e, r = Ho) {
  if (isNaN(e))
    throw new ct(De.EncodeTimeValueMalformed, `Time must be a number: ${e}`);
  if (e > Tn)
    throw new ct(De.EncodeTimeSizeExceeded, `Cannot encode a time larger than ${Tn}: ${e}`);
  if (e < 0)
    throw new ct(De.EncodeTimeNegative, `Time must be positive: ${e}`);
  if (Number.isInteger(e) === !1)
    throw new ct(De.EncodeTimeValueMalformed, `Time must be an integer: ${e}`);
  let t, o = "";
  for (let i = r; i > 0; i--)
    t = e % Kt, o = $o.charAt(t) + o, e = (e - t) / Kt;
  return o;
}
function Pd() {
  return typeof WorkerGlobalScope < "u" && self instanceof WorkerGlobalScope;
}
function Ed(e, r) {
  const t = gd(), o = Date.now();
  return vd(o, Ho) + wd(_d, t);
}
const zo = "op_analytics_device_token", Bo = () => {
  const e = document.cookie.split(";").find((t) => t.includes(zo));
  if (e)
    return e.split("=")[1];
  const r = Ed();
  return Sd(r), r;
}, Sd = (e) => {
  const r = /* @__PURE__ */ new Date();
  r.setFullYear(r.getFullYear() + 1), document.cookie = `${zo}=${e}; path=/; expires=${r.toUTCString()}`;
}, kd = (e) => {
  const r = {};
  return Object.entries(e).forEach(([t, o]) => {
    try {
      const i = ao.parse(t);
      Array.isArray(o) ? r[i] = o : Array.isArray(o._errors) && (r[i] = o._errors);
    } catch {
      return;
    }
  }), r;
}, $ = (e, r) => Array.from(e.querySelectorAll("[data-opid]") ?? []).reduce((t, o) => {
  const i = o.getAttribute("data-opid");
  if (!i) return t;
  const a = o.type === "checkbox" ? o.checked : o.value;
  return { ...t, [i]: a };
}, {}), Cd = (e) => {
  try {
    return gc.parse(e);
  } catch (r) {
    throw console.error("Error parsing event payload:", e, r), r;
  }
}, Id = () => {
  const e = Fe().split("-")[0];
  return {
    firstName: `xx_${e}`,
    lastName: `xx_${e}`,
    email: `xx_${e}@email.com`,
    zipCode: `xx_${e}`,
    country: "US"
  };
}, St = (e) => ({
  line1: e[m.LINE1],
  line2: e[m.LINE2],
  line3: e[m.LINE3],
  city: e[m.CITY],
  state: e[m.STATE],
  country: e[m.COUNTRY],
  zip_code: e[m.ZIP_CODE]
}), lr = (e, r) => {
  if (r.require_full_shipping_address)
    return {
      line1: e[m.SHIPPING_LINE1],
      line2: e[m.SHIPPING_LINE2],
      line3: e[m.SHIPPING_LINE3],
      city: e[m.SHIPPING_CITY],
      state: e[m.SHIPPING_STATE],
      country: e[m.SHIPPING_COUNTRY],
      zip_code: e[m.SHIPPING_ZIP_CODE]
    };
}, ur = (e, r) => [e, r].filter(Boolean).join(" "), Ad = ({ width: e, height: r }) => `
@keyframes fadeIn {
  from {
    opacity: 0;
    transform: scale(0.9);
  }
  to {
    opacity: 1;
    transform: scale(1);
  }
}

.overlay {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 2147483648 !important;
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: rgba(0, 0, 0, 0.5);
}
.container {
  max-width: ${e ?? "500px"};
  max-height: ${r ?? "600px"};
  width: 100%;
  height: 100%;
  background-color: white;
  position: relative;
  animation: fadeIn 0.3s ease-out;
}
.frame, #adyen-container, #adyen-container > * {
  max-width: ${e ?? "500px"};
  max-height: ${r ?? "600px"};
  width: 100%;
  height: 100%;
  border: none;
}
.cancel-button {
  position: absolute;
  background: transparent;
  border: none;
  font-size: 1rem;
  color: #fff;
  cursor: pointer;
  top: -1.5rem;
  padding: 0;
  right: 0;
}
`, xd = ({ width: e, height: r }) => `
@keyframes fadeIn {
  from {
    opacity: 0;
    transform: scale(0.9);
  }
  to {
    opacity: 1;
    transform: scale(1);
  }
}

.overlay {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 2147483648 !important;
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: rgba(0, 0, 0, 0.5);
}
.container {
  max-width: ${e ?? "500px"};
  max-height: ${r ?? "600px"};
  width: 100%;
  background-color: white;
  position: relative;
  animation: fadeIn 0.3s ease-out;
  border-radius: 8px;
  box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
}
.bank-selector-content {
  padding: 24px;
  max-height: calc(${r ?? "600px"} - 48px);
  overflow-y: auto;
}
.bank-selector-header {
  font-size: 1.25rem;
  font-weight: 600;
  margin-bottom: 20px;
  color: #1a1a1a;
  text-align: center;
}
.bank-list {
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.bank-item {
  display: flex;
  align-items: center;
  padding: 16px;
  border: 2px solid #e5e5e5;
  border-radius: 8px;
  cursor: pointer;
  transition: all 0.2s ease;
  background-color: #ffffff;
}
.bank-item:hover {
  border-color: #3b82f6;
  background-color: #f8fafc;
  transform: translateY(-1px);
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
.bank-item:active {
  transform: translateY(0);
}
.bank-logo {
  width: 40px;
  height: 40px;
  border-radius: 6px;
  object-fit: contain;
  margin-right: 16px;
  background-color: #f8f9fa;
  border: 1px solid #e9ecef;
}
.bank-logo-placeholder {
  width: 40px;
  height: 40px;
  border-radius: 6px;
  background-color: #e9ecef;
  display: flex;
  align-items: center;
  justify-content: center;
  margin-right: 16px;
  color: #6c757d;
  font-size: 0.875rem;
  font-weight: 500;
}
.bank-info {
  flex: 1;
}
.bank-display-name {
  font-size: 1rem;
  font-weight: 500;
  color: #1a1a1a;
  margin-bottom: 2px;
}
.bank-name {
  font-size: 0.875rem;
  color: #6c757d;
}
.cancel-button {
  position: absolute;
  background: transparent;
  border: none;
  font-size: 1rem;
  color: #fff;
  cursor: pointer;
  top: -1.5rem;
  padding: 0;
  right: 0;
}
`, dr = (e, r) => {
  const { id: t, title: o, width: i, height: a, name: s } = r ?? {}, c = document.createElement("template");
  c.innerHTML = `
    <style>
      ${Ad({ width: i, height: a })}
    </style>
    <div class="overlay">
      <div class="container">
        <button class="cancel-button">Cancel</button>
        <iframe src="${e}" class="frame" id="${t ?? "three-ds-iframe"}" title="${o ?? "3D Secure verification"}" allow="payment" name="${s ?? "three-ds-iframe"}"></iframe>
      </div>
    </div>
  `;
  const l = document.createElement("div"), u = l.attachShadow({ mode: "open" });
  u.appendChild(c.content.cloneNode(!0));
  const d = u.querySelector("#three-ds-iframe"), _ = u.querySelector(".cancel-button");
  return document.body.appendChild(l), { host: l, iframe: d, cancelButton: _ };
}, Yo = (e, r) => {
  const { width: t, height: o, title: i } = r ?? {};
  return new Promise((a, s) => {
    const c = document.createElement("template"), l = e.map((h, y) => {
      const g = h.resources.logo_url ? `<img src="${h.resources.logo_url}" alt="${h.display_name}" class="bank-logo" />` : `<div class="bank-logo-placeholder">${h.display_name.substring(0, 2).toUpperCase()}</div>`;
      return `
        <div class="bank-item" data-bank-index="${y}">
          ${g}
          <div class="bank-info">
            <div class="bank-display-name">${h.display_name}</div>
            <div class="bank-name">${h.bank_name}</div>
          </div>
        </div>
      `;
    }).join("");
    c.innerHTML = `
      <style>
        ${xd({ width: t, height: o })}
      </style>
      <div class="overlay">
        <div class="container">
          <button class="cancel-button">Cancel</button>
          <div class="bank-selector-content">
            <div class="bank-selector-header">${i ?? "Select your bank"}</div>
            <div class="bank-list">
              ${l}
            </div>
          </div>
        </div>
      </div>
    `;
    const u = document.createElement("div"), d = u.attachShadow({ mode: "open" });
    d.appendChild(c.content.cloneNode(!0));
    const _ = d.querySelector(".cancel-button"), f = d.querySelectorAll(".bank-item"), p = () => {
      document.body.removeChild(u);
    };
    _.addEventListener("click", () => {
      p(), s(new Error("Bank selection cancelled"));
    }), f.forEach((h, y) => {
      h.addEventListener("click", () => {
        p(), a(e[y]);
      });
    }), document.body.appendChild(u);
  });
}, pr = (e, r) => {
  const { width: t, height: o, baseUrl: i } = r ?? {}, a = new URL(`app/direct_debit/micro_deposit/?type=${e}`, i).toString();
  return new Promise((s, c) => {
    const l = dr(a, { width: t, height: o, title: "Micro Deposit Form" }), u = () => {
      l.host.remove();
    }, d = () => {
      u(), c(new Error("Micro deposit form cancelled"));
    }, _ = (g) => {
      u(), g.status === "success" && g.payload ? "error" in g.payload ? c(new Error(g.payload.error)) : s(g.payload) : c(new Error("Micro deposit form failed"));
    };
    l.cancelButton.addEventListener("click", d);
    const f = Zr(
      l.iframe,
      _,
      new URL(i).origin,
      "micro-deposit-status",
      Lc
    ), p = () => {
      l.cancelButton.removeEventListener("click", d), clearInterval(f);
    }, h = d, y = () => {
      p(), h();
    };
    l.cancelButton.removeEventListener("click", d), l.cancelButton.addEventListener("click", y);
  });
};
function Zr(e, r, t, o, i) {
  const a = async () => {
    try {
      const c = await pd(e, t, o, i);
      c && (clearInterval(s), r(c));
    } catch {
    }
  };
  a();
  const s = setInterval(a, Go);
  return s;
}
function Zo({
  elements: e,
  pollingInterval: r,
  resolve: t
}) {
  const o = () => {
    clearInterval(r), e.host.remove(), t({ status: M.CANCELLED });
  };
  return e.cancelButton.addEventListener("click", o), () => {
    e.cancelButton.removeEventListener("click", o);
  };
}
async function ke(e) {
  const { url: r, baseUrl: t, frameWidth: o, frameHeight: i, frameTitle: a } = e, s = dr(r, { width: o, height: i, title: a });
  return new Promise((c) => {
    const l = (_) => {
      setTimeout(() => {
        s.host.remove();
      }, 1e3), c(_), d?.();
    }, u = Zr(
      s.iframe,
      l,
      new URL(t).origin,
      "ping-3ds-status",
      uo
    ), d = Zo({
      elements: s,
      pollingInterval: u,
      resolve: c
    });
  });
}
const Ko = async (e) => {
  const r = await ke(e);
  if (r.status === M.CANCELLED)
    throw new Error("3DS verification cancelled");
  if (r.status === M.FAILURE)
    throw new Error("3DS verification failed");
  return r.status !== M.SUCCESS && Et(r.status), {
    href: r.href
  };
}, Td = (e, r) => {
  const t = window.open(r, "_blank");
  if (!t)
    throw new Error(`${e} popup window blocked. Please allow popups for this site.`);
  return t;
}, Jo = async (e, r, t, o) => {
  const { err__: i } = R("popup-verify");
  return new Promise((a, s) => {
    const c = Td(e, o), l = setInterval(async () => {
      try {
        const u = await ld(r, t);
        if (u.present)
          clearInterval(l), c.close(), a({ href: u.href });
        else if (c.closed)
          throw new Error(`${e} payment cancelled`);
      } catch (u) {
        i(ne(u)), clearInterval(l), s(ne(u));
      }
    }, 1e3);
  });
}, me = () => {
  let e = (navigator.languages && navigator.languages.length ? navigator.languages : [navigator.language])?.[0];
  return e && (e = e.split("-")[0]), e;
}, { log__: Rd, err__: Nd } = R("common-cc"), Ld = ({
  require_zip_code: e,
  require_full_billing_address: r,
  require_full_shipping_address: t,
  payment_method: o
}) => {
  const i = {};
  return o === "ach" && (i[m.FIRST_NAME] = n.string().min(2, { message: "Minimum length is 2" }), i[m.LAST_NAME] = n.string().min(2, { message: "Minimum length is 2" })), e && (i[m.ZIP_CODE] = T), r && (i[m.LINE1] = T, i[m.CITY] = T, i[m.STATE] = T, i[m.COUNTRY] = T, i[m.ZIP_CODE] = T), t && (i[m.SHIPPING_LINE1] = T, i[m.SHIPPING_CITY] = T, i[m.SHIPPING_STATE] = T, i[m.SHIPPING_COUNTRY] = T, i[m.SHIPPING_ZIP_CODE] = T), Object.keys(i).length === 0 ? Je : Je.extend(i);
}, Md = (e, r, t = {}) => {
  if (t) {
    Rd(`Received default field values: ${JSON.stringify(t)}`);
    const i = Object.keys(t);
    for (let a = 0; a < i.length; a++) {
      const s = i[a], c = t[s];
      e[s] || (e[s] = c);
    }
  }
  e[m.IS_SHIPPING_SAME_AS_BILLING] = !!e[m.IS_SHIPPING_SAME_AS_BILLING], e[m.IS_SHIPPING_SAME_AS_BILLING] && (e[m.SHIPPING_LINE1] = e[m.LINE1], e[m.SHIPPING_LINE2] = e[m.LINE2], e[m.SHIPPING_LINE3] = e[m.LINE3], e[m.SHIPPING_CITY] = e[m.CITY], e[m.SHIPPING_STATE] = e[m.STATE], e[m.SHIPPING_COUNTRY] = e[m.COUNTRY], e[m.SHIPPING_ZIP_CODE] = e[m.ZIP_CODE]);
  const o = Ld(t).safeParse(e);
  if (!o.success) {
    const i = o.error.format(), a = kd(i), s = Object.keys(a);
    for (let c = 0; c < s.length; c++) {
      const l = s[c], u = a[l];
      r(l, u, l);
    }
    throw Nd("Got validation errors in non-CDE form fields", a), new Error("Almost there! Just a few things highlighted above to fix before you can submit.");
  }
  return o.data;
}, { log__: jd, err__: Od } = R("common-cc"), Z = Md, Wo = (e, r) => {
  for (const t of e)
    if (t.success === !1)
      throw t.errors.forEach((o) => {
        const i = lo.safeParse(o.elementType);
        if (!i.success)
          Od(`Unknown field name in onValidationError: ${o.elementType}. Error object:`, o);
        else {
          const a = i.data;
          r(a, o.errors);
        }
      }), jd(`Error tokenizing card: got validation errors: ${JSON.stringify(t.errors)}`), new Error("Got validation errors while tokenizing card");
}, { err__: Qo } = R("common"), kt = (e) => {
  if (e.payment_methods.length !== 1)
    throw new Error(`Expected exactly one payment method, got ${e.payment_methods.length}`);
  return { payment_method_id: e.payment_methods[0].id };
}, K = (e, r) => {
  const t = e.find((o) => r.safeParse(o).success);
  if (!t)
    throw Qo("No CPMs found for model. All models:", e), new Error("No CPMs found for model");
  return r.parse(t);
}, ee = (e, r) => ({
  new_customer_email: e.email,
  new_customer_last_name: e.lastName,
  new_customer_first_name: e.firstName,
  customer_business_name: e.businessName,
  customer_tax_id: e.taxId,
  customer_tax_id_type: e.taxIdType,
  new_customer_address: St(e),
  new_customer_shipping_address: lr(e, r)
}), he = async (e) => {
  const { log__: r } = R(e.logPrefix), t = await D(e.anyCdeConnection), o = kt(e.confirmResult);
  if (t.mode === "setup")
    return r("Setting up payment method..."), { mode: "setup", result: await cd(e.anyCdeConnection, {
      secure_token: t.token,
      pm_id: o.payment_method_id
    }) };
  {
    if (e.usePayFirstFlow) {
      if (r("Using pay-first flow..."), !e.confirmResult.pay_first_success_response)
        throw Qo("Checkout failed, no pay-first success response:", e.confirmResult), new Error("Checkout failed, please try again with another payment method.");
      return {
        mode: "checkout",
        result: e.confirmResult.pay_first_success_response
      };
    }
    const i = {
      secure_token: t.token,
      payment_input: { provider_type: e.checkoutPaymentMethod.provider },
      customer_email: e.requiredFormFields[m.EMAIL],
      customer_address: St(e.requiredFormFields),
      customer_shipping_address: lr(e.requiredFormFields, t.checkout_settings),
      promotion_code: e.requiredFormFields[m.PROMOTION_CODE],
      line_items: t.line_items,
      total_amount_atom: t.amount_total_atom,
      cancel_at_end: !1,
      use_confirmed_pm_id: o.payment_method_id,
      checkout_payment_method: e.checkoutPaymentMethod
    };
    return r("Doing checkout...", i), { mode: "checkout", result: await Yr(e.anyCdeConnection, i) };
  }
}, V = n.enum(["stripe", "airwallex", "authorize_net", "adyen", "paypal", "pockyt", "loop"]);
V.Enum.stripe;
const Xo = ({
  scriptId: e,
  src: r,
  checkLoadedFn: t
}) => {
  const o = new AbortController();
  return new Promise((i, a) => {
    let s = document.createElement("script");
    s.src = r, s.id = e, s.async = !0;
    const c = document.getElementById(e);
    t() ? i() : c ? s = c : document.body.appendChild(s), s.addEventListener(
      "load",
      () => {
        o.abort(), i();
      },
      { signal: o.signal }
    ), s.addEventListener(
      "error",
      () => {
        o.abort(), a("Failed to load the script");
      },
      { signal: o.signal }
    );
  });
}, rt = ({
  gateway: e,
  gatewayMerchantId: r,
  merchantName: t,
  merchantId: o,
  initialPreview: i,
  overridePaymentRequest: a,
  prefill: s
}) => {
  const c = a?.amount?.amountAtom ?? i?.amountAtom ?? 0, l = Math.max(c / 100, 0), u = (a?.amount?.currency ?? s?.currency ?? i.currency).toUpperCase(), d = {
    apiVersion: 2,
    apiVersionMinor: 0,
    allowedPaymentMethods: [
      {
        type: "CARD",
        parameters: {
          allowedAuthMethods: ["PAN_ONLY", "CRYPTOGRAM_3DS"],
          allowedCardNetworks: ["AMEX", "DISCOVER", "INTERAC", "JCB", "MASTERCARD", "VISA"],
          billingAddressRequired: !0,
          billingAddressParameters: {
            format: "FULL"
          },
          allowCreditCards: !0,
          allowPrepaidCards: !0
        },
        tokenizationSpecification: {
          type: "PAYMENT_GATEWAY",
          parameters: {
            gateway: e,
            gatewayMerchantId: r
          }
        }
      }
    ],
    emailRequired: !0,
    shippingAddressRequired: s.checkout_settings.require_full_shipping_address,
    merchantInfo: {
      // PROD env will need this
      // https://developers.google.com/pay/api/web/reference/request-objects#MerchantInfo
      merchantId: o ?? "",
      merchantName: t
    },
    transactionInfo: {
      countryCode: "US",
      currencyCode: u,
      totalPriceStatus: a?.pending ? "ESTIMATED" : "FINAL",
      totalPrice: l.toFixed(2)
    }
  };
  return a?.googlePayPaymentRequest ? typeof a.googlePayPaymentRequest == "function" ? { ...d, ...a.googlePayPaymentRequest(d) } : { ...d, ...a.googlePayPaymentRequest } : d;
}, Kr = () => Xo({
  scriptId: "__op_internal_google_pay_sdk",
  src: "https://pay.google.com/gp/p/js/pay.js",
  checkLoadedFn: () => !!window.google?.payments?.api
});
let vr = null;
const Jr = async (e) => await Ao(e) === "prod" ? "PRODUCTION" : "TEST", nt = async (e, r) => {
  const t = await Jr(e);
  return vr === null && (vr = new window.google.payments.api.PaymentsClient({
    environment: t,
    merchantInfo: r.merchantInfo
  })), vr;
}, ot = (e) => {
  const r = e.required_user_actions.find((t) => t.type === "airwallex_payment_consent");
  return r ? po.parse(r) : null;
}, Wr = (e, r) => {
  const t = { ...e }, o = r.paymentMethodData?.info?.billingAddress, i = r.shippingAddress;
  if (o) {
    const [a, ...s] = o.name?.trim()?.split(/\s+/) ?? [], c = s.join(" ") || void 0;
    t[m.EMAIL] = t[m.EMAIL] || r.email || "op_unfilled@getopenpay.com", t[m.LINE1] = t[m.LINE1] || o.address1 || "", t[m.LINE2] = t[m.LINE2] || o.address2 || "", t[m.LINE3] = t[m.LINE3] || o.address3 || "", t[m.CITY] = t[m.CITY] || o.locality || "", t[m.STATE] = t[m.STATE] || o.administrativeArea || "", t[m.COUNTRY] = t[m.COUNTRY] || o.countryCode || "US", t[m.ZIP_CODE] = t[m.ZIP_CODE] || o.postalCode || "00000";
    const l = t[m.FIRST_NAME] || a || "", u = t[m.LAST_NAME] || c || "";
    l || u ? (t[m.FIRST_NAME] = l, t[m.LAST_NAME] = u) : (t[m.FIRST_NAME] = "_OP_UNKNOWN", t[m.LAST_NAME] = "");
  }
  return i && (t[m.SHIPPING_LINE1] = t[m.SHIPPING_LINE1] || i.address1 || "", t[m.SHIPPING_LINE2] = t[m.SHIPPING_LINE2] || i.address2 || "", t[m.SHIPPING_LINE3] = t[m.SHIPPING_LINE3] || i.address3 || "", t[m.SHIPPING_CITY] = t[m.SHIPPING_CITY] || i.locality || "", t[m.SHIPPING_ZIP_CODE] = t[m.SHIPPING_ZIP_CODE] || i.postalCode || "00000", t[m.SHIPPING_STATE] = t[m.SHIPPING_STATE] || i.administrativeArea || "", t[m.SHIPPING_COUNTRY] = t[m.SHIPPING_COUNTRY] || i.countryCode || "US"), t;
}, { log__: Ie, err__: Dd } = R("awx-bacs"), Ud = J(
  async ({
    context: e,
    checkoutPaymentMethod: r,
    nonCdeFormInputs: t,
    formCallbacks: o,
    customParams: i
  }) => {
    const a = Z(t, o.get.onValidationError), s = e.anyCdeConnection, c = await D(s), l = i.verificationMethod ?? "truelayer";
    let u = null;
    if (l === "micro_deposit") {
      Ie("Micro deposit verification selected, showing form...");
      try {
        u = await pr("bacs_direct_debit", {
          width: "450px",
          height: "350px",
          baseUrl: e.baseUrl
        }), Ie("Micro deposit data collected");
      } catch {
        throw Ie("Micro deposit form cancelled"), new Error("Micro deposit form cancelled");
      }
    }
    const d = await ie(s, {
      payment_provider: r.provider,
      checkout_payment_method: r,
      ...ee(a, c.checkout_settings),
      customer_language: me()
    }), _ = ot(d), f = _?.consent_id, p = _?.available_banks;
    let h;
    if (l === "truelayer" && p && p.length >= 1) {
      Ie("Multiple banks available, showing bank selector...");
      try {
        h = await Yo(p, {
          width: "450px",
          height: "500px",
          title: "Select bank"
        }), Ie(`Bank selected: ${h.display_name}`);
      } catch {
        throw Ie("Bank selection cancelled"), new Error("Bank selection cancelled");
      }
    }
    const y = St(a), g = {
      type: "bacs_direct_debit",
      bacs_direct_debit: {
        // TrueLayer
        bank_name: h?.bank_name,
        // Microdeposit
        owner_name: ur(a[m.FIRST_NAME], a[m.LAST_NAME]),
        owner_email: a[m.EMAIL],
        country_code: a[m.COUNTRY],
        account_number: u?.account_number,
        sort_code: u?.sort_code,
        address: { ...y, town: y.city, postcode: y.zip_code }
      }
    }, w = (await G(s, {
      secure_token: c.token,
      processor_specific_metadata: {
        payment_provider: r.provider,
        airwallex_consent_id: f,
        verification_method: l,
        direct_debit_data: g
      }
    })).required_user_actions?.find(
      (I) => I.type === "airwallex_payment_consent"
    )?.redirect_url;
    if (w) {
      Ie("BACS verification required, starting verification...");
      const { status: I } = await ke({
        url: w,
        baseUrl: e.baseUrl,
        frameWidth: "500px",
        frameHeight: "700px",
        frameTitle: "BACS verification"
      });
      if (Ie(`╰ BACS verification completed [Status: ${I}]`), I === M.CANCELLED)
        throw new Error("BACS verification cancelled");
      if (I === M.FAILURE)
        throw new Error("BACS verification failed");
    }
    const E = await G(s, {
      secure_token: c.token,
      processor_specific_metadata: {
        payment_provider: r.provider,
        airwallex_consent_id: f
      }
    });
    try {
      return he({
        logPrefix: "awx-bacs",
        anyCdeConnection: s,
        checkoutPaymentMethod: r,
        requiredFormFields: a,
        confirmResult: E,
        usePayFirstFlow: !1
      });
    } catch (I) {
      throw Dd("BACS payment error", I), b("checkout_error", {
        error: I
      }), new Error(I?.message ?? "Unknown error");
    }
  }
), { log__: at, err__: Fd } = R("awx-eft"), Gd = J(
  async ({
    context: e,
    checkoutPaymentMethod: r,
    nonCdeFormInputs: t,
    formCallbacks: o,
    customParams: i
  }) => {
    const a = Z(t, o.get.onValidationError), s = e.anyCdeConnection, c = await D(s), l = i.verificationMethod ?? "plaid";
    let u = null;
    if (l === "micro_deposit") {
      at("Micro deposit verification selected, showing form...");
      try {
        u = await pr("eft_direct_debit", {
          width: "450px",
          height: "450px",
          baseUrl: e.baseUrl
        }), at("Micro deposit data collected");
      } catch {
        throw at("Micro deposit form cancelled"), new Error("Micro deposit form cancelled");
      }
    }
    const d = await ie(s, {
      payment_provider: r.provider,
      checkout_payment_method: r,
      ...ee(a, c.checkout_settings),
      customer_language: me()
    }), _ = ot(d)?.consent_id, f = {
      type: "eft_direct_debit",
      eft_direct_debit: {
        // Plaid
        business_account: i.isBusinessAccount ?? !1,
        owner_name: ur(a[m.FIRST_NAME], a[m.LAST_NAME]),
        owner_email: a[m.EMAIL],
        // Microdeposit
        institution_number: u?.institution_number,
        transit_number: u?.transit_number,
        account_number: u?.account_number
        // mandate_version: undefined as string | undefined,
      }
    }, p = (await G(s, {
      secure_token: c.token,
      processor_specific_metadata: {
        payment_provider: r.provider,
        airwallex_consent_id: _,
        verification_method: l,
        direct_debit_data: f
      }
    })).required_user_actions?.find(
      (y) => y.type === "airwallex_payment_consent"
    )?.redirect_url;
    if (p) {
      at("EFT verification required, starting verification...");
      const { status: y } = await ke({
        url: p,
        baseUrl: e.baseUrl,
        frameWidth: "500px",
        frameHeight: "700px",
        frameTitle: "EFT verification"
      });
      if (at(`╰ EFT verification completed [Status: ${y}]`), y === M.CANCELLED)
        throw new Error("EFT verification cancelled");
      if (y === M.FAILURE)
        throw new Error("EFT verification failed");
    }
    const h = await G(s, {
      secure_token: c.token,
      processor_specific_metadata: {
        payment_provider: r.provider,
        airwallex_consent_id: _
      }
    });
    try {
      return he({
        logPrefix: "awx-eft",
        anyCdeConnection: s,
        checkoutPaymentMethod: r,
        requiredFormFields: a,
        confirmResult: h,
        usePayFirstFlow: !1
      });
    } catch (y) {
      throw Fd("EFT payment error", y), b("checkout_error", {
        error: y
      }), new Error(y?.message ?? "Unknown error");
    }
  }
), { log__: Ae, err__: qd } = R("awx-sepa"), Vd = J(
  async ({
    context: e,
    checkoutPaymentMethod: r,
    nonCdeFormInputs: t,
    formCallbacks: o,
    customParams: i
  }) => {
    const a = Z(t, o.get.onValidationError), s = e.anyCdeConnection, c = await D(s), l = i.verificationMethod ?? "truelayer";
    let u = null;
    if (l === "micro_deposit") {
      Ae("Micro deposit verification selected, showing form...");
      try {
        u = await pr("sepa_direct_debit", {
          width: "450px",
          height: "300px",
          baseUrl: e.baseUrl
        }), Ae("Micro deposit data collected");
      } catch {
        throw Ae("Micro deposit form cancelled"), new Error("Micro deposit form cancelled");
      }
    }
    const d = await ie(s, {
      payment_provider: r.provider,
      checkout_payment_method: r,
      ...ee(a, c.checkout_settings),
      customer_language: me()
    }), _ = ot(d), f = _?.consent_id, p = _?.available_banks;
    let h;
    if (l === "truelayer" && p && p.length >= 1) {
      Ae("Multiple banks available, showing bank selector...");
      try {
        h = await Yo(p, {
          width: "450px",
          height: "500px",
          title: "Select bank"
        }), Ae(`Bank selected: ${h.display_name}`);
      } catch {
        throw Ae("Bank selection cancelled"), new Error("Bank selection cancelled");
      }
    }
    const y = (await G(s, {
      secure_token: c.token,
      processor_specific_metadata: {
        payment_provider: r.provider,
        airwallex_consent_id: f,
        verification_method: l,
        direct_debit_data: {
          type: "sepa_direct_debit",
          sepa_direct_debit: {
            // truelayer
            bank_name: h?.bank_name,
            country_code: a[m.COUNTRY],
            // microdeposit
            owner_name: ur(a[m.FIRST_NAME], a[m.LAST_NAME]),
            owner_email: a[m.EMAIL],
            iban: u?.iban
          }
        }
      }
    })).required_user_actions?.find(
      (w) => w.type === "airwallex_payment_consent"
    )?.redirect_url;
    if (y) {
      Ae("SEPA verification required, starting verification...");
      const { status: w } = await ke({
        url: y,
        baseUrl: e.baseUrl,
        frameWidth: "500px",
        frameHeight: "700px",
        frameTitle: "SEPA verification"
      });
      if (Ae(`╰ SEPA verification completed [Status: ${w}]`), w === M.CANCELLED)
        throw new Error("SEPA verification cancelled");
      if (w === M.FAILURE)
        throw new Error("SEPA verification failed");
    }
    const g = await G(s, {
      secure_token: c.token,
      processor_specific_metadata: {
        payment_provider: r.provider,
        airwallex_consent_id: f
      }
    });
    try {
      return he({
        logPrefix: "awx-sepa",
        anyCdeConnection: s,
        checkoutPaymentMethod: r,
        requiredFormFields: a,
        confirmResult: g,
        usePayFirstFlow: !1
      });
    } catch (w) {
      throw qd("SEPA payment error", w), b("checkout_error", {
        error: w
      }), new Error(w?.message ?? "Unknown error");
    }
  }
), { log__: $d, err__: Qr } = R("airwallex-cc"), Hd = n.object({
  "op-airwallex-3ds-url": n.string(),
  "op-airwallex-initial-intent-id": n.string(),
  "op-airwallex-consent-id": n.string()
}), zd = (e) => {
  const r = Hd.safeParse(e);
  if (!r.success) {
    const t = "Unable to process your credit card. Please contact support for assistance.", o = `Airwallex 3DS is required but headers are malformed. Got: ${JSON.stringify(e)}`;
    throw Qr(o), new Error(t);
  }
  return r.data;
}, ei = (e) => e?.["op-airwallex-3ds-url"] !== void 0, Bd = (e) => {
  try {
    const r = new URL(e ?? "").searchParams.get("payment_intent_id");
    if (!r)
      throw new Error("No intent ID found in Airwallex 3DS verification result");
    return $d(`Airwallex 3DS verification success. [Intent ID: ${r}]`), r;
  } catch (r) {
    const t = "Error verifying Airwallex 3DS verification result.";
    throw Qr(t, `Resulting URL: ${e}.
Error: ${ne(r)}`), new Error(t);
  }
}, ti = async (e, r) => {
  const t = zd(r), o = await Ko({ url: t["op-airwallex-3ds-url"], baseUrl: e }), i = Bd(o.href ?? ""), a = t["op-airwallex-initial-intent-id"];
  if (a !== i) {
    const s = "Unable to process your credit card. Please contact support for assistance.", c = `Intent ID from callback (${i}) does not match the initial intent ID (${a}).`;
    throw Qr(c), new Error(s);
  }
  return {
    existing_cc: {
      initial_intent_id: i,
      consent_id: t["op-airwallex-consent-id"]
    }
  };
}, ri = n.object({
  provider: n.literal("apple_pay"),
  processor_name: n.literal("airwallex"),
  metadata: n.object({
    processor_account_id: n.string(),
    processor_account_name: n.string()
  })
}), ni = n.object({
  provider: n.literal("google_pay"),
  processor_name: n.literal("airwallex"),
  metadata: n.object({
    processor_account_id: n.string(),
    processor_account_name: n.string(),
    google_pay_merchant_id: n.string().nullish()
  })
}), Xr = () => Xo({
  scriptId: "__op_internal_apple_pay_sdk",
  src: "https://applepay.cdn-apple.com/jsapi/1.latest/apple-pay-sdk.js",
  checkLoadedFn: () => !!window.ApplePaySession
}), en = (e, r) => {
  const t = r.token.paymentMethod.billingContact, o = r.billingContact, i = r.shippingContact, a = { ...e };
  if (t || o || i) {
    a[m.EMAIL] = a[m.EMAIL] || t?.emailAddress || o?.emailAddress || i?.emailAddress || "op_unfilled@email.com", a[m.COUNTRY] = a[m.COUNTRY] || t?.countryCode || o?.countryCode || i?.countryCode || "US", a[m.ZIP_CODE] = a[m.ZIP_CODE] || t?.postalCode || o?.postalCode || i?.postalCode || "00000";
    const s = a[m.FIRST_NAME] || t?.givenName || o?.givenName || i?.givenName || "", c = a[m.LAST_NAME] || t?.familyName || o?.familyName || i?.familyName || "";
    s || c ? (a[m.FIRST_NAME] = s, a[m.LAST_NAME] = c) : (a[m.FIRST_NAME] = "_OP_UNKNOWN", a[m.LAST_NAME] = "");
  }
  return a;
};
n.object({
  data: n.object({
    messageHeaders: n.record(n.string(), n.any()),
    errors: n.array(n.any()),
    messageType: n.string(),
    messageBody: n.record(n.string(), n.any())
  }),
  origin: n.literal("https://applepay.cdn-apple.com")
});
const Yd = ({
  total: e,
  prefill: r
}) => {
  if (r.mode === "setup")
    return {
      paymentDescription: "Setup recurring payment",
      regularBilling: {
        amount: e.amount,
        label: "Setup recurring payment",
        paymentTiming: "recurring",
        type: "final"
      },
      // TODO: this should be billing portal url
      // https://developer.apple.com/documentation/passkit/pkrecurringpaymentrequest/managementurl#Discussion
      // This is probably used when user remove a card from their ApplePay wallet.
      // Currenty set to checkout session url to satisfy ApplePay types
      managementURL: new URL(`/pay/${r.token}`, Vo).toString()
    };
  const t = r.line_items?.[0];
  if (t)
    return {
      paymentDescription: t?.description ?? "",
      regularBilling: {
        amount: e.amount,
        label: t?.description ?? "",
        recurringPaymentIntervalUnit: t?.billing_interval,
        recurringPaymentIntervalCount: t?.billing_interval_count ?? void 0,
        paymentTiming: "recurring",
        type: "final"
      },
      managementURL: `https://cde.getopenpay.com/pay/${r.token}`
    };
}, Zd = ({
  overridePaymentRequest: e,
  initialPreview: r,
  prefill: t,
  defaultLabel: o = "Total"
}) => {
  const i = (e?.amount?.currency ?? t?.currency ?? r.currency).toUpperCase(), a = ((e?.amount?.amountAtom ?? r?.amountAtom ?? 0) / 100).toFixed(2);
  return {
    currencyCode: i,
    total: {
      label: e?.label ?? o ?? "Total",
      type: e?.pending ? "pending" : "final",
      amount: a
    }
  };
}, tn = ({
  overridePaymentRequest: e,
  initialPreview: r,
  prefill: t,
  defaultLabel: o
}) => {
  const { currencyCode: i, total: a } = Zd({
    overridePaymentRequest: e,
    initialPreview: r,
    prefill: t,
    defaultLabel: o
  });
  let s = {
    countryCode: "US",
    currencyCode: i,
    requiredBillingContactFields: ["email", "postalAddress", "name"],
    requiredShippingContactFields: [
      "email",
      ...t.checkout_settings.require_full_shipping_address ? ["postalAddress"] : []
    ],
    supportedNetworks: ["visa", "masterCard", "amex", "discover", "jcb"],
    merchantCapabilities: ["supports3DS", "supportsCredit", "supportsDebit"],
    total: a
  };
  return t.line_items.every((c) => c.billing_interval && c.billing_interval_count) && (s.recurringPaymentRequest = Yd({
    total: a,
    prefill: t
  })), e?.applePayPaymentRequest && (typeof e.applePayPaymentRequest == "function" ? s = {
    ...s,
    ...e.applePayPaymentRequest(s)
  } : s = { ...s, ...e.applePayPaymentRequest }), s;
}, Kd = n.enum(["test", "live", "live-us", "live-in", "live-apse", "live-au"]), Jd = n.enum([
  "ar",
  "bg-BG",
  "ca-ES",
  "cs-CZ",
  "da-DK",
  "de-DE",
  "el-GR",
  "en-US",
  "es-ES",
  "et-EE",
  "fi-FI",
  "fr-FR",
  "hr-HR",
  "hu-HU",
  "is-IS",
  "it-IT",
  "ja-JP",
  "ko-KR",
  "lt-LT",
  "lv-LV",
  "nl-NL",
  "no-NO",
  "pl-PL",
  "pt-BR",
  "pt-PT",
  "ro-RO",
  "ru-RU",
  "sk-SK",
  "sl-SI",
  "sv-SE",
  "zh-CN",
  "zh-TW"
]), { log__: Xe, err__: bt } = R("adyen-cc"), Wd = n.object({
  "op-account-id": n.string(),
  "op-adyen-client-key": n.string(),
  "op-adyen-environment": Kd,
  "op-adyen-action": n.string()
}), oi = "Unable to process your credit card. Please contact support for assistance.", Qd = (e) => {
  const r = Wd.safeParse(e);
  if (!r.success)
    throw bt(`Adyen 3DS is required but headers are malformed. Got: ${JSON.stringify(e)}`), new Error(oi);
  return r.data;
}, Xd = (e) => JSON.parse(e), Rn = () => "AdyenWeb" in window && "AdyenCheckout" in window.AdyenWeb, ep = async () => {
  Xe("Waiting for Adyen SDK to load...");
  for (let e = 0; e < 10; e++)
    Rn() || await sr(500);
  if (!Rn())
    throw bt("Adyen SDK not loaded properly"), new Error(oi);
  return Xe("Adyen SDK loaded successfully"), window.AdyenWeb.AdyenCheckout;
}, tp = (e) => {
  const { headers: r, locale: t, countryCode: o, component: i, host: a, cancelButton: s } = e, c = Xd(r["op-adyen-action"]);
  return Xe(`Running Adyen 3DS flow for action type: ${c.type}`), new Promise((l) => {
    const u = () => {
      Xe("Cleaning up Adyen 3DS flow"), s.removeEventListener("click", f), a.remove();
    }, d = (h) => {
      bt("Authentication failed. Result:", h), l({ status: M.FAILURE, cleanup: u });
    }, _ = (h) => {
      bt("Adyen error:", h), l({ status: M.FAILURE, cleanup: u });
    }, f = () => {
      l({ status: M.CANCELLED, cleanup: u });
    };
    s.addEventListener("click", f);
    const p = (h, y, g) => {
      a.remove(), l({ status: M.SUCCESS, additionalDetails: h, cleanup: u });
    };
    ep().then(
      (h) => h({
        clientKey: r["op-adyen-client-key"],
        environment: r["op-adyen-environment"],
        locale: t,
        countryCode: o,
        onAdditionalDetails: p,
        onPaymentFailed: d,
        onError: _
      })
    ).then((h) => {
      h.createFromAction(c, { challengeWindowSize: "03" }).mount(i);
    });
  });
}, rp = (e) => {
  const r = navigator.languages && navigator.languages.length ? navigator.languages[0] : navigator.language, t = e ?? r, o = Jd.safeParse(t);
  return o.success ? (Xe(`Resolved locale: ${o.data}`), o.data) : (bt(`Resolved invalid locale: ${t}. Defaulting to en-US.`), "en-US");
}, ii = (e) => e?.["op-adyen-action"] !== void 0, ai = async (e, r, t) => {
  const o = Qd(r), i = document.createElement("div");
  i.id = "adyen-container";
  const { host: a, iframe: s, cancelButton: c } = dr("http://example.com");
  s.replaceWith(i);
  const l = await tp({
    headers: o,
    locale: rp(t),
    countryCode: e,
    component: i,
    host: a,
    cancelButton: c
  });
  if (l.cleanup(), l.status === M.FAILURE)
    throw new Error("3DS verification failed");
  if (l.status === M.CANCELLED)
    throw new Error("3DS verification cancelled");
  if (l.status === M.SUCCESS) {
    if (!l.additionalDetails)
      throw new Error("3DS verification succeeded but no additional details were returned");
    return Xe("3DS verification succeeded"), {
      existing_cc: {
        additional_details: l.additionalDetails.data
      }
    };
  } else
    Et(l.status);
}, si = n.object({
  provider: n.literal("apple_pay"),
  processor_name: n.literal("adyen"),
  metadata: n.object({
    processor_account_id: n.string(),
    processor_account_name: n.string()
  })
}), ci = n.object({
  provider: n.literal("google_pay"),
  processor_name: n.literal("adyen"),
  metadata: n.object({
    processor_account_id: n.string(),
    processor_account_name: n.string(),
    google_pay_merchant_id: n.string().nullish()
  })
}), { log__: np } = R("awx-apple-pay");
async function op(e, r) {
  try {
    const t = (await cr(r.connection, {
      checkout_payment_method: r.checkoutPaymentMethod,
      processor_specific_metadata: {
        apple_pay_session: {
          validation_url: e.validationURL,
          initiative_context: window.location.hostname,
          their_account_id: r.processorAccount.processor_account_id
        }
      }
    })).next_action_metadata?.apple_pay_session;
    if (!t)
      throw new Error("No session data received from payment flow");
    r.session.completeMerchantValidation(t), b("apple_pay_complete_merchant_validation", {
      ...t
    });
  } catch (t) {
    throw r.session.abort(), t;
  }
}
async function ip(e, r) {
  try {
    const t = e.payment, o = en(r.nonCdeFormInputs, t), i = Z(
      o,
      r.formCallbacks.get.onValidationError,
      r.defaultFieldValues
    );
    b("billing_details_received", {
      ...i
    }), await ie(r.connection, {
      payment_provider: r.checkoutPaymentMethod.provider,
      checkout_payment_method: r.checkoutPaymentMethod,
      ...ee(i, r.prefill.checkout_settings)
    });
    const a = await G(r.connection, {
      secure_token: r.prefill.token,
      processor_specific_metadata: {
        payment_provider: r.checkoutPaymentMethod.provider,
        browser_info: ki(),
        mobile_wallet_payment_data: {
          encrypted_payment_token: JSON.stringify(t.token)
        }
      }
    });
    if (np("[1st] Confirm payment flow response", a), !a.payment_methods?.[0]?.id)
      throw new Error("No PM ID found");
    const s = {
      status: ApplePaySession.STATUS_SUCCESS
    };
    return r.session.completePayment(s), he({
      logPrefix: "adyen-applepay",
      anyCdeConnection: r.connection,
      checkoutPaymentMethod: r.checkoutPaymentMethod,
      requiredFormFields: i,
      confirmResult: a,
      usePayFirstFlow: !1
    });
  } catch (t) {
    const o = {
      status: ApplePaySession.STATUS_FAILURE
    };
    throw r.session.completePayment(o), t;
  }
}
const { log__: lt, err__: li } = R("adyen-apple-pay"), ap = Ee(
  async ({ context: e, formCallbacks: r }) => {
    const t = {
      processor: V.Enum.adyen,
      isAvailable: !1,
      isLoading: !1,
      startFlow: async () => {
      }
    }, o = K(e.checkoutPaymentMethods, si);
    if (!o)
      return t;
    if (lt("Loading Apple Pay script"), await Xr(), !window.ApplePaySession || !ApplePaySession.canMakePayments())
      return lt("Apple Pay is not available on this device/browser"), t;
    if (lt("Apple Pay Loaded"), !await ApplePaySession.canMakePayments())
      return lt("No active cards available for Apple Pay"), t;
    if (!o.metadata.processor_account_id)
      throw new Error("No gateway merchant ID found in processor account");
    const i = e.anyCdeConnection, a = await D(i), s = a.mode === "setup", c = await Se(i, a.token, s, void 0), l = async (u) => {
      try {
        await j.adyenApplePay.run({
          context: e,
          checkoutPaymentMethod: o,
          nonCdeFormInputs: $(e.formDiv),
          formCallbacks: r,
          customParams: {
            ...u,
            initialPreview: c
          },
          initResult: void 0
        });
      } catch (d) {
        li("Apple Pay payment error", d), r.get.onCheckoutError(d?.message ?? "Unknown error");
      }
    };
    return {
      processor: V.Enum.adyen,
      isAvailable: !0,
      isLoading: !1,
      startFlow: l
    };
  }
), sp = J(
  async ({
    context: e,
    checkoutPaymentMethod: r,
    nonCdeFormInputs: t,
    customParams: o,
    formCallbacks: i
  }) => {
    const a = K(e.checkoutPaymentMethods, si), { overridePaymentRequest: s, initialPreview: c } = o, l = e.anyCdeConnection, u = await D(l), d = u.mode === "setup", _ = tn({
      overridePaymentRequest: s,
      initialPreview: c,
      prefill: {
        ...u
      },
      defaultLabel: a?.metadata?.processor_account_name
    }), f = new ApplePaySession(3, _), p = {
      session: f,
      connection: e.anyCdeConnection,
      checkoutPaymentMethod: r,
      nonCdeFormInputs: t,
      processorAccount: a.metadata,
      prefill: u,
      isSetupMode: d,
      baseUrl: e.baseUrl,
      formCallbacks: i,
      defaultFieldValues: o?.defaultFieldValues
    };
    return b("apple_pay_flow_started", {
      processor_name: r.processor_name,
      prefill: ir(u, ["brand"]),
      overridePaymentRequest: s
    }), new Promise((h, y) => {
      const g = () => {
        lt("Payment cancelled by user"), y(new Error("Payment cancelled by user"));
      };
      f.onvalidatemerchant = async (w) => {
        try {
          await op(w, p);
        } catch (E) {
          y(E);
        }
      }, f.onpaymentmethodselected = () => {
        const w = {
          newTotal: { ..._.total }
        };
        f.completePaymentMethodSelection(w);
      }, f.onpaymentauthorized = async (w) => {
        b("apple_pay_payment_authorized");
        try {
          const E = await ip(w, p);
          h(E);
        } catch (E) {
          y(E);
        }
      }, f.oncancel = g, f.begin();
    }).catch((h) => {
      throw li("Apple Pay payment error", h), b("apple_pay_payment_error", {
        error: h
      }), h;
    });
  }
), { log__: le, err__: Ge } = R("adyen-google-pay"), cp = Ee(
  async ({ context: e, formCallbacks: r }) => {
    const t = {
      processor: V.Enum.adyen,
      isAvailable: !1,
      isLoading: !1,
      startFlow: async () => {
      }
    }, o = K(e.checkoutPaymentMethods, ci);
    if (!o)
      return t;
    le("Google Pay CPM", o);
    const i = o.metadata;
    if (!i.processor_account_id)
      return Ge("No gateway merchant ID found in processor account"), t;
    if (le("Loading Google Pay script"), await Kr(), !window.google?.payments?.api)
      return Ge("Google Pay SDK not loaded properly"), t;
    if (await Jr(e.baseUrl) === "PRODUCTION" && !i.google_pay_merchant_id)
      return Ge("Google Pay merchant ID is required for production environment"), t;
    le("Google Pay SDK loaded", window.google.payments);
    const a = e.anyCdeConnection, s = await D(a);
    try {
      const d = rt({
        prefill: s,
        gateway: "airwallex",
        gatewayMerchantId: i.processor_account_id,
        merchantName: i.processor_account_name,
        merchantId: i.google_pay_merchant_id ?? "",
        // This is for initial payment request to check availability. Actual `initialPreview` will be used when the UI is shown
        initialPreview: {
          amountAtom: 0,
          currency: "USD"
        }
      }), _ = await nt(e.baseUrl, d), { result: f } = await _.isReadyToPay(d);
      if (!f)
        return le("Google Pay is not available for this user"), t;
    } catch (d) {
      return Ge("Error checking Google Pay availability", d), t;
    }
    const c = s.mode === "setup", l = await Se(a, s.token, c, void 0), u = async (d) => {
      try {
        j.adyenGooglePay.run({
          context: e,
          checkoutPaymentMethod: o,
          nonCdeFormInputs: $(e.formDiv),
          formCallbacks: r,
          initResult: void 0,
          customParams: {
            ...d,
            initialPreview: l
          }
        });
      } catch (_) {
        Ge("Google Pay payment error", _), r.get.onCheckoutError(_?.message ?? "Unknown error");
      }
    };
    return {
      processor: V.Enum.adyen,
      isAvailable: !0,
      isLoading: !1,
      startFlow: u
    };
  }
), lp = J(
  async ({
    context: e,
    checkoutPaymentMethod: r,
    nonCdeFormInputs: t,
    formCallbacks: o,
    customParams: i
  }) => {
    le("Starting Google Pay flow...");
    const a = K(e.checkoutPaymentMethods, ci), { initialPreview: s, overridePaymentRequest: c } = i, l = a.metadata;
    if (!l.processor_account_id)
      throw new Error("No gateway merchant ID found in processor account");
    const u = e.anyCdeConnection, d = await D(u), _ = rt({
      prefill: d,
      gateway: "adyen",
      gatewayMerchantId: l.processor_account_id,
      merchantName: l.processor_account_name,
      merchantId: l.google_pay_merchant_id ?? "",
      initialPreview: s,
      overridePaymentRequest: c
    });
    b("google_pay_flow_started", {
      processor_name: a.processor_name,
      prefill: ir(d, ["brand"]),
      overridePaymentRequest: c
    });
    const f = await nt(e.baseUrl, _);
    try {
      const p = await f.loadPaymentData(_);
      le("Google Pay Payment data", p);
      const h = Wr(t, p), y = Z(
        h,
        o.get.onValidationError,
        i?.defaultFieldValues
      );
      if (b("billing_details_received", {
        ...y
      }), !p.paymentMethodData?.tokenizationData?.token)
        throw new Error("No payment token received from Google Pay");
      const g = await ie(u, {
        payment_provider: r.provider,
        checkout_payment_method: r,
        ...ee(y, d.checkout_settings)
      }), w = ot(g);
      le("Start flow next actions", w);
      let E = await G(u, {
        secure_token: d.token,
        processor_specific_metadata: {
          payment_provider: r.provider,
          browser_info: ki(),
          mobile_wallet_payment_data: {
            encrypted_payment_token: p.paymentMethodData?.tokenizationData?.token
          }
        }
      });
      le("[1st] Confirm payment flow response", E);
      let I = E.payment_methods?.[0]?.id;
      const A = E.required_user_actions?.find((C) => C.type === "adyen-3ds");
      if (A && A.redirect_url) {
        le("Adyen 3DS Required, starting verification...", A);
        const { status: C } = await ke({
          url: A.redirect_url,
          baseUrl: e.baseUrl
        });
        if (le(`╰ Adyen 3DS verification completed [Status: ${C}]`), C === M.CANCELLED)
          throw new Error("3DS verification cancelled");
        if (C === M.FAILURE)
          throw new Error("3DS verification failed");
      }
      if (A && !I && (E = await G(u, {
        secure_token: d.token,
        their_pm_id: A.their_pm_id,
        processor_specific_metadata: {
          payment_provider: r.provider
        }
      }), le("[2nd] Confirm payment flow response after 3DS", E), I = E.payment_methods?.[0]?.id), !I)
        throw new Error("No payment method ID found");
      return he({
        logPrefix: "adyen-googlepay",
        anyCdeConnection: u,
        checkoutPaymentMethod: r,
        requiredFormFields: y,
        confirmResult: E,
        usePayFirstFlow: !1
      });
    } catch (p) {
      throw Ge("Google Pay payment error", p), b("google_pay_payment_error", {
        error: p
      }), new Error(p?.message ?? "Unknown error");
    }
  }
), { log__: st, err__: up } = R("awx-ach"), dp = J(
  async ({
    context: e,
    checkoutPaymentMethod: r,
    nonCdeFormInputs: t,
    formCallbacks: o,
    customParams: i
  }) => {
    const a = Z(t, o.get.onValidationError), s = e.anyCdeConnection, c = await D(s), l = i.verificationMethod ?? "plaid";
    let u = null;
    if (l === "micro_deposit") {
      st("Micro deposit verification selected, showing form...");
      try {
        u = await pr("ach_direct_debit", {
          width: "450px",
          height: "400px",
          baseUrl: e.baseUrl
        }), st("Micro deposit data collected");
      } catch {
        throw st("Micro deposit form cancelled"), new Error("Micro deposit form cancelled");
      }
    }
    const d = await ie(s, {
      payment_provider: r.provider,
      checkout_payment_method: r,
      ...ee(a, c.checkout_settings),
      customer_language: me()
    }), _ = ot(d)?.consent_id, f = (await G(s, {
      secure_token: c.token,
      processor_specific_metadata: {
        payment_provider: r.provider,
        airwallex_consent_id: _,
        verification_method: l,
        direct_debit_data: {
          type: "ach_direct_debit",
          ach_direct_debit: {
            //plaid verification required fields
            business_account: i.isBusinessAccount ?? !1,
            owner_name: ur(a[m.FIRST_NAME], a[m.LAST_NAME]),
            owner_email: a[m.EMAIL],
            //ACH micro deposit verification required fields
            account_number: u?.account_number,
            aba_routing_number: u?.aba_routing_number
            // mandate_version: '1.0',
          }
        }
      }
    })).required_user_actions?.find(
      (h) => h.type === "airwallex_payment_consent"
    )?.redirect_url;
    if (f) {
      st("Plaid verification Required, starting verification...");
      const { status: h } = await ke({
        url: f,
        baseUrl: e.baseUrl,
        frameWidth: "500px",
        frameHeight: "700px",
        frameTitle: "ACH verification"
      });
      if (st(`╰ Plaid verification completed [Status: ${h}]`), h === M.CANCELLED)
        throw new Error("Plaid verification cancelled");
      if (h === M.FAILURE)
        throw new Error("Plaid verification failed");
    }
    const p = await G(s, {
      secure_token: c.token,
      processor_specific_metadata: {
        payment_provider: r.provider,
        airwallex_consent_id: _
      }
    });
    try {
      return he({
        logPrefix: "awx-ach",
        anyCdeConnection: s,
        checkoutPaymentMethod: r,
        requiredFormFields: a,
        confirmResult: p,
        usePayFirstFlow: !1
      });
    } catch (h) {
      throw up("ACH payment error", h), b("checkout_error", {
        error: h
      }), new Error(h?.message ?? "Unknown error");
    }
  }
), { log__: jt } = R("awx-apple-pay");
async function pp(e, r) {
  try {
    const t = (await cr(r.connection, {
      checkout_payment_method: r.checkoutPaymentMethod,
      processor_specific_metadata: {
        airwallex_payment_session: {
          validation_url: e.validationURL,
          initiative_context: window.location.hostname,
          their_account_id: r.processorAccount.processor_account_id
        }
      }
    })).next_action_metadata?.apple_pay_session;
    if (!t)
      throw new Error("No session data received from payment flow");
    r.session.completeMerchantValidation(t), b("apple_pay_complete_merchant_validation", {
      ...t
    });
  } catch (t) {
    throw r.session.abort(), t;
  }
}
async function mp(e, r) {
  if (!e.redirect_url)
    throw new Error("No redirect URL found");
  jt("3DS Required, starting verification...", e);
  const { status: t } = await ke({
    url: e.redirect_url,
    baseUrl: r.baseUrl
  });
  if (jt(`╰ 3DS verification completed [Status: ${t}]`), t === M.CANCELLED)
    throw new Error("3DS verification cancelled");
  if (t === M.FAILURE)
    throw new Error("3DS verification failed");
  const o = await G(r.connection, {
    secure_token: r.prefill.token,
    processor_specific_metadata: {
      their_pm_id: e.their_pm_id,
      airwallex_consent_id: e.consent_id,
      payment_provider: r.checkoutPaymentMethod.provider
    }
  });
  return jt("[2nd] Confirm payment flow response", o), o;
}
async function hp(e, r) {
  try {
    const t = e.payment, o = en(r.nonCdeFormInputs, t), i = Z(
      o,
      r.formCallbacks.get.onValidationError,
      r.defaultFieldValues
    );
    b("billing_details_received", {
      ...i
    });
    const a = (await ie(r.connection, {
      payment_provider: r.checkoutPaymentMethod.provider,
      checkout_payment_method: r.checkoutPaymentMethod,
      ...ee(i, r.prefill.checkout_settings),
      customer_language: me()
    })).required_user_actions[0].consent_id;
    if (!a)
      throw new Error("No consent ID received from payment flow");
    let s = await G(r.connection, {
      secure_token: r.prefill.token,
      processor_specific_metadata: {
        payment_provider: r.checkoutPaymentMethod.provider,
        airwallex_consent_id: a,
        airwallex_payment_method_data: {
          type: "applepay",
          applepay: {
            payment_data_type: "encrypted_payment_token",
            encrypted_payment_token: JSON.stringify(t.token)
          }
        }
      }
    });
    jt("[1st] Confirm payment flow response", s);
    let c = s.payment_methods?.[0]?.id;
    const l = s.required_user_actions?.find(
      (d) => d.type === "airwallex_payment_consent"
    );
    if (l?.redirect_url && l.consent_id && l.their_pm_id && (s = await mp(l, r), c = s.payment_methods?.[0]?.id), !c)
      throw new Error("No PM ID found");
    const u = {
      status: ApplePaySession.STATUS_SUCCESS
    };
    return r.session.completePayment(u), he({
      logPrefix: "awx-applepay",
      anyCdeConnection: r.connection,
      checkoutPaymentMethod: r.checkoutPaymentMethod,
      requiredFormFields: i,
      confirmResult: s,
      usePayFirstFlow: !1
    });
  } catch (t) {
    const o = {
      status: ApplePaySession.STATUS_FAILURE
    };
    throw r.session.completePayment(o), t;
  }
}
const { log__: ut, err__: ui } = R("awx-apple-pay"), fp = Ee(
  async ({ context: e, formCallbacks: r }) => {
    const t = {
      processor: V.Enum.airwallex,
      isAvailable: !1,
      isLoading: !1,
      startFlow: async () => {
      }
    }, o = K(e.checkoutPaymentMethods, ri);
    if (!o)
      return t;
    if (ut("Loading Apple Pay script"), await Xr(), !window.ApplePaySession || !ApplePaySession.canMakePayments())
      return ut("Apple Pay is not available on this device/browser"), t;
    if (ut("Apple Pay Loaded"), !await ApplePaySession.canMakePayments())
      return ut("No active cards available for Apple Pay"), t;
    if (!o.metadata.processor_account_id)
      throw new Error("No gateway merchant ID found in processor account");
    const i = e.anyCdeConnection, a = await D(i), s = a.mode === "setup", c = await Se(i, a.token, s, void 0), l = async (u) => {
      try {
        await j.airwallexApplePay.run({
          context: e,
          checkoutPaymentMethod: o,
          nonCdeFormInputs: $(e.formDiv),
          formCallbacks: r,
          customParams: {
            ...u,
            initialPreview: c
          },
          initResult: void 0
        });
      } catch (d) {
        ui("Apple Pay payment error", d), r.get.onCheckoutError(d?.message ?? "Unknown error");
      }
    };
    return {
      processor: V.Enum.airwallex,
      isAvailable: !0,
      isLoading: !1,
      startFlow: l
    };
  }
), _p = J(
  async ({
    context: e,
    checkoutPaymentMethod: r,
    nonCdeFormInputs: t,
    customParams: o,
    formCallbacks: i
  }) => {
    const a = K(e.checkoutPaymentMethods, ri), { overridePaymentRequest: s, initialPreview: c } = o, l = e.anyCdeConnection, u = await D(l), d = u.mode === "setup", _ = tn({
      overridePaymentRequest: s,
      initialPreview: c,
      prefill: {
        ...u
      },
      defaultLabel: a?.metadata?.processor_account_name
    }), f = new ApplePaySession(3, _), p = {
      session: f,
      connection: e.anyCdeConnection,
      checkoutPaymentMethod: r,
      nonCdeFormInputs: t,
      processorAccount: a.metadata,
      prefill: u,
      isSetupMode: d,
      baseUrl: e.baseUrl,
      formCallbacks: i,
      defaultFieldValues: o?.defaultFieldValues
    };
    return b("apple_pay_flow_started", {
      processor_name: r.processor_name,
      prefill: ir(u, ["brand"]),
      overridePaymentRequest: s
    }), new Promise((h, y) => {
      const g = () => {
        ut("Payment cancelled by user"), y(new Error("Payment cancelled by user"));
      };
      f.oncancel = g, f.onvalidatemerchant = async (w) => {
        try {
          await pp(w, p);
        } catch (E) {
          y(E);
        }
      }, f.onpaymentmethodselected = () => {
        const w = {
          newTotal: { ..._.total }
        };
        f.completePaymentMethodSelection(w);
      }, f.onpaymentauthorized = async (w) => {
        b("apple_pay_payment_authorized");
        try {
          const E = await hp(w, p);
          h(E);
        } catch (E) {
          y(E);
        }
      }, f.begin();
    }).catch((h) => {
      throw ui("Apple Pay payment error", h), b("apple_pay_payment_error", {
        error: h
      }), h;
    });
  }
), { log__: oe, err__: qe } = R("awx-google-pay"), yp = Ee(
  async ({ context: e, formCallbacks: r }) => {
    const t = {
      processor: V.Enum.airwallex,
      isAvailable: !1,
      isLoading: !1,
      startFlow: async () => {
      }
    }, o = K(e.checkoutPaymentMethods, ni);
    if (!o)
      return t;
    oe("Google Pay CPM", o);
    const i = o.metadata;
    if (!i.processor_account_id)
      return qe("No gateway merchant ID found in processor account"), t;
    if (oe("Loading Google Pay script"), await Kr(), !window.google?.payments?.api)
      return qe("Google Pay SDK not loaded properly"), t;
    if (await Jr(e.baseUrl) === "PRODUCTION" && !i.google_pay_merchant_id)
      return qe("Google Pay merchant ID is required for production environment"), t;
    oe("Google Pay SDK loaded", window.google.payments);
    const a = e.anyCdeConnection, s = await D(a);
    try {
      const d = rt({
        prefill: s,
        gateway: "airwallex",
        gatewayMerchantId: i.processor_account_id,
        merchantName: i.processor_account_name,
        merchantId: i.google_pay_merchant_id ?? "",
        // This is for initial payment request to check availability. Actual `initialPreview` will be used when the UI is shown
        initialPreview: {
          amountAtom: 0,
          currency: "USD"
        }
      }), _ = await nt(e.baseUrl, d), { result: f } = await _.isReadyToPay(d);
      if (!f)
        return oe("Google Pay is not available for this user"), t;
    } catch (d) {
      return qe("Error checking Google Pay availability", d), t;
    }
    const c = s.mode === "setup", l = await Se(a, s.token, c, void 0), u = async (d) => {
      try {
        j.airwallexGooglePay.run({
          context: e,
          checkoutPaymentMethod: o,
          nonCdeFormInputs: $(e.formDiv),
          formCallbacks: r,
          initResult: void 0,
          customParams: {
            ...d,
            initialPreview: l
          }
        });
      } catch (_) {
        qe("Google Pay payment error", _), r.get.onCheckoutError(_?.message ?? "Unknown error");
      }
    };
    return {
      processor: V.Enum.airwallex,
      isAvailable: !0,
      isLoading: !1,
      startFlow: u
    };
  }
), gp = J(
  async ({
    context: e,
    checkoutPaymentMethod: r,
    nonCdeFormInputs: t,
    formCallbacks: o,
    customParams: i
  }) => {
    oe("Starting Google Pay flow...");
    const a = K(e.checkoutPaymentMethods, ni), { initialPreview: s, overridePaymentRequest: c } = i, l = a.metadata;
    if (!l.processor_account_id)
      throw new Error("No gateway merchant ID found in processor account");
    const u = e.anyCdeConnection, d = await D(u), _ = rt({
      prefill: d,
      gateway: "airwallex",
      gatewayMerchantId: l.processor_account_id,
      merchantName: l.processor_account_name,
      merchantId: l.google_pay_merchant_id ?? "",
      initialPreview: s,
      overridePaymentRequest: c
    });
    b("google_pay_flow_started", {
      processor_name: a.processor_name,
      prefill: ir(d, ["brand"]),
      overridePaymentRequest: c
    });
    const f = await nt(e.baseUrl, _);
    try {
      const p = await f.loadPaymentData(_);
      oe("Google Pay Payment data", p);
      const h = Wr(t, p), y = Z(
        h,
        o.get.onValidationError,
        i?.defaultFieldValues
      );
      oe("___", y), b("billing_details_received", {
        ...y
      });
      const g = p.paymentMethodData?.tokenizationData?.token;
      if (!g)
        throw new Error("No payment token received from Google Pay");
      const w = await ie(u, {
        payment_provider: r.provider,
        checkout_payment_method: r,
        ...ee(y, d.checkout_settings),
        customer_language: me()
      }), E = ot(w);
      oe("Start flow next actions", E);
      let I = await G(u, {
        secure_token: d.token,
        processor_specific_metadata: {
          payment_provider: r.provider,
          // GooglePay's encrypted_payment_token provided to verify the consent first
          airwallex_consent_id: E?.consent_id,
          airwallex_payment_method_data: {
            type: "googlepay",
            googlepay: {
              payment_data_type: "encrypted_payment_token",
              encrypted_payment_token: g
            }
          }
        }
      });
      oe("[1st] Confirm payment flow response", I);
      let A = I.payment_methods?.[0]?.id;
      const C = I.required_user_actions?.find(
        (q) => q.type === "airwallex_payment_consent"
      );
      if (C && C.redirect_url) {
        oe("3DS Required, starting verification...", C);
        const { status: q } = await ke({
          url: C.redirect_url,
          baseUrl: e.baseUrl
        });
        if (oe(`╰ 3DS verification completed [Status: ${q}]`), q === M.CANCELLED)
          throw new Error("3DS verification cancelled");
        if (q === M.FAILURE)
          throw new Error("3DS verification failed");
      }
      if (C && !A && (I = await G(u, {
        secure_token: d.token,
        their_pm_id: C.their_pm_id,
        processor_specific_metadata: {
          payment_provider: r.provider,
          airwallex_consent_id: C.consent_id
        }
      }), oe("[2nd] Confirm payment flow response", I), A = I.payment_methods?.[0]?.id), !A)
        throw new Error("No PM ID found");
      return he({
        logPrefix: "awx-googlepay",
        anyCdeConnection: u,
        checkoutPaymentMethod: r,
        requiredFormFields: y,
        confirmResult: I,
        usePayFirstFlow: !1
      });
    } catch (p) {
      throw qe("Google Pay payment error", p), b("google_pay_payment_error", {
        error: p
      }), new Error(p?.message ?? "Unknown error");
    }
  }
), di = n.object({
  provider: n.literal("apple_pay"),
  processor_name: n.literal("authorize_net"),
  metadata: n.object({
    processor_account_id: n.string(),
    processor_account_name: n.string()
  })
}), pi = n.object({
  provider: n.literal("google_pay"),
  processor_name: n.literal("authorize_net"),
  metadata: n.object({
    processor_account_id: n.string(),
    processor_account_name: n.string(),
    google_pay_merchant_id: n.string().nullish()
  })
});
async function bp(e, r) {
  try {
    const t = (await cr(r.connection, {
      checkout_payment_method: r.checkoutPaymentMethod,
      processor_specific_metadata: {
        apple_payment_session: {
          validation_url: e.validationURL,
          initiative_context: window.location.hostname,
          their_account_id: r.processorAccount.processor_account_id
        }
      }
    })).next_action_metadata?.apple_pay_session;
    if (!t)
      throw new Error("No session data received from payment flow");
    r.session.completeMerchantValidation(t), b("apple_pay_complete_merchant_validation", {
      ...t
    });
  } catch (t) {
    throw r.session.abort(), t;
  }
}
async function wp(e, r) {
  try {
    const t = e.payment, o = en(r.nonCdeFormInputs, t), i = Z(o, r.formCallbacks.get.onValidationError);
    b("billing_details_received", {
      ...i
    }), await ie(r.connection, {
      payment_provider: r.checkoutPaymentMethod.provider,
      checkout_payment_method: r.checkoutPaymentMethod,
      ...ee(i, r.prefill.checkout_settings),
      customer_language: me()
    });
    const a = {
      dataDescriptor: "COMMON.APPLE.INAPP.PAYMENT",
      dataValue: window.btoa(JSON.stringify(t.token.paymentData))
    }, s = await G(r.connection, {
      secure_token: r.prefill.token,
      processor_specific_metadata: {
        payment_provider: r.checkoutPaymentMethod.provider,
        mobile_wallet_payment_data: a
      }
    });
    if (!s.payment_methods?.[0]?.id)
      throw new Error("No PM ID found");
    const c = {
      status: ApplePaySession.STATUS_SUCCESS
    };
    return r.session.completePayment(c), he({
      logPrefix: "authnet-applepay",
      anyCdeConnection: r.connection,
      checkoutPaymentMethod: r.checkoutPaymentMethod,
      requiredFormFields: i,
      confirmResult: s,
      usePayFirstFlow: !1
    });
  } catch (t) {
    const o = {
      status: ApplePaySession.STATUS_FAILURE
    };
    throw r.session.completePayment(o), t;
  }
}
const { log__: Ot, err__: mi } = R("authnet-applepay"), vp = Ee(
  async ({ context: e, formCallbacks: r }) => {
    const t = {
      processor: V.Enum.authorize_net,
      isAvailable: !1,
      isLoading: !1,
      startFlow: async () => {
      }
    }, o = K(e.checkoutPaymentMethods, di);
    if (!o)
      return t;
    if (Ot("Loading Apple Pay script"), await Xr(), !window.ApplePaySession || !ApplePaySession.canMakePayments())
      return Ot("Apple Pay is not available on this device/browser"), t;
    if (!await ApplePaySession.canMakePayments())
      return Ot("No active cards available for Apple Pay"), t;
    if (!o.metadata.processor_account_id)
      throw new Error("No gateway merchant ID found in processor account");
    const i = e.anyCdeConnection, a = await D(i), s = a.mode === "setup", c = await Se(i, a.token, s, void 0), l = async (u) => {
      try {
        await j.authorizeNetApplePay.run({
          context: e,
          checkoutPaymentMethod: o,
          nonCdeFormInputs: $(e.formDiv),
          formCallbacks: r,
          customParams: {
            ...u,
            initialPreview: c
          },
          initResult: void 0
        });
      } catch (d) {
        mi("Apple Pay payment error", d), b("apple_pay_payment_error", {
          error: d
        }), r.get.onCheckoutError(d?.message ?? "Unknown error");
      }
    };
    return {
      processor: V.Enum.authorize_net,
      isAvailable: !0,
      isLoading: !1,
      startFlow: l
    };
  }
), Pp = J(
  async ({
    context: e,
    checkoutPaymentMethod: r,
    nonCdeFormInputs: t,
    customParams: o,
    formCallbacks: i
  }) => {
    const { initialPreview: a, overridePaymentRequest: s } = o, c = K(e.checkoutPaymentMethods, di), l = e.anyCdeConnection, u = await D(l), d = u.mode === "setup", _ = tn({
      overridePaymentRequest: s,
      initialPreview: a,
      prefill: u,
      defaultLabel: c?.metadata?.processor_account_name
    });
    b("apple_pay_flow_started", {
      processor_name: r.processor_name,
      prefill: u,
      overridePaymentRequest: s
    });
    const f = new ApplePaySession(3, _), p = {
      session: f,
      connection: e.anyCdeConnection,
      checkoutPaymentMethod: r,
      nonCdeFormInputs: t,
      processorAccount: r.metadata,
      prefill: u,
      isSetupMode: d,
      baseUrl: e.baseUrl,
      formCallbacks: i
    };
    return new Promise((h, y) => {
      f.oncancel = () => {
        Ot("Payment cancelled by user"), y(new Error("Payment cancelled by user"));
      }, f.onvalidatemerchant = async (g) => {
        try {
          await bp(g, p);
        } catch (w) {
          y(w);
        }
      }, f.onpaymentmethodselected = () => {
        const g = {
          newTotal: _.total
        };
        f.completePaymentMethodSelection(g);
      }, f.onpaymentauthorized = async (g) => {
        b("apple_pay_payment_authorized");
        try {
          const w = await wp(g, p);
          h(w);
        } catch (w) {
          y(w);
        }
      }, f.begin();
    }).catch((h) => {
      throw mi("Apple Pay payment error", h), b("apple_pay_payment_error", {
        error: h
      }), h;
    });
  }
), { log__: je, err__: dt } = R("authnet-googlepay"), Ep = Ee(
  async ({ context: e, formCallbacks: r }) => {
    je("Initializing Authnet GooglePay flow");
    const t = {
      processor: V.Enum.authorize_net,
      isAvailable: !1,
      isLoading: !1,
      startFlow: async () => {
      }
    }, o = K(e.checkoutPaymentMethods, pi);
    if (!o)
      return t;
    je("Google Pay CPM", o);
    const i = o.metadata;
    if (!i.processor_account_id)
      return dt("No gateway merchant ID found in processor account"), t;
    if (je("Loading Google Pay script"), await Kr(), !window.google?.payments?.api)
      return dt("Google Pay SDK not loaded properly"), t;
    je("Google Pay SDK loaded", window.google.payments);
    const a = e.anyCdeConnection, s = await D(a);
    try {
      const d = rt({
        prefill: s,
        gateway: "authorizenet",
        gatewayMerchantId: i.processor_account_id,
        merchantName: i.processor_account_name,
        merchantId: i.google_pay_merchant_id ?? "",
        // This is for initial payment request to check availability. Actual `initialPreview` will be used when the UI is shown
        initialPreview: {
          amountAtom: 0,
          currency: "USD"
        }
      }), _ = await nt(e.baseUrl, d), { result: f } = await _.isReadyToPay(d);
      if (!f)
        return je("Google Pay is not available for this user"), t;
    } catch (d) {
      return dt("Error checking Google Pay availability", d), t;
    }
    const c = s.mode === "setup", l = await Se(a, s.token, c, void 0), u = async (d) => {
      try {
        j.authorizeNetGooglePay.run({
          context: e,
          checkoutPaymentMethod: o,
          nonCdeFormInputs: $(e.formDiv),
          formCallbacks: r,
          initResult: void 0,
          customParams: {
            ...d,
            initialPreview: l
          }
        });
      } catch (_) {
        dt("Google Pay payment error", _), b("google_pay_payment_error", {
          error: _
        }), r.get.onCheckoutError(_?.message ?? "Unknown error");
      }
    };
    return {
      processor: V.Enum.authorize_net,
      isAvailable: !0,
      isLoading: !1,
      startFlow: u
    };
  }
), Sp = J(
  async ({
    context: e,
    nonCdeFormInputs: r,
    checkoutPaymentMethod: t,
    formCallbacks: o,
    customParams: i
  }) => {
    const { initialPreview: a, overridePaymentRequest: s } = i, c = K(e.checkoutPaymentMethods, pi).metadata, l = e.anyCdeConnection, u = await D(l), d = rt({
      prefill: u,
      gateway: "authorizenet",
      gatewayMerchantId: c.processor_account_id,
      merchantName: c.processor_account_name,
      merchantId: c.google_pay_merchant_id ?? "",
      initialPreview: a,
      overridePaymentRequest: s
    });
    b("google_pay_flow_started", {
      processor_name: t.processor_name,
      prefill: u,
      overridePaymentRequest: s
    });
    const _ = await nt(e.baseUrl, d);
    try {
      const f = await _.loadPaymentData(d);
      je("Google Pay Payment data", f);
      const p = Wr(r, f), h = Z(p, o.get.onValidationError);
      b("billing_details_received", {
        ...h
      });
      const y = f.paymentMethodData?.tokenizationData?.token;
      if (!y)
        throw new Error("No payment token received from Google Pay");
      const g = await ie(l, {
        payment_provider: t.provider,
        checkout_payment_method: t,
        ...ee(h, u.checkout_settings),
        customer_language: me()
      });
      je("Start payment flow response", g);
      const w = await G(l, {
        secure_token: u.token,
        processor_specific_metadata: {
          payment_provider: t.provider,
          mobile_wallet_payment_data: {
            dataDescriptor: "COMMON.GOOGLE.INAPP.PAYMENT",
            dataValue: window.btoa(y)
          }
        }
      });
      if (!w.payment_methods?.[0]?.id)
        throw new Error("No PM ID found");
      return he({
        logPrefix: "authnet-googlepay",
        anyCdeConnection: l,
        checkoutPaymentMethod: t,
        requiredFormFields: h,
        confirmResult: w,
        usePayFirstFlow: !1
      });
    } catch (f) {
      throw dt("Google Pay payment error", f), b("google_pay_payment_error", {
        error: f
      }), new Error(f?.message ?? "Unknown error");
    }
  }
), { log__: Rt, err__: kp } = R("cybs-frame"), Cp = (e, r) => {
  const t = document.createElement("iframe");
  t.name = "cardinal_collection_iframe", t.style.display = "none", t.style.width = "10px", t.style.height = "10px";
  const o = document.createElement("form");
  o.action = e, o.method = "POST", o.target = t.name;
  const i = document.createElement("input");
  return i.type = "hidden", i.name = "JWT", i.value = r, o.appendChild(i), document.body.appendChild(t), document.body.appendChild(o), { form: o, detach: () => {
    document.body.removeChild(t), document.body.removeChild(o);
  } };
}, Ip = async (e) => new Promise((r, t) => {
  const { postUrl: o, accessToken: i } = e, a = new URL(o).origin, { form: s, detach: c } = Cp(o, i);
  Rt("Attached device data collector");
  const l = (d) => {
    if (d.origin !== a)
      return;
    const _ = JSON.parse(d.data);
    if (Rt("Received event from device data collector:", _), _.MessageType === "profile.completed") {
      r(_), u();
      return;
    }
  }, u = () => {
    c(), window.removeEventListener("message", l);
  };
  try {
    window.addEventListener("message", l), Rt("Attached listener to window"), s.submit(), Rt("Submitted form");
  } catch (d) {
    kp("Error submitting form:", d), u(), t(d);
  }
}), Ap = (e) => {
  const { stepUpUrl: r, accessToken: t, merchantData: o, iframe: i, host: a } = e, s = document.createElement("form");
  s.action = r, s.method = "POST", s.target = i.name;
  const c = document.createElement("input");
  c.type = "hidden", c.name = "JWT", c.value = t;
  const l = document.createElement("input");
  return l.type = "hidden", l.name = "MD", l.value = o, s.appendChild(c), s.appendChild(l), a.appendChild(s), s;
}, { log__: Ye, err__: hi } = R("cybs"), fi = n.object({
  step_up_url: n.string(),
  access_token: n.string(),
  dd_url: F(n.string()),
  dd_token: F(n.string()),
  merchant_data: n.string()
}), xp = "Unable to process your credit card. Please contact support for assistance.", Tp = (e) => {
  const r = fi.safeParse(e);
  if (!r.success)
    throw hi(`Cybersource 3DS is required but user action is malformed. Got: ${JSON.stringify(e)}`), new Error(xp);
  return r.data;
}, Rp = (e) => e.type === "cybersource_payer_auth", Np = async (e) => {
  const { stepUpUrl: r, accessToken: t, merchantData: o, iframe: i, host: a, cancelButton: s } = e, c = new URL(r).origin;
  return new Promise((l) => {
    const u = () => {
      Ye("Cleaning up Cybersource 3DS flow"), s.removeEventListener("click", d), a.remove();
    }, d = () => {
      Ye("Cybersource 3DS cancelled"), l({ status: M.CANCELLED, cleanup: u });
    }, _ = Zr(i, (p) => {
      Ye("Cybersource 3DS completed with status:", p), l({ status: p.status, cleanup: u }), f();
    }, c, "ping-3ds-status", uo), f = Zo({
      elements: { host: a, cancelButton: s },
      pollingInterval: _,
      resolve: (p) => {
        l({ status: p.status, cleanup: u });
      }
    });
    s.addEventListener("click", d), Ap({
      stepUpUrl: r,
      accessToken: t,
      merchantData: o,
      iframe: i,
      host: a
    }).submit();
  });
}, _i = async (e) => {
  const r = Tp(e), { step_up_url: t, access_token: o, dd_url: i, dd_token: a, merchant_data: s } = r;
  if (i && a) {
    const _ = await Ip({
      postUrl: i,
      accessToken: a
    });
    Ye("Device data collection completed with status:", _.Status);
  } else
    hi("No device data collection URL or token provided");
  const { host: c, iframe: l, cancelButton: u } = dr("", { name: "cardinal_auth_iframe" });
  Ye("Running Cybersource 3DS flow");
  const d = await Np({
    stepUpUrl: t,
    accessToken: o,
    merchantData: s,
    iframe: l,
    host: c,
    cancelButton: u
  });
  if (d.cleanup(), d.status === M.FAILURE)
    throw new Error("3DS verification failed");
  if (d.status === M.CANCELLED)
    throw new Error("3DS verification cancelled");
  if (d.status === M.SUCCESS) {
    Ye("3DS verification succeeded");
    return;
  } else
    Et(d.status);
}, { log__: Lp, err__: yi } = R("pockyt-cc"), Mp = n.object({
  "op-pockyt-3ds-url": n.string(),
  "op-pockyt-txn-no": n.string(),
  "op-pockyt-ref-no": n.string()
}), jp = (e) => {
  const r = Mp.safeParse(e);
  if (!r.success) {
    const t = "Unable to process your credit card. Please contact support for assistance.", o = `Pockyt 3DS is required but headers are malformed. Got: ${JSON.stringify(e)}`;
    throw yi(o), new Error(t);
  }
  return r.data;
}, gi = (e) => {
  try {
    const r = new URL(e ?? "").searchParams.get("vaultId");
    if (!r)
      throw new Error("No vault ID found in 3DS verification result");
    return Lp(`3DS verification success. [Vault ID: ${r}]`), r;
  } catch (r) {
    const t = "Error verifying 3DS verification result.";
    throw yi(t, `Resulting URL: ${e}.
Error: ${ne(r)}`), new Error(t);
  }
}, Lr = (e, r) => new URL(e).searchParams.get(r), Op = (e) => e?.["op-pockyt-3ds-url"] !== void 0, Dp = async (e, r) => {
  const t = jp(r), o = await Ko({ url: t["op-pockyt-3ds-url"], baseUrl: e });
  return {
    existing_cc: {
      vault_id: gi(o.href ?? ""),
      transaction_no: t["op-pockyt-txn-no"],
      reference_no: t["op-pockyt-ref-no"]
    }
  };
}, { log__: Nn } = R("stripe-cc"), Up = n.object({
  stripe_pk: n.string(),
  client_secret: n.string(),
  stripe_pm_id: n.string()
}), bi = async (e) => {
  b("3ds_stripe_redirect", {
    ...e
  }), Nn(`├ Using stripe 3DS flow [Client Secret: ${e.client_secret.substring(0, 8)}...]`), await vu(e), b("3ds_stripe_complete"), Nn("╰ Stripe 3DS flow completed successfully");
}, Fp = (e) => {
  const r = Up.safeParse(e);
  if (!r.success)
    throw new Error(`Stripe 3DS metadata has unexpected format: ${JSON.stringify(r.error.errors)}`);
  return {
    stripe_pk: r.data.stripe_pk,
    client_secret: r.data.client_secret,
    stripe_pm_id: r.data.stripe_pm_id
  };
}, Gp = 4, { log__: Ue, err__: Jt } = R("unified-cc"), qp = async ({
  context: e,
  checkoutPaymentMethod: r,
  nonCdeFormInputs: t,
  formCallbacks: o,
  customParams: i
}) => {
  Ue("├ Running unified CC flow...", { checkoutPaymentMethod: r });
  const a = e.anyCdeConnection, s = await D(a);
  Ue(`├ Validating non-CDE form fields [Mode: ${s.mode}]`);
  const c = Z(t, o.get.onValidationError), l = {
    session_id: e.elementsSessionId,
    checkout_payment_method: r,
    non_cde_form_fields: c,
    extra_metadata: {
      origin: window.location.origin,
      // For debugging purposes in the checkout attempt logs
      deviceToken: Bo()
    },
    use_unified_cc_flow: !0,
    pay_first_flow_cart_info: {
      line_items: s.line_items,
      displayed_total_amount_atom: s.amount_total_atom
    },
    payment_route_id: i.paymentRouteId
  };
  Jt(i, l), Ue(`├ Tokenizing card info in Partial PMs [Session: ${e.elementsSessionId}]`);
  const u = await Fo(i.currentCdeConnections, {
    session_id: e.elementsSessionId
  });
  Wo(u, o.get.onValidationError);
  const d = await Uo(a, l);
  if (Ue("├ startPf result", d), d.checkout_success_response)
    return wi(s.mode, d);
  if (!d.checkout_attempt_id)
    throw new Error("Invalid state: no checkout attempt ID from PF result");
  return Vp({
    context: e,
    prefill: s,
    nonCdeFormInputs: t,
    commonCheckoutParams: l,
    anyCdeConnection: a,
    startPfResult: d,
    checkoutAttemptId: d.checkout_attempt_id
  });
}, Vp = async (e) => {
  const {
    context: r,
    prefill: t,
    nonCdeFormInputs: o,
    commonCheckoutParams: i,
    anyCdeConnection: a,
    startPfResult: s,
    checkoutAttemptId: c
  } = e;
  let l = s;
  for (let u = 0; u < Gp; u++) {
    Ue(`├ Running confirm loop iteration ${u}`), b("unified_cc_confirm_loop_iteration", { iteration: u });
    const { userAction: d } = zp(l);
    try {
      const _ = await $p(r.baseUrl, d, t, o);
      i.extra_metadata = {
        ...i.extra_metadata,
        ..._.metadataForConfirmStep
      }, Ue("├ New extra metadata", i.extra_metadata);
    } catch (_) {
      const f = ne(_);
      Jt(`├ Error in running user action in iteration ${u}. Continuing to confirm step...`, f), b("unified_cc_user_action_error", { error_message: f, iteration: u });
    }
    if (l = await G(a, {
      secure_token: t.token,
      checkout_attempt_id: c,
      processor_specific_metadata: i.extra_metadata
    }), Ue(`├ confirmPf result (iteration ${u})`, l), l.checkout_success_response)
      return wi(t.mode, l);
  }
  throw b("unified_cc_unexpected_branch", {
    secure_token: t.token,
    checkout_attempt_id: l.checkout_attempt_id,
    confirmPFResult: l
  }), new Error("Checkout error, please try another payment method");
}, $p = async (e, r, t, o) => {
  if (r._unified_cc_action_name === "3DS_REQUIRED") {
    if (r.type === "stripe_3ds")
      return await bi(Fp(r)), { metadataForConfirmStep: {} };
    if (ei(r))
      return { metadataForConfirmStep: { airwallex: await ti(e, r) } };
    if (ii(r))
      return { metadataForConfirmStep: { adyen: await ai(
        o[m.COUNTRY],
        r,
        t.locale
      ) } };
    if (Rp(r))
      return await _i(r), { metadataForConfirmStep: {} };
    if (Hp(r))
      return await Pi({ required_user_actions: [r] }, e), { metadataForConfirmStep: {} };
    throw new Error(`Unhandled 3DS user action: ${JSON.stringify(r)}`);
  } else
    throw new Error(`Unknown required user action: ${JSON.stringify(r)}`);
}, Hp = (e) => {
  try {
    return vi([e]), !0;
  } catch {
    return !1;
  }
}, zp = (e) => {
  if (e.required_user_actions) {
    if (e.required_user_actions.length === 0)
      throw new Error("Invalid state: no required user actions");
    if (e.required_user_actions.length > 1)
      throw new Error("Invalid state: multiple required user actions");
  } else throw new Error("Invalid state: no required user actions");
  const r = Qc.safeParse(e.required_user_actions[0]);
  if (!r.success)
    throw Jt("User action raw payload", e.required_user_actions[0]), Jt("Parsing error", r.error), new Error("Invalid state: schema of user action payload is not valid");
  return {
    userAction: r.data
  };
}, wi = (e, r) => {
  if (e === "setup") {
    const t = r.cc_pm_id ?? r.payment_methods?.[0].id;
    if (!t)
      throw new Error("Invalid state: no CC PM ID or payment_methods found in PF result");
    return {
      mode: "setup",
      result: {
        payment_method_id: t
      }
    };
  } else {
    if (!r.checkout_success_response)
      throw new Error("Invalid state: no checkout success response from startPF");
    return {
      mode: "checkout",
      result: r.checkout_success_response
    };
  }
}, { log__: O, err__: Ln } = R("common-cc");
n.array(
  n.object({
    our_existing_pm_id: n.string()
  })
).length(1);
const Bp = J(
  async ({
    context: e,
    checkoutPaymentMethod: r,
    nonCdeFormInputs: t,
    formCallbacks: o,
    customParams: i
  }) => {
    O("├ Running common CC flow...", { checkoutPaymentMethod: r });
    const a = e.anyCdeConnection, s = await D(a);
    b("common_cc_flow_started", {
      ...r,
      prefill: s
    });
    const c = s.final_feature_rollout_settings?.unified_cc ?? 0;
    O(`├ Unified CC rollout: ${Math.round(c * 100)}%`);
    const l = Math.random(), u = l < c, d = {
      roll: l,
      unifiedCCRolloutRatio: c,
      useUnifiedCCFlow: u
    };
    if (u)
      return O(`├ Picked unified CC flow (${l} vs ${c})`), b("unified_cc_flow_picked", d), qp({
        context: e,
        checkoutPaymentMethod: r,
        nonCdeFormInputs: t,
        formCallbacks: o,
        customParams: i,
        initResult: void 0
      });
    O(`├ Picked legacy CC flow (${l} vs ${c})`), b("legacy_cc_flow_picked", d), O(`├ Validating non-CDE form fields [Mode: ${s.mode}]`);
    const _ = Z(
      t,
      o.get.onValidationError,
      s.checkout_settings
    );
    b("billing_details_received", {
      ..._
    });
    const f = {
      session_id: e.elementsSessionId,
      checkout_payment_method: r,
      non_cde_form_fields: _,
      extra_metadata: {
        origin: window.location.origin
      },
      use_unified_cc_flow: !1,
      payment_route_id: i.paymentRouteId,
      customer_language: me(),
      ...ee(_, s.checkout_settings)
    };
    try {
      O(`├ Tokenizing card info in CDE [Session: ${e.elementsSessionId}]`);
      const p = await Fo(i.currentCdeConnections, {
        session_id: e.elementsSessionId
      });
      if (Wo(p, o.get.onValidationError), s.mode === "setup") {
        O(`├ Setting up payment method in CDE [Token: ${s.token}]`);
        const h = await dd(a, f);
        return O(`╰ Setup completed successfully [PM ID: ${h.payment_method_id}]`), { mode: "setup", result: h };
      } else {
        O(`├ Initial checkout flow. Checking out card info in CDE [Session: ${e.elementsSessionId}]`);
        const h = await xn(a, f);
        return O("╰ Checkout completed successfully."), { mode: "checkout", result: h };
      }
    } catch (p) {
      if (p instanceof Do && p.originalErrorMessage.includes("3DS_REQUIRED")) {
        O("├ Card requires 3DS, starting non-legacy payment flow"), O("Received 3DS error response headers:", p.response.headers), b("3ds_required", {
          ...r,
          ...p.response.headers
        });
        const h = p.response.headers ?? {};
        "op-existing-cc-pm-id" in h && (f.existing_cc_pm_id = h["op-existing-cc-pm-id"], O(`├ Existing CC PM ID: ${f.existing_cc_pm_id}`));
        const y = Op(p.response.headers);
        if (y) {
          O("├ Pockyt 3DS case detected. Going through Pockyt 3DS flow.");
          const A = await Dp(e.baseUrl, p.response.headers);
          f.extra_metadata.pockyt = A;
        }
        if (ei(p.response.headers)) {
          O("├ Airwallex 3DS case detected. Going through Airwallex 3DS flow.");
          const A = await ti(e.baseUrl, p.response.headers);
          f.extra_metadata.airwallex = A;
        }
        if (ii(p.response.headers)) {
          O("├ Adyen 3DS case detected. Going through Adyen 3DS flow.");
          const A = await ai(
            t[m.COUNTRY],
            p.response.headers,
            s.locale
          );
          f.extra_metadata.adyen = A;
        }
        const g = await Uo(a, f);
        O("├ Start payment flow result:", g);
        const w = g.required_user_actions.find(
          (A) => A.type === "cybersource_payer_auth"
        );
        if (w) {
          O("├ Cybersource 3DS case detected. Going through Cybersource 3DS flow.");
          const A = fi.parse(w), C = await _i({
            ...A,
            _unified_cc_action_name: "",
            _unified_cc_pccs_id: ""
          });
          f.extra_metadata.cybersource = C;
        }
        const E = p.response.headers?.["op-should-use-new-flow"] !== "true";
        !y && !w ? E ? (O("├ Using stripe 3DS flow"), await bi(Yp(g))) : (O("├ Using common 3DS flow"), await Pi(g, e.baseUrl)) : O("├ Pre-start 3DS is successful, other 3DS flows will be skipped.");
        const I = g.cc_pm_id;
        if (s.mode === "setup") {
          O(`├ Confirming payment flow [cc_pm_id: ${I}]`);
          const A = await G(a, {
            secure_token: s.token,
            existing_cc_pm_id: I
          });
          O("├ Confirm payment flow result received Result:", A);
          const C = kt(A);
          return O(`╰ Setup completed successfully [PM ID: ${C.payment_method_id}]`), { mode: "setup", result: C };
        } else {
          O(`├ Checking out after 3DS flow [Flow: ${E ? "legacy" : "new"}]`);
          const A = await xn(a, {
            ...f,
            existing_cc_pm_id: I,
            do_not_use_legacy_cc_flow: E
          });
          return O("╰ Checkout completed successfully."), { mode: "checkout", result: A };
        }
      }
      throw Ln("╰ Error checking out card info in CDE"), Ln(p), p;
    }
  }
), Yp = (e) => {
  const r = e.required_user_actions.find((t) => t.type === "stripe_3ds");
  if (!r)
    throw new Error("No stripe 3DS action found");
  return hu.parse(r);
}, Zp = ["airwallex_payment_consent", "adyen"], vi = (e) => {
  const r = e.find((t) => Zp.includes(t.type));
  if (!r)
    throw new Error("No common 3DS action found");
  return Pc.parse(r);
}, Pi = async (e, r) => {
  const t = vi(e.required_user_actions);
  if (t.redirect_url === "3DS_COMPLETE") {
    O("├ 3DS flow completed successfully"), b("3ds_complete");
    return;
  }
  O(`├ Using common 3DS flow [URL: ${t.redirect_url}]`), b("3ds_redirect", {
    ...t
  });
  const { status: o } = await ke({ url: t.redirect_url, baseUrl: r });
  if (O(`╰ 3DS verification completed [Status: ${o}]`), o === M.CANCELLED)
    throw b("3ds_cancelled"), new Error("3DS verification cancelled");
  if (o === M.FAILURE)
    throw b("3ds_failure"), new Error("3DS verification failed");
  b("common_3ds_completed");
}, Kp = n.object({
  processor_name: n.literal("loop"),
  provider: n.literal("crypto"),
  metadata: n.object({
    merchant_id: n.string(),
    entity_id: n.string(),
    api_token: n.string(),
    supported_currencies: n.array(n.string()),
    environment: n.string()
  })
}), { log__: Q, err__: Jp } = R("loop-crypto"), Wp = Ee(
  async ({ context: e }) => {
    Q("Checking if there are any CPMs for Loop Crypto...");
    const r = K(e.checkoutPaymentMethods, Kp);
    Q(`checkoutPaymentMethod: ${JSON.stringify(r)}`), Q("Starting Loop Crypto flow...");
    const t = await D(e.anyCdeConnection), o = t.mode === "setup", i = await cr(e.anyCdeConnection, {
      checkout_payment_method: r
    }), a = await Se(
      e.anyCdeConnection,
      t.token,
      o,
      void 0
    );
    if (!o && !r.metadata.supported_currencies.includes(t.currency))
      throw Error(
        `Currency ${t.currency} not enabled for Loop. Enabled currencies: ${r.metadata.supported_currencies}`
      );
    if (!i || !i.next_action_metadata)
      throw Error("Failed to fetch necessary setup data for Loop");
    const s = i.next_action_metadata;
    let c = s.authorization_amount, l = s.min_authorization_amount;
    const u = s.allow_customer_to_choose_auth;
    let d;
    o ? (d = 0, c = Math.max(c, l)) : (d = (a ? a.amountAtom : t.amount_total_atom) * s.token_price, l = Math.max(l, d), c = Math.max(c, l));
    const _ = d, f = Fe(), p = {
      paymentUsdAmount: _,
      suggestedAuthorizationUsdAmount: c,
      customerRefId: f,
      minAuthorizationUsdAmount: l,
      allowCustomerToChooseAuth: u
    }, h = {
      apiToken: r.metadata.api_token,
      entityId: r.metadata.entity_id,
      merchantId: r.metadata.merchant_id,
      environment: r.metadata.environment
    };
    return {
      isAvailable: !0,
      widgetProps: p,
      initLoopConnectProps: h
    };
  }
), Qp = J(
  async ({
    context: e,
    checkoutPaymentMethod: r,
    nonCdeFormInputs: t,
    formCallbacks: o,
    customParams: i
  }) => {
    Q("Running Loop flow..."), Q("context", e), Q("checkoutPaymentMethod", r), Q("nonCdeFormInputs", t), Q("flowCallbacks", o), Q("customParams", i);
    const a = await D(e.anyCdeConnection);
    Q(`├ Validating non-CDE form fields [Mode: ${a.mode}]`);
    const s = Z(
      t,
      o.get.onValidationError,
      a.checkout_settings
    ), c = e.anyCdeConnection, l = a.mode !== "setup", u = ee(s, a.checkout_settings);
    if (!i)
      throw new Error("Checkout failed. Failed to properly submit form data.");
    if (!i.success)
      throw b("loop_pay_flow_failure", i), new Error("Checkout failed. Success is not true.");
    const d = await ie(e.anyCdeConnection, {
      checkout_payment_method: r,
      payment_provider: r.provider,
      ...u,
      use_pay_first_flow: l,
      pay_first_flow_cart_info: l ? {
        // TODO add coupon and cart adjusted line items later
        line_items: a.line_items,
        displayed_total_amount_atom: a.amount_total_atom,
        promotion_code: s[m.PROMOTION_CODE]
      } : void 0,
      customer_language: me()
    }), _ = await G(c, {
      secure_token: a.token,
      their_pm_id: i.paymentMethod.paymentMethodId,
      // NOTE: we do have the checkout attempt id here even if its a setup, but for now we don't include it
      // because we don't have checkout attempt support for setup intents.
      checkout_attempt_id: l ? d.checkout_attempt_id : void 0,
      processor_specific_metadata: {
        loop_customer: i.customer,
        loop_payment_method: i.paymentMethod,
        loop_success: i.success
      }
    });
    if (Q(`Confirm result: ${_}`), a.mode === "setup") {
      Q("Doing payment setup..."), Q("├ Confirm payment flow result received Result:", _);
      const f = kt(_);
      return Q(`╰ Setup completed successfully [PM ID: ${f.payment_method_id}]`), { mode: "setup", result: f };
    } else {
      if (Q("Doing checkout..."), !_.pay_first_success_response)
        throw Jp("Checkout failed, no pay-first success response:", _), new Error("Checkout failed, please try again with another payment method.");
      return {
        mode: "checkout",
        result: _.pay_first_success_response
      };
    }
  }
), { log__: Le, err__: Xp } = R("paypal"), Ei = n.object({
  provider: n.literal("paypal"),
  metadata: n.object({ client_id: n.string() }),
  processor_name: n.literal("paypal")
}), em = async ({ context: e, formCallbacks: r }) => {
  const t = K(e.checkoutPaymentMethods, Ei);
  if (!t)
    throw new Error("PayPal CPM not found in available payment methods");
  return {
    isLoading: !1,
    isAvailable: !0,
    startFlow: () => j.paypal.run({
      context: e,
      checkoutPaymentMethod: t,
      nonCdeFormInputs: $(e.formDiv),
      formCallbacks: r,
      initResult: void 0,
      customParams: { settings: {} }
    })
  };
}, tm = J(
  async ({
    context: e,
    nonCdeFormInputs: r,
    checkoutPaymentMethod: t,
    formCallbacks: o,
    customParams: i
  }) => {
    try {
      Le("Running PayPal flow...");
      const a = e.anyCdeConnection, s = await D(a), { isAnonymous: c, useRedirectFlow: l } = i.settings ?? {};
      Le("Verifying CPM...");
      const u = Ei.parse(t);
      Le("├ Validating non-CDE form fields");
      const d = Z(r, o.get.onValidationError, {
        ...c ? Id() : void 0,
        ...s.checkout_settings
      }), _ = ee(d, s.checkout_settings);
      Le(`Starting payment flow... Mode: ${s.mode}`);
      const f = Fe(), p = !1, h = {
        payment_provider: u.provider,
        checkout_payment_method: u,
        use_pay_first_flow: p,
        pay_first_flow_cart_info: p ? {
          line_items: s.line_items,
          displayed_total_amount_atom: s.amount_total_atom
        } : void 0,
        processor_specific_metadata: {
          use_paypal_redirect_flow: l,
          frontend_token_for_redirect_flow: f
        },
        ..._
      }, y = new URL("/app/pre-action/start/", e.baseUrl).toString(), g = btoa(JSON.stringify(h)), w = new URLSearchParams({
        st: s.token,
        r: g
      }), E = `${y}?${w.toString()}`;
      if (l)
        throw Le("Starting redirect mode for PayPal..."), window.location.href = E, await sr(20 * 1e3), new Error("Paypal flow timed out, please try again with another payment method.");
      const I = await Jo(
        "PayPal",
        a,
        f,
        E
      );
      Le("Paypal flow result", I);
      const A = Lr(I.href, "catt"), C = Lr(I.href, "approval_session_id"), q = await G(a, {
        secure_token: s.token,
        checkout_attempt_id: p ? A : void 0,
        their_pm_id: p ? C : void 0
      });
      return Le("Confirm payment flow result", q), he({
        logPrefix: "paypal",
        anyCdeConnection: a,
        checkoutPaymentMethod: u,
        requiredFormFields: d,
        confirmResult: q,
        usePayFirstFlow: p
      });
    } catch (a) {
      throw Xp("PayPal payment error", a), b("checkout_error", { payment_method: "paypal", error: a }), new Error(a?.message ?? "Unknown error");
    }
  }
), { log__: fe, err__: Mn } = R("pockyt-paypal"), Si = n.object({
  processor_name: n.literal("pockyt"),
  provider: n.literal("paypal")
});
n.array(
  n.object({
    paypal_iframe_url: n.string(),
    verify_token: n.string()
  })
).length(1);
const rm = async ({ context: e, formCallbacks: r }) => {
  const t = K(e.checkoutPaymentMethods, Si);
  if (!t)
    throw new Error("Pockyt PayPal CPM not found in available payment methods");
  return {
    isLoading: !1,
    isAvailable: !0,
    startFlow: () => j.pockytPaypal.run({
      context: e,
      checkoutPaymentMethod: t,
      nonCdeFormInputs: $(e.formDiv),
      formCallbacks: r,
      initResult: void 0,
      customParams: { settings: {} }
    })
  };
}, nm = J(
  async ({
    context: e,
    checkoutPaymentMethod: r,
    nonCdeFormInputs: t,
    formCallbacks: o,
    customParams: i
  }) => {
    fe("Running Pockyt Paypal flow...");
    const a = e.anyCdeConnection, s = await D(a);
    fe("Verifying CPM...");
    const c = Si.parse(r);
    fe("├ Validating non-CDE form fields");
    const l = i?.settings, u = Z(
      t,
      o.get.onValidationError,
      l?.defaultFieldValues
    ), d = ee(u, s.checkout_settings);
    fe(`Starting payment flow... Mode: ${s.mode}`);
    const _ = Fe(), f = s.mode !== "setup", p = {
      payment_provider: c.provider,
      checkout_payment_method: c,
      use_pay_first_flow: f,
      pay_first_flow_cart_info: f ? {
        // TODO add coupon and cart adjusted line items later
        line_items: s.line_items,
        displayed_total_amount_atom: s.amount_total_atom
      } : void 0,
      processor_specific_metadata: {
        use_paypal_redirect_flow: !!i?.settings?.useRedirectFlow,
        frontend_token_for_redirect_flow: _
      },
      ...d
    }, h = new URL("/app/pre-action/start/", e.baseUrl).toString(), y = btoa(JSON.stringify(p)), g = new URLSearchParams({
      st: s.token,
      r: y
    }), w = `${h}?${g.toString()}`;
    if (i?.settings?.useRedirectFlow)
      throw fe("Starting redirect mode for PayPal..."), window.location.href = w, await sr(20 * 1e3), new Error("Paypal flow timed out, please try again with another payment method.");
    fe("Starting popup mode for PayPal..."), fe("Opening paypal iframe...");
    const E = await Jo(
      "PayPal",
      a,
      _,
      w
    );
    fe("Paypal flow result", E);
    const I = gi(E.href), A = Lr(E.href, "catt");
    if (!A)
      throw Mn("Checkout attempt ID not found in redirect URL:", E.href), new Error("Checkout attempt ID not found in redirect URL");
    fe(`Confirming payment flow using vault ID ${I}`);
    const C = await G(a, {
      secure_token: s.token,
      their_pm_id: I,
      checkout_attempt_id: f ? A : void 0
    });
    if (fe("Confirm payment flow result", C), s.mode === "setup")
      return {
        mode: "setup",
        result: {
          payment_method_id: C.payment_methods[0].id
        }
      };
    if (!C.pay_first_success_response)
      throw Mn("Checkout failed, no pay-first success response:", C), new Error("Checkout failed, please try again with another payment method.");
    return {
      mode: "checkout",
      result: C.pay_first_success_response
    };
  }
), Nt = "ojs-stripe-link-btn", { log__: H, err__: jn } = R("stripe-link"), om = n.object({
  provider: n.literal("stripe_link"),
  processor_name: n.literal("stripe"),
  metadata: n.object({
    stripe_pk: n.string()
  })
}), im = n.array(
  n.object({
    our_existing_pm_id: n.string()
  })
).length(1), am = Ee(
  async ({ context: e, formCallbacks: r }) => {
    const t = e.customInitParams.stripeLink;
    H("Checking if there are any CPMs for Stripe Link...");
    const o = K(e.checkoutPaymentMethods, om);
    H("Starting stripe link flow...");
    const i = e.anyCdeConnection, a = await D(i), s = a.mode === "setup";
    H("Creating stripe elements...");
    const c = await Se(i, a.token, s, void 0), { elements: l, stripe: u } = await yu(o.metadata.stripe_pk, {
      mode: "setup",
      currency: c.currency,
      setup_future_usage: "off_session",
      paymentMethodCreation: "manual"
    }), d = l.create("linkAuthentication");
    H("Creating express checkout...");
    const _ = l.create("expressCheckout", {
      buttonHeight: t?.buttonHeight,
      paymentMethods: {
        amazonPay: "never",
        applePay: "never",
        googlePay: "never",
        paypal: "never"
      }
    }), f = (y, g) => {
      let w = document.querySelector(y);
      w || (jn(`Recommanded to render a container with ${y} to avoid rendering in the body`), w = document.body);
      const E = document.createElement("div");
      w?.appendChild(E), d.mount(E);
      let I = !1, A = !1;
      if (d.once("ready", () => {
        A = !0, t?.onAuthenticationElementReady?.();
      }), g) {
        E.style.visibility = "hidden", E.style.position = "absolute", E.style.top = "-1000px", E.style.left = "-1000px", E.style.zIndex = "-1", d.on("change", (q) => {
          I = q.complete || !!q.value.email, A && t?.onAuthenticationStatusChange?.(I);
        });
        const C = E.querySelector("iframe");
        C && new MutationObserver(() => {
          const q = C.offsetHeight > 160;
          A && t?.onAuthenticationStatusChange?.(I || q);
        }).observe(C, { attributes: !0, attributeFilter: ["style"] });
      }
      return d;
    }, p = (y) => {
      _.mount(y || `#${Nt}`);
    }, h = () => {
      _.unmount();
    };
    return t?.doNotMountOnInit ? H("NOT mounting stripe link button (doNotMountOnInit is true)") : (H("Mounting stripe link button..."), p()), t?.silentlyCheckAuthentication && (H(`Silently mounting link authentication element at #${Nt}...`), f(`#${Nt}`, !0)), _.on("click", async (y) => {
      if (H("Stripe Link button clicked"), t?.overrideLinkSubmit && !await t.overrideLinkSubmit()) {
        H("Stripe Link submit aborted by overrideLinkSubmit");
        return;
      }
      y.resolve();
    }), _.on("confirm", async (y) => {
      H("Stripe Link window confirmed", y);
      const g = await u.createPaymentMethod({
        elements: l,
        params: {
          billing_details: y.billingDetails
        }
      });
      g.error ? (jn("error", g.error), r.get.onCheckoutError(g.error.message ?? "Stripe Link unknown error")) : (H("paymentMethod", g.paymentMethod), j.stripeLink.run({
        context: e,
        checkoutPaymentMethod: o,
        nonCdeFormInputs: $(e.formDiv),
        formCallbacks: r,
        customParams: { stripePM: g.paymentMethod },
        initResult: { isAvailable: !0 }
      }));
    }), {
      isAvailable: !0,
      controller: {
        mountButton: p,
        dismountButton: h,
        mountLinkAuthenticationElement: (y) => f(y, !1),
        waitForButtonToMount: async () => await lm(Nt)
      }
    };
  }
), sm = J(
  async ({
    context: e,
    checkoutPaymentMethod: r,
    nonCdeFormInputs: t,
    formCallbacks: o,
    customParams: i
  }) => {
    H("Running Stripe Link flow...");
    const a = e.anyCdeConnection, s = await D(a);
    H("Merging PM fields with form fields...");
    const c = cm(t, i.stripePM), l = Z(c, o.get.onValidationError);
    b("billing_details_received", {
      ...l
    }), H("Starting payment flow...");
    const u = await ie(a, {
      payment_provider: r.provider,
      checkout_payment_method: r,
      their_existing_pm_id: i.stripePM.id,
      ...ee(l, s.checkout_settings),
      customer_language: me()
    });
    H("Start payment flow response", u);
    const d = im.parse(u.required_user_actions)[0].our_existing_pm_id;
    if (s.mode === "setup") {
      H("Doing payment setup...");
      const _ = await G(a, {
        secure_token: s.token,
        existing_cc_pm_id: d
      });
      return { mode: "setup", result: kt(_) };
    } else {
      H("Doing checkout...");
      const _ = {
        secure_token: s.token,
        payment_input: {
          provider_type: r.provider
        },
        customer_email: l[m.EMAIL],
        customer_first_name: l[m.FIRST_NAME],
        customer_last_name: l[m.LAST_NAME],
        customer_address: St(l),
        customer_shipping_address: lr(l, s.checkout_settings),
        promotion_code: l[m.PROMOTION_CODE],
        line_items: s.line_items,
        total_amount_atom: s.amount_total_atom,
        cancel_at_end: !1,
        checkout_payment_method: r
      };
      return { mode: "checkout", result: await Yr(a, _) };
    }
  }
), cm = (e, r) => {
  const t = { ...e }, [o, ...i] = r.billing_details.name?.trim()?.split(/\s+/) ?? [], a = i.join(" ") || void 0;
  t[m.EMAIL] = t[m.EMAIL] || // eslint-disable-next-line @typescript-eslint/no-explicit-any
  r.link?.email || r.billing_details.email || "op_unfilled@getopenpay.com", t[m.ZIP_CODE] = t[m.ZIP_CODE] || r.billing_details.address?.postal_code || "00000", t[m.COUNTRY] = t[m.COUNTRY] || r.billing_details.address?.country || "US";
  const s = t[m.FIRST_NAME] || o || "", c = t[m.LAST_NAME] || a || "";
  return s || c ? (t[m.FIRST_NAME] = s, t[m.LAST_NAME] = c) : (t[m.FIRST_NAME] = "_OP_UNKNOWN", t[m.LAST_NAME] = ""), H("Final form inputs:", t), t;
}, lm = (e) => new Promise((r) => {
  const t = () => {
    const o = document.getElementById(e);
    o ? r(o) : requestAnimationFrame(t);
  };
  t();
}), { log__: X, err__: um } = R("stripe-pr"), dm = n.object({
  provider: n.union([n.literal("apple_pay"), n.literal("google_pay")]),
  processor_name: n.literal("stripe"),
  metadata: n.object({
    stripe_pk: n.string()
  })
}), pm = Ee(
  async ({ context: e, formCallbacks: r }) => {
    X("Checking if there are any CPMs for Stripe PR...");
    const t = K(e.checkoutPaymentMethods, dm);
    X("Initializing Stripe PR flow...");
    const o = e.anyCdeConnection, i = await D(o), a = i.mode === "setup";
    X("Getting initial preview amount");
    const s = await Se(o, i.token, a, void 0), c = await gu(
      t.metadata.stripe_pk,
      s.amountAtom,
      s.currency,
      a
    );
    X("Checking if can make payment");
    const l = await c.canMakePayment();
    if (l === null)
      return um("canMakePayment returned null"), { isAvailable: !1, reason: "canMakePayment returned null" };
    X("Stripe PR flow initialized successfully. Can make payment", l);
    const u = (d, _) => j.stripePR.run({
      context: e,
      checkoutPaymentMethod: ye(e.checkoutPaymentMethods, d),
      nonCdeFormInputs: $(e.formDiv),
      formCallbacks: r,
      customParams: { provider: d, overridePaymentRequest: _?.overridePaymentRequest },
      initResult: {
        processor: V.Enum.stripe,
        pr: c,
        isAvailable: !0,
        availableProviders: { applePay: l.applePay, googlePay: l.googlePay },
        startFlow: u
      }
    });
    return {
      processor: V.Enum.stripe,
      isAvailable: !0,
      pr: c,
      availableProviders: {
        applePay: l.applePay,
        googlePay: l.googlePay
      },
      startFlow: u
    };
  }
), mm = J(
  async ({
    context: e,
    checkoutPaymentMethod: r,
    nonCdeFormInputs: t,
    formCallbacks: o,
    customParams: i,
    initResult: a
  }) => {
    if (X("Running Stripe PR flow..."), i.provider !== r.provider)
      throw new Error(`Provider mismatch. Expected ${i.provider}, got ${r.provider}`);
    const s = e.anyCdeConnection, c = a.pr;
    if (i?.overridePaymentRequest) {
      const h = i.overridePaymentRequest;
      X("Overriding PR amount with", h);
      const y = typeof h.applePayPaymentRequest == "function" ? h.applePayPaymentRequest({}) : h.applePayPaymentRequest;
      fm(c, h.amount, h.pending, y, h.label);
    }
    X("Showing PR dialog..."), c.show();
    const l = await bu(c);
    X("Stripe PM added event:", l), X("Merging PM fields with form fields...");
    const u = hm(t, l), d = Z(u, o.get.onValidationError);
    b("billing_details_received", {
      ...d
    }), X("PR dialog finished. Starting payment flow...", d);
    const _ = await sd(s, {
      fields: d,
      checkoutPaymentMethod: r
    }), f = _m(_);
    X("Confirming PR with Stripe..."), await wu(f, l);
    const p = await D(s);
    if (p.mode === "setup") {
      X("Confirming payment flow for setup...");
      const h = await G(s, {
        secure_token: p.token
      });
      return { mode: "setup", result: kt(h) };
    } else {
      X("Performing checkout...");
      const h = {
        secure_token: p.token,
        payment_input: {
          provider_type: r.provider
        },
        customer_first_name: d[m.FIRST_NAME],
        customer_last_name: d[m.LAST_NAME],
        customer_email: d[m.EMAIL],
        customer_address: St(d),
        customer_shipping_address: lr(d, p.checkout_settings),
        promotion_code: d[m.PROMOTION_CODE],
        line_items: p.line_items,
        total_amount_atom: p.amount_total_atom,
        cancel_at_end: !1,
        checkout_payment_method: r
      };
      return { mode: "checkout", result: await Yr(s, h) };
    }
  }
), hm = (e, r) => {
  const t = { ...e }, [o, ...i] = r.payerName?.trim()?.split(/\s+/) ?? [], a = i.join(" ") || void 0, s = r.paymentMethod?.billing_details?.address, c = r.shippingAddress;
  t[m.EMAIL] = t[m.EMAIL] || r.payerEmail || "op_unfilled@getopenpay.com", t[m.ZIP_CODE] = t[m.ZIP_CODE] || s?.postal_code || c?.postalCode || "00000", t[m.COUNTRY] = t[m.COUNTRY] || s?.country || c?.country || "US";
  const l = t[m.FIRST_NAME] || o || "", u = t[m.LAST_NAME] || a || "";
  return l || u ? (t[m.FIRST_NAME] = l, t[m.LAST_NAME] = u) : (t[m.FIRST_NAME] = "_OP_UNKNOWN", t[m.LAST_NAME] = ""), X("Final form inputs:", t), t;
}, fm = (e, r, t, o, i) => {
  e.update({
    total: r ? {
      amount: r.amountAtom,
      label: i ?? "Total",
      pending: t
    } : void 0,
    currency: r?.currency,
    // Stripe's applePay option only supports 'recurringPaymentRequest' | 'deferredPaymentRequest' | 'automaticReloadPaymentRequest' of native ApplePay payment request
    // We're accepting native Payment Request here for more common typing.
    // @ts-expect-error - stripe do not expect additional fields
    applePay: o
  });
}, _m = (e) => {
  if (e.required_user_actions.length !== 1)
    throw new Error(`Error occurred.
Details: got ${e.required_user_actions.length} required user actions`);
  return fu.parse(e.required_user_actions[0]);
}, ye = (e, r, t) => {
  const o = e.filter((i) => {
    const a = t === void 0 ? !0 : i.processor_name === t, s = i.provider === r;
    return a && s;
  });
  if (o.length === 0)
    throw console.warn("CPMs list", e), new Error(`No CPMs found with provider '${r}' and processor '${t}'`);
  return o.length !== 1 && (console.warn("CPMs list", e), console.warn(`More than one CPM found with provider '${r}' and processor '${t}'`), b("more_than_one_cpm_found", {
    provider: r,
    processor: t,
    cpms: e
  })), o[0];
}, j = {
  // ✋ Note: For flows that require initialization, please add them to `init-flows.ts`
  // Common
  commonCC: {
    init: async () => {
    },
    run: Bp
  },
  // Stripe
  stripePR: {
    init: pm,
    run: mm
  },
  stripeLink: {
    init: am,
    run: sm
  },
  // Pockyt
  pockytPaypal: {
    init: rm,
    run: nm
  },
  // PayPal
  paypal: {
    init: em,
    run: tm
  },
  // Airwallex
  airwallexGooglePay: {
    init: yp,
    run: gp
  },
  airwallexApplePay: {
    init: fp,
    run: _p
  },
  airwallexACH: {
    init: async () => {
    },
    run: dp
  },
  airwallexEFT: {
    init: async () => {
    },
    run: Gd
  },
  airwallexBACS: {
    init: async () => {
    },
    run: Ud
  },
  airwallexSEPA: {
    init: async () => {
    },
    run: Vd
  },
  // Loop
  loopCrypto: {
    init: Wp,
    run: Qp
  },
  authorizeNetApplePay: {
    init: vp,
    run: Pp
  },
  authorizeNetGooglePay: {
    init: Ep,
    run: Sp
  },
  adyenGooglePay: {
    init: cp,
    run: lp
  },
  adyenApplePay: {
    init: ap,
    run: sp
  }
  // 👉 Add more flows here
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
}, { log__: ym, err__: gm } = R("init-flows"), se = (e, r) => {
  const t = new pt();
  return {
    publisher: t,
    initialize: async (o) => {
      try {
        if (t.current.isSuccess)
          throw new Error("This flow has already been initialized.");
        const i = await r(o);
        ym(`✔ ${e} flow initialized successfully. Result:`, i), t.set(i);
      } catch (i) {
        gm(`𝙭 ${e} flow initialization failed. Error:`, ne(i), "Details:", i), t.throw(i, ne(i));
      }
    }
  };
}, bm = async (e, r, t) => {
  await Promise.all(Object.values(e).map((o) => o.initialize({ context: r, formCallbacks: t })));
}, wm = () => ({
  // 💡 Add new init flows here
  // Stripe PR
  stripePR: se("Stripe PR", j.stripePR.init),
  // Stripe Link
  stripeLink: se("Stripe Link", j.stripeLink.init),
  // Airwallex GooglePay
  airwallexGooglePay: se("Airwallex GooglePay", j.airwallexGooglePay.init),
  // Airwallex ApplePay
  airwallexApplePay: se("Airwallex ApplePay", j.airwallexApplePay.init),
  // Loop
  loop: se("Loop", j.loopCrypto.init),
  // PayPal
  paypal: se("PayPal", j.paypal.init),
  // Pockyt PayPal
  pockytPaypal: se("Pockyt PayPal", j.pockytPaypal.init),
  // Authnet GooglePay
  authorizeNetGooglePay: se("Authnet GooglePay", j.authorizeNetGooglePay.init),
  // Authnet ApplePay
  authorizeNetApplePay: se("Authnet ApplePay", j.authorizeNetApplePay.init),
  // Adyen GooglePay
  adyenGooglePay: se("Adyen GooglePay", j.adyenGooglePay.init),
  // Adyen ApplePay
  adyenApplePay: se("Adyen ApplePay", j.adyenApplePay.init)
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
}), { err__: vm } = R("form-callbacks"), ce = n.function().optional(), On = n.object({
  onFocus: ce,
  onBlur: ce,
  onChange: ce,
  onLoad: ce,
  onLoadError: ce,
  onValidationError: ce,
  onCheckoutStarted: ce,
  onCheckoutSuccess: ce,
  onSetupPaymentMethodSuccess: ce,
  onCheckoutError: ce,
  onPaymentRequestLoad: ce
}), Ve = class Dt {
  constructor() {
    this.setCallbacks = (r) => {
      this._callbacks = Dt.createEmptyCallbacks(), Object.entries(r).forEach(([t, o]) => {
        const i = sl(t, o ?? Dt.NOOP, vm);
        this._callbacks[t] = i;
      });
    }, this._callbacks = Dt.createEmptyCallbacks();
  }
  /**
   * Returns a read-only version of the callbacks object.
   */
  get get() {
    return { ...this._callbacks };
  }
};
Ve.NOOP = () => {
}, Ve.createEmptyCallbacks = () => {
  const e = {};
  return Object.keys(On.keyof().enum).forEach((r) => {
    e[r] = Ve.NOOP;
  }), e;
}, Ve.fromObject = (e) => {
  const r = new Ve();
  return r.setCallbacks(On.parse(e)), r;
};
let Pm = Ve;
function Em() {
  try {
    const e = z(), r = e;
    if (r?.next || r?.__NEXT_DATA__ || document.querySelector("#__next"))
      return "nextjs";
    if (e?.__NUXT__ || document.querySelector("#__nuxt"))
      return "nuxt";
    if (Object.keys(document).find((o) => o.includes("react")) || Array.from(document.body.querySelectorAll("body > *")).find(
      // @ts-expect-error - _reactRootContainer doesn't exist
      (o) => o._reactRootContainer
    ))
      return "react";
    const t = e;
    return t?.Vue || t?.__VUE__ ? "vue" : document.querySelector("[ng-version]") ? "angular" : "vanilla";
  } catch {
    return "unknown";
  }
}
function Sm(e) {
  try {
    switch (e) {
      case "react":
        return null;
      case "nextjs": {
        const r = z();
        return r?.next?.version || r?.__NEXT_DATA__?.buildId || null;
      }
      case "nuxt":
        return null;
      case "vue":
        return null;
      case "angular": {
        const r = z()?.document?.querySelector("[ng-version]");
        return r ? r.getAttribute("ng-version") : null;
      }
      default:
        return null;
    }
  } catch {
    return null;
  }
}
function km() {
  const e = Em(), r = Sm(e);
  return { framework: e, version: r };
}
const ki = () => {
  const e = window && window.screen ? window.screen.height : null, r = window && window.screen ? window.screen.width : null, t = window && window.screen ? window.screen.colorDepth : null, o = window && window.navigator ? window.navigator.javaEnabled() : !1, i = window && window.navigator ? window.navigator.userAgent : null, a = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8";
  let s = null;
  window && window.navigator && (s = window.navigator.language ? window.navigator.language : window.navigator.browserLanguage);
  const c = (/* @__PURE__ */ new Date()).getTimezoneOffset();
  return {
    color_depth: t,
    java_enabled: o,
    javascript_enabled: !0,
    language: s,
    screen_height: e,
    screen_width: r,
    time_zone_offset: c,
    user_agent: i,
    accept_header: a
  };
};
var N = /* @__PURE__ */ ((e) => (e.card = "card", e.pockytPaypal = "pockyt-paypal", e.applePay = "apple-pay", e.googlePay = "google-pay", e.loopCrypto = "loop-crypto", e.paypal = "paypal", e.stripeLink = "stripe-link", e.airwallexGooglePay = "airwallex-google-pay", e.airwallexApplePay = "airwallex-apple-pay", e.authorizenetGooglePay = "authorizenet-google-pay", e.authorizenetApplePay = "authorizenet-apple-pay", e.adyenGooglePay = "adyen-google-pay", e.adyenApplePay = "adyen-apple-pay", e.airwallexACH = "airwallex-ach", e.airwallexEFT = "airwallex-eft", e.airwallexBACS = "airwallex-bacs", e.airwallexSEPA = "airwallex-sepa", e))(N || {});
n.nativeEnum(N);
var Me = /* @__PURE__ */ ((e) => (e.ACH = "ach", e.EFT = "eft", e.BACS = "bacs", e.SEPA = "sepa", e.APPLE_PAY = "apple_pay", e.CREDIT_CARD = "credit_card", e.GOOGLE_PAY = "google_pay", e.STRIPE_LINK = "stripe_link", e.CRYPTO = "crypto", e.PAYPAL = "paypal", e))(Me || {});
const Dn = (e) => {
  const r = [e.airwallexApplePay, e.authorizeNetApplePay, e.adyenApplePay], t = [];
  r.forEach((i) => {
    const a = i.publisher.getValueIfLoadedElse(null);
    a?.isAvailable && t.push(a);
  });
  const o = e.stripePR.publisher.getValueIfLoadedElse(null);
  return o?.isAvailable && o.availableProviders.applePay && t.push({
    isAvailable: !0,
    isLoading: !1,
    processor: V.Enum.stripe,
    startFlow: (i) => o.startFlow("apple_pay", {
      overridePaymentRequest: i?.overridePaymentRequest
    })
  }), {
    processors: t.map((i) => i.processor),
    isAvailable: t.length > 0,
    isLoading: !1,
    startFlow: (i) => Cm(t, i)
  };
}, Un = (e) => {
  const r = [e.airwallexGooglePay, e.authorizeNetGooglePay, e.adyenGooglePay], t = [];
  r.forEach((i) => {
    const a = i.publisher.getValueIfLoadedElse(null);
    a?.isAvailable && t.push(a);
  });
  const o = e.stripePR.publisher.getValueIfLoadedElse(null);
  return o?.isAvailable && o.availableProviders.googlePay && t.push({
    isAvailable: !0,
    isLoading: !1,
    processor: V.Enum.stripe,
    startFlow: (i) => o.startFlow("google_pay", {
      overridePaymentRequest: i?.overridePaymentRequest
    })
  }), {
    processors: t.map((i) => i.processor),
    isAvailable: t.length > 0,
    isLoading: !1,
    startFlow: (i) => Im(t, i)
  };
}, Cm = (e, r) => {
  if (r?.processor) {
    const o = e.find((i) => i.processor === r.processor);
    if (o?.isAvailable)
      return o.startFlow(r);
    throw new Error(`Specified Apple Pay processor ${r.processor} is not available`);
  }
  const t = e.find((o) => o.isAvailable);
  if (t)
    return t.startFlow(r);
  throw new Error("No available Apple Pay processor found");
}, Im = (e, r) => {
  if (r?.processor) {
    const o = e.find((i) => i.processor === r.processor);
    if (o?.isAvailable)
      return o.startFlow(r);
    throw new Error(`Specified Google Pay processor ${r.processor} is not available`);
  }
  const t = e.find((o) => o.isAvailable);
  if (t)
    return t.startFlow(r);
  throw new Error("No available Google Pay processor found");
}, Am = (e) => JSON.stringify(e), { log__: Pr, err__: xm } = R("tracer"), Tm = (e, r) => {
  try {
    Rm(e, r);
  } catch (t) {
    xm(`Error initializing tracer: ${t}`);
  }
};
let Fn;
const Rm = async (e, r) => {
  if (typeof window > "u")
    return;
  const t = await import("./index-CD5ZzJ0E-BNo61tUq.js"), { ConsoleSpanExporter: o, SimpleSpanProcessor: i, WebTracerProvider: a } = t, s = await import("./index-BXyoTbrS-DGGjVY6j.js"), { FetchInstrumentation: c } = s, l = await import("./index-1sGeF-S8-Cf5_9V8Q.js"), { ZoneContextManager: u } = l, d = await import("./index-925BJ6Jo-FMJz60P8.js"), { registerInstrumentations: _ } = d, f = await import("./index-BE9m_H38-DZJya01O.js"), { Resource: p } = f, h = await import("./detect-resources-ChhXDAxq-Btymf6C7.js").then((Ai) => Ai.d), { detectResourcesSync: y } = h, g = await import("./index-CfmI3mSs-kdYEhELt.js"), { OTLPTraceExporter: w } = g, E = await import("./index-DHKyZPe5-DB9begqh.js"), { B3Propagator: I, B3InjectEncoding: A } = E, C = await import("./index-C3N5jtkQ-BnMnAIzy.js"), { BatchSpanProcessor: q } = C;
  Pr(`Initializing tracer with version ${e} and baseUrl ${r}`);
  const rn = Nm(r);
  Pr(`Using collector URL ${rn}`);
  const Ci = new w({ url: rn }), Ii = {
    "service.version": e,
    "service.name": "ojs"
  };
  return new a({
    resource: new p(Ii).merge(y()),
    spanProcessors: [
      new i(new o()),
      new q(Ci, {
        scheduledDelayMillis: 500
      })
    ]
  }).register({
    contextManager: new u(),
    propagator: new I({ injectEncoding: A.MULTI_HEADER })
  }), _({
    instrumentations: [
      new c({
        propagateTraceHeaderCorsUrls: [/.*/],
        // Propagate to all URLs
        // Exclude Adyen URLs - they do not allow OPTIONS requests
        // Also exclude loopcrypto.xyz
        ignoreUrls: [/^https:\/\/(.*\.)?adyen\.com/, /^https:\/\/(.*\.)?loopcrypto\.xyz/]
      })
    ]
  }), Fn = Qe.getTracer("openpay-js"), Pr("Tracer initialized"), Fn;
}, Nm = (e) => {
  const r = new URL(e).hostname;
  return r === "cde.openpaystaging.com" ? "https://otel.openpaysandbox.com/v1/traces" : r === "cde.getopenpay.com" ? "https://otel.getopenpay.com/v1/traces" : "http://localhost:4319/v1/traces";
};
class Lm {
  constructor(r, t, o, i) {
    this.handleMessage = (a) => {
      if (!a.source) {
        console.warn("[OJS] No source found");
        return;
      }
      if (Gn(a.origin) !== Gn(this.baseUrl) || typeof a.data == "object" && a.data.penpal || typeof a.data == "object" && a.data.source && a.data.source === "react-devtools-bridge")
        return;
      let s = null;
      try {
        s = Cd(JSON.parse(a.data));
      } catch {
        return;
      }
      if (!this.validateEvent(s)) return;
      const { elementId: c, payload: l } = s, u = l.type;
      switch (u) {
        case "LAYOUT":
          this.internalCallbacks.setFormHeight(l.height ? `${l.height}px` : "100%");
          break;
        case "FOCUS":
          this.formCallbacks.get.onFocus(c, l.elementType);
          break;
        case "BLUR":
          this.formCallbacks.get.onBlur(c, l.elementType, {
            obfuscatedValue: l.obfuscatedValue
          });
          break;
        case "CHANGE":
          this.formCallbacks.get.onChange(c, l.elementType, l.errors);
          break;
        case "LOADED":
          this.eventTargets[c] = a.source, this.internalCallbacks.onCdeLoaded(l);
          break;
        case "LOAD_ERROR":
          this.internalCallbacks.onCdeLoadError(l.message);
          break;
        case "VALIDATION_ERROR":
          this.formCallbacks.get.onValidationError(l.elementType, l.errors, c);
          break;
        default:
          console.warn("[form] Unhandled event type:", u);
      }
    }, this.validateEvent = (a) => a.formId !== this.formId || !a.elementId ? (console.log("[OJS] formId", this.formId, a.formId), console.warn("[form] Ignoring unknown event:", a), !1) : this.nonces.has(a.nonce) ? (console.warn("[form] Ignoring duplicate event:", a), !1) : (this.nonces.add(a.nonce), !0), this.eventTargets = {}, this.nonces = /* @__PURE__ */ new Set(), this.formId = r, this.baseUrl = t, this.formCallbacks = o, this.internalCallbacks = i;
  }
}
const Gn = (e) => new URL(e).origin;
async function Mm(e, r) {
  const t = await Hn({
    iframe: e,
    debug: !1,
    childOrigin: r
  }).promise, o = await hd(t);
  if (!fd(t, o))
    throw new Error("Got invalid CDE connection object");
  return t;
}
class jm {
  constructor() {
    this.connections = /* @__PURE__ */ new Map();
  }
  addConnection(r, t) {
    this.connections.set(r, t);
  }
  getConnection() {
    const r = this.connections.values().next().value;
    if (!r)
      throw new Error("Connection not found");
    return r;
  }
  getAllConnections() {
    return this.connections;
  }
}
const Om = (e, r, t) => {
  const { stripePR: o } = e;
  o.publisher.subscribe((i) => {
    if (i.isSuccess) {
      const a = i.loadedValue, s = a.isAvailable && a.availableProviders.applePay, c = a.isAvailable && a.availableProviders.googlePay, l = {
        apple_pay: {
          isLoading: !1,
          isAvailable: s,
          startFlow: async (u) => {
            s && qn("apple_pay", a, r, t, u);
          }
        },
        google_pay: {
          isLoading: !1,
          isAvailable: c,
          startFlow: async (u) => {
            c && qn("google_pay", a, r, t, u);
          }
        }
      };
      t.get.onPaymentRequestLoad(l);
    }
  });
}, qn = (e, r, t, o, i) => j.stripePR.run({
  context: t,
  checkoutPaymentMethod: ye(t.checkoutPaymentMethods, e),
  nonCdeFormInputs: $(t.formDiv),
  formCallbacks: o,
  customParams: { provider: e, overridePaymentRequest: i?.overridePaymentRequest },
  initResult: r
}), Vn = "The secure form failed to load properly. Please check your internet connection, or try again later.", { log__: _e, err__: te } = R("op-form"), $e = class Ut {
  constructor(r) {
    this.isDestroyed = !1, this.cdeLoadEvent = new pt(), this.anyCdeConn = new pt(), this.context = new pt(), this.initFlows = wm(), this.isSubmitting = !1, this.startFormInit = async () => {
      const i = Qe.getTracer("openpay-js"), a = i.startSpan("form.initialize", {
        kind: gt.CLIENT,
        attributes: {
          "ojs.checkoutSecureToken": this.config.checkoutSecureToken,
          "ojs.deviceToken": this.deviceToken,
          "ojs.formId": this.formId,
          "ojs.version": this.ojsVersion,
          "ojs.release_version": this.ojsReleaseVersion,
          "ojs.base_url": this.baseUrl,
          "ojs.referrer": this.referrer
        }
      });
      return Be.with(Qe.setSpan(Be.active(), a), async () => {
        try {
          const s = this.createElement(we.CDE_BRIDGE);
          s.node.id = "__op_internal_cde_bridge", s.node.ariaHidden = "true", Object.assign(s.node.style, {
            border: "none",
            margin: "0px",
            padding: "0px",
            width: "1px",
            height: "1px",
            overflow: "hidden",
            visibility: "hidden",
            position: "fixed",
            pointerEvents: "none",
            userSelect: "none"
          }), s.mount("body"), _e("CDE bridge element mounted"), _e("Initializing OpenPay form:"), _e("├ Waiting for CDE load event...");
          const c = await this.cdeLoadEvent.waitForLoad({
            timeoutSec: 120,
            timeoutErrMsg: Vn
          });
          _e("├ CDE load event received"), a?.addEvent("waiting_for_cde_connection"), _e("├ Waiting for CDE connection...");
          const l = i?.startSpan("cde.connect", void 0, Be.active()), u = await this.anyCdeConn.waitForLoad({
            timeoutSec: 120,
            timeoutErrMsg: Vn
          });
          l?.end(), a?.addEvent("cde_connected"), _e("├ CDE connection received"), await md(u, this.deviceToken), _e("├ Creating OJS context, setting up handlers...");
          const d = Ut.buildOjsFlowContext(
            this.config,
            c,
            u,
            this.getFormDiv()
          );
          this.context.set(d), Om(this.initFlows, d, this.formCallbacks), _e("├ Starting OJS init flows..."), await bm(this.initFlows, d, this.formCallbacks), this.formCallbacks.get.onLoad(c.totalAmountAtoms, c.currency), _e("╰ Done initializing OJS flows."), a?.setStatus({ code: Te.OK }), b("form_loaded");
        } catch (s) {
          const c = ne(s);
          a?.setStatus({
            code: Te.ERROR,
            message: c
          }), te("╰ Error initializing OP form:", c), b("form_init_error", {
            error: c
          }), this.formCallbacks.get.onLoadError(c);
        } finally {
          a?.end();
        }
      });
    }, this.setFormHeight = (i) => {
      this.formProperties.height = i, this.registeredElements && Object.values(this.registeredElements).forEach((a) => {
        !a || a.type === we.CDE_BRIDGE || (a.node.style.height = i);
      });
    }, this.onCdeLoaded = (i) => {
      this.cdeLoadEvent.current.isSuccess || (this.cdeLoadEvent.set(i), b("cde_loaded"));
    }, this.onCdeLoadError = (i) => {
      this.cdeLoadEvent.current.isSuccess || (this.cdeLoadEvent.throw(new Error(i), i), b("cde_load_error", {
        error: i
      }));
    }, this.createElement = (i, a = {}) => {
      if (this.checkValidFormInstance("createElement"), !this.config) throw new Error("OpenPay form not initialized");
      const s = Qs.parse(i), c = document.createElement("iframe"), l = this.buildQueryString(a);
      c.name = `${s}-element`;
      const u = new URL(`/app/v1/${c.name}/`, this.config.baseUrl);
      return u.search = l.toString(), c.src = u.href, c.style.border = "none", c.style.width = "100%", this.registerIframe(s, c);
    }, this.registerIframe = (i, a) => {
      const s = {
        type: i,
        node: a,
        mount: (c) => {
          document.querySelector(c)?.appendChild(a), b("element_mounted", {
            element_type: i
          });
        }
      };
      return this.connectToElement({ type: s.type, node: s.node }), this.registeredElements || (this.registeredElements = {
        [we.CARD]: void 0,
        [we.CARD_NUMBER]: void 0,
        [we.CARD_EXPIRY]: void 0,
        [we.CARD_CVC]: void 0,
        [we.CDE_BRIDGE]: void 0
      }), this.registeredElements[i] = s, s;
    }, this.buildQueryString = (i) => {
      const a = new URLSearchParams();
      return a.append("referer", this.referrer), a.append("formId", this.formId), i.styles && a.append("styles", Am(i.styles)), a.append("secureToken", this.config.checkoutSecureToken), a;
    }, this.connectToElement = (i) => Tt(
      {
        spanName: "connect_to_element",
        checkoutSecureToken: this.config.checkoutSecureToken,
        deviceToken: this.deviceToken,
        formId: this.formId,
        version: this.ojsVersion,
        releaseVersion: this.ojsReleaseVersion,
        baseUrl: this.baseUrl,
        referrer: this.referrer
      },
      async () => {
        const a = await Mm(i.node);
        a.tracingContext = {
          checkoutSecureToken: this.config.checkoutSecureToken,
          deviceToken: this.deviceToken,
          formId: this.formId,
          version: this.ojsVersion,
          releaseVersion: this.ojsReleaseVersion,
          baseUrl: this.baseUrl,
          referrer: this.referrer
        }, this.connectionManager.addConnection(i.type, a), !this.anyCdeConn.current.isSuccess && i.type === we.CDE_BRIDGE && this.anyCdeConn.set(a);
      }
    ).catch((a) => te("[FORM] Error connecting to CDE iframe", a)), this.getFormDiv = () => document.querySelector(this.formTarget) ?? document.body, this.submitCard = async (i) => {
      if (this.isSubmitting) {
        te("Form is already submitting. Please wait for the submission to finish before submitting again.");
        return;
      }
      this.isSubmitting = !0;
      try {
        const a = await Tt(
          {
            spanName: "submit_card",
            checkoutSecureToken: this.config.checkoutSecureToken,
            deviceToken: this.deviceToken,
            formId: this.formId,
            version: this.ojsVersion,
            releaseVersion: this.ojsReleaseVersion,
            baseUrl: this.baseUrl,
            referrer: this.referrer,
            paymentRouteId: i?.paymentRouteId
          },
          async () => {
            b("submit_card", { ...i }), this.checkValidFormInstance("submitCard");
            const s = this.context.getValueIfLoadedElse(null);
            if (!s)
              throw new Error("Please wait for the form to finish loading before submitting.");
            await j.commonCC.run({
              context: s,
              checkoutPaymentMethod: ye(s.checkoutPaymentMethods, "credit_card"),
              nonCdeFormInputs: $(s.formDiv),
              formCallbacks: this.formCallbacks,
              customParams: {
                currentCdeConnections: this.connectionManager.getAllConnections(),
                paymentRouteId: i?.paymentRouteId
              },
              initResult: void 0
            });
          }
        );
        return this.isSubmitting = !1, a;
      } catch (a) {
        throw this.isSubmitting = !1, a;
      }
    }, this.getAvailablePaymentMethods = () => Tt(
      {
        spanName: "get_available_payment_methods",
        checkoutSecureToken: this.config.checkoutSecureToken,
        deviceToken: this.deviceToken,
        formId: this.formId,
        version: this.ojsVersion,
        releaseVersion: this.ojsReleaseVersion,
        baseUrl: this.baseUrl,
        referrer: this.referrer
      },
      () => {
        this.checkValidFormInstance("getAvailablePaymentMethods");
        const i = this.context.getValueIfLoadedElse(null);
        if (!i)
          throw new Error("Please wait for the form to finish loading before getting available payment methods.");
        const { processors: a, isAvailable: s } = Dn(
          this.initFlows
        ), { processors: c, isAvailable: l } = Un(
          this.initFlows
        ), u = this.initFlows.paypal.publisher.getValueIfLoadedElse(null)?.isAvailable ?? !1, d = i.checkoutPaymentMethods.some(
          (g) => g.processor_name === "pockyt" && g.provider === "paypal"
        ), _ = this.initFlows.loop.publisher.getValueIfLoadedElse(null)?.isAvailable ?? !1, f = this.initFlows.stripeLink.publisher.getValueIfLoadedElse(null), p = f?.isAvailable ?? !1, h = [
          {
            name: N.card,
            processors: [],
            isAvailable: !0
          },
          {
            name: N.applePay,
            processors: a,
            isAvailable: s
          },
          {
            name: N.googlePay,
            processors: c,
            isAvailable: l
          },
          {
            name: N.paypal,
            processors: u ? [V.Enum.paypal] : [],
            isAvailable: u
          },
          {
            name: N.pockytPaypal,
            processors: d ? [V.Enum.pockyt] : [],
            isAvailable: d
          },
          {
            name: N.loopCrypto,
            processors: _ ? [V.Enum.loop] : [],
            isAvailable: _
          },
          {
            name: N.stripeLink,
            processors: [V.Enum.stripe],
            isAvailable: p,
            controller: f?.isAvailable ? f.controller : void 0
          }
        ], y = {
          paypal: N.paypal,
          airwallexGooglePay: N.airwallexGooglePay,
          airwallexApplePay: N.airwallexApplePay,
          authorizeNetGooglePay: N.authorizenetGooglePay,
          authorizeNetApplePay: N.authorizenetApplePay,
          adyenGooglePay: N.adyenGooglePay,
          adyenApplePay: N.adyenApplePay
        };
        return [...Object.entries(this.initFlows).map(([g, w]) => {
          const E = w.publisher.getValueIfLoadedElse(null);
          return {
            name: y[g] ?? g,
            processors: [],
            isAvailable: E?.isAvailable ?? !1
          };
        }), ...h];
      }
    ), this.generalSubmit = async (i, a) => {
      if (this.isSubmitting) {
        te("Form is already submitting. Please wait for the submission to finish before submitting again.");
        return;
      }
      this.isSubmitting = !0;
      try {
        const s = await Tt(
          {
            spanName: "general_form_submit",
            checkoutSecureToken: this.config.checkoutSecureToken,
            deviceToken: this.deviceToken,
            formId: this.formId,
            version: this.ojsVersion,
            releaseVersion: this.ojsReleaseVersion,
            baseUrl: this.baseUrl,
            referrer: this.referrer
          },
          async () => {
            b("general_form_submit", { method: i, settings: a }), this.checkValidFormInstance("generalSubmit");
            const c = this.context.getValueIfLoadedElse(null);
            if (!c)
              throw new Error("Please wait for the form to finish loading before submitting.");
            switch (i) {
              case N.card:
                return this.submitCard(a);
              case N.pockytPaypal:
                return j.pockytPaypal.run({
                  context: c,
                  checkoutPaymentMethod: ye(
                    c.checkoutPaymentMethods,
                    Me.PAYPAL,
                    "pockyt"
                  ),
                  nonCdeFormInputs: $(c.formDiv),
                  formCallbacks: this.formCallbacks,
                  customParams: { settings: a },
                  initResult: void 0
                });
              case N.paypal:
                return j.paypal.run({
                  context: c,
                  checkoutPaymentMethod: ye(
                    c.checkoutPaymentMethods,
                    Me.PAYPAL,
                    "paypal"
                  ),
                  nonCdeFormInputs: $(c.formDiv),
                  initResult: void 0,
                  customParams: { settings: a },
                  formCallbacks: this.formCallbacks
                });
              case N.loopCrypto:
                return j.loopCrypto.run({
                  context: c,
                  checkoutPaymentMethod: ye(
                    c.checkoutPaymentMethods,
                    "crypto",
                    "loop"
                  ),
                  nonCdeFormInputs: $(c.formDiv),
                  formCallbacks: this.formCallbacks,
                  customParams: a,
                  initResult: void 0
                });
              case N.applePay: {
                const { startFlow: l } = Dn(this.initFlows);
                return l(a);
              }
              case N.googlePay: {
                const { startFlow: l } = Un(this.initFlows);
                return l(a);
              }
              // Keeping existing commented code for backward compatibility
              // TODO: Remove this in the future version
              case N.airwallexGooglePay: {
                const l = this.initFlows.airwallexGooglePay.publisher.getValueIfLoadedElse(null);
                if (!l) {
                  te(
                    "airwallex-google-pay is not available. Please check the availability using 'getAvailablePaymentMethods()'"
                  );
                  return;
                }
                return l.startFlow(a);
              }
              case N.airwallexApplePay: {
                const l = this.initFlows.airwallexApplePay.publisher.getValueIfLoadedElse(null);
                if (!l) {
                  te(
                    "airwallex-apple-pay is not available. Please check the availability using 'getAvailablePaymentMethods()'"
                  );
                  return;
                }
                return l.startFlow(a);
              }
              case N.authorizenetGooglePay: {
                const l = this.initFlows.authorizeNetGooglePay.publisher.getValueIfLoadedElse(null);
                if (!l) {
                  te(
                    "authorize-net-google-pay is not available. Please check the availability using 'getAvailablePaymentMethods()'"
                  );
                  return;
                }
                return l.startFlow(a);
              }
              case N.authorizenetApplePay: {
                const l = this.initFlows.authorizeNetApplePay.publisher.getValueIfLoadedElse(null);
                if (!l) {
                  te(
                    "authorize-net-apple-pay is not available. Please check the availability using 'getAvailablePaymentMethods()'"
                  );
                  return;
                }
                return l.startFlow(a);
              }
              case N.adyenGooglePay: {
                const l = this.initFlows.adyenGooglePay.publisher.getValueIfLoadedElse(null);
                if (!l) {
                  te(
                    "adyen-google-pay is not available. Please check the availability using 'getAvailablePaymentMethods()'"
                  );
                  return;
                }
                return l.startFlow(a);
              }
              case N.adyenApplePay: {
                const l = this.initFlows.adyenApplePay.publisher.getValueIfLoadedElse(null);
                if (!l) {
                  te(
                    "adyen-apple-pay is not available. Please check the availability using 'getAvailablePaymentMethods()'"
                  );
                  return;
                }
                return l.startFlow(a);
              }
              case N.airwallexACH:
                return j.airwallexACH.run({
                  context: c,
                  checkoutPaymentMethod: ye(
                    c.checkoutPaymentMethods,
                    Me.ACH,
                    "airwallex"
                  ),
                  nonCdeFormInputs: $(c.formDiv),
                  formCallbacks: this.formCallbacks,
                  customParams: a,
                  initResult: void 0
                });
              case N.airwallexEFT:
                return j.airwallexEFT.run({
                  context: c,
                  checkoutPaymentMethod: ye(
                    c.checkoutPaymentMethods,
                    Me.EFT,
                    "airwallex"
                  ),
                  nonCdeFormInputs: $(c.formDiv),
                  formCallbacks: this.formCallbacks,
                  customParams: a,
                  initResult: void 0
                });
              case N.airwallexBACS:
                return j.airwallexBACS.run({
                  context: c,
                  checkoutPaymentMethod: ye(
                    c.checkoutPaymentMethods,
                    Me.BACS,
                    "airwallex"
                  ),
                  nonCdeFormInputs: $(c.formDiv),
                  formCallbacks: this.formCallbacks,
                  customParams: a,
                  initResult: void 0
                });
              case N.airwallexSEPA:
                return j.airwallexSEPA.run({
                  context: c,
                  checkoutPaymentMethod: ye(
                    c.checkoutPaymentMethods,
                    Me.SEPA,
                    "airwallex"
                  ),
                  nonCdeFormInputs: $(c.formDiv),
                  formCallbacks: this.formCallbacks,
                  customParams: a,
                  initResult: void 0
                });
              case N.stripeLink: {
                te(
                  "StripeLink cannot be submitted manually. Please mount the button properly and if user completed the payment flow via StripeLink button, the payment will be submitted automatically."
                );
                return;
              }
              default:
                Et(i);
            }
          }
        );
        return this.isSubmitting = !1, s;
      } catch (s) {
        throw this.isSubmitting = !1, s;
      }
    }, this.submitWith = this.generalSubmit, this.submit = this.submitCard, this.destroy = () => {
      _e("Destroying OpenPay form..."), this.checkValidFormInstance("destroy"), this.isDestroyed = !0;
      for (const i of Object.values(this.registeredElements ?? {}))
        i && i.node.remove();
      z()?.removeEventListener("message", this.eventHandler.handleMessage.bind(this.eventHandler)), mu(), this.registeredElements = null, delete window.ojs, b("form_destroyed");
    }, this.updateCallbacks = (i) => {
      this.formCallbacks.setCallbacks(i);
    }, Ut.assignAsSingleton(this), this.ojsVersion = "0.5.17", this.ojsReleaseVersion = "local_build", this.baseUrl = r.baseUrl ?? "https://cde.getopenpay.com", this.config = { ...r, baseUrl: this.baseUrl }, this.formCallbacks = Pm.fromObject(r), this.registeredElements = null, this.formId = `opjs-form-${Fe()}`, this.referrer = window.location.origin, this.formTarget = r.formTarget ?? "body", this.formProperties = { height: "1px" }, this.connectionManager = new jm(), this.deviceToken = Bo(), pu();
    const { framework: t, version: o } = km();
    Ao(this.baseUrl).then((i) => {
      if (!Rr.current.isSuccess) {
        const a = {
          checkoutSecureToken: this.config.checkoutSecureToken,
          deviceToken: this.deviceToken,
          environment: i,
          framework: t,
          frameworkVersion: o,
          ojsVersion: this.ojsVersion,
          ojsReleaseVersion: this.ojsReleaseVersion,
          referrer: this.referrer,
          baseUrl: this.baseUrl
        };
        Rr.set(a);
      }
    }), b("form_init"), console.log("OJS VERSION", this.ojsVersion), r.allowTracing === !0 && Tm(this.ojsVersion, this.baseUrl), this.eventHandler = new Lm(this.formId, this.baseUrl, this.formCallbacks, {
      setFormHeight: this.setFormHeight,
      onCdeLoaded: this.onCdeLoaded,
      onCdeLoadError: this.onCdeLoadError
    }), z()?.addEventListener("message", this.eventHandler.handleMessage.bind(this.eventHandler)), this.startFormInit();
  }
  get checkoutSecureToken() {
    return this.config.checkoutSecureToken;
  }
  checkValidFormInstance(r = "unknown") {
    const t = Ut.getInstance(), o = {
      thisFormId: this.formId,
      currentFormId: t?.formId || "no-current-instance",
      isDestroyed: this.isDestroyed,
      checkoutToken: this.config.checkoutSecureToken.substring(0, 10) + "..."
    }, i = `
      [Warning] Invalid form instance detected.
      It looks like you are still using an old instance that has been destroyed.
      Please make sure you are using the latest instance of the form and cleanup event listeners.
      ───────────────────────────────────────────────────────────
      Debug Info:                                               
      - caller: ${r}
      - caller_form_id: ${o.thisFormId}
      - current_active_form_id: ${o.currentFormId}
      - is_destroyed: ${o.isDestroyed}
      - checkout_token: ${o.checkoutToken}
    `;
    return this.isDestroyed ? (te(i), b("outdated_form_instance", { error: i }), !1) : !t || t.formId !== this.formId ? (te(i), b("outdated_form_instance", { error: i }), !1) : !0;
  }
};
$e.ojsFlows = j, $e.assignAsSingleton = (e) => {
  if ($e.getInstance())
    throw new Error("OpenPay instance already exists. Only one instance is allowed.");
  window.ojs = e;
}, $e.getInstance = () => window.ojs ?? null, $e.buildOjsFlowContext = (e, r, t, o) => ({
  checkoutSecureToken: e.checkoutSecureToken,
  baseUrl: new URL(e.baseUrl ?? Vo).origin,
  formDiv: o,
  elementsSessionId: r.sessionId,
  checkoutPaymentMethods: r.checkoutPaymentMethods,
  anyCdeConnection: t,
  customInitParams: e.customInitParams ?? {},
  preventNavigationDuringSubmission: e.preventNavigationDuringSubmission
});
let Wt = $e;
const Dm = (e) => {
  const r = Ir.fromObject({
    onFocus: e.onFocus,
    onBlur: e.onBlur,
    onChange: e.onChange,
    onLoad: e.onLoad,
    onLoadError: e.onLoadError,
    onValidationError: e.onValidationError,
    onCheckoutStarted: e.onCheckoutStarted,
    onCheckoutSuccess: e.onCheckoutSuccess,
    onSetupPaymentMethodSuccess: e.onSetupPaymentMethodSuccess,
    onCheckoutError: e.onCheckoutError,
    onPaymentRequestLoad: e.onPaymentRequestLoad
  });
  return Wt.getInstance() && Wt.getInstance()?.updateCallbacks(r.get), r.get;
}, $n = "op_ojs_form", Jm = (e) => {
  const [r, t] = be(), [o, i] = be(null), [a, s] = be(!1), [c, l] = be(fn), [u, d] = be(fn), [_, f] = be(null), [p, h] = be(Gs), [y, g] = be({
    googlePay: mn,
    applePay: mn
  }), w = Dm({
    ...e,
    onLoad: (I, A) => {
      if (s(!0), e.onLoad?.(I, A), r) {
        const C = Vs(r.initFlows);
        l(C);
        const q = $s(r.initFlows);
        d(q);
      }
    }
  });
  if (Er(() => {
    if (r) return;
    const I = Wt.getInstance() ?? new Wt({
      checkoutSecureToken: e.checkoutSecureToken,
      formTarget: `#${$n}`,
      baseUrl: e.baseUrl,
      customInitParams: e.customInitParams,
      allowTracing: e.allowTracing ?? !1,
      preventNavigationDuringSubmission: e.preventNavigationDuringSubmission,
      ...w
    });
    t(I);
    const A = Um(I);
    return i(A), I.initFlows.stripeLink.publisher.subscribe((C) => {
      C.isSuccess && C.loadedValue.isAvailable && f(C.loadedValue.controller);
    }), I.initFlows.loop.publisher.subscribe((C) => {
      C.isSuccess && C.loadedValue.isAvailable ? h({
        isAvailable: !0,
        isLoading: !1,
        widget: C.loadedValue.widgetProps,
        config: C.loadedValue.initLoopConnectProps
      }) : C.isSuccess && !C.loadedValue.isAvailable && h({
        isAvailable: !1,
        isLoading: !1,
        widget: null,
        config: null
      });
    }), I.initFlows.airwallexGooglePay.publisher.subscribe((C) => {
      C.isSuccess && C.loadedValue && g((q) => ({
        applePay: q.applePay,
        googlePay: C.loadedValue
      }));
    }), I.initFlows.airwallexApplePay.publisher.subscribe((C) => {
      C.isSuccess && C.loadedValue && g((q) => ({
        googlePay: q.googlePay,
        applePay: C.loadedValue
      }));
    }), () => {
      I.destroy();
    };
  }, []), !r)
    return /* @__PURE__ */ ue(mr, {});
  const E = {
    submit: r.submitCard,
    submitWith: r.generalSubmit,
    applePay: c,
    googlePay: u,
    loaded: a,
    // Disable dynamic previews feature for now
    preview: {
      amount: null,
      isLoading: !1,
      error: null
    },
    stripeLink: _,
    airwallex: y,
    loop: p
  };
  return /* @__PURE__ */ ue(mr, { children: o ? /* @__PURE__ */ ue(io.Provider, { value: o, children: /* @__PURE__ */ ue("div", { id: $n, className: e.className, children: e.children(E) }) }) : /* @__PURE__ */ ue(mr, {}) });
}, Um = (e) => ({
  formId: e.formId,
  formHeight: e.formProperties.height,
  referrer: e.referrer,
  checkoutSecureToken: e.checkoutSecureToken,
  registerIframe: e.registerIframe,
  baseUrl: e.baseUrl
});
export {
  Ym as C,
  Jm as E,
  L as F,
  Nr as H,
  Qe as M,
  Us as P,
  ju as Q,
  An as S,
  Be as T,
  yt as X,
  Lu as Z,
  No as _,
  Vu as a,
  re as b,
  qr as c,
  Zu as d,
  gt as e,
  Lo as f,
  Vr as g,
  jo as h,
  $r as i,
  Bm as j,
  Zm as k,
  Km as l,
  Ds as m,
  Fs as n,
  oo as o,
  Ku as p,
  zm as q,
  Ys as u,
  Zt as v,
  Te as w,
  Xu as y
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXgtIX57MDA3fX4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IGNvbm5lY3RUb0NoaWxkIH0gZnJvbSAncGVucGFsJztcbmltcG9ydCB7IHogYXMgeiQxIH0gZnJvbSAnem9kJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyB2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsganN4LCBGcmFnbWVudCB9IGZyb20gJ3JlYWN0L2pzeC1ydW50aW1lJztcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQsIHVzZVN0YXRlLCB1c2VSZWYsIHVzZU1lbW8sIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcblxuZnVuY3Rpb24gZml4UHJvdG8odGFyZ2V0LCBwcm90b3R5cGUpIHtcbiAgdmFyIHNldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mO1xuICBzZXRQcm90b3R5cGVPZiA/IHNldFByb3RvdHlwZU9mKHRhcmdldCwgcHJvdG90eXBlKSA6IHRhcmdldC5fX3Byb3RvX18gPSBwcm90b3R5cGU7XG59XG5mdW5jdGlvbiBmaXhTdGFjayh0YXJnZXQsIGZuKSB7XG4gIGlmIChmbiA9PT0gdm9pZCAwKSB7XG4gICAgZm4gPSB0YXJnZXQuY29uc3RydWN0b3I7XG4gIH1cblxuICB2YXIgY2FwdHVyZVN0YWNrVHJhY2UgPSBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZTtcbiAgY2FwdHVyZVN0YWNrVHJhY2UgJiYgY2FwdHVyZVN0YWNrVHJhY2UodGFyZ2V0LCBmbik7XG59XG5cbnZhciBfX2V4dGVuZHMkMSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9leHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gZXh0ZW5kU3RhdGljcyhkLCBiKSB7XG4gICAgX2V4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwge1xuICAgICAgX19wcm90b19fOiBbXVxuICAgIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZC5fX3Byb3RvX18gPSBiO1xuICAgIH0gfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgIGZvciAodmFyIHAgaW4gYikge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIF9leHRlbmRTdGF0aWNzKGQsIGIpO1xuICB9O1xuXG4gIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcblxuICAgIF9leHRlbmRTdGF0aWNzKGQsIGIpO1xuXG4gICAgZnVuY3Rpb24gX18oKSB7XG4gICAgICB0aGlzLmNvbnN0cnVjdG9yID0gZDtcbiAgICB9XG5cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gIH07XG59KCk7XG5cbihmdW5jdGlvbiAoX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyQxKEN1c3RvbUVycm9yLCBfc3VwZXIpO1xuXG4gIGZ1bmN0aW9uIEN1c3RvbUVycm9yKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICB2YXIgX25ld1RhcmdldCA9IHRoaXMuY29uc3RydWN0b3I7XG5cbiAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtZXNzYWdlLCBvcHRpb25zKSB8fCB0aGlzO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF90aGlzLCAnbmFtZScsIHtcbiAgICAgIHZhbHVlOiBfbmV3VGFyZ2V0Lm5hbWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIGZpeFByb3RvKF90aGlzLCBfbmV3VGFyZ2V0LnByb3RvdHlwZSk7XG4gICAgZml4U3RhY2soX3RoaXMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHJldHVybiBDdXN0b21FcnJvcjtcbn0pKEVycm9yKTtcblxuY29uc3QgUmVxdWlyZWRTdHJpbmcgPSB6JDEuc3RyaW5nKCkudHJpbSgpLm1pbigxLCB7IG1lc3NhZ2U6IGBQbGVhc2UgZmlsbCBpbiB0aGlzIGZpZWxkYCB9KTtcbmNvbnN0IE9wdGlvbmFsU3RyaW5nID0geiQxLnN0cmluZygpLnRyaW0oKS5vcHRpb25hbCgpO1xuY29uc3QgbnVsbE9yVW5kZWZPciQxID0gKHpUeXBlKSA9PiB6JDEubnVsbGFibGUoelR5cGUub3B0aW9uYWwoKSk7XG52YXIgRmllbGROYW1lID0gLyogQF9fUFVSRV9fICovICgoRmllbGROYW1lMikgPT4ge1xuICBGaWVsZE5hbWUyW1wiRklSU1RfTkFNRVwiXSA9IFwiZmlyc3ROYW1lXCI7XG4gIEZpZWxkTmFtZTJbXCJMQVNUX05BTUVcIl0gPSBcImxhc3ROYW1lXCI7XG4gIEZpZWxkTmFtZTJbXCJQSE9ORVwiXSA9IFwicGhvbmVcIjtcbiAgRmllbGROYW1lMltcIkVNQUlMXCJdID0gXCJlbWFpbFwiO1xuICBGaWVsZE5hbWUyW1wiTElORTFcIl0gPSBcImxpbmUxXCI7XG4gIEZpZWxkTmFtZTJbXCJMSU5FMlwiXSA9IFwibGluZTJcIjtcbiAgRmllbGROYW1lMltcIkxJTkUzXCJdID0gXCJsaW5lM1wiO1xuICBGaWVsZE5hbWUyW1wiQ0lUWVwiXSA9IFwiY2l0eVwiO1xuICBGaWVsZE5hbWUyW1wiU1RBVEVcIl0gPSBcInN0YXRlXCI7XG4gIEZpZWxkTmFtZTJbXCJDT1VOVFJZXCJdID0gXCJjb3VudHJ5XCI7XG4gIEZpZWxkTmFtZTJbXCJaSVBfQ09ERVwiXSA9IFwiemlwQ29kZVwiO1xuICBGaWVsZE5hbWUyW1wiU0hJUFBJTkdfTElORTFcIl0gPSBcInNoaXBwaW5nQWRkcmVzc0xpbmUxXCI7XG4gIEZpZWxkTmFtZTJbXCJTSElQUElOR19MSU5FMlwiXSA9IFwic2hpcHBpbmdBZGRyZXNzTGluZTJcIjtcbiAgRmllbGROYW1lMltcIlNISVBQSU5HX0xJTkUzXCJdID0gXCJzaGlwcGluZ0FkZHJlc3NMaW5lM1wiO1xuICBGaWVsZE5hbWUyW1wiU0hJUFBJTkdfQ0lUWVwiXSA9IFwic2hpcHBpbmdBZGRyZXNzQ2l0eVwiO1xuICBGaWVsZE5hbWUyW1wiU0hJUFBJTkdfU1RBVEVcIl0gPSBcInNoaXBwaW5nQWRkcmVzc1N0YXRlXCI7XG4gIEZpZWxkTmFtZTJbXCJTSElQUElOR19DT1VOVFJZXCJdID0gXCJzaGlwcGluZ0FkZHJlc3NDb3VudHJ5XCI7XG4gIEZpZWxkTmFtZTJbXCJTSElQUElOR19aSVBfQ09ERVwiXSA9IFwic2hpcHBpbmdBZGRyZXNzWmlwQ29kZVwiO1xuICBGaWVsZE5hbWUyW1wiSVNfU0hJUFBJTkdfU0FNRV9BU19CSUxMSU5HXCJdID0gXCJpc1NoaXBwaW5nU2FtZUFzQmlsbGluZ1wiO1xuICBGaWVsZE5hbWUyW1wiUFJPTU9USU9OX0NPREVcIl0gPSBcInByb21vdGlvbkNvZGVcIjtcbiAgRmllbGROYW1lMltcIklTX0JVU0lORVNTX1BVUkNIQVNFXCJdID0gXCJpc0J1c2luZXNzUHVyY2hhc2VcIjtcbiAgRmllbGROYW1lMltcIkJVU0lORVNTX05BTUVcIl0gPSBcImJ1c2luZXNzTmFtZVwiO1xuICBGaWVsZE5hbWUyW1wiVEFYX0lEXCJdID0gXCJ0YXhJZFwiO1xuICBGaWVsZE5hbWUyW1wiVEFYX0lEX1RZUEVcIl0gPSBcInRheElkVHlwZVwiO1xuICByZXR1cm4gRmllbGROYW1lMjtcbn0pKEZpZWxkTmFtZSB8fCB7fSk7XG5jb25zdCBGaWVsZE5hbWVFbnVtID0geiQxLm5hdGl2ZUVudW0oRmllbGROYW1lKTtcbnZhciBQcml2YXRlRmllbGROYW1lID0gLyogQF9fUFVSRV9fICovICgoUHJpdmF0ZUZpZWxkTmFtZTIpID0+IHtcbiAgUHJpdmF0ZUZpZWxkTmFtZTJbXCJDQVJEX05VTUJFUlwiXSA9IFwiY2FyZE51bWJlclwiO1xuICBQcml2YXRlRmllbGROYW1lMltcIkNBUkRfRVhQSVJZXCJdID0gXCJjYXJkRXhwaXJ5XCI7XG4gIFByaXZhdGVGaWVsZE5hbWUyW1wiQ0FSRF9DVkNcIl0gPSBcImNhcmRDdmNcIjtcbiAgcmV0dXJuIFByaXZhdGVGaWVsZE5hbWUyO1xufSkoUHJpdmF0ZUZpZWxkTmFtZSB8fCB7fSk7XG5jb25zdCBQcml2YXRlRmllbGROYW1lRW51bSA9IHokMS5uYXRpdmVFbnVtKFByaXZhdGVGaWVsZE5hbWUpO1xuY29uc3QgQWxsRmllbGROYW1lcyA9IHokMS51bmlvbihbRmllbGROYW1lRW51bSwgUHJpdmF0ZUZpZWxkTmFtZUVudW1dKTtcbnZhciBFbGVtZW50VHlwZUVudW0gPSAvKiBAX19QVVJFX18gKi8gKChFbGVtZW50VHlwZUVudW0yKSA9PiB7XG4gIEVsZW1lbnRUeXBlRW51bTJbXCJDQVJEXCJdID0gXCJjYXJkXCI7XG4gIEVsZW1lbnRUeXBlRW51bTJbXCJDQVJEX05VTUJFUlwiXSA9IFwiY2FyZC1udW1iZXJcIjtcbiAgRWxlbWVudFR5cGVFbnVtMltcIkNBUkRfRVhQSVJZXCJdID0gXCJjYXJkLWV4cGlyeVwiO1xuICBFbGVtZW50VHlwZUVudW0yW1wiQ0FSRF9DVkNcIl0gPSBcImNhcmQtY3ZjXCI7XG4gIEVsZW1lbnRUeXBlRW51bTJbXCJDREVfQlJJREdFXCJdID0gXCJjZGUtYnJpZGdlXCI7XG4gIHJldHVybiBFbGVtZW50VHlwZUVudW0yO1xufSkoRWxlbWVudFR5cGVFbnVtIHx8IHt9KTtcbnokMS5lbnVtKFtcImNhcmRcIiwgXCJjYXJkLW51bWJlclwiLCBcImNhcmQtZXhwaXJ5XCIsIFwiY2FyZC1jdmNcIiwgXCJjZGUtYnJpZGdlXCJdKTtcbmNvbnN0IENoZWNrb3V0UGF5bWVudE1ldGhvZCQxID0geiQxLm9iamVjdCh7XG4gIHByb3ZpZGVyOiB6JDEuc3RyaW5nKCksXG4gIHByb2Nlc3Nvcl9uYW1lOiBudWxsT3JVbmRlZk9yJDEoeiQxLnN0cmluZygpKSxcbiAgbWV0YWRhdGE6IG51bGxPclVuZGVmT3IkMSh6JDEucmVjb3JkKHokMS5zdHJpbmcoKSwgeiQxLmFueSgpKSlcbn0pO1xuY29uc3QgUGF5bWVudE1ldGhvZE1pbmltYWwgPSB6JDEub2JqZWN0KHtcbiAgaWQ6IHokMS5zdHJpbmcoKVxufSk7XG5jb25zdCBCYXNlRWxlbWVudHNTdHlsZSA9IHokMS5vYmplY3Qoe1xuICBiYWNrZ3JvdW5kQ29sb3I6IE9wdGlvbmFsU3RyaW5nLFxuICBjb2xvcjogT3B0aW9uYWxTdHJpbmcsXG4gIGZvbnRGYW1pbHk6IE9wdGlvbmFsU3RyaW5nLFxuICBmb250U2l6ZTogT3B0aW9uYWxTdHJpbmcsXG4gIGZvbnRXZWlnaHQ6IE9wdGlvbmFsU3RyaW5nLFxuICBtYXJnaW46IE9wdGlvbmFsU3RyaW5nLFxuICBwYWRkaW5nOiBPcHRpb25hbFN0cmluZyxcbiAgbGV0dGVyU3BhY2luZzogT3B0aW9uYWxTdHJpbmcsXG4gIGxpbmVIZWlnaHQ6IE9wdGlvbmFsU3RyaW5nLFxuICBoaWRlSWNvbjogT3B0aW9uYWxTdHJpbmcsXG4gIHBsYWNlaG9sZGVyU3R5bGU6IHokMS5vYmplY3Qoe1xuICAgIGNvbG9yOiBPcHRpb25hbFN0cmluZyxcbiAgICBmb250U2l6ZTogT3B0aW9uYWxTdHJpbmcsXG4gICAgZm9udFdlaWdodDogT3B0aW9uYWxTdHJpbmcsXG4gICAgZm9udEZhbWlseTogT3B0aW9uYWxTdHJpbmcsXG4gICAgbGV0dGVyU3BhY2luZzogT3B0aW9uYWxTdHJpbmcsXG4gICAgbGluZUhlaWdodDogT3B0aW9uYWxTdHJpbmdcbiAgfSkub3B0aW9uYWwoKVxufSk7XG5CYXNlRWxlbWVudHNTdHlsZS5leHRlbmQoe1xuICBkaXNhYmxlQXV0b0ZpbGw6IE9wdGlvbmFsU3RyaW5nLFxuICBwbGFjZWhvbGRlcjogeiQxLm9iamVjdCh7XG4gICAgY2FyZE51bWJlcjogT3B0aW9uYWxTdHJpbmcsXG4gICAgZXhwaXJ5OiBPcHRpb25hbFN0cmluZyxcbiAgICBjdmM6IE9wdGlvbmFsU3RyaW5nXG4gIH0pLm9wdGlvbmFsKClcbn0pO1xuQmFzZUVsZW1lbnRzU3R5bGUuZXh0ZW5kKHtcbiAgZGlzYWJsZUF1dG9GaWxsOiBPcHRpb25hbFN0cmluZyxcbiAgcGxhY2Vob2xkZXI6IHokMS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAvKipcbiAgICogVGhlIGNhcmQgaWNvbiBhdCB0aGUgc3RhcnQgb2YgdGhlIGNhcmQgbnVtYmVyIGlucHV0IGZpZWxkXG4gICAqIEl0IHdvbid0IGFmZmVjdCBhZnRlciB0aGUgaWNvbiBjaGFuZ2VkIHRvIGNhcmQgYnJhbmQgYWZ0ZXIgdGhlIHVzZXIgaW5wdXQgdGhlIGNhcmQgbnVtYmVyXG4gICAqL1xuICBpY29uOiB6JDEub2JqZWN0KHtcbiAgICBjb2xvcjogeiQxLnN0cmluZygpLm9wdGlvbmFsKClcbiAgfSkub3B0aW9uYWwoKVxufSk7XG5CYXNlRWxlbWVudHNTdHlsZS5leHRlbmQoe1xuICBkaXNhYmxlQXV0b0ZpbGw6IE9wdGlvbmFsU3RyaW5nLFxuICBwbGFjZWhvbGRlcjogeiQxLnN0cmluZygpLm9wdGlvbmFsKClcbn0pO1xuQmFzZUVsZW1lbnRzU3R5bGUuZXh0ZW5kKHtcbiAgZGlzYWJsZUF1dG9GaWxsOiBPcHRpb25hbFN0cmluZyxcbiAgcGxhY2Vob2xkZXI6IHokMS5zdHJpbmcoKS5vcHRpb25hbCgpXG59KTtcbmNvbnN0IEV2ZW50VHlwZSA9IHokMS5lbnVtKFtcbiAgLy8gRWxlbWVudCAtPiBGb3JtXG4gIFwiTEFZT1VUXCIsXG4gIFwiTE9BREVEXCIsXG4gIFwiQkxVUlwiLFxuICBcIkZPQ1VTXCIsXG4gIFwiQ0hBTkdFXCIsXG4gIFwiVE9LRU5JWkVfU1RBUlRFRFwiLFxuICBcIkNIRUNLT1VUX1NUQVJURURcIixcbiAgXCJQQVlNRU5UX0ZMT1dfU1RBUlRFRFwiLFxuICBcIlRPS0VOSVpFX1NVQ0NFU1NcIixcbiAgXCJDSEVDS09VVF9TVUNDRVNTXCIsXG4gIFwiTE9BRF9FUlJPUlwiLFxuICBcIlZBTElEQVRJT05fRVJST1JcIixcbiAgXCJUT0tFTklaRV9FUlJPUlwiLFxuICBcIkNIRUNLT1VUX0VSUk9SXCIsXG4gIFwiU0VUVVBfUEFZTUVOVF9NRVRIT0RfU1VDQ0VTU1wiLFxuICAvLyBGb3JtIC0+IEVsZW1lbnRcbiAgXCJUT0tFTklaRVwiLFxuICBcIkNIRUNLT1VUXCIsXG4gIFwiU1RBUlRfUEFZTUVOVF9GTE9XXCJcbl0pO1xuY29uc3QgR2VuZXJpY0V2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIlRPS0VOSVpFX1NUQVJURURcIiwgXCJDSEVDS09VVF9TVEFSVEVEXCJdKTtcbmNvbnN0IEdlbmVyaWNFdmVudFBheWxvYWQgPSB6JDEub2JqZWN0KHsgdHlwZTogR2VuZXJpY0V2ZW50VHlwZSB9KTtcbmNvbnN0IElucHV0RXZlbnRUeXBlID0gRXZlbnRUeXBlLmV4dHJhY3QoW1wiQkxVUlwiLCBcIkZPQ1VTXCIsIFwiQ0hBTkdFXCJdKTtcbmNvbnN0IElucHV0RXZlbnRQYXlsb2FkID0geiQxLm9iamVjdCh7XG4gIHR5cGU6IElucHV0RXZlbnRUeXBlLFxuICBlbGVtZW50VHlwZTogUHJpdmF0ZUZpZWxkTmFtZUVudW0sXG4gIGVycm9yczogeiQxLmFycmF5KHokMS5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgb2JmdXNjYXRlZFZhbHVlOiB6JDEuc3RyaW5nKCkub3B0aW9uYWwoKVxufSk7XG5jb25zdCBFcnJvckV2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIkxPQURfRVJST1JcIiwgXCJUT0tFTklaRV9FUlJPUlwiLCBcIkNIRUNLT1VUX0VSUk9SXCJdKTtcbmNvbnN0IEVycm9yRXZlbnRQYXlsb2FkID0geiQxLm9iamVjdCh7XG4gIHR5cGU6IEVycm9yRXZlbnRUeXBlLFxuICBtZXNzYWdlOiBSZXF1aXJlZFN0cmluZyxcbiAgaGVhZGVyczogeiQxLnJlY29yZCh6JDEuc3RyaW5nKCksIHokMS5zdHJpbmcoKSkub3B0aW9uYWwoKVxufSk7XG5jb25zdCBWYWxpZGF0aW9uRXJyb3JFdmVudFR5cGUgPSBFdmVudFR5cGUuZXh0cmFjdChbXCJWQUxJREFUSU9OX0VSUk9SXCJdKTtcbmNvbnN0IFZhbGlkYXRpb25FcnJvckV2ZW50UGF5bG9hZCA9IHokMS5vYmplY3Qoe1xuICB0eXBlOiBWYWxpZGF0aW9uRXJyb3JFdmVudFR5cGUsXG4gIGVsZW1lbnRUeXBlOiBBbGxGaWVsZE5hbWVzLFxuICBlcnJvcnM6IHokMS5hcnJheSh6JDEuc3RyaW5nKCkpXG59KTtcbmNvbnN0IExheW91dEV2ZW50UGF5bG9hZCA9IHokMS5vYmplY3Qoe1xuICB0eXBlOiB6JDEubGl0ZXJhbChFdmVudFR5cGUuZW51bS5MQVlPVVQpLFxuICBoZWlnaHQ6IFJlcXVpcmVkU3RyaW5nXG59KTtcbmNvbnN0IExvYWRlZEV2ZW50UGF5bG9hZCA9IHokMS5vYmplY3Qoe1xuICB0eXBlOiB6JDEubGl0ZXJhbChFdmVudFR5cGUuZW51bS5MT0FERUQpLFxuICBzZXNzaW9uSWQ6IFJlcXVpcmVkU3RyaW5nLFxuICB0b3RhbEFtb3VudEF0b21zOiB6JDEubnVtYmVyKCksXG4gIGN1cnJlbmN5OiBPcHRpb25hbFN0cmluZyxcbiAgY2hlY2tvdXRQYXltZW50TWV0aG9kczogeiQxLmFycmF5KENoZWNrb3V0UGF5bWVudE1ldGhvZCQxKVxufSk7XG5jb25zdCBQYXltZW50Rmxvd1N0YXJ0ZWRFdmVudFBheWxvYWQgPSB6JDEub2JqZWN0KHtcbiAgdHlwZTogeiQxLmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uUEFZTUVOVF9GTE9XX1NUQVJURUQpLFxuICBuZXh0QWN0aW9uTWV0YWRhdGE6IHokMS5yZWNvcmQoeiQxLnN0cmluZygpLCB6JDEuYW55KCkpLFxuICBwYXltZW50Rmxvd01ldGFkYXRhOiB6JDEuYW55KCkub3B0aW9uYWwoKSxcbiAgc3RhcnRQRk1ldGFkYXRhOiB6JDEub3B0aW9uYWwoeiQxLnJlY29yZCh6JDEuc3RyaW5nKCksIHokMS5hbnkoKSkpXG59KTtcbmNvbnN0IFNldHVwQ2hlY2tvdXRTdWNjZXNzRXZlbnRQYXlsb2FkID0geiQxLm9iamVjdCh7XG4gIHR5cGU6IHokMS5saXRlcmFsKEV2ZW50VHlwZS5lbnVtLlNFVFVQX1BBWU1FTlRfTUVUSE9EX1NVQ0NFU1MpLFxuICBwYXltZW50TWV0aG9kSWQ6IHokMS5zdHJpbmcoKVxufSk7XG5jb25zdCBSZXF1aXJlZEZvcm1GaWVsZHMgPSB6JDEub2JqZWN0KHtcbiAgW1wiZW1haWxcIiAvKiBFTUFJTCAqL106IFJlcXVpcmVkU3RyaW5nLmVtYWlsKHsgbWVzc2FnZTogXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzXCIgfSksXG4gIFtcImZpcnN0TmFtZVwiIC8qIEZJUlNUX05BTUUgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgW1wibGFzdE5hbWVcIiAvKiBMQVNUX05BTUUgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgW1wicHJvbW90aW9uQ29kZVwiIC8qIFBST01PVElPTl9DT0RFICovXTogT3B0aW9uYWxTdHJpbmcsXG4gIFtcImxpbmUxXCIgLyogTElORTEgKi9dOiBPcHRpb25hbFN0cmluZyxcbiAgW1wibGluZTJcIiAvKiBMSU5FMiAqL106IE9wdGlvbmFsU3RyaW5nLFxuICBbXCJsaW5lM1wiIC8qIExJTkUzICovXTogT3B0aW9uYWxTdHJpbmcsXG4gIFtcImNpdHlcIiAvKiBDSVRZICovXTogT3B0aW9uYWxTdHJpbmcsXG4gIFtcInN0YXRlXCIgLyogU1RBVEUgKi9dOiBPcHRpb25hbFN0cmluZyxcbiAgW1wiY291bnRyeVwiIC8qIENPVU5UUlkgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgW1wiemlwQ29kZVwiIC8qIFpJUF9DT0RFICovXTogT3B0aW9uYWxTdHJpbmcsXG4gIFtcImlzU2hpcHBpbmdTYW1lQXNCaWxsaW5nXCIgLyogSVNfU0hJUFBJTkdfU0FNRV9BU19CSUxMSU5HICovXTogeiQxLmN1c3RvbSgpLm9wdGlvbmFsKCkuZGVmYXVsdCh0cnVlKSxcbiAgW1wic2hpcHBpbmdBZGRyZXNzTGluZTFcIiAvKiBTSElQUElOR19MSU5FMSAqL106IE9wdGlvbmFsU3RyaW5nLFxuICBbXCJzaGlwcGluZ0FkZHJlc3NMaW5lMlwiIC8qIFNISVBQSU5HX0xJTkUyICovXTogT3B0aW9uYWxTdHJpbmcsXG4gIFtcInNoaXBwaW5nQWRkcmVzc0xpbmUzXCIgLyogU0hJUFBJTkdfTElORTMgKi9dOiBPcHRpb25hbFN0cmluZyxcbiAgW1wic2hpcHBpbmdBZGRyZXNzQ2l0eVwiIC8qIFNISVBQSU5HX0NJVFkgKi9dOiBPcHRpb25hbFN0cmluZyxcbiAgW1wic2hpcHBpbmdBZGRyZXNzU3RhdGVcIiAvKiBTSElQUElOR19TVEFURSAqL106IE9wdGlvbmFsU3RyaW5nLFxuICBbXCJzaGlwcGluZ0FkZHJlc3NDb3VudHJ5XCIgLyogU0hJUFBJTkdfQ09VTlRSWSAqL106IE9wdGlvbmFsU3RyaW5nLFxuICBbXCJzaGlwcGluZ0FkZHJlc3NaaXBDb2RlXCIgLyogU0hJUFBJTkdfWklQX0NPREUgKi9dOiBPcHRpb25hbFN0cmluZyxcbiAgW1wiYnVzaW5lc3NOYW1lXCIgLyogQlVTSU5FU1NfTkFNRSAqL106IE9wdGlvbmFsU3RyaW5nLFxuICBbXCJ0YXhJZFwiIC8qIFRBWF9JRCAqL106IE9wdGlvbmFsU3RyaW5nLFxuICBbXCJ0YXhJZFR5cGVcIiAvKiBUQVhfSURfVFlQRSAqL106IE9wdGlvbmFsU3RyaW5nXG59KTtcbmNvbnN0IFBSRm9ybUZpZWxkcyA9IHokMS5vYmplY3Qoe1xuICBbXCJlbWFpbFwiIC8qIEVNQUlMICovXTogUmVxdWlyZWRTdHJpbmcuZW1haWwoeyBtZXNzYWdlOiBcIlBsZWFzZSBlbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3NcIiB9KSxcbiAgW1wiZmlyc3ROYW1lXCIgLyogRklSU1RfTkFNRSAqL106IE9wdGlvbmFsU3RyaW5nLFxuICBbXCJsYXN0TmFtZVwiIC8qIExBU1RfTkFNRSAqL106IE9wdGlvbmFsU3RyaW5nLFxuICBbXCJwcm9tb3Rpb25Db2RlXCIgLyogUFJPTU9USU9OX0NPREUgKi9dOiBPcHRpb25hbFN0cmluZyxcbiAgW1wibGluZTFcIiAvKiBMSU5FMSAqL106IE9wdGlvbmFsU3RyaW5nLFxuICBbXCJsaW5lMlwiIC8qIExJTkUyICovXTogT3B0aW9uYWxTdHJpbmcsXG4gIFtcImxpbmUzXCIgLyogTElORTMgKi9dOiBPcHRpb25hbFN0cmluZyxcbiAgW1wiY2l0eVwiIC8qIENJVFkgKi9dOiBPcHRpb25hbFN0cmluZyxcbiAgW1wic3RhdGVcIiAvKiBTVEFURSAqL106IE9wdGlvbmFsU3RyaW5nLFxuICBbXCJjb3VudHJ5XCIgLyogQ09VTlRSWSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJ6aXBDb2RlXCIgLyogWklQX0NPREUgKi9dOiBPcHRpb25hbFN0cmluZyxcbiAgW1wiaXNTaGlwcGluZ1NhbWVBc0JpbGxpbmdcIiAvKiBJU19TSElQUElOR19TQU1FX0FTX0JJTExJTkcgKi9dOiB6JDEuY3VzdG9tKCkub3B0aW9uYWwoKS5kZWZhdWx0KHRydWUpLFxuICBbXCJzaGlwcGluZ0FkZHJlc3NMaW5lMVwiIC8qIFNISVBQSU5HX0xJTkUxICovXTogT3B0aW9uYWxTdHJpbmcsXG4gIFtcInNoaXBwaW5nQWRkcmVzc0xpbmUyXCIgLyogU0hJUFBJTkdfTElORTIgKi9dOiBPcHRpb25hbFN0cmluZyxcbiAgW1wic2hpcHBpbmdBZGRyZXNzTGluZTNcIiAvKiBTSElQUElOR19MSU5FMyAqL106IE9wdGlvbmFsU3RyaW5nLFxuICBbXCJzaGlwcGluZ0FkZHJlc3NDaXR5XCIgLyogU0hJUFBJTkdfQ0lUWSAqL106IE9wdGlvbmFsU3RyaW5nLFxuICBbXCJzaGlwcGluZ0FkZHJlc3NTdGF0ZVwiIC8qIFNISVBQSU5HX1NUQVRFICovXTogT3B0aW9uYWxTdHJpbmcsXG4gIFtcInNoaXBwaW5nQWRkcmVzc0NvdW50cnlcIiAvKiBTSElQUElOR19DT1VOVFJZICovXTogT3B0aW9uYWxTdHJpbmcsXG4gIFtcInNoaXBwaW5nQWRkcmVzc1ppcENvZGVcIiAvKiBTSElQUElOR19aSVBfQ09ERSAqL106IE9wdGlvbmFsU3RyaW5nLFxuICBbXCJidXNpbmVzc05hbWVcIiAvKiBCVVNJTkVTU19OQU1FICovXTogT3B0aW9uYWxTdHJpbmcsXG4gIFtcInRheElkXCIgLyogVEFYX0lEICovXTogT3B0aW9uYWxTdHJpbmcsXG4gIFtcInRheElkVHlwZVwiIC8qIFRBWF9JRF9UWVBFICovXTogT3B0aW9uYWxTdHJpbmdcbn0pO1xueiQxLm9iamVjdCh7XG4gIFtcImxpbmUxXCIgLyogTElORTEgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgW1wiY2l0eVwiIC8qIENJVFkgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgW1wic3RhdGVcIiAvKiBTVEFURSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJjb3VudHJ5XCIgLyogQ09VTlRSWSAqL106IFJlcXVpcmVkU3RyaW5nXG59KTtcbnokMS5vYmplY3Qoe1xuICBbXCJzaGlwcGluZ0FkZHJlc3NDb3VudHJ5XCIgLyogU0hJUFBJTkdfQ09VTlRSWSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJzaGlwcGluZ0FkZHJlc3NaaXBDb2RlXCIgLyogU0hJUFBJTkdfWklQX0NPREUgKi9dOiBSZXF1aXJlZFN0cmluZ1xufSk7XG56JDEub2JqZWN0KHtcbiAgW1wic2hpcHBpbmdBZGRyZXNzTGluZTFcIiAvKiBTSElQUElOR19MSU5FMSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJzaGlwcGluZ0FkZHJlc3NDaXR5XCIgLyogU0hJUFBJTkdfQ0lUWSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJzaGlwcGluZ0FkZHJlc3NTdGF0ZVwiIC8qIFNISVBQSU5HX1NUQVRFICovXTogUmVxdWlyZWRTdHJpbmcsXG4gIFtcInNoaXBwaW5nQWRkcmVzc0NvdW50cnlcIiAvKiBTSElQUElOR19DT1VOVFJZICovXTogUmVxdWlyZWRTdHJpbmcsXG4gIFtcInNoaXBwaW5nQWRkcmVzc1ppcENvZGVcIiAvKiBTSElQUElOR19aSVBfQ09ERSAqL106IFJlcXVpcmVkU3RyaW5nXG59KTtcbmNvbnN0IFN1Ym1pdEV2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIlRPS0VOSVpFXCIsIFwiQ0hFQ0tPVVRcIiwgXCJTVEFSVF9QQVlNRU5UX0ZMT1dcIl0pO1xuY29uc3QgU3VibWl0RXZlbnRQYXlsb2FkID0geiQxLm9iamVjdCh7XG4gIHR5cGU6IFN1Ym1pdEV2ZW50VHlwZSxcbiAgc2Vzc2lvbklkOiBSZXF1aXJlZFN0cmluZyxcbiAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBDaGVja291dFBheW1lbnRNZXRob2QkMSxcbiAgcGF5bWVudEZsb3dNZXRhZGF0YTogeiQxLmFueSgpLm9wdGlvbmFsKCksXG4gIGRvTm90VXNlTGVnYWN5Q0NGbG93OiB6JDEuYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIGV4aXN0aW5nQ0NQTUlkOiBPcHRpb25hbFN0cmluZyxcbiAgcGF5bWVudFJvdXRlSWQ6IE9wdGlvbmFsU3RyaW5nXG59KS5leHRlbmQoUmVxdWlyZWRGb3JtRmllbGRzLnNoYXBlKTtcbmNvbnN0IFRva2VuaXplU3VjY2Vzc0V2ZW50UGF5bG9hZCA9IHokMS5vYmplY3Qoe1xuICB0eXBlOiB6JDEubGl0ZXJhbChFdmVudFR5cGUuZW51bS5UT0tFTklaRV9TVUNDRVNTKSxcbiAgaXNSZWFkeUZvckNoZWNrb3V0OiB6JDEuYm9vbGVhbigpXG59KTtcbmNvbnN0IENoZWNrb3V0U3VjY2Vzc0V2ZW50UGF5bG9hZCA9IHokMS5vYmplY3Qoe1xuICB0eXBlOiB6JDEubGl0ZXJhbChFdmVudFR5cGUuZW51bS5DSEVDS09VVF9TVUNDRVNTKSxcbiAgaW52b2ljZVVybHM6IHokMS5hcnJheSh6JDEuc3RyaW5nKCkpLFxuICBzdWJzY3JpcHRpb25JZHM6IHokMS5hcnJheSh6JDEuc3RyaW5nKCkpLFxuICBjdXN0b21lcklkOiB6JDEuc3RyaW5nKCksXG4gIHBheW1lbnRNZXRob2RJZDogT3B0aW9uYWxTdHJpbmdcbn0pO1xuY29uc3QgRXZlbnRQYXlsb2FkID0geiQxLmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICBHZW5lcmljRXZlbnRQYXlsb2FkLFxuICBJbnB1dEV2ZW50UGF5bG9hZCxcbiAgRXJyb3JFdmVudFBheWxvYWQsXG4gIFZhbGlkYXRpb25FcnJvckV2ZW50UGF5bG9hZCxcbiAgTGF5b3V0RXZlbnRQYXlsb2FkLFxuICBMb2FkZWRFdmVudFBheWxvYWQsXG4gIFN1Ym1pdEV2ZW50UGF5bG9hZCxcbiAgVG9rZW5pemVTdWNjZXNzRXZlbnRQYXlsb2FkLFxuICBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQsXG4gIFBheW1lbnRGbG93U3RhcnRlZEV2ZW50UGF5bG9hZCxcbiAgU2V0dXBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWRcbl0pO1xueiQxLm9iamVjdCh7XG4gIHBheWxvYWQ6IEV2ZW50UGF5bG9hZCxcbiAgbm9uY2U6IFJlcXVpcmVkU3RyaW5nLFxuICBmb3JtSWQ6IFJlcXVpcmVkU3RyaW5nLFxuICBlbGVtZW50SWQ6IFJlcXVpcmVkU3RyaW5nXG59KTtcbnokMS5vYmplY3Qoe1xuICBhbW91bnRBdG9tOiB6JDEubnVtYmVyKCksXG4gIC8qKlxuICAgKiBUaGUgdGhyZWUtbGV0dGVyIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgZm9yIHRoZSBwYXltZW50LlxuICAgKi9cbiAgY3VycmVuY3k6IFJlcXVpcmVkU3RyaW5nXG59KTtcbnokMS5lbnVtKFtcImFwcGxlX3BheVwiLCBcImdvb2dsZV9wYXlcIl0pO1xueiQxLm9iamVjdCh7XG4gIHNlY3VyZV90b2tlbjogeiQxLnN0cmluZygpLFxuICBwcm9tb3Rpb25fY29kZTogeiQxLnN0cmluZygpLm9wdGlvbmFsKClcbn0pO1xueiQxLm9iamVjdCh7XG4gIHNlY3VyZV90b2tlbjogeiQxLnN0cmluZygpLFxuICBleGlzdGluZ19jY19wbV9pZDogbnVsbE9yVW5kZWZPciQxKHokMS5zdHJpbmcoKSksXG4gIHRoZWlyX3BtX2lkOiBudWxsT3JVbmRlZk9yJDEoeiQxLnN0cmluZygpKSxcbiAgY2hlY2tvdXRfYXR0ZW1wdF9pZDogbnVsbE9yVW5kZWZPciQxKHokMS5zdHJpbmcoKSksXG4gIHByb2Nlc3Nvcl9zcGVjaWZpY19tZXRhZGF0YTogbnVsbE9yVW5kZWZPciQxKHokMS5yZWNvcmQoeiQxLnN0cmluZygpLCB6JDEuYW55KCkpKVxufSk7XG5jb25zdCBDaGVja291dFN1Y2Nlc3NSZXNwb25zZSA9IHokMS5vYmplY3Qoe1xuICBpbnZvaWNlX3VybHM6IHokMS5hcnJheSh6JDEuc3RyaW5nKCkpLFxuICBzdWJzY3JpcHRpb25faWRzOiB6JDEuYXJyYXkoeiQxLnN0cmluZygpKSxcbiAgY3VzdG9tZXJfaWQ6IHokMS5zdHJpbmcoKSxcbiAgcGF5bWVudF9tZXRob2RfaWQ6IG51bGxPclVuZGVmT3IkMSh6JDEuc3RyaW5nKCkpLFxuICBwcm9jZXNzb3JzX3VzZWQ6IG51bGxPclVuZGVmT3IkMSh6JDEuYXJyYXkoeiQxLnN0cmluZygpKSlcbn0pO1xuY29uc3QgRmllbGRWYWxpZGF0aW9uRXJyb3IgPSB6JDEub2JqZWN0KHtcbiAgZWxlbWVudFR5cGU6IHokMS5zdHJpbmcoKSxcbiAgZXJyb3JzOiB6JDEuYXJyYXkoeiQxLnN0cmluZygpKVxufSk7XG56JDEub2JqZWN0KHtcbiAgc2Vzc2lvbl9pZDogeiQxLnN0cmluZygpXG59KTtcbmNvbnN0IFRva2VuaXplQ2FyZEVycm9yUmVzcG9uc2UgPSB6JDEub2JqZWN0KHtcbiAgc3VjY2VzczogeiQxLmxpdGVyYWwoZmFsc2UpLFxuICBlcnJvcl90eXBlOiB6JDEubGl0ZXJhbChcInZhbGlkYXRpb25fZXJyb3JcIiksXG4gIGVycm9yczogeiQxLmFycmF5KEZpZWxkVmFsaWRhdGlvbkVycm9yKVxufSk7XG56JDEuZGlzY3JpbWluYXRlZFVuaW9uKFwic3VjY2Vzc1wiLCBbXG4gIHokMS5vYmplY3QoeyBzdWNjZXNzOiB6JDEubGl0ZXJhbCh0cnVlKSB9KSxcbiAgVG9rZW5pemVDYXJkRXJyb3JSZXNwb25zZVxuXSk7XG56JDEub2JqZWN0KHtcbiAgc2Vzc2lvbl9pZDogeiQxLnN0cmluZygpLFxuICBjaGVja291dF9wYXltZW50X21ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEsXG4gIG5vbl9jZGVfZm9ybV9maWVsZHM6IFJlcXVpcmVkRm9ybUZpZWxkcyxcbiAgZG9fbm90X3VzZV9sZWdhY3lfY2NfZmxvdzogeiQxLmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICBleGlzdGluZ19jY19wbV9pZDogbnVsbE9yVW5kZWZPciQxKHokMS5zdHJpbmcoKSksXG4gIGV4dHJhX21ldGFkYXRhOiB6JDEucmVjb3JkKHokMS5zdHJpbmcoKSwgeiQxLmFueSgpKSxcbiAgcGF5bWVudF9yb3V0ZV9pZDogbnVsbE9yVW5kZWZPciQxKHokMS5zdHJpbmcoKSksXG4gIGN1c3RvbWVyX2xhbmd1YWdlOiBudWxsT3JVbmRlZk9yJDEoeiQxLnN0cmluZygpKVxufSk7XG56JDEub2JqZWN0KHtcbiAgc2Vzc2lvbl9pZDogeiQxLnN0cmluZygpLFxuICBjaGVja291dF9wYXltZW50X21ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEsXG4gIG5vbl9jZGVfZm9ybV9maWVsZHM6IFJlcXVpcmVkRm9ybUZpZWxkcyxcbiAgZXh0cmFfbWV0YWRhdGE6IHokMS5yZWNvcmQoeiQxLnN0cmluZygpLCB6JDEuYW55KCkpLm9wdGlvbmFsKCksXG4gIHBheW1lbnRfcm91dGVfaWQ6IG51bGxPclVuZGVmT3IkMSh6JDEuc3RyaW5nKCkpLFxuICBjdXN0b21lcl9sYW5ndWFnZTogbnVsbE9yVW5kZWZPciQxKHokMS5zdHJpbmcoKSlcbn0pO1xueiQxLm9iamVjdCh7XG4gIHN0YXR1czogeiQxLmVudW0oW1wic3VjY2Vzc1wiIC8qIFNVQ0NFU1MgKi8sIFwiZmFpbHVyZVwiIC8qIEZBSUxVUkUgKi8sIFwiY2FuY2VsbGVkXCIgLyogQ0FOQ0VMTEVEICovXSksXG4gIGhyZWY6IHokMS5zdHJpbmcoKS5vcHRpb25hbCgpLm51bGxhYmxlKClcbn0pO1xueiQxLm9iamVjdCh7XG4gIGhyZWY6IHokMS5zdHJpbmcoKS5vcHRpb25hbCgpLm51bGxhYmxlKClcbn0pO1xueiQxLm9iamVjdCh7XG4gIHR5cGU6IHokMS5zdHJpbmcoKSxcbiAgcmVkaXJlY3RfdXJsOiB6JDEuc3RyaW5nKCksXG4gIGluaXRpYWxfaW50ZW50X2lkOiB6JDEuc3RyaW5nKCksXG4gIGNvbnNlbnRfaWQ6IHokMS5zdHJpbmcoKSxcbiAgdGhlaXJfcG1faWQ6IHokMS5zdHJpbmcoKS5vcHRpb25hbCgpXG59KTtcbmNvbnN0IEFXWEJhbmsgPSB6JDEub2JqZWN0KHtcbiAgYmFua19uYW1lOiB6JDEuc3RyaW5nKCksXG4gIGRpc3BsYXlfbmFtZTogeiQxLnN0cmluZygpLFxuICByZXNvdXJjZXM6IHokMS5vYmplY3Qoe1xuICAgIGxvZ29fdXJsOiB6JDEuc3RyaW5nKCkub3B0aW9uYWwoKVxuICB9KVxufSk7XG5jb25zdCBDb21tb25OZXh0QWN0aW9uTWV0YWRhdGEgPSB6JDEub2JqZWN0KHtcbiAgdHlwZTogeiQxLnN0cmluZygpLFxuICByZWRpcmVjdF91cmw6IG51bGxPclVuZGVmT3IkMSh6JDEuc3RyaW5nKCkpLFxuICBpbml0aWFsX2ludGVudF9pZDogbnVsbE9yVW5kZWZPciQxKHokMS5zdHJpbmcoKSksXG4gIGNvbnNlbnRfaWQ6IG51bGxPclVuZGVmT3IkMSh6JDEuc3RyaW5nKCkpLFxuICB0aGVpcl9wbV9pZDogbnVsbE9yVW5kZWZPciQxKHokMS5zdHJpbmcoKSksXG4gIHBheW1lbnRfc2Vzc2lvbjogbnVsbE9yVW5kZWZPciQxKHokMS5yZWNvcmQoeiQxLnN0cmluZygpLCB6JDEuYW55KCkpKSxcbiAgYXZhaWxhYmxlX2JhbmtzOiBudWxsT3JVbmRlZk9yJDEoeiQxLmFycmF5KEFXWEJhbmspKVxufSk7XG56JDEuZGlzY3JpbWluYXRlZFVuaW9uKFwicHJlc2VudFwiLCBbXG4gIHokMS5vYmplY3QoeyBwcmVzZW50OiB6JDEubGl0ZXJhbCh0cnVlKSwgaHJlZjogeiQxLnN0cmluZygpIH0pLFxuICB6JDEub2JqZWN0KHsgcHJlc2VudDogeiQxLmxpdGVyYWwoZmFsc2UpIH0pXG5dKTtcbnokMS5vYmplY3Qoe1xuICBwYXltZW50X21ldGhvZHM6IHokMS5hcnJheShQYXltZW50TWV0aG9kTWluaW1hbCksXG4gIHBheV9maXJzdF9zdWNjZXNzX3Jlc3BvbnNlOiBudWxsT3JVbmRlZk9yJDEoQ2hlY2tvdXRTdWNjZXNzUmVzcG9uc2UpLFxuICByZXF1aXJlZF91c2VyX2FjdGlvbnM6IG51bGxPclVuZGVmT3IkMSh6JDEuYXJyYXkoQ29tbW9uTmV4dEFjdGlvbk1ldGFkYXRhKSksXG4gIHBvc3RfY2hlY2tvdXRfcmVkaXJlY3RfdG86IG51bGxPclVuZGVmT3IkMSh6JDEuc3RyaW5nKCkpLFxuICBjaGVja291dF9zdWNjZXNzX3Jlc3BvbnNlOiBudWxsT3JVbmRlZk9yJDEoQ2hlY2tvdXRTdWNjZXNzUmVzcG9uc2UpXG59KTtcbmNvbnN0IEVGVEZvcm1EYXRhID0geiQxLm9iamVjdCh7XG4gIGluc3RpdHV0aW9uTnVtYmVyOiB6JDEuc3RyaW5nKCksXG4gIHRyYW5zaXROdW1iZXI6IHokMS5zdHJpbmcoKSxcbiAgYWNjb3VudE51bWJlcjogeiQxLnN0cmluZygpLFxuICBhY2NvdW50VHlwZTogeiQxLmVudW0oW1wicGVyc29uYWxcIiwgXCJidXNpbmVzc1wiXSlcbn0pO1xueiQxLm9iamVjdCh7XG4gIHN0YXR1czogeiQxLmVudW0oW1wic3VjY2Vzc1wiLCBcImZhaWx1cmVcIl0pLFxuICBwYXlsb2FkOiBFRlRGb3JtRGF0YS5vcHRpb25hbCgpXG59KTtcbmNvbnN0IEJBQ1NGb3JtRGF0YSA9IHokMS5vYmplY3Qoe1xuICBzb3J0Q29kZTogeiQxLnN0cmluZygpLFxuICBhY2NvdW50TnVtYmVyOiB6JDEuc3RyaW5nKCksXG4gIGFjY291bnRUeXBlOiB6JDEuZW51bShbXCJwZXJzb25hbFwiLCBcImJ1c2luZXNzXCJdKVxufSk7XG56JDEub2JqZWN0KHtcbiAgc3RhdHVzOiB6JDEuZW51bShbXCJzdWNjZXNzXCIsIFwiZmFpbHVyZVwiXSksXG4gIHBheWxvYWQ6IEJBQ1NGb3JtRGF0YS5vcHRpb25hbCgpXG59KTtcbmNvbnN0IFNFUEFGb3JtRGF0YSA9IHokMS5vYmplY3Qoe1xuICBpYmFuOiB6JDEuc3RyaW5nKCksXG4gIGFjY291bnRUeXBlOiB6JDEuZW51bShbXCJwZXJzb25hbFwiLCBcImJ1c2luZXNzXCJdKVxufSk7XG56JDEub2JqZWN0KHtcbiAgc3RhdHVzOiB6JDEuZW51bShbXCJzdWNjZXNzXCIsIFwiZmFpbHVyZVwiXSksXG4gIHBheWxvYWQ6IFNFUEFGb3JtRGF0YS5vcHRpb25hbCgpXG59KTtcbmNvbnN0IEFDSE1pY3JvRGVwb3NpdEZvcm1EYXRhID0geiQxLm9iamVjdCh7XG4gIGFjY291bnRfbnVtYmVyOiB6JDEuc3RyaW5nKCksXG4gIGFiYV9yb3V0aW5nX251bWJlcjogeiQxLnN0cmluZygpXG59KTtcbmNvbnN0IEVGVE1pY3JvRGVwb3NpdEZvcm1EYXRhID0geiQxLm9iamVjdCh7XG4gIGluc3RpdHV0aW9uX251bWJlcjogeiQxLnN0cmluZygpLFxuICB0cmFuc2l0X251bWJlcjogeiQxLnN0cmluZygpLFxuICBhY2NvdW50X251bWJlcjogeiQxLnN0cmluZygpXG59KTtcbmNvbnN0IEJBQ1NNaWNyb0RlcG9zaXRGb3JtRGF0YSA9IHokMS5vYmplY3Qoe1xuICBhY2NvdW50X251bWJlcjogeiQxLnN0cmluZygpLFxuICBzb3J0X2NvZGU6IHokMS5zdHJpbmcoKVxufSk7XG5jb25zdCBTRVBBTWljcm9EZXBvc2l0Rm9ybURhdGEgPSB6JDEub2JqZWN0KHtcbiAgaWJhbjogeiQxLnN0cmluZygpXG59KTtcbnokMS5vYmplY3Qoe1xuICBzdGF0dXM6IHokMS5lbnVtKFtcInN1Y2Nlc3NcIiwgXCJmYWlsdXJlXCJdKSxcbiAgcGF5bG9hZDogeiQxLnVuaW9uKFtcbiAgICBBQ0hNaWNyb0RlcG9zaXRGb3JtRGF0YSxcbiAgICBFRlRNaWNyb0RlcG9zaXRGb3JtRGF0YSxcbiAgICBCQUNTTWljcm9EZXBvc2l0Rm9ybURhdGEsXG4gICAgU0VQQU1pY3JvRGVwb3NpdEZvcm1EYXRhLFxuICAgIHokMS5vYmplY3QoeyBlcnJvcjogeiQxLnN0cmluZygpIH0pXG4gIF0pLm9wdGlvbmFsKClcbn0pO1xuXG5jb25zdCBudWxsT3JVbmRlZk9yID0gKHpUeXBlKSA9PiB6JDEubnVsbGFibGUoelR5cGUub3B0aW9uYWwoKSk7XG56JDEuc3RyaW5nKCkudHJpbSgpLm1pbigxLCB7IG1lc3NhZ2U6IGBDYW5ub3QgYmUgYmxhbmtgIH0pO1xueiQxLm9iamVjdCh7XG4gIGNkZV9yZXNwb25zZV90eXBlOiB6JDEubGl0ZXJhbChcImVycm9yXCIpLFxuICBtZXNzYWdlOiB6JDEuc3RyaW5nKCksXG4gIGhlYWRlcnM6IHokMS5yZWNvcmQoeiQxLnN0cmluZygpLCB6JDEuc3RyaW5nKCkpLm9wdGlvbmFsKClcbn0pO1xueiQxLmVudW0oW1widXNkXCIsIFwiYnJsXCJdKTtcbmNvbnN0IENvdXBvbk1pbmltYWwgPSB6JDEub2JqZWN0KHtcbiAgbmFtZTogeiQxLnN0cmluZygpLFxuICBhbW91bnRfYXRvbV9vZmY6IG51bGxPclVuZGVmT3IoeiQxLm51bWJlcigpKSxcbiAgcGVyY2VudF9vZmY6IG51bGxPclVuZGVmT3IoeiQxLm51bWJlcigpKSxcbiAgY3VycmVuY3k6IG51bGxPclVuZGVmT3IoeiQxLnN0cmluZygpKSxcbiAgZHVyYXRpb246IHokMS5zdHJpbmcoKSxcbiAgZHVyYXRpb25faW5fbW9udGhzOiBudWxsT3JVbmRlZk9yKHokMS5udW1iZXIoKSlcbn0pO1xuY29uc3QgTGluZUl0ZW0gPSB6JDEub2JqZWN0KHtcbiAgYW1vdW50X3N1YnRvdGFsX2F0b206IHokMS5udW1iZXIoKS5pbnQoKSxcbiAgYW1vdW50X3RvdGFsX2F0b206IHokMS5udW1iZXIoKS5pbnQoKSxcbiAgY3VycmVuY3k6IHokMS5zdHJpbmcoKSxcbiAgZGVzY3JpcHRpb246IG51bGxPclVuZGVmT3IoeiQxLnN0cmluZygpKSxcbiAgcHJpY2VfaWQ6IHokMS5zdHJpbmcoKSxcbiAgYmlsbGluZ19pbnRlcnZhbDogbnVsbE9yVW5kZWZPcih6JDEuc3RyaW5nKCkpLFxuICBiaWxsaW5nX2ludGVydmFsX2NvdW50OiBudWxsT3JVbmRlZk9yKHokMS5udW1iZXIoKS5pbnQoKSksXG4gIHF1YW50aXR5OiB6JDEubnVtYmVyKCkuaW50KClcbn0pO1xuY29uc3QgQnJhbmRTZXR0aW5ncyA9IHokMS5yZWNvcmQoeiQxLnN0cmluZygpLCB6JDEuYW55KCkpO1xuY29uc3QgQnJhbmQgPSB6JDEub2JqZWN0KHtcbiAgbmFtZTogeiQxLnN0cmluZygpLFxuICBzZXR0aW5nczogbnVsbE9yVW5kZWZPcihCcmFuZFNldHRpbmdzKVxufSk7XG5jb25zdCBDaGVja291dFBheW1lbnRNZXRob2QgPSB6JDEub2JqZWN0KHtcbiAgcHJvdmlkZXI6IHokMS5zdHJpbmcoKSxcbiAgcHJvY2Vzc29yX25hbWU6IG51bGxPclVuZGVmT3IoeiQxLnN0cmluZygpKSxcbiAgbWV0YWRhdGE6IG51bGxPclVuZGVmT3IoeiQxLnJlY29yZCh6JDEuc3RyaW5nKCksIHokMS5hbnkoKSkpXG59KTtcbmNvbnN0IFN1YnNjcmlwdGlvbkl0ZW1NaW5pbWFsID0geiQxLm9iamVjdCh7XG4gIHF1YW50aXR5OiB6JDEubnVtYmVyKClcbn0pO1xuY29uc3QgU3Vic2NyaXB0aW9uTWluaW1hbCA9IHokMS5vYmplY3Qoe1xuICBpZDogbnVsbE9yVW5kZWZPcih6JDEuc3RyaW5nKCkpLFxuICBiaWxsaW5nX2ludGVydmFsOiBudWxsT3JVbmRlZk9yKHokMS5zdHJpbmcoKSksXG4gIGJpbGxpbmdfaW50ZXJ2YWxfY291bnQ6IG51bGxPclVuZGVmT3IoeiQxLm51bWJlcigpLmludCgpKSxcbiAgc3Vic2NyaXB0aW9uX2l0ZW1zOiB6JDEuYXJyYXkoU3Vic2NyaXB0aW9uSXRlbU1pbmltYWwpLFxuICB0cmlhbF9zdGFydDogbnVsbE9yVW5kZWZPcih6JDEuc3RyaW5nKCkpLFxuICB0cmlhbF9lbmQ6IG51bGxPclVuZGVmT3IoeiQxLnN0cmluZygpKVxufSk7XG5jb25zdCBJbnZvaWNlSXRlbURpc2NvdW50QW1vdW50c01pbmltYWwgPSB6JDEub2JqZWN0KHtcbiAgYW1vdW50X2F0b206IHokMS5udW1iZXIoKVxufSk7XG5jb25zdCBJbnZvaWNlTGluZUl0ZW1NaW5pbWFsID0geiQxLm9iamVjdCh7XG4gIGFtb3VudF9hdG9tOiB6JDEubnVtYmVyKCksXG4gIGFtb3VudF9hdG9tX2NvbnNpZGVyaW5nX2Rpc2NvdW50X2FwcGxpZWQ6IHokMS5udW1iZXIoKSxcbiAgY3VycmVuY3k6IHokMS5zdHJpbmcoKSxcbiAgZGlzY291bnRfYW1vdW50X2F0b21zOiB6JDEuYXJyYXkoSW52b2ljZUl0ZW1EaXNjb3VudEFtb3VudHNNaW5pbWFsKSxcbiAgc3Vic2NyaXB0aW9uX2l0ZW1faWQ6IHokMS5zdHJpbmcoKVxufSk7XG5jb25zdCBEaXNjb3VudE1pbmltYWwgPSB6JDEub2JqZWN0KHtcbiAgY291cG9uOiBDb3Vwb25NaW5pbWFsXG59KTtcbmNvbnN0IEludm9pY2VNaW5pbWFsID0geiQxLm9iamVjdCh7XG4gIGN1cnJlbmN5OiB6JDEuc3RyaW5nKCksXG4gIGRpc2NvdW50czogeiQxLmFycmF5KERpc2NvdW50TWluaW1hbCksXG4gIGhvc3RlZF9pbnZvaWNlX3VybDogbnVsbE9yVW5kZWZPcih6JDEuc3RyaW5nKCkpLFxuICBsaW5lczogeiQxLmFycmF5KEludm9pY2VMaW5lSXRlbU1pbmltYWwpLFxuICByZW1haW5pbmdfYW1vdW50X2F0b206IHokMS5udW1iZXIoKSxcbiAgdGF4X2Ftb3VudF9hdG9tOiB6JDEubnVtYmVyKCksXG4gIHRvdGFsX2Ftb3VudF9hdG9tOiB6JDEubnVtYmVyKCksXG4gIHRvdGFsX2Rpc2NvdW50X2Ftb3VudF9hdG9tczogeiQxLmFycmF5KEludm9pY2VJdGVtRGlzY291bnRBbW91bnRzTWluaW1hbClcbn0pO1xuY29uc3QgQ3JlYXRlU3Vic2NyaXB0aW9uUmVzcG9uc2VNaW5pbWFsID0geiQxLm9iamVjdCh7XG4gIGNyZWF0ZWQ6IHokMS5hcnJheShTdWJzY3JpcHRpb25NaW5pbWFsKSxcbiAgaW52b2ljZXM6IHokMS5hcnJheShJbnZvaWNlTWluaW1hbCksXG4gIHByb2Nlc3NvcnNfdXNlZDogbnVsbE9yVW5kZWZPcih6JDEuYXJyYXkoeiQxLnN0cmluZygpKSksXG4gIHBheW1lbnRfbWV0aG9kX2lkOiBudWxsT3JVbmRlZk9yKHokMS5zdHJpbmcoKSlcbn0pO1xuY29uc3QgUHJldmlld0NoZWNrb3V0UmVzcG9uc2UgPSB6JDEub2JqZWN0KHtcbiAgcHJldmlldzogQ3JlYXRlU3Vic2NyaXB0aW9uUmVzcG9uc2VNaW5pbWFsLFxuICBwcmV2aWV3X3Bvc3RfdHJpYWw6IG51bGxPclVuZGVmT3IoQ3JlYXRlU3Vic2NyaXB0aW9uUmVzcG9uc2VNaW5pbWFsKSxcbiAgY291cG9uczogeiQxLmFycmF5KENvdXBvbk1pbmltYWwpXG59KTtcbmNvbnN0IF9QYXltZW50Rm9ybVByZWZpbGxDb21tb24gPSB6JDEub2JqZWN0KHtcbiAgc3RhdHVzOiB6JDEubGl0ZXJhbChcIm9wZW5cIiksXG4gIGxvY2FsZTogbnVsbE9yVW5kZWZPcih6JDEuc3RyaW5nKCkpLFxuICB0b2tlbjogeiQxLnN0cmluZygpLFxuICBlbWFpbDogbnVsbE9yVW5kZWZPcih6JDEuc3RyaW5nKCkpLFxuICBjaGVja291dF9zZXR0aW5nczogeiQxLnJlY29yZCh6JDEuc3RyaW5nKCksIHokMS5hbnkoKSksXG4gIGxpbmVfaXRlbXM6IHokMS5hcnJheShMaW5lSXRlbSksXG4gIGFtb3VudF9zdWJ0b3RhbF9hdG9tOiB6JDEubnVtYmVyKCkuaW50KCksXG4gIGFtb3VudF90b3RhbF9hdG9tOiB6JDEubnVtYmVyKCkuaW50KCksXG4gIGJyYW5kOiBCcmFuZCxcbiAgc3Vic19wcmV2aWV3OiBudWxsT3JVbmRlZk9yKFByZXZpZXdDaGVja291dFJlc3BvbnNlKSxcbiAgLy8gTnVsbCBpbiBzZXR1cCBtb2RlXG4gIG1ldGhvZHNfYXZhaWxhYmxlOiB6JDEuYXJyYXkoQ2hlY2tvdXRQYXltZW50TWV0aG9kKSxcbiAgcmV0dXJuX3VybDogbnVsbE9yVW5kZWZPcih6JDEuc3RyaW5nKCkpLFxuICBzdWNjZXNzX3VybDogbnVsbE9yVW5kZWZPcih6JDEuc3RyaW5nKCkpLFxuICBmaW5hbF9mZWF0dXJlX3JvbGxvdXRfc2V0dGluZ3M6IG51bGxPclVuZGVmT3IoeiQxLnJlY29yZCh6JDEuc3RyaW5nKCksIHokMS5hbnkoKSkpXG59KTtcbmNvbnN0IFBheW1lbnRGb3JtUHJlZmlsbCA9IHokMS5kaXNjcmltaW5hdGVkVW5pb24oXCJtb2RlXCIsIFtcbiAgeiQxLm9iamVjdCh7XG4gICAgbW9kZTogeiQxLmxpdGVyYWwoXCJzZXR1cFwiKSxcbiAgICBjdXJyZW5jeTogeiQxLm51bGxhYmxlKHokMS51bmRlZmluZWQoKSlcbiAgfSkuZXh0ZW5kKF9QYXltZW50Rm9ybVByZWZpbGxDb21tb24uc2hhcGUpLFxuICB6JDEub2JqZWN0KHtcbiAgICBtb2RlOiB6JDEuZW51bShbXCJwYXltZW50XCIsIFwic3Vic2NyaXB0aW9uXCJdKSxcbiAgICBjdXJyZW5jeTogeiQxLnN0cmluZygpXG4gIH0pLmV4dGVuZChfUGF5bWVudEZvcm1QcmVmaWxsQ29tbW9uLnNoYXBlKVxuXSk7XG5jb25zdCBDb21wbGV0ZWRGb3JtUHJlZmlsbCA9IHokMS5vYmplY3Qoe1xuICBzdGF0dXM6IHokMS5saXRlcmFsKFwiY29tcGxldGVcIilcbn0pO1xuY29uc3QgRXhwaXJlZEZvcm1QcmVmaWxsID0geiQxLm9iamVjdCh7XG4gIHN0YXR1czogeiQxLmxpdGVyYWwoXCJleHBpcmVkXCIpXG59KTtcbnokMS51bmlvbihbUGF5bWVudEZvcm1QcmVmaWxsLCBDb21wbGV0ZWRGb3JtUHJlZmlsbCwgRXhwaXJlZEZvcm1QcmVmaWxsXSk7XG56JDEub2JqZWN0KHtcbiAgbG9nbzogeiQxLnN0cmluZygpLFxuICBpY29uOiB6JDEuc3RyaW5nKCksXG4gIHByaW1hcnlfY29sb3I6IHokMS5zdHJpbmcoKSxcbiAgc2Vjb25kYXJ5X2NvbG9yOiB6JDEuc3RyaW5nKClcbn0pO1xueiQxLm9iamVjdCh7XG4gIHNlY3VyZV90b2tlbjogeiQxLnN0cmluZygpLFxuICBwbV9pZDogeiQxLnN0cmluZygpXG59KTtcbmNvbnN0IENvbXBsZXRlQWRkcmVzcyA9IHokMS5vYmplY3Qoe1xuICBsaW5lMTogeiQxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGxpbmUyOiB6JDEuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgbGluZTM6IHokMS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBjaXR5OiB6JDEuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgc3RhdGU6IHokMS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBjb3VudHJ5OiB6JDEuc3RyaW5nKCksXG4gIHppcF9jb2RlOiB6JDEuc3RyaW5nKCkub3B0aW9uYWwoKVxufSk7XG56JDEub2JqZWN0KHtcbiAgc2VjdXJlX3Rva2VuOiB6JDEuc3RyaW5nKCksXG4gIHBheW1lbnRfaW5wdXQ6IHokMS5hbnkoKSxcbiAgLy8gU2hvdWxkIGZvbGxvdyBBbnlQYXltZW50SW5wdXQgZnJvbSBDREVcbiAgY3VzdG9tZXJfZW1haWw6IHokMS5zdHJpbmcoKSxcbiAgY3VzdG9tZXJfbGFzdF9uYW1lOiB6JDEuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgY3VzdG9tZXJfZmlyc3RfbmFtZTogeiQxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGN1c3RvbWVyX2FkZHJlc3M6IENvbXBsZXRlQWRkcmVzcyxcbiAgY3VzdG9tZXJfc2hpcHBpbmdfYWRkcmVzczogQ29tcGxldGVBZGRyZXNzLm9wdGlvbmFsKCksXG4gIGxpbmVfaXRlbXM6IHokMS5hcnJheShMaW5lSXRlbSksXG4gIHRvdGFsX2Ftb3VudF9hdG9tOiB6JDEubnVtYmVyKCkuaW50KCksXG4gIGNhbmNlbF9hdF9lbmQ6IHokMS5ib29sZWFuKCksXG4gIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBDaGVja291dFBheW1lbnRNZXRob2QsXG4gIHByb21vdGlvbl9jb2RlOiB6JDEuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgZG9fbm90X3VzZV9sZWdhY3lfY2NfZmxvdzogeiQxLmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICB1c2VfY29uZmlybWVkX3BtX2lkOiBudWxsT3JVbmRlZk9yKHokMS5zdHJpbmcoKSksXG4gIHBheW1lbnRfcm91dGVfaWQ6IG51bGxPclVuZGVmT3IoeiQxLnN0cmluZygpKVxufSk7XG56JDEub2JqZWN0KHtcbiAgcGF5bWVudF9tZXRob2RfaWQ6IHokMS5zdHJpbmcoKVxufSk7XG56JDEub2JqZWN0KHtcbiAgaWQ6IHokMS5zdHJpbmcoKSxcbiAgcmV0dXJuX3VybDogeiQxLnN0cmluZygpXG59KTtcbmNvbnN0IFB5ZGFudGljVmFsaWRhdGlvbkVycm9yJDEgPSB6JDEub2JqZWN0KHtcbiAgdHlwZTogeiQxLnN0cmluZygpLFxuICBsb2M6IHokMS5hcnJheSh6JDEuc3RyaW5nKCkpLFxuICBtc2c6IHokMS5zdHJpbmcoKSxcbiAgdXJsOiB6JDEuc3RyaW5nKClcbn0pO1xueiQxLmFycmF5KFB5ZGFudGljVmFsaWRhdGlvbkVycm9yJDEpO1xuY29uc3QgTmV3Q3VzdG9tZXJGaWVsZHMgPSB6JDEub2JqZWN0KHtcbiAgbmV3X2N1c3RvbWVyX2VtYWlsOiB6JDEuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgbmV3X2N1c3RvbWVyX2xhc3RfbmFtZTogeiQxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gIG5ld19jdXN0b21lcl9maXJzdF9uYW1lOiB6JDEuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgY3VzdG9tZXJfYnVzaW5lc3NfbmFtZTogeiQxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGN1c3RvbWVyX3RheF9pZDogeiQxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGN1c3RvbWVyX3RheF9pZF90eXBlOiB6JDEuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgbmV3X2N1c3RvbWVyX2FkZHJlc3M6IENvbXBsZXRlQWRkcmVzcyxcbiAgbmV3X2N1c3RvbWVyX3NoaXBwaW5nX2FkZHJlc3M6IENvbXBsZXRlQWRkcmVzcy5vcHRpb25hbCgpXG59KTtcbmNvbnN0IFByaWNlUXR5ID0geiQxLm9iamVjdCh7XG4gIHByaWNlX2lkOiB6JDEuc3RyaW5nKCksXG4gIHF1YW50aXR5OiB6JDEubnVtYmVyKCkuaW50KClcbn0pO1xuY29uc3QgQ2FydEluZm8gPSB6JDEub2JqZWN0KHtcbiAgbGluZV9pdGVtczogeiQxLmFycmF5KFByaWNlUXR5KSxcbiAgcHJvbW90aW9uX2NvZGU6IHokMS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBkaXNwbGF5ZWRfdG90YWxfYW1vdW50X2F0b206IHokMS5udW1iZXIoKS5pbnQoKVxufSk7XG5jb25zdCBQcm9jZXNzb3JTcGVjaWZpY01ldGFkYXRhID0geiQxLm9iamVjdCh7XG4gIHByb2Nlc3Nvcl9zcGVjaWZpY19tZXRhZGF0YTogbnVsbE9yVW5kZWZPcih6JDEucmVjb3JkKHokMS5zdHJpbmcoKSwgeiQxLmFueSgpKSlcbn0pO1xueiQxLm9iamVjdCh7XG4gIHBheW1lbnRfcHJvdmlkZXI6IHokMS5zdHJpbmcoKSxcbiAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgZXhpc3RpbmdfY2NfcG1faWQ6IHokMS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB0aGVpcl9leGlzdGluZ19wbV9pZDogeiQxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHVzZV9wYXlfZmlyc3RfZmxvdzogeiQxLmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICBwYXlfZmlyc3RfZmxvd19jYXJ0X2luZm86IENhcnRJbmZvLm9wdGlvbmFsKCksXG4gIGN1c3RvbWVyX2xhbmd1YWdlOiB6JDEuc3RyaW5nKCkub3B0aW9uYWwoKVxufSkuZXh0ZW5kKE5ld0N1c3RvbWVyRmllbGRzLnNoYXBlKS5leHRlbmQoUHJvY2Vzc29yU3BlY2lmaWNNZXRhZGF0YS5zaGFwZSk7XG56JDEub2JqZWN0KHtcbiAgcmVxdWlyZWRfdXNlcl9hY3Rpb25zOiB6JDEuYXJyYXkoeiQxLnJlY29yZCh6JDEuc3RyaW5nKCksIHokMS5hbnkoKSkpLFxuICBjaGVja291dF9hdHRlbXB0X2lkOiBudWxsT3JVbmRlZk9yKHokMS5zdHJpbmcoKSlcbn0pO1xueiQxLm9iamVjdCh7XG4gIGZpZWxkczogUFJGb3JtRmllbGRzLFxuICBjaGVja291dFBheW1lbnRNZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgcGF5bWVudF9yb3V0ZV9pZDogbnVsbE9yVW5kZWZPcih6JDEuc3RyaW5nKCkpXG59KTtcbnokMS5vYmplY3Qoe1xuICBzZXNzaW9uX2lkOiB6JDEuc3RyaW5nKCksXG4gIG5vbl9jZGVfZm9ybV9maWVsZHM6IFJlcXVpcmVkRm9ybUZpZWxkcyxcbiAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgZXh0cmFfbWV0YWRhdGE6IHokMS5yZWNvcmQoeiQxLnN0cmluZygpLCB6JDEuYW55KCkpLFxuICAvLyBUaGlzIGlzIG9wdGlvbmFsIGluIENERSwgYnV0IG5vdCBpbiBPSlMgbW92aW5nIGZvcndhcmRcbiAgdXNlX3VuaWZpZWRfY2NfZmxvdzogbnVsbE9yVW5kZWZPcih6JDEuYm9vbGVhbigpKSxcbiAgcGF5X2ZpcnN0X2Zsb3dfY2FydF9pbmZvOiBDYXJ0SW5mby5vcHRpb25hbCgpLFxuICBwYXltZW50X3JvdXRlX2lkOiBudWxsT3JVbmRlZk9yKHokMS5zdHJpbmcoKSksXG4gIGN1c3RvbWVyX2xhbmd1YWdlOiB6JDEuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgZXhpc3RpbmdfY2NfcG1faWQ6IG51bGxPclVuZGVmT3IoeiQxLnN0cmluZygpKVxufSk7XG56JDEub2JqZWN0KHtcbiAgcmVxdWlyZWRfdXNlcl9hY3Rpb25zOiB6JDEuYXJyYXkoeiQxLnJlY29yZCh6JDEuc3RyaW5nKCksIHokMS5hbnkoKSkpLFxuICBjY19wbV9pZDogeiQxLnN0cmluZygpLFxuICBjaGVja291dF9zdWNjZXNzX3Jlc3BvbnNlOiBudWxsT3JVbmRlZk9yKENoZWNrb3V0U3VjY2Vzc1Jlc3BvbnNlKSxcbiAgY2hlY2tvdXRfYXR0ZW1wdF9pZDogbnVsbE9yVW5kZWZPcih6JDEuc3RyaW5nKCkpXG59KTtcbnokMS5yZWNvcmQoeiQxLmFueSgpKTtcbnokMS5vYmplY3Qoe1xuICBmaXJzdF9uYW1lOiBudWxsT3JVbmRlZk9yKHokMS5zdHJpbmcoKSksXG4gIGxhc3RfbmFtZTogbnVsbE9yVW5kZWZPcih6JDEuc3RyaW5nKCkpLFxuICBsaW5lMTogbnVsbE9yVW5kZWZPcih6JDEuc3RyaW5nKCkpLFxuICBsaW5lMjogbnVsbE9yVW5kZWZPcih6JDEuc3RyaW5nKCkpLFxuICBsaW5lMzogbnVsbE9yVW5kZWZPcih6JDEuc3RyaW5nKCkpLFxuICBjaXR5OiBudWxsT3JVbmRlZk9yKHokMS5zdHJpbmcoKSksXG4gIHN0YXRlOiBudWxsT3JVbmRlZk9yKHokMS5zdHJpbmcoKSksXG4gIGNvdW50cnk6IG51bGxPclVuZGVmT3IoeiQxLnN0cmluZygpKSxcbiAgemlwX2NvZGU6IG51bGxPclVuZGVmT3IoeiQxLnN0cmluZygpKSxcbiAgZW1haWw6IG51bGxPclVuZGVmT3IoeiQxLnN0cmluZygpKSxcbiAgYmlsbGluZ19lbWFpbDogbnVsbE9yVW5kZWZPcih6JDEuc3RyaW5nKCkpLFxuICBwaG9uZV9udW1iZXI6IG51bGxPclVuZGVmT3IoeiQxLnN0cmluZygpKSxcbiAgYnVzaW5lc3NfbmFtZTogbnVsbE9yVW5kZWZPcih6JDEuc3RyaW5nKCkpLFxuICB0YXhfaWQ6IG51bGxPclVuZGVmT3IoeiQxLnN0cmluZygpKSxcbiAgdGF4X2lkX3R5cGU6IG51bGxPclVuZGVmT3IoeiQxLnN0cmluZygpKSxcbiAgdXBkYXRlX3Byb2Nlc3Nvcl9jdXN0b21lcjogbnVsbE9yVW5kZWZPcih6JDEuYm9vbGVhbigpKVxufSk7XG56JDEub2JqZWN0KHtcbiAgaWQ6IHokMS5zdHJpbmcoKSxcbiAgZW1haWw6IG51bGxPclVuZGVmT3IoeiQxLnN0cmluZygpKSxcbiAgZmlyc3RfbmFtZTogbnVsbE9yVW5kZWZPcih6JDEuc3RyaW5nKCkpLFxuICBsYXN0X25hbWU6IG51bGxPclVuZGVmT3IoeiQxLnN0cmluZygpKSxcbiAgcGhvbmVfbnVtYmVyOiBudWxsT3JVbmRlZk9yKHokMS5zdHJpbmcoKSksXG4gIGJpbGxpbmdfZW1haWw6IG51bGxPclVuZGVmT3IoeiQxLnN0cmluZygpKSxcbiAgYWRkcmVzczogbnVsbE9yVW5kZWZPcih6JDEucmVjb3JkKHokMS5zdHJpbmcoKSwgeiQxLmFueSgpKSlcbn0pO1xueiQxLm9iamVjdCh7XG4gIG1lc3NhZ2U6IHokMS5zdHJpbmcoKVxufSk7XG56JDEub2JqZWN0KHtcbiAgZXJyb3JfY29kZTogeiQxLnN0cmluZygpXG59KTtcbnokMS5vYmplY3Qoe1xuICBjaGVja291dF9wYXltZW50X21ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICBwcm9jZXNzb3Jfc3BlY2lmaWNfbWV0YWRhdGE6IHokMS5yZWNvcmQoeiQxLmFueSgpKS5vcHRpb25hbCgpLFxuICBwYXltZW50X3JvdXRlX2lkOiBudWxsT3JVbmRlZk9yKHokMS5zdHJpbmcoKSlcbn0pO1xueiQxLm9iamVjdCh7XG4gIG5leHRfYWN0aW9uX21ldGFkYXRhOiBudWxsT3JVbmRlZk9yKHokMS5yZWNvcmQoeiQxLmFueSgpKSlcbn0pO1xueiQxLm9iamVjdCh7XG4gIGV2ZW50czogeiQxLmFycmF5KFxuICAgIHokMS5vYmplY3Qoe1xuICAgICAgZXZlbnRfbmFtZTogeiQxLnN0cmluZygpLFxuICAgICAgZGV2aWNlX3Rva2VuOiB6JDEuc3RyaW5nKCksXG4gICAgICBwcm9wZXJ0aWVzOiB6JDEucmVjb3JkKHokMS5hbnkoKSkub3B0aW9uYWwoKSxcbiAgICAgIGNvbnRleHRfcHJvcGVydGllczogeiQxLnJlY29yZCh6JDEuYW55KCkpLm9wdGlvbmFsKClcbiAgICB9KVxuICApXG59KTtcbnokMS5hbnkoKS5vcHRpb25hbCgpO1xueiQxLm9iamVjdCh7XG4gIGRldmljZV90b2tlbjogeiQxLnN0cmluZygpXG59KTtcbnokMS5vYmplY3Qoe30pO1xueiQxLm9iamVjdCh7XG4gIF91bmlmaWVkX2NjX2FjdGlvbl9uYW1lOiB6JDEuc3RyaW5nKCksXG4gIF91bmlmaWVkX2NjX3BjY3NfaWQ6IHokMS5zdHJpbmcoKVxufSkuY2F0Y2hhbGwoeiQxLmFueSgpKTtcblxuY29uc3QgUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IgPSB6JDEub2JqZWN0KHtcbiAgdHlwZTogeiQxLnN0cmluZygpLFxuICBsb2M6IHokMS5hcnJheSh6JDEuc3RyaW5nKCkpLFxuICBtc2c6IHokMS5zdHJpbmcoKSxcbiAgdXJsOiB6JDEuc3RyaW5nKClcbn0pO1xueiQxLmFycmF5KFB5ZGFudGljVmFsaWRhdGlvbkVycm9yKTtcbmNvbnN0IFpvZEZpZWxkRXJyb3IgPSB6JDEub2JqZWN0KHtcbiAgY29kZTogeiQxLnN0cmluZygpLFxuICBtZXNzYWdlOiB6JDEuc3RyaW5nKCksXG4gIHBhdGg6IHokMS5hcnJheSh6JDEuc3RyaW5nKCkpXG59KTtcbnokMS5hcnJheShab2RGaWVsZEVycm9yKTtcbmNvbnN0IG1ha2VDYWxsYmFja1NhZmUgPSAoY2FsbGJhY2tOYW1lLCBmbiwgZXJyb3JMb2dnZXIpID0+IHtcbiAgcmV0dXJuICgoLi4uYXJncykgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZm4oLi4uYXJncyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGVycm9yTG9nZ2VyKGBbZm9ybV0gRXJyb3IgcnVubmluZyBjYWxsYmFjayAoJHtjYWxsYmFja05hbWV9KTpgLCBlcnJvcik7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgfSk7XG59O1xuXG5jb25zdCBjcmVhdGVPanNGbG93TG9nZ2VycyA9IChwcmVmaXgpID0+IHtcbiAgY29uc3QgbG9nID0gKC4uLmFyZ3MpID0+IHtcbiAgICB3aW5kb3dbXCJjb25zb2xlXCJdLmxvZyhgJHtjaGFsay5ncmVlbi5ib2xkKFwib2pzL1wiKX0ke2NoYWxrLmJvbGQuZ3JheShgJHtwcmVmaXh9YCl9XHRgLCAuLi5hcmdzKTtcbiAgfTtcbiAgY29uc3QgZXJyID0gKC4uLmFyZ3MpID0+IHtcbiAgICB3aW5kb3dbXCJjb25zb2xlXCJdLndhcm4oYCR7Y2hhbGsucmVkLmJvbGQoXCJvanMvXCIpfSR7Y2hhbGsuYm9sZC5ncmF5KGAke3ByZWZpeH1gKX1cdGAsIC4uLmFyZ3MpO1xuICB9O1xuICByZXR1cm4ge1xuICAgIGxvZyxcbiAgICBlcnIsXG4gICAgbG9nX186IGxvZyxcbiAgICBlcnJfXzogZXJyXG4gIH07XG59O1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cblxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xuICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XG4gIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59XG5cbmZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xuICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEl0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKTtcbiAgcmV0dXJuIGcubmV4dCA9IHZlcmIoMCksIGdbXCJ0aHJvd1wiXSA9IHZlcmIoMSksIGdbXCJyZXR1cm5cIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xuICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gX192YWx1ZXMobykge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgfVxuICB9O1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59XG5cbmZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFtKSByZXR1cm4gbztcbiAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gIHRyeSB7XG4gICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgfVxuICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgfVxuICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gIH1cbiAgcmV0dXJuIGFyO1xufVxuXG5mdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XG4gIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59XG5cbmZ1bmN0aW9uIF9fYXdhaXQodikge1xuICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcbn1cblxuZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcbiAgcmV0dXJuIGkgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgQXN5bmNJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gQXN5bmNJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiLCBhd2FpdFJldHVybiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcbiAgZnVuY3Rpb24gYXdhaXRSZXR1cm4oZikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGYsIHJlamVjdCk7IH07IH1cbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChnW25dKSB7IGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IGlmIChmKSBpW25dID0gZihpW25dKTsgfSB9XG4gIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cbiAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XG4gIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxuICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XG59XG5cbmZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xuICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cbiAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxufVxuXG50eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59O1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gY3JlYXRlRXJyb3JDbGFzcyhjcmVhdGVJbXBsKSB7XG4gICAgdmFyIF9zdXBlciA9IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICBFcnJvci5jYWxsKGluc3RhbmNlKTtcbiAgICAgICAgaW5zdGFuY2Uuc3RhY2sgPSBuZXcgRXJyb3IoKS5zdGFjaztcbiAgICB9O1xuICAgIHZhciBjdG9yRnVuYyA9IGNyZWF0ZUltcGwoX3N1cGVyKTtcbiAgICBjdG9yRnVuYy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG4gICAgY3RvckZ1bmMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvckZ1bmM7XG4gICAgcmV0dXJuIGN0b3JGdW5jO1xufVxuXG52YXIgVW5zdWJzY3JpcHRpb25FcnJvciA9IGNyZWF0ZUVycm9yQ2xhc3MoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHJldHVybiBmdW5jdGlvbiBVbnN1YnNjcmlwdGlvbkVycm9ySW1wbChlcnJvcnMpIHtcbiAgICAgICAgX3N1cGVyKHRoaXMpO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBlcnJvcnNcbiAgICAgICAgICAgID8gZXJyb3JzLmxlbmd0aCArIFwiIGVycm9ycyBvY2N1cnJlZCBkdXJpbmcgdW5zdWJzY3JpcHRpb246XFxuXCIgKyBlcnJvcnMubWFwKGZ1bmN0aW9uIChlcnIsIGkpIHsgcmV0dXJuIGkgKyAxICsgXCIpIFwiICsgZXJyLnRvU3RyaW5nKCk7IH0pLmpvaW4oJ1xcbiAgJylcbiAgICAgICAgICAgIDogJyc7XG4gICAgICAgIHRoaXMubmFtZSA9ICdVbnN1YnNjcmlwdGlvbkVycm9yJztcbiAgICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgfTtcbn0pO1xuXG5mdW5jdGlvbiBhcnJSZW1vdmUoYXJyLCBpdGVtKSB7XG4gICAgaWYgKGFycikge1xuICAgICAgICB2YXIgaW5kZXggPSBhcnIuaW5kZXhPZihpdGVtKTtcbiAgICAgICAgMCA8PSBpbmRleCAmJiBhcnIuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG59XG5cbnZhciBTdWJzY3JpcHRpb24gPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFN1YnNjcmlwdGlvbihpbml0aWFsVGVhcmRvd24pIHtcbiAgICAgICAgdGhpcy5pbml0aWFsVGVhcmRvd24gPSBpbml0aWFsVGVhcmRvd247XG4gICAgICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3BhcmVudGFnZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplcnMgPSBudWxsO1xuICAgIH1cbiAgICBTdWJzY3JpcHRpb24ucHJvdG90eXBlLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZV8xLCBfYSwgZV8yLCBfYjtcbiAgICAgICAgdmFyIGVycm9ycztcbiAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIF9wYXJlbnRhZ2UgPSB0aGlzLl9wYXJlbnRhZ2U7XG4gICAgICAgICAgICBpZiAoX3BhcmVudGFnZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudGFnZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoX3BhcmVudGFnZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9wYXJlbnRhZ2VfMSA9IF9fdmFsdWVzKF9wYXJlbnRhZ2UpLCBfcGFyZW50YWdlXzFfMSA9IF9wYXJlbnRhZ2VfMS5uZXh0KCk7ICFfcGFyZW50YWdlXzFfMS5kb25lOyBfcGFyZW50YWdlXzFfMSA9IF9wYXJlbnRhZ2VfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50XzEgPSBfcGFyZW50YWdlXzFfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfMS5yZW1vdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfcGFyZW50YWdlXzFfMSAmJiAhX3BhcmVudGFnZV8xXzEuZG9uZSAmJiAoX2EgPSBfcGFyZW50YWdlXzEucmV0dXJuKSkgX2EuY2FsbChfcGFyZW50YWdlXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfcGFyZW50YWdlLnJlbW92ZSh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaW5pdGlhbEZpbmFsaXplciA9IHRoaXMuaW5pdGlhbFRlYXJkb3duO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oaW5pdGlhbEZpbmFsaXplcikpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpbml0aWFsRmluYWxpemVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycyA9IGUgaW5zdGFuY2VvZiBVbnN1YnNjcmlwdGlvbkVycm9yID8gZS5lcnJvcnMgOiBbZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIF9maW5hbGl6ZXJzID0gdGhpcy5fZmluYWxpemVycztcbiAgICAgICAgICAgIGlmIChfZmluYWxpemVycykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmFsaXplcnMgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9maW5hbGl6ZXJzXzEgPSBfX3ZhbHVlcyhfZmluYWxpemVycyksIF9maW5hbGl6ZXJzXzFfMSA9IF9maW5hbGl6ZXJzXzEubmV4dCgpOyAhX2ZpbmFsaXplcnNfMV8xLmRvbmU7IF9maW5hbGl6ZXJzXzFfMSA9IF9maW5hbGl6ZXJzXzEubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmluYWxpemVyID0gX2ZpbmFsaXplcnNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjRmluYWxpemVyKGZpbmFsaXplcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzICE9PSBudWxsICYmIGVycm9ycyAhPT0gdm9pZCAwID8gZXJyb3JzIDogW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFVuc3Vic2NyaXB0aW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoZXJyb3JzKSksIF9fcmVhZChlcnIuZXJyb3JzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9maW5hbGl6ZXJzXzFfMSAmJiAhX2ZpbmFsaXplcnNfMV8xLmRvbmUgJiYgKF9iID0gX2ZpbmFsaXplcnNfMS5yZXR1cm4pKSBfYi5jYWxsKF9maW5hbGl6ZXJzXzEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3Vic2NyaXB0aW9uRXJyb3IoZXJyb3JzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgU3Vic2NyaXB0aW9uLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodGVhcmRvd24pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodGVhcmRvd24gJiYgdGVhcmRvd24gIT09IHRoaXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgICAgIGV4ZWNGaW5hbGl6ZXIodGVhcmRvd24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRlYXJkb3duIGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZWFyZG93bi5jbG9zZWQgfHwgdGVhcmRvd24uX2hhc1BhcmVudCh0aGlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRlYXJkb3duLl9hZGRQYXJlbnQodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICh0aGlzLl9maW5hbGl6ZXJzID0gKF9hID0gdGhpcy5fZmluYWxpemVycykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW10pLnB1c2godGVhcmRvd24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBTdWJzY3JpcHRpb24ucHJvdG90eXBlLl9oYXNQYXJlbnQgPSBmdW5jdGlvbiAocGFyZW50KSB7XG4gICAgICAgIHZhciBfcGFyZW50YWdlID0gdGhpcy5fcGFyZW50YWdlO1xuICAgICAgICByZXR1cm4gX3BhcmVudGFnZSA9PT0gcGFyZW50IHx8IChBcnJheS5pc0FycmF5KF9wYXJlbnRhZ2UpICYmIF9wYXJlbnRhZ2UuaW5jbHVkZXMocGFyZW50KSk7XG4gICAgfTtcbiAgICBTdWJzY3JpcHRpb24ucHJvdG90eXBlLl9hZGRQYXJlbnQgPSBmdW5jdGlvbiAocGFyZW50KSB7XG4gICAgICAgIHZhciBfcGFyZW50YWdlID0gdGhpcy5fcGFyZW50YWdlO1xuICAgICAgICB0aGlzLl9wYXJlbnRhZ2UgPSBBcnJheS5pc0FycmF5KF9wYXJlbnRhZ2UpID8gKF9wYXJlbnRhZ2UucHVzaChwYXJlbnQpLCBfcGFyZW50YWdlKSA6IF9wYXJlbnRhZ2UgPyBbX3BhcmVudGFnZSwgcGFyZW50XSA6IHBhcmVudDtcbiAgICB9O1xuICAgIFN1YnNjcmlwdGlvbi5wcm90b3R5cGUuX3JlbW92ZVBhcmVudCA9IGZ1bmN0aW9uIChwYXJlbnQpIHtcbiAgICAgICAgdmFyIF9wYXJlbnRhZ2UgPSB0aGlzLl9wYXJlbnRhZ2U7XG4gICAgICAgIGlmIChfcGFyZW50YWdlID09PSBwYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3BhcmVudGFnZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShfcGFyZW50YWdlKSkge1xuICAgICAgICAgICAgYXJyUmVtb3ZlKF9wYXJlbnRhZ2UsIHBhcmVudCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN1YnNjcmlwdGlvbi5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHRlYXJkb3duKSB7XG4gICAgICAgIHZhciBfZmluYWxpemVycyA9IHRoaXMuX2ZpbmFsaXplcnM7XG4gICAgICAgIF9maW5hbGl6ZXJzICYmIGFyclJlbW92ZShfZmluYWxpemVycywgdGVhcmRvd24pO1xuICAgICAgICBpZiAodGVhcmRvd24gaW5zdGFuY2VvZiBTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRlYXJkb3duLl9yZW1vdmVQYXJlbnQodGhpcyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN1YnNjcmlwdGlvbi5FTVBUWSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlbXB0eSA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgZW1wdHkuY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGVtcHR5O1xuICAgIH0pKCk7XG4gICAgcmV0dXJuIFN1YnNjcmlwdGlvbjtcbn0oKSk7XG52YXIgRU1QVFlfU1VCU0NSSVBUSU9OID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuZnVuY3Rpb24gaXNTdWJzY3JpcHRpb24odmFsdWUpIHtcbiAgICByZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uIHx8XG4gICAgICAgICh2YWx1ZSAmJiAnY2xvc2VkJyBpbiB2YWx1ZSAmJiBpc0Z1bmN0aW9uKHZhbHVlLnJlbW92ZSkgJiYgaXNGdW5jdGlvbih2YWx1ZS5hZGQpICYmIGlzRnVuY3Rpb24odmFsdWUudW5zdWJzY3JpYmUpKSk7XG59XG5mdW5jdGlvbiBleGVjRmluYWxpemVyKGZpbmFsaXplcikge1xuICAgIGlmIChpc0Z1bmN0aW9uKGZpbmFsaXplcikpIHtcbiAgICAgICAgZmluYWxpemVyKCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmaW5hbGl6ZXIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG59XG5cbnZhciBjb25maWcgPSB7XG4gICAgUHJvbWlzZTogdW5kZWZpbmVkfTtcblxudmFyIHRpbWVvdXRQcm92aWRlciA9IHtcbiAgICBzZXRUaW1lb3V0OiBmdW5jdGlvbiAoaGFuZGxlciwgdGltZW91dCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaSAtIDJdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2V0VGltZW91dC5hcHBseSh2b2lkIDAsIF9fc3ByZWFkQXJyYXkoW2hhbmRsZXIsIHRpbWVvdXRdLCBfX3JlYWQoYXJncykpKTtcbiAgICB9LFxuICAgIGNsZWFyVGltZW91dDogZnVuY3Rpb24gKGhhbmRsZSkge1xuICAgICAgICByZXR1cm4gKGNsZWFyVGltZW91dCkoaGFuZGxlKTtcbiAgICB9LFxuICAgIGRlbGVnYXRlOiB1bmRlZmluZWQsXG59O1xuXG5mdW5jdGlvbiByZXBvcnRVbmhhbmRsZWRFcnJvcihlcnIpIHtcbiAgICB0aW1lb3V0UHJvdmlkZXIuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBub29wKCkgeyB9XG5cbmZ1bmN0aW9uIGVycm9yQ29udGV4dChjYikge1xuICAgIHtcbiAgICAgICAgY2IoKTtcbiAgICB9XG59XG5cbnZhciBTdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTdWJzY3JpYmVyKGRlc3RpbmF0aW9uKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoZGVzdGluYXRpb24pIHtcbiAgICAgICAgICAgIF90aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247XG4gICAgICAgICAgICBpZiAoaXNTdWJzY3JpcHRpb24oZGVzdGluYXRpb24pKSB7XG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb24uYWRkKF90aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzLmRlc3RpbmF0aW9uID0gRU1QVFlfT0JTRVJWRVI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBTdWJzY3JpYmVyLmNyZWF0ZSA9IGZ1bmN0aW9uIChuZXh0LCBlcnJvciwgY29tcGxldGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTYWZlU3Vic2NyaWJlcihuZXh0LCBlcnJvciwgY29tcGxldGUpO1xuICAgIH07XG4gICAgU3Vic2NyaWJlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIDtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9uZXh0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU3Vic2NyaWJlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmICh0aGlzLmlzU3RvcHBlZCkgO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKGVycik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN1YnNjcmliZXIucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIDtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTdWJzY3JpYmVyLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS51bnN1YnNjcmliZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7XG4gICAgfTtcbiAgICBTdWJzY3JpYmVyLnByb3RvdHlwZS5fZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN1YnNjcmliZXIucHJvdG90eXBlLl9jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFN1YnNjcmliZXI7XG59KFN1YnNjcmlwdGlvbikpO1xudmFyIENvbnN1bWVyT2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvbnN1bWVyT2JzZXJ2ZXIocGFydGlhbE9ic2VydmVyKSB7XG4gICAgICAgIHRoaXMucGFydGlhbE9ic2VydmVyID0gcGFydGlhbE9ic2VydmVyO1xuICAgIH1cbiAgICBDb25zdW1lck9ic2VydmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBwYXJ0aWFsT2JzZXJ2ZXIgPSB0aGlzLnBhcnRpYWxPYnNlcnZlcjtcbiAgICAgICAgaWYgKHBhcnRpYWxPYnNlcnZlci5uZXh0KSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBhcnRpYWxPYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgQ29uc3VtZXJPYnNlcnZlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHZhciBwYXJ0aWFsT2JzZXJ2ZXIgPSB0aGlzLnBhcnRpYWxPYnNlcnZlcjtcbiAgICAgICAgaWYgKHBhcnRpYWxPYnNlcnZlci5lcnJvcikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXJ0aWFsT2JzZXJ2ZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvbnN1bWVyT2JzZXJ2ZXIucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcGFydGlhbE9ic2VydmVyID0gdGhpcy5wYXJ0aWFsT2JzZXJ2ZXI7XG4gICAgICAgIGlmIChwYXJ0aWFsT2JzZXJ2ZXIuY29tcGxldGUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGFydGlhbE9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVVbmhhbmRsZWRFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBDb25zdW1lck9ic2VydmVyO1xufSgpKTtcbnZhciBTYWZlU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFNhZmVTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFNhZmVTdWJzY3JpYmVyKG9ic2VydmVyT3JOZXh0LCBlcnJvciwgY29tcGxldGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgdmFyIHBhcnRpYWxPYnNlcnZlcjtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24ob2JzZXJ2ZXJPck5leHQpIHx8ICFvYnNlcnZlck9yTmV4dCkge1xuICAgICAgICAgICAgcGFydGlhbE9ic2VydmVyID0ge1xuICAgICAgICAgICAgICAgIG5leHQ6IChvYnNlcnZlck9yTmV4dCAhPT0gbnVsbCAmJiBvYnNlcnZlck9yTmV4dCAhPT0gdm9pZCAwID8gb2JzZXJ2ZXJPck5leHQgOiB1bmRlZmluZWQpLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvciAhPT0gbnVsbCAmJiBlcnJvciAhPT0gdm9pZCAwID8gZXJyb3IgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY29tcGxldGU6IGNvbXBsZXRlICE9PSBudWxsICYmIGNvbXBsZXRlICE9PSB2b2lkIDAgPyBjb21wbGV0ZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGFydGlhbE9ic2VydmVyID0gb2JzZXJ2ZXJPck5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX3RoaXMuZGVzdGluYXRpb24gPSBuZXcgQ29uc3VtZXJPYnNlcnZlcihwYXJ0aWFsT2JzZXJ2ZXIpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBTYWZlU3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcikpO1xuZnVuY3Rpb24gaGFuZGxlVW5oYW5kbGVkRXJyb3IoZXJyb3IpIHtcbiAgICB7XG4gICAgICAgIHJlcG9ydFVuaGFuZGxlZEVycm9yKGVycm9yKTtcbiAgICB9XG59XG5mdW5jdGlvbiBkZWZhdWx0RXJyb3JIYW5kbGVyKGVycikge1xuICAgIHRocm93IGVycjtcbn1cbnZhciBFTVBUWV9PQlNFUlZFUiA9IHtcbiAgICBjbG9zZWQ6IHRydWUsXG4gICAgbmV4dDogbm9vcCxcbiAgICBlcnJvcjogZGVmYXVsdEVycm9ySGFuZGxlcixcbiAgICBjb21wbGV0ZTogbm9vcCxcbn07XG5cbnZhciBvYnNlcnZhYmxlID0gKGZ1bmN0aW9uICgpIHsgcmV0dXJuICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5vYnNlcnZhYmxlKSB8fCAnQEBvYnNlcnZhYmxlJzsgfSkoKTtcblxuZnVuY3Rpb24gaWRlbnRpdHkoeCkge1xuICAgIHJldHVybiB4O1xufVxuXG5mdW5jdGlvbiBwaXBlRnJvbUFycmF5KGZucykge1xuICAgIGlmIChmbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBpZGVudGl0eTtcbiAgICB9XG4gICAgaWYgKGZucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGZuc1swXTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHBpcGVkKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBmbnMucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBmbikgeyByZXR1cm4gZm4ocHJldik7IH0sIGlucHV0KTtcbiAgICB9O1xufVxuXG52YXIgT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT2JzZXJ2YWJsZShzdWJzY3JpYmUpIHtcbiAgICAgICAgaWYgKHN1YnNjcmliZSkge1xuICAgICAgICAgICAgdGhpcy5fc3Vic2NyaWJlID0gc3Vic2NyaWJlO1xuICAgICAgICB9XG4gICAgfVxuICAgIE9ic2VydmFibGUucHJvdG90eXBlLmxpZnQgPSBmdW5jdGlvbiAob3BlcmF0b3IpIHtcbiAgICAgICAgdmFyIG9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZSgpO1xuICAgICAgICBvYnNlcnZhYmxlLnNvdXJjZSA9IHRoaXM7XG4gICAgICAgIG9ic2VydmFibGUub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICAgICAgcmV0dXJuIG9ic2VydmFibGU7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmUgPSBmdW5jdGlvbiAob2JzZXJ2ZXJPck5leHQsIGVycm9yLCBjb21wbGV0ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgc3Vic2NyaWJlciA9IGlzU3Vic2NyaWJlcihvYnNlcnZlck9yTmV4dCkgPyBvYnNlcnZlck9yTmV4dCA6IG5ldyBTYWZlU3Vic2NyaWJlcihvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKTtcbiAgICAgICAgZXJyb3JDb250ZXh0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IF90aGlzLCBvcGVyYXRvciA9IF9hLm9wZXJhdG9yLCBzb3VyY2UgPSBfYS5zb3VyY2U7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmFkZChvcGVyYXRvclxuICAgICAgICAgICAgICAgID9cbiAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IuY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpXG4gICAgICAgICAgICAgICAgOiBzb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgP1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3N1YnNjcmliZShzdWJzY3JpYmVyKVxuICAgICAgICAgICAgICAgICAgICA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5fdHJ5U3Vic2NyaWJlKHN1YnNjcmliZXIpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzdWJzY3JpYmVyO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZS5wcm90b3R5cGUuX3RyeVN1YnNjcmliZSA9IGZ1bmN0aW9uIChzaW5rKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3Vic2NyaWJlKHNpbmspO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHNpbmsuZXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgT2JzZXJ2YWJsZS5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChuZXh0LCBwcm9taXNlQ3Rvcikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBwcm9taXNlQ3RvciA9IGdldFByb21pc2VDdG9yKHByb21pc2VDdG9yKTtcbiAgICAgICAgcmV0dXJuIG5ldyBwcm9taXNlQ3RvcihmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgc3Vic2NyaWJlciA9IG5ldyBTYWZlU3Vic2NyaWJlcih7XG4gICAgICAgICAgICAgICAgbmV4dDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3I6IHJlamVjdCxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZTogcmVzb2x2ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgX3RoaXMuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIE9ic2VydmFibGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLnNvdXJjZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnN1YnNjcmliZShzdWJzY3JpYmVyKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGUucHJvdG90eXBlW29ic2VydmFibGVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIE9ic2VydmFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvcGVyYXRpb25zID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBvcGVyYXRpb25zW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBpcGVGcm9tQXJyYXkob3BlcmF0aW9ucykodGhpcyk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlLnByb3RvdHlwZS50b1Byb21pc2UgPSBmdW5jdGlvbiAocHJvbWlzZUN0b3IpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcHJvbWlzZUN0b3IgPSBnZXRQcm9taXNlQ3Rvcihwcm9taXNlQ3Rvcik7XG4gICAgICAgIHJldHVybiBuZXcgcHJvbWlzZUN0b3IoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgX3RoaXMuc3Vic2NyaWJlKGZ1bmN0aW9uICh4KSB7IHJldHVybiAodmFsdWUgPSB4KTsgfSwgZnVuY3Rpb24gKGVycikgeyByZXR1cm4gcmVqZWN0KGVycik7IH0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlc29sdmUodmFsdWUpOyB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlLmNyZWF0ZSA9IGZ1bmN0aW9uIChzdWJzY3JpYmUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKHN1YnNjcmliZSk7XG4gICAgfTtcbiAgICByZXR1cm4gT2JzZXJ2YWJsZTtcbn0oKSk7XG5mdW5jdGlvbiBnZXRQcm9taXNlQ3Rvcihwcm9taXNlQ3Rvcikge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gKF9hID0gcHJvbWlzZUN0b3IgIT09IG51bGwgJiYgcHJvbWlzZUN0b3IgIT09IHZvaWQgMCA/IHByb21pc2VDdG9yIDogY29uZmlnLlByb21pc2UpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFByb21pc2U7XG59XG5mdW5jdGlvbiBpc09ic2VydmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICYmIGlzRnVuY3Rpb24odmFsdWUubmV4dCkgJiYgaXNGdW5jdGlvbih2YWx1ZS5lcnJvcikgJiYgaXNGdW5jdGlvbih2YWx1ZS5jb21wbGV0ZSk7XG59XG5mdW5jdGlvbiBpc1N1YnNjcmliZXIodmFsdWUpIHtcbiAgICByZXR1cm4gKHZhbHVlICYmIHZhbHVlIGluc3RhbmNlb2YgU3Vic2NyaWJlcikgfHwgKGlzT2JzZXJ2ZXIodmFsdWUpICYmIGlzU3Vic2NyaXB0aW9uKHZhbHVlKSk7XG59XG5cbmZ1bmN0aW9uIGhhc0xpZnQoc291cmNlKSB7XG4gICAgcmV0dXJuIGlzRnVuY3Rpb24oc291cmNlID09PSBudWxsIHx8IHNvdXJjZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc291cmNlLmxpZnQpO1xufVxuZnVuY3Rpb24gb3BlcmF0ZShpbml0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgICAgaWYgKGhhc0xpZnQoc291cmNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5saWZ0KGZ1bmN0aW9uIChsaWZ0ZWRTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5pdChsaWZ0ZWRTb3VyY2UsIHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmFibGUgdG8gbGlmdCB1bmtub3duIE9ic2VydmFibGUgdHlwZScpO1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgb25OZXh0LCBvbkNvbXBsZXRlLCBvbkVycm9yLCBvbkZpbmFsaXplKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvclN1YnNjcmliZXIoZGVzdGluYXRpb24sIG9uTmV4dCwgb25Db21wbGV0ZSwgb25FcnJvciwgb25GaW5hbGl6ZSk7XG59XG52YXIgT3BlcmF0b3JTdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoT3BlcmF0b3JTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE9wZXJhdG9yU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgb25OZXh0LCBvbkNvbXBsZXRlLCBvbkVycm9yLCBvbkZpbmFsaXplLCBzaG91bGRVbnN1YnNjcmliZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMub25GaW5hbGl6ZSA9IG9uRmluYWxpemU7XG4gICAgICAgIF90aGlzLnNob3VsZFVuc3Vic2NyaWJlID0gc2hvdWxkVW5zdWJzY3JpYmU7XG4gICAgICAgIF90aGlzLl9uZXh0ID0gb25OZXh0XG4gICAgICAgICAgICA/IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIG9uTmV4dCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24uZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6IF9zdXBlci5wcm90b3R5cGUuX25leHQ7XG4gICAgICAgIF90aGlzLl9lcnJvciA9IG9uRXJyb3JcbiAgICAgICAgICAgID8gZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogX3N1cGVyLnByb3RvdHlwZS5fZXJyb3I7XG4gICAgICAgIF90aGlzLl9jb21wbGV0ZSA9IG9uQ29tcGxldGVcbiAgICAgICAgICAgID8gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogX3N1cGVyLnByb3RvdHlwZS5fY29tcGxldGU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgT3BlcmF0b3JTdWJzY3JpYmVyLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIXRoaXMuc2hvdWxkVW5zdWJzY3JpYmUgfHwgdGhpcy5zaG91bGRVbnN1YnNjcmliZSgpKSB7XG4gICAgICAgICAgICB2YXIgY2xvc2VkXzEgPSB0aGlzLmNsb3NlZDtcbiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUudW5zdWJzY3JpYmUuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICFjbG9zZWRfMSAmJiAoKF9hID0gdGhpcy5vbkZpbmFsaXplKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBPcGVyYXRvclN1YnNjcmliZXI7XG59KFN1YnNjcmliZXIpKTtcblxudmFyIE9iamVjdFVuc3Vic2NyaWJlZEVycm9yID0gY3JlYXRlRXJyb3JDbGFzcyhmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIE9iamVjdFVuc3Vic2NyaWJlZEVycm9ySW1wbCgpIHtcbiAgICAgICAgX3N1cGVyKHRoaXMpO1xuICAgICAgICB0aGlzLm5hbWUgPSAnT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3InO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSAnb2JqZWN0IHVuc3Vic2NyaWJlZCc7XG4gICAgfTtcbn0pO1xuXG52YXIgU3ViamVjdCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFN1YmplY3QsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU3ViamVjdCgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuY2xvc2VkID0gZmFsc2U7XG4gICAgICAgIF90aGlzLmN1cnJlbnRPYnNlcnZlcnMgPSBudWxsO1xuICAgICAgICBfdGhpcy5vYnNlcnZlcnMgPSBbXTtcbiAgICAgICAgX3RoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG4gICAgICAgIF90aGlzLmhhc0Vycm9yID0gZmFsc2U7XG4gICAgICAgIF90aGlzLnRocm93bkVycm9yID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBTdWJqZWN0LnByb3RvdHlwZS5saWZ0ID0gZnVuY3Rpb24gKG9wZXJhdG9yKSB7XG4gICAgICAgIHZhciBzdWJqZWN0ID0gbmV3IEFub255bW91c1N1YmplY3QodGhpcywgdGhpcyk7XG4gICAgICAgIHN1YmplY3Qub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICAgICAgcmV0dXJuIHN1YmplY3Q7XG4gICAgfTtcbiAgICBTdWJqZWN0LnByb3RvdHlwZS5fdGhyb3dJZkNsb3NlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU3ViamVjdC5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBlcnJvckNvbnRleHQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgICAgICBfdGhpcy5fdGhyb3dJZkNsb3NlZCgpO1xuICAgICAgICAgICAgaWYgKCFfdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV90aGlzLmN1cnJlbnRPYnNlcnZlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuY3VycmVudE9ic2VydmVycyA9IEFycmF5LmZyb20oX3RoaXMub2JzZXJ2ZXJzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyhfdGhpcy5jdXJyZW50T2JzZXJ2ZXJzKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9ic2VydmVyID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgU3ViamVjdC5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGVycm9yQ29udGV4dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5fdGhyb3dJZkNsb3NlZCgpO1xuICAgICAgICAgICAgaWYgKCFfdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5oYXNFcnJvciA9IF90aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgX3RoaXMudGhyb3duRXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgdmFyIG9ic2VydmVycyA9IF90aGlzLm9ic2VydmVycztcbiAgICAgICAgICAgICAgICB3aGlsZSAob2JzZXJ2ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlcnMuc2hpZnQoKS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBTdWJqZWN0LnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgZXJyb3JDb250ZXh0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLl90aHJvd0lmQ2xvc2VkKCk7XG4gICAgICAgICAgICBpZiAoIV90aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICAgICAgICAgIF90aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIG9ic2VydmVycyA9IF90aGlzLm9ic2VydmVycztcbiAgICAgICAgICAgICAgICB3aGlsZSAob2JzZXJ2ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlcnMuc2hpZnQoKS5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBTdWJqZWN0LnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXJzID0gdGhpcy5jdXJyZW50T2JzZXJ2ZXJzID0gbnVsbDtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdWJqZWN0LnByb3RvdHlwZSwgXCJvYnNlcnZlZFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgcmV0dXJuICgoX2EgPSB0aGlzLm9ic2VydmVycykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCkgPiAwO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgU3ViamVjdC5wcm90b3R5cGUuX3RyeVN1YnNjcmliZSA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgIHRoaXMuX3Rocm93SWZDbG9zZWQoKTtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuX3RyeVN1YnNjcmliZS5jYWxsKHRoaXMsIHN1YnNjcmliZXIpO1xuICAgIH07XG4gICAgU3ViamVjdC5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgIHRoaXMuX3Rocm93SWZDbG9zZWQoKTtcbiAgICAgICAgdGhpcy5fY2hlY2tGaW5hbGl6ZWRTdGF0dXNlcyhzdWJzY3JpYmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lubmVyU3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICAgIH07XG4gICAgU3ViamVjdC5wcm90b3R5cGUuX2lubmVyU3Vic2NyaWJlID0gZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIF9hID0gdGhpcywgaGFzRXJyb3IgPSBfYS5oYXNFcnJvciwgaXNTdG9wcGVkID0gX2EuaXNTdG9wcGVkLCBvYnNlcnZlcnMgPSBfYS5vYnNlcnZlcnM7XG4gICAgICAgIGlmIChoYXNFcnJvciB8fCBpc1N0b3BwZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBFTVBUWV9TVUJTQ1JJUFRJT047XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXJyZW50T2JzZXJ2ZXJzID0gbnVsbDtcbiAgICAgICAgb2JzZXJ2ZXJzLnB1c2goc3Vic2NyaWJlcik7XG4gICAgICAgIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLmN1cnJlbnRPYnNlcnZlcnMgPSBudWxsO1xuICAgICAgICAgICAgYXJyUmVtb3ZlKG9ic2VydmVycywgc3Vic2NyaWJlcik7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgU3ViamVjdC5wcm90b3R5cGUuX2NoZWNrRmluYWxpemVkU3RhdHVzZXMgPSBmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBoYXNFcnJvciA9IF9hLmhhc0Vycm9yLCB0aHJvd25FcnJvciA9IF9hLnRocm93bkVycm9yLCBpc1N0b3BwZWQgPSBfYS5pc1N0b3BwZWQ7XG4gICAgICAgIGlmIChoYXNFcnJvcikge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcih0aHJvd25FcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNTdG9wcGVkKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN1YmplY3QucHJvdG90eXBlLmFzT2JzZXJ2YWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZSgpO1xuICAgICAgICBvYnNlcnZhYmxlLnNvdXJjZSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBvYnNlcnZhYmxlO1xuICAgIH07XG4gICAgU3ViamVjdC5jcmVhdGUgPSBmdW5jdGlvbiAoZGVzdGluYXRpb24sIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gbmV3IEFub255bW91c1N1YmplY3QoZGVzdGluYXRpb24sIHNvdXJjZSk7XG4gICAgfTtcbiAgICByZXR1cm4gU3ViamVjdDtcbn0oT2JzZXJ2YWJsZSkpO1xudmFyIEFub255bW91c1N1YmplY3QgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhBbm9ueW1vdXNTdWJqZWN0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFub255bW91c1N1YmplY3QoZGVzdGluYXRpb24sIHNvdXJjZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uO1xuICAgICAgICBfdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgQW5vbnltb3VzU3ViamVjdC5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAoX2IgPSAoX2EgPSB0aGlzLmRlc3RpbmF0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubmV4dCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EsIHZhbHVlKTtcbiAgICB9O1xuICAgIEFub255bW91c1N1YmplY3QucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAoX2IgPSAoX2EgPSB0aGlzLmRlc3RpbmF0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZXJyb3IpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCBlcnIpO1xuICAgIH07XG4gICAgQW5vbnltb3VzU3ViamVjdC5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIChfYiA9IChfYSA9IHRoaXMuZGVzdGluYXRpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jb21wbGV0ZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EpO1xuICAgIH07XG4gICAgQW5vbnltb3VzU3ViamVjdC5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSB0aGlzLnNvdXJjZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnN1YnNjcmliZShzdWJzY3JpYmVyKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogRU1QVFlfU1VCU0NSSVBUSU9OO1xuICAgIH07XG4gICAgcmV0dXJuIEFub255bW91c1N1YmplY3Q7XG59KFN1YmplY3QpKTtcblxudmFyIGRhdGVUaW1lc3RhbXBQcm92aWRlciA9IHtcbiAgICBub3c6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIChEYXRlKS5ub3coKTtcbiAgICB9fTtcblxudmFyIEFjdGlvbiA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEFjdGlvbiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBBY3Rpb24oc2NoZWR1bGVyLCB3b3JrKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBBY3Rpb24ucHJvdG90eXBlLnNjaGVkdWxlID0gZnVuY3Rpb24gKHN0YXRlLCBkZWxheSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIHJldHVybiBBY3Rpb247XG59KFN1YnNjcmlwdGlvbikpO1xuXG52YXIgaW50ZXJ2YWxQcm92aWRlciA9IHtcbiAgICBzZXRJbnRlcnZhbDogZnVuY3Rpb24gKGhhbmRsZXIsIHRpbWVvdXQpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2kgLSAyXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNldEludGVydmFsLmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbaGFuZGxlciwgdGltZW91dF0sIF9fcmVhZChhcmdzKSkpO1xuICAgIH0sXG4gICAgY2xlYXJJbnRlcnZhbDogZnVuY3Rpb24gKGhhbmRsZSkge1xuICAgICAgICByZXR1cm4gKGNsZWFySW50ZXJ2YWwpKGhhbmRsZSk7XG4gICAgfSxcbiAgICBkZWxlZ2F0ZTogdW5kZWZpbmVkLFxufTtcblxudmFyIEFzeW5jQWN0aW9uID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQXN5bmNBY3Rpb24sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQXN5bmNBY3Rpb24oc2NoZWR1bGVyLCB3b3JrKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHNjaGVkdWxlciwgd29yaykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgICAgICBfdGhpcy53b3JrID0gd29yaztcbiAgICAgICAgX3RoaXMucGVuZGluZyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEFzeW5jQWN0aW9uLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uIChzdGF0ZSwgZGVsYXkpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoZGVsYXkgPT09IHZvaWQgMCkgeyBkZWxheSA9IDA7IH1cbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIHZhciBpZCA9IHRoaXMuaWQ7XG4gICAgICAgIHZhciBzY2hlZHVsZXIgPSB0aGlzLnNjaGVkdWxlcjtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLnJlY3ljbGVBc3luY0lkKHNjaGVkdWxlciwgaWQsIGRlbGF5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBlbmRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlbGF5ID0gZGVsYXk7XG4gICAgICAgIHRoaXMuaWQgPSAoX2EgPSB0aGlzLmlkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLnJlcXVlc3RBc3luY0lkKHNjaGVkdWxlciwgdGhpcy5pZCwgZGVsYXkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIEFzeW5jQWN0aW9uLnByb3RvdHlwZS5yZXF1ZXN0QXN5bmNJZCA9IGZ1bmN0aW9uIChzY2hlZHVsZXIsIF9pZCwgZGVsYXkpIHtcbiAgICAgICAgaWYgKGRlbGF5ID09PSB2b2lkIDApIHsgZGVsYXkgPSAwOyB9XG4gICAgICAgIHJldHVybiBpbnRlcnZhbFByb3ZpZGVyLnNldEludGVydmFsKHNjaGVkdWxlci5mbHVzaC5iaW5kKHNjaGVkdWxlciwgdGhpcyksIGRlbGF5KTtcbiAgICB9O1xuICAgIEFzeW5jQWN0aW9uLnByb3RvdHlwZS5yZWN5Y2xlQXN5bmNJZCA9IGZ1bmN0aW9uIChfc2NoZWR1bGVyLCBpZCwgZGVsYXkpIHtcbiAgICAgICAgaWYgKGRlbGF5ID09PSB2b2lkIDApIHsgZGVsYXkgPSAwOyB9XG4gICAgICAgIGlmIChkZWxheSAhPSBudWxsICYmIHRoaXMuZGVsYXkgPT09IGRlbGF5ICYmIHRoaXMucGVuZGluZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaW50ZXJ2YWxQcm92aWRlci5jbGVhckludGVydmFsKGlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgQXN5bmNBY3Rpb24ucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbiAoc3RhdGUsIGRlbGF5KSB7XG4gICAgICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignZXhlY3V0aW5nIGEgY2FuY2VsbGVkIGFjdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGVuZGluZyA9IGZhbHNlO1xuICAgICAgICB2YXIgZXJyb3IgPSB0aGlzLl9leGVjdXRlKHN0YXRlLCBkZWxheSk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucGVuZGluZyA9PT0gZmFsc2UgJiYgdGhpcy5pZCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5yZWN5Y2xlQXN5bmNJZCh0aGlzLnNjaGVkdWxlciwgdGhpcy5pZCwgbnVsbCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEFzeW5jQWN0aW9uLnByb3RvdHlwZS5fZXhlY3V0ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgX2RlbGF5KSB7XG4gICAgICAgIHZhciBlcnJvcmVkID0gZmFsc2U7XG4gICAgICAgIHZhciBlcnJvclZhbHVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy53b3JrKHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZXJyb3JlZCA9IHRydWU7XG4gICAgICAgICAgICBlcnJvclZhbHVlID0gZSA/IGUgOiBuZXcgRXJyb3IoJ1NjaGVkdWxlZCBhY3Rpb24gdGhyZXcgZmFsc3kgZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3JlZCkge1xuICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yVmFsdWU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEFzeW5jQWN0aW9uLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgdmFyIF9hID0gdGhpcywgaWQgPSBfYS5pZCwgc2NoZWR1bGVyID0gX2Euc2NoZWR1bGVyO1xuICAgICAgICAgICAgdmFyIGFjdGlvbnMgPSBzY2hlZHVsZXIuYWN0aW9ucztcbiAgICAgICAgICAgIHRoaXMud29yayA9IHRoaXMuc3RhdGUgPSB0aGlzLnNjaGVkdWxlciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGFyclJlbW92ZShhY3Rpb25zLCB0aGlzKTtcbiAgICAgICAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMucmVjeWNsZUFzeW5jSWQoc2NoZWR1bGVyLCBpZCwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRlbGF5ID0gbnVsbDtcbiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUudW5zdWJzY3JpYmUuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEFzeW5jQWN0aW9uO1xufShBY3Rpb24pKTtcblxudmFyIFNjaGVkdWxlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2NoZWR1bGVyKHNjaGVkdWxlckFjdGlvbkN0b3IsIG5vdykge1xuICAgICAgICBpZiAobm93ID09PSB2b2lkIDApIHsgbm93ID0gU2NoZWR1bGVyLm5vdzsgfVxuICAgICAgICB0aGlzLnNjaGVkdWxlckFjdGlvbkN0b3IgPSBzY2hlZHVsZXJBY3Rpb25DdG9yO1xuICAgICAgICB0aGlzLm5vdyA9IG5vdztcbiAgICB9XG4gICAgU2NoZWR1bGVyLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uICh3b3JrLCBkZWxheSwgc3RhdGUpIHtcbiAgICAgICAgaWYgKGRlbGF5ID09PSB2b2lkIDApIHsgZGVsYXkgPSAwOyB9XG4gICAgICAgIHJldHVybiBuZXcgdGhpcy5zY2hlZHVsZXJBY3Rpb25DdG9yKHRoaXMsIHdvcmspLnNjaGVkdWxlKHN0YXRlLCBkZWxheSk7XG4gICAgfTtcbiAgICBTY2hlZHVsZXIubm93ID0gZGF0ZVRpbWVzdGFtcFByb3ZpZGVyLm5vdztcbiAgICByZXR1cm4gU2NoZWR1bGVyO1xufSgpKTtcblxudmFyIEFzeW5jU2NoZWR1bGVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQXN5bmNTY2hlZHVsZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQXN5bmNTY2hlZHVsZXIoU2NoZWR1bGVyQWN0aW9uLCBub3cpIHtcbiAgICAgICAgaWYgKG5vdyA9PT0gdm9pZCAwKSB7IG5vdyA9IFNjaGVkdWxlci5ub3c7IH1cbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgU2NoZWR1bGVyQWN0aW9uLCBub3cpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmFjdGlvbnMgPSBbXTtcbiAgICAgICAgX3RoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEFzeW5jU2NoZWR1bGVyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgICAgdmFyIGFjdGlvbnMgPSB0aGlzLmFjdGlvbnM7XG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvcjtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKChlcnJvciA9IGFjdGlvbi5leGVjdXRlKGFjdGlvbi5zdGF0ZSwgYWN0aW9uLmRlbGF5KSkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoKGFjdGlvbiA9IGFjdGlvbnMuc2hpZnQoKSkpO1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICB3aGlsZSAoKGFjdGlvbiA9IGFjdGlvbnMuc2hpZnQoKSkpIHtcbiAgICAgICAgICAgICAgICBhY3Rpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQXN5bmNTY2hlZHVsZXI7XG59KFNjaGVkdWxlcikpO1xuXG52YXIgYXN5bmNTY2hlZHVsZXIgPSBuZXcgQXN5bmNTY2hlZHVsZXIoQXN5bmNBY3Rpb24pO1xuXG52YXIgaXNBcnJheUxpa2UgPSAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggJiYgdHlwZW9mIHgubGVuZ3RoID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgeCAhPT0gJ2Z1bmN0aW9uJzsgfSk7XG5cbmZ1bmN0aW9uIGlzUHJvbWlzZSh2YWx1ZSkge1xuICAgIHJldHVybiBpc0Z1bmN0aW9uKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB2b2lkIDAgPyB2b2lkIDAgOiB2YWx1ZS50aGVuKTtcbn1cblxuZnVuY3Rpb24gaXNJbnRlcm9wT2JzZXJ2YWJsZShpbnB1dCkge1xuICAgIHJldHVybiBpc0Z1bmN0aW9uKGlucHV0W29ic2VydmFibGVdKTtcbn1cblxuZnVuY3Rpb24gaXNBc3luY0l0ZXJhYmxlKG9iaikge1xuICAgIHJldHVybiBTeW1ib2wuYXN5bmNJdGVyYXRvciAmJiBpc0Z1bmN0aW9uKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9ialtTeW1ib2wuYXN5bmNJdGVyYXRvcl0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVJbnZhbGlkT2JzZXJ2YWJsZVR5cGVFcnJvcihpbnB1dCkge1xuICAgIHJldHVybiBuZXcgVHlwZUVycm9yKFwiWW91IHByb3ZpZGVkIFwiICsgKGlucHV0ICE9PSBudWxsICYmIHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgPyAnYW4gaW52YWxpZCBvYmplY3QnIDogXCInXCIgKyBpbnB1dCArIFwiJ1wiKSArIFwiIHdoZXJlIGEgc3RyZWFtIHdhcyBleHBlY3RlZC4gWW91IGNhbiBwcm92aWRlIGFuIE9ic2VydmFibGUsIFByb21pc2UsIFJlYWRhYmxlU3RyZWFtLCBBcnJheSwgQXN5bmNJdGVyYWJsZSwgb3IgSXRlcmFibGUuXCIpO1xufVxuXG5mdW5jdGlvbiBnZXRTeW1ib2xJdGVyYXRvcigpIHtcbiAgICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJyB8fCAhU3ltYm9sLml0ZXJhdG9yKSB7XG4gICAgICAgIHJldHVybiAnQEBpdGVyYXRvcic7XG4gICAgfVxuICAgIHJldHVybiBTeW1ib2wuaXRlcmF0b3I7XG59XG52YXIgaXRlcmF0b3IgPSBnZXRTeW1ib2xJdGVyYXRvcigpO1xuXG5mdW5jdGlvbiBpc0l0ZXJhYmxlKGlucHV0KSB7XG4gICAgcmV0dXJuIGlzRnVuY3Rpb24oaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGlucHV0W2l0ZXJhdG9yXSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRhYmxlU3RyZWFtTGlrZVRvQXN5bmNHZW5lcmF0b3IocmVhZGFibGVTdHJlYW0pIHtcbiAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uIHJlYWRhYmxlU3RyZWFtTGlrZVRvQXN5bmNHZW5lcmF0b3JfMSgpIHtcbiAgICAgICAgdmFyIHJlYWRlciwgX2EsIHZhbHVlLCBkb25lO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICByZWFkZXIgPSByZWFkYWJsZVN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgX2IudHJ5cy5wdXNoKFsxLCAsIDksIDEwXSk7XG4gICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCwgX19hd2FpdChyZWFkZXIucmVhZCgpKV07XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKSwgdmFsdWUgPSBfYS52YWx1ZSwgZG9uZSA9IF9hLmRvbmU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZG9uZSkgcmV0dXJuIFszLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0LCBfX2F3YWl0KHZvaWQgMCldO1xuICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyLCBfYi5zZW50KCldO1xuICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFs0LCBfX2F3YWl0KHZhbHVlKV07XG4gICAgICAgICAgICAgICAgY2FzZSA2OiByZXR1cm4gWzQsIF9iLnNlbnQoKV07XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMywgMl07XG4gICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gWzMsIDEwXTtcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5yZWxlYXNlTG9jaygpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzddO1xuICAgICAgICAgICAgICAgIGNhc2UgMTA6IHJldHVybiBbMl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gaXNSZWFkYWJsZVN0cmVhbUxpa2Uob2JqKSB7XG4gICAgcmV0dXJuIGlzRnVuY3Rpb24ob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JqLmdldFJlYWRlcik7XG59XG5cbmZ1bmN0aW9uIGlubmVyRnJvbShpbnB1dCkge1xuICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cbiAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoaXNJbnRlcm9wT2JzZXJ2YWJsZShpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmcm9tSW50ZXJvcE9ic2VydmFibGUoaW5wdXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FycmF5TGlrZShpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQcm9taXNlKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNBc3luY0l0ZXJhYmxlKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZyb21Bc3luY0l0ZXJhYmxlKGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNJdGVyYWJsZShpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmcm9tSXRlcmFibGUoaW5wdXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1JlYWRhYmxlU3RyZWFtTGlrZShpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmcm9tUmVhZGFibGVTdHJlYW1MaWtlKGlucHV0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBjcmVhdGVJbnZhbGlkT2JzZXJ2YWJsZVR5cGVFcnJvcihpbnB1dCk7XG59XG5mdW5jdGlvbiBmcm9tSW50ZXJvcE9ic2VydmFibGUob2JqKSB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgIHZhciBvYnMgPSBvYmpbb2JzZXJ2YWJsZV0oKTtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24ob2JzLnN1YnNjcmliZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBvYnMuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Byb3ZpZGVkIG9iamVjdCBkb2VzIG5vdCBjb3JyZWN0bHkgaW1wbGVtZW50IFN5bWJvbC5vYnNlcnZhYmxlJyk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlKGFycmF5KSB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoICYmICFzdWJzY3JpYmVyLmNsb3NlZDsgaSsrKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoYXJyYXlbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGZyb21Qcm9taXNlKHByb21pc2UpIHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICAgICAgcHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsgcmV0dXJuIHN1YnNjcmliZXIuZXJyb3IoZXJyKTsgfSlcbiAgICAgICAgICAgIC50aGVuKG51bGwsIHJlcG9ydFVuaGFuZGxlZEVycm9yKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGZyb21JdGVyYWJsZShpdGVyYWJsZSkge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICB2YXIgZV8xLCBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIGl0ZXJhYmxlXzEgPSBfX3ZhbHVlcyhpdGVyYWJsZSksIGl0ZXJhYmxlXzFfMSA9IGl0ZXJhYmxlXzEubmV4dCgpOyAhaXRlcmFibGVfMV8xLmRvbmU7IGl0ZXJhYmxlXzFfMSA9IGl0ZXJhYmxlXzEubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gaXRlcmFibGVfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHN1YnNjcmliZXIuY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVyYWJsZV8xXzEgJiYgIWl0ZXJhYmxlXzFfMS5kb25lICYmIChfYSA9IGl0ZXJhYmxlXzEucmV0dXJuKSkgX2EuY2FsbChpdGVyYWJsZV8xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBmcm9tQXN5bmNJdGVyYWJsZShhc3luY0l0ZXJhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgIHByb2Nlc3MoYXN5bmNJdGVyYWJsZSwgc3Vic2NyaWJlcikuY2F0Y2goZnVuY3Rpb24gKGVycikgeyByZXR1cm4gc3Vic2NyaWJlci5lcnJvcihlcnIpOyB9KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGZyb21SZWFkYWJsZVN0cmVhbUxpa2UocmVhZGFibGVTdHJlYW0pIHtcbiAgICByZXR1cm4gZnJvbUFzeW5jSXRlcmFibGUocmVhZGFibGVTdHJlYW1MaWtlVG9Bc3luY0dlbmVyYXRvcihyZWFkYWJsZVN0cmVhbSkpO1xufVxuZnVuY3Rpb24gcHJvY2Vzcyhhc3luY0l0ZXJhYmxlLCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIGFzeW5jSXRlcmFibGVfMSwgYXN5bmNJdGVyYWJsZV8xXzE7XG4gICAgdmFyIGVfMiwgX2E7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWUsIGVfMl8xO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzAsIDUsIDYsIDExXSk7XG4gICAgICAgICAgICAgICAgICAgIGFzeW5jSXRlcmFibGVfMSA9IF9fYXN5bmNWYWx1ZXMoYXN5bmNJdGVyYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCwgYXN5bmNJdGVyYWJsZV8xLm5leHQoKV07XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBpZiAoIShhc3luY0l0ZXJhYmxlXzFfMSA9IF9iLnNlbnQoKSwgIWFzeW5jSXRlcmFibGVfMV8xLmRvbmUpKSByZXR1cm4gWzMsIDRdO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGFzeW5jSXRlcmFibGVfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3Vic2NyaWJlci5jbG9zZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMl07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFszLCAxXTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMywgMTFdO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgZV8yXzEgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMywgMTFdO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgX2IudHJ5cy5wdXNoKFs2LCAsIDksIDEwXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGFzeW5jSXRlcmFibGVfMV8xICYmICFhc3luY0l0ZXJhYmxlXzFfMS5kb25lICYmIChfYSA9IGFzeW5jSXRlcmFibGVfMS5yZXR1cm4pKSkgcmV0dXJuIFszLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0LCBfYS5jYWxsKGFzeW5jSXRlcmFibGVfMSldO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDg7XG4gICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gWzMsIDEwXTtcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgIGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3XTtcbiAgICAgICAgICAgICAgICBjYXNlIDEwOiByZXR1cm4gWzddO1xuICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGV4ZWN1dGVTY2hlZHVsZShwYXJlbnRTdWJzY3JpcHRpb24sIHNjaGVkdWxlciwgd29yaywgZGVsYXksIHJlcGVhdCkge1xuICAgIGlmIChkZWxheSA9PT0gdm9pZCAwKSB7IGRlbGF5ID0gMDsgfVxuICAgIGlmIChyZXBlYXQgPT09IHZvaWQgMCkgeyByZXBlYXQgPSBmYWxzZTsgfVxuICAgIHZhciBzY2hlZHVsZVN1YnNjcmlwdGlvbiA9IHNjaGVkdWxlci5zY2hlZHVsZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdvcmsoKTtcbiAgICAgICAgaWYgKHJlcGVhdCkge1xuICAgICAgICAgICAgcGFyZW50U3Vic2NyaXB0aW9uLmFkZCh0aGlzLnNjaGVkdWxlKG51bGwsIGRlbGF5KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9LCBkZWxheSk7XG4gICAgcGFyZW50U3Vic2NyaXB0aW9uLmFkZChzY2hlZHVsZVN1YnNjcmlwdGlvbik7XG4gICAgaWYgKCFyZXBlYXQpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVkdWxlU3Vic2NyaXB0aW9uO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdGhyb3dFcnJvcihlcnJvck9yRXJyb3JGYWN0b3J5LCBzY2hlZHVsZXIpIHtcbiAgICB2YXIgZXJyb3JGYWN0b3J5ID0gaXNGdW5jdGlvbihlcnJvck9yRXJyb3JGYWN0b3J5KSA/IGVycm9yT3JFcnJvckZhY3RvcnkgOiBmdW5jdGlvbiAoKSB7IHJldHVybiBlcnJvck9yRXJyb3JGYWN0b3J5OyB9O1xuICAgIHZhciBpbml0ID0gZnVuY3Rpb24gKHN1YnNjcmliZXIpIHsgcmV0dXJuIHN1YnNjcmliZXIuZXJyb3IoZXJyb3JGYWN0b3J5KCkpOyB9O1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShpbml0KTtcbn1cblxudmFyIEVtcHR5RXJyb3IgPSBjcmVhdGVFcnJvckNsYXNzKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gRW1wdHlFcnJvckltcGwoKSB7XG4gICAgICAgIF9zdXBlcih0aGlzKTtcbiAgICAgICAgdGhpcy5uYW1lID0gJ0VtcHR5RXJyb3InO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSAnbm8gZWxlbWVudHMgaW4gc2VxdWVuY2UnO1xuICAgIH07XG59KTtcblxuZnVuY3Rpb24gbGFzdFZhbHVlRnJvbShzb3VyY2UsIGNvbmZpZykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBfaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgdmFyIF92YWx1ZTtcbiAgICAgICAgc291cmNlLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfdmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBfaGFzVmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiByZWplY3QsXG4gICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChfaGFzVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShfdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFbXB0eUVycm9yKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkRGF0ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKHZhbHVlKTtcbn1cblxudmFyIFRpbWVvdXRFcnJvciA9IGNyZWF0ZUVycm9yQ2xhc3MoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHJldHVybiBmdW5jdGlvbiBUaW1lb3V0RXJyb3JJbXBsKGluZm8pIHtcbiAgICAgICAgaWYgKGluZm8gPT09IHZvaWQgMCkgeyBpbmZvID0gbnVsbDsgfVxuICAgICAgICBfc3VwZXIodGhpcyk7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9ICdUaW1lb3V0IGhhcyBvY2N1cnJlZCc7XG4gICAgICAgIHRoaXMubmFtZSA9ICdUaW1lb3V0RXJyb3InO1xuICAgICAgICB0aGlzLmluZm8gPSBpbmZvO1xuICAgIH07XG59KTtcbmZ1bmN0aW9uIHRpbWVvdXQoY29uZmlnLCBzY2hlZHVsZXJBcmcpIHtcbiAgICB2YXIgX2EgPSAoaXNWYWxpZERhdGUoY29uZmlnKSA/IHsgZmlyc3Q6IGNvbmZpZyB9IDogdHlwZW9mIGNvbmZpZyA9PT0gJ251bWJlcicgPyB7IGVhY2g6IGNvbmZpZyB9IDogY29uZmlnKSwgZmlyc3QgPSBfYS5maXJzdCwgZWFjaCA9IF9hLmVhY2gsIF9iID0gX2Eud2l0aCwgX3dpdGggPSBfYiA9PT0gdm9pZCAwID8gdGltZW91dEVycm9yRmFjdG9yeSA6IF9iLCBfYyA9IF9hLnNjaGVkdWxlciwgc2NoZWR1bGVyID0gX2MgPT09IHZvaWQgMCA/IGFzeW5jU2NoZWR1bGVyIDogX2MsIF9kID0gX2EubWV0YSwgbWV0YSA9IF9kID09PSB2b2lkIDAgPyBudWxsIDogX2Q7XG4gICAgaWYgKGZpcnN0ID09IG51bGwgJiYgZWFjaCA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ05vIHRpbWVvdXQgcHJvdmlkZWQuJyk7XG4gICAgfVxuICAgIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uIChzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsU291cmNlU3Vic2NyaXB0aW9uO1xuICAgICAgICB2YXIgdGltZXJTdWJzY3JpcHRpb247XG4gICAgICAgIHZhciBsYXN0VmFsdWUgPSBudWxsO1xuICAgICAgICB2YXIgc2VlbiA9IDA7XG4gICAgICAgIHZhciBzdGFydFRpbWVyID0gZnVuY3Rpb24gKGRlbGF5KSB7XG4gICAgICAgICAgICB0aW1lclN1YnNjcmlwdGlvbiA9IGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFNvdXJjZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgICBpbm5lckZyb20oX3dpdGgoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YTogbWV0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RWYWx1ZTogbGFzdFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2Vlbjogc2VlbixcbiAgICAgICAgICAgICAgICAgICAgfSkpLnN1YnNjcmliZShzdWJzY3JpYmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgZGVsYXkpO1xuICAgICAgICB9O1xuICAgICAgICBvcmlnaW5hbFNvdXJjZVN1YnNjcmlwdGlvbiA9IHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGltZXJTdWJzY3JpcHRpb24gPT09IG51bGwgfHwgdGltZXJTdWJzY3JpcHRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRpbWVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICBzZWVuKys7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoKGxhc3RWYWx1ZSA9IHZhbHVlKSk7XG4gICAgICAgICAgICBlYWNoID4gMCAmJiBzdGFydFRpbWVyKGVhY2gpO1xuICAgICAgICB9LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCEodGltZXJTdWJzY3JpcHRpb24gPT09IG51bGwgfHwgdGltZXJTdWJzY3JpcHRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRpbWVyU3Vic2NyaXB0aW9uLmNsb3NlZCkpIHtcbiAgICAgICAgICAgICAgICB0aW1lclN1YnNjcmlwdGlvbiA9PT0gbnVsbCB8fCB0aW1lclN1YnNjcmlwdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGltZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RWYWx1ZSA9IG51bGw7XG4gICAgICAgIH0pKTtcbiAgICAgICAgIXNlZW4gJiYgc3RhcnRUaW1lcihmaXJzdCAhPSBudWxsID8gKHR5cGVvZiBmaXJzdCA9PT0gJ251bWJlcicgPyBmaXJzdCA6ICtmaXJzdCAtIHNjaGVkdWxlci5ub3coKSkgOiBlYWNoKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHRpbWVvdXRFcnJvckZhY3RvcnkoaW5mbykge1xuICAgIHRocm93IG5ldyBUaW1lb3V0RXJyb3IoaW5mbyk7XG59XG5cbmNsYXNzIExvYWRlZE9uY2VQdWJsaXNoZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnNldCA9ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2N1cnJlbnQuc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2FkZWRPbmNlIGlzIGFscmVhZHkgaW4gc3VjY2VzcyBzdGF0ZVwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2N1cnJlbnQgPSB7IHN0YXR1czogXCJzdWNjZXNzXCIsIGlzU3VjY2VzczogdHJ1ZSwgbG9hZGVkVmFsdWU6IHZhbHVlIH07XG4gICAgICB0aGlzLl9zdWJqZWN0Lm5leHQodmFsdWUpO1xuICAgICAgdGhpcy5fc3ViamVjdC5jb21wbGV0ZSgpO1xuICAgIH07XG4gICAgdGhpcy50aHJvdyA9IChlcnJvciwgZXJyTXNnKSA9PiB7XG4gICAgICBpZiAodGhpcy5fY3VycmVudC5zdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkxvYWRlZE9uY2UgaXMgYWxyZWFkeSBpbiBzdWNjZXNzIHN0YXRlXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY3VycmVudCA9IHsgc3RhdHVzOiBcImVycm9yXCIsIGlzU3VjY2VzczogZmFsc2UsIGVycm9yLCBlcnJNc2cgfTtcbiAgICAgIHRoaXMuX3N1YmplY3QuZXJyb3IoZXJyb3IpO1xuICAgIH07XG4gICAgdGhpcy5nZXRWYWx1ZUlmTG9hZGVkRWxzZSA9ICh2YWx1ZUlmTm90TG9hZGVkKSA9PiB7XG4gICAgICBpZiAodGhpcy5fY3VycmVudC5zdGF0dXMgPT09IFwic3VjY2Vzc1wiKSByZXR1cm4gdGhpcy5fY3VycmVudC5sb2FkZWRWYWx1ZTtcbiAgICAgIHJldHVybiB2YWx1ZUlmTm90TG9hZGVkO1xuICAgIH07XG4gICAgdGhpcy5zdWJzY3JpYmUgPSAoZm4pID0+IHtcbiAgICAgIGlmICh0aGlzLl9jdXJyZW50LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgZm4odGhpcy5fY3VycmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9jdXJyZW50LnN0YXR1cyA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgIGZuKHRoaXMuX2N1cnJlbnQpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5fc3ViamVjdC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnQuc3RhdHVzICE9PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzdGF0ZSAobmV4dCk6IHBsZWFzZSBtYWtlIHN1cmUgdG8gdXBkYXRlIF9jdXJyZW50IGJlZm9yZSB0aGUgc3ViamVjdFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm4odGhpcy5fY3VycmVudCk7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnQuc3RhdHVzICE9PSBcImVycm9yXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc3RhdGUgKGVycm9yKTogcGxlYXNlIG1ha2Ugc3VyZSB0byB1cGRhdGUgX2N1cnJlbnQgYmVmb3JlIHRoZSBzdWJqZWN0XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbih0aGlzLl9jdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLndhaXRGb3JMb2FkID0gKHRpbWVvdXRDb25maWcpID0+IHtcbiAgICAgIGlmICh0aGlzLl9jdXJyZW50LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fY3VycmVudC5sb2FkZWRWYWx1ZSk7XG4gICAgICBpZiAodGhpcy5fY3VycmVudC5zdGF0dXMgPT09IFwiZXJyb3JcIikgcmV0dXJuIFByb21pc2UucmVqZWN0KHRoaXMuX2N1cnJlbnQuZXJyb3IpO1xuICAgICAgaWYgKHRoaXMuX2N1cnJlbnQuc3RhdHVzICE9PSBcImluaXRpYWxcIikgYXNzZXJ0TmV2ZXIodGhpcy5fY3VycmVudCk7XG4gICAgICBjb25zdCB0aW1lb3V0UGFyYW1zID0ge1xuICAgICAgICBmaXJzdDogdGltZW91dENvbmZpZy50aW1lb3V0U2VjICogMWUzLFxuICAgICAgICB3aXRoOiAoKSA9PiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcih0aW1lb3V0Q29uZmlnLnRpbWVvdXRFcnJNc2cpKVxuICAgICAgfTtcbiAgICAgIHJldHVybiBsYXN0VmFsdWVGcm9tKHRoaXMuX3N1YmplY3QucGlwZSh0aW1lb3V0KHRpbWVvdXRQYXJhbXMpKSk7XG4gICAgfTtcbiAgICB0aGlzLl9jdXJyZW50ID0geyBzdGF0dXM6IFwiaW5pdGlhbFwiLCBpc1N1Y2Nlc3M6IGZhbHNlIH07XG4gICAgdGhpcy5fc3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG4gIH1cbiAgZ2V0IGN1cnJlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnQ7XG4gIH1cbn1cblxueiQxLmVudW0oW1wiZGV2XCIsIFwic3RnXCIsIFwicHJvZFwiXSk7XG5jb25zdCBjb25udG9CYXNlVXJscyA9IHtcbiAgcHJvZDogXCJodHRwczovL2Nvbm50by5nZXRvcGVucGF5LmNvbVwiLFxuICBzdGc6IFwiaHR0cHM6Ly9jb25udG8ub3BlbnBheXN0YWdpbmcuY29tXCIsXG4gIGRldjogXCJodHRwOi8vbG9jYWxob3N0OjgwMDBcIlxufTtcbmNvbnN0IGdldENvbm50b1VybCA9IChlbnYpID0+IHtcbiAgcmV0dXJuIGNvbm50b0Jhc2VVcmxzW2Vudl07XG59O1xuXG5mdW5jdGlvbiBhc3NlcnROZXZlcih2YWx1ZSkge1xuICB0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBjYXNlOiAke3ZhbHVlfWApO1xufVxuY29uc3QgZ2V0V2luZG93U2FmZSA9ICgpID0+IHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIHJldHVybiB3aW5kb3c7XG59O1xuXG5jb25zdCBtZXRyaWNzUHVibGlzaGVyID0gbmV3IExvYWRlZE9uY2VQdWJsaXNoZXIoKTtcbmNvbnN0IE1FVFJJQ1NfUVVFVUVfS0VZID0gXCJvcF9tZXRyaWNzX3F1ZXVlXCI7XG5jb25zdCBNQVhfUkVUUllfQVRURU1QVFMgPSAzO1xuY29uc3QgQkFUQ0hfU0laRSA9IDM7XG5jb25zdCBCQVRDSF9JTlRFUlZBTF9NUyA9IDFlMztcbmNvbnN0IHsgbG9nX186IGxvZ19fJDEgfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwib3AtbWV0cmljc1wiKTtcbmNsYXNzIE1ldHJpY3NRdWV1ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucXVldWUgPSBbXTtcbiAgICB0aGlzLnByb2Nlc3NpbmdRdWV1ZSA9IGZhbHNlO1xuICAgIHRoaXMuYmF0Y2hUaW1lb3V0ID0gbnVsbDtcbiAgICB0aGlzLmxhc3RFdmVudFRpbWVzdGFtcCA9IDA7XG4gICAgdGhpcy5vZmZsaW5lTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICBsb2dfXyQxKFwiTmV0d29yayBvZmZsaW5lLCBtZXRyaWNzIHdpbGwgYmUgcXVldWVkXCIpO1xuICAgICAgdGhpcy5jYW5jZWxCYXRjaFByb2Nlc3NpbmcoKTtcbiAgICB9O1xuICAgIHRoaXMub25saW5lTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICBsb2dfXyQxKFwiTmV0d29yayBvbmxpbmUsIHByb2Nlc3NpbmcgbWV0cmljcyBxdWV1ZVwiKTtcbiAgICAgIHRoaXMucHJvY2Vzc1F1ZXVlKCk7XG4gICAgfTtcbiAgICB0aGlzLmxvYWRRdWV1ZUZyb21TdG9yYWdlKCk7XG4gICAgZ2V0V2luZG93U2FmZSgpPy5hZGRFdmVudExpc3RlbmVyKFwib2ZmbGluZVwiLCB0aGlzLm9mZmxpbmVMaXN0ZW5lcik7XG4gICAgZ2V0V2luZG93U2FmZSgpPy5hZGRFdmVudExpc3RlbmVyKFwib25saW5lXCIsIHRoaXMub25saW5lTGlzdGVuZXIpO1xuICB9XG4gIGFkZEV2ZW50KGV2ZW50TmFtZSwgcHJvcGVydGllcywgY29udGV4dFByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIGV2ZW50TmFtZSxcbiAgICAgIHByb3BlcnRpZXM6IHByb3BlcnRpZXMgfHwge30sXG4gICAgICBjb250ZXh0UHJvcGVydGllczogY29udGV4dFByb3BlcnRpZXMgfHwge30sXG4gICAgICBub25jZTogdjQoKSxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIGRhdGV0aW1lOiAoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKCksXG4gICAgICBhdHRlbXB0Q291bnQ6IDAsXG4gICAgICB0aW1lRGlmZkZyb21QcmV2aW91c0V2ZW50OiB0aGlzLmxhc3RFdmVudFRpbWVzdGFtcCA/IERhdGUubm93KCkgLSB0aGlzLmxhc3RFdmVudFRpbWVzdGFtcCA6IDBcbiAgICB9O1xuICAgIHRoaXMubGFzdEV2ZW50VGltZXN0YW1wID0gZXZlbnQudGltZXN0YW1wO1xuICAgIHRoaXMucXVldWUucHVzaChldmVudCk7XG4gICAgdGhpcy5zYXZlUXVldWVUb1N0b3JhZ2UoKTtcbiAgICB0aGlzLnNjaGVkdWxlQmF0Y2hQcm9jZXNzaW5nKCk7XG4gIH1cbiAgbG9hZFF1ZXVlRnJvbVN0b3JhZ2UoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JlZFF1ZXVlID0gZ2V0V2luZG93U2FmZSgpPy5sb2NhbFN0b3JhZ2U/LmdldEl0ZW0oTUVUUklDU19RVUVVRV9LRVkpO1xuICAgICAgaWYgKHN0b3JlZFF1ZXVlKSB7XG4gICAgICAgIHRoaXMucXVldWUgPSBKU09OLnBhcnNlKHN0b3JlZFF1ZXVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgICAgdGhpcy5zYXZlUXVldWVUb1N0b3JhZ2UoKTtcbiAgICB9XG4gIH1cbiAgc2F2ZVF1ZXVlVG9TdG9yYWdlKCkge1xuICAgIGdldFdpbmRvd1NhZmUoKT8ubG9jYWxTdG9yYWdlLnNldEl0ZW0oTUVUUklDU19RVUVVRV9LRVksIEpTT04uc3RyaW5naWZ5KHRoaXMucXVldWUpKTtcbiAgfVxuICBzY2hlZHVsZUJhdGNoUHJvY2Vzc2luZygpIHtcbiAgICBjb25zdCBzYWZlV2luZG93ID0gZ2V0V2luZG93U2FmZSgpO1xuICAgIGlmIChzYWZlV2luZG93ICYmIG5hdmlnYXRvci5vbkxpbmUgJiYgIXRoaXMucHJvY2Vzc2luZ1F1ZXVlICYmIHRoaXMucXVldWUubGVuZ3RoID4gMCAmJiAhdGhpcy5iYXRjaFRpbWVvdXQpIHtcbiAgICAgIHRoaXMuYmF0Y2hUaW1lb3V0ID0gc2FmZVdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5iYXRjaFRpbWVvdXQgPSBudWxsO1xuICAgICAgICB0aGlzLnByb2Nlc3NRdWV1ZSgpO1xuICAgICAgfSwgQkFUQ0hfSU5URVJWQUxfTVMpO1xuICAgIH1cbiAgfVxuICBjYW5jZWxCYXRjaFByb2Nlc3NpbmcoKSB7XG4gICAgaWYgKHRoaXMuYmF0Y2hUaW1lb3V0KSB7XG4gICAgICBnZXRXaW5kb3dTYWZlKCk/LmNsZWFyVGltZW91dCh0aGlzLmJhdGNoVGltZW91dCk7XG4gICAgICB0aGlzLmJhdGNoVGltZW91dCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMucHJvY2Vzc2luZ1F1ZXVlID0gZmFsc2U7XG4gIH1cbiAgcHJvY2Vzc1F1ZXVlKCkge1xuICAgIGlmICghbmF2aWdhdG9yLm9uTGluZSB8fCB0aGlzLnByb2Nlc3NpbmdRdWV1ZSB8fCB0aGlzLnF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnByb2Nlc3NpbmdRdWV1ZSA9IHRydWU7XG4gICAgdGhpcy5zZW5kQmF0Y2goKS5maW5hbGx5KCgpID0+IHtcbiAgICAgIHRoaXMucHJvY2Vzc2luZ1F1ZXVlID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVCYXRjaFByb2Nlc3NpbmcoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBhc3luYyBzZW5kQmF0Y2goKSB7XG4gICAgaWYgKHRoaXMucXVldWUubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgY29udGV4dCA9IG1ldHJpY3NQdWJsaXNoZXIuZ2V0VmFsdWVJZkxvYWRlZEVsc2Uodm9pZCAwKTtcbiAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgIGxvZ19fJDEoXCJNZXRyaWNzIGNvbnRleHQgbm90IGF2YWlsYWJsZSwgd2lsbCByZXRyeSBsYXRlclwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYmF0Y2ggPSB0aGlzLnF1ZXVlLnNsaWNlKDAsIEJBVENIX1NJWkUpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBiYXRjaFBheWxvYWQgPSB7XG4gICAgICAgIGV2ZW50czogYmF0Y2gubWFwKChldmVudCkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBldmVudF9uYW1lOiBldmVudC5ldmVudE5hbWUsXG4gICAgICAgICAgICBkZXZpY2VfdG9rZW46IGNvbnRleHQuZGV2aWNlVG9rZW4sXG4gICAgICAgICAgICBjb250ZXh0X3Byb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgICAgICAgLi4uZXZlbnQuY29udGV4dFByb3BlcnRpZXNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgIG5vbmNlOiBldmVudC5ub25jZSxcbiAgICAgICAgICAgICAgZGF0ZXRpbWU6IGV2ZW50LmRhdGV0aW1lLFxuICAgICAgICAgICAgICB0aW1lc3RhbXA6IGV2ZW50LnRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgdGltZV9kaWZmX2Zyb21fcHJldmlvdXNfZXZlbnQ6IGV2ZW50LnRpbWVEaWZmRnJvbVByZXZpb3VzRXZlbnQsXG4gICAgICAgICAgICAgIGNoZWNrb3V0X3NlY3VyZV90b2tlbjogY29udGV4dC5jaGVja291dFNlY3VyZVRva2VuLFxuICAgICAgICAgICAgICAuLi5ldmVudC5wcm9wZXJ0aWVzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgICBjb25zdCBjb25udG9VcmwgPSBnZXRDb25udG9VcmwoY29udGV4dC5lbnZpcm9ubWVudCk7XG4gICAgICBjb25zdCBtZXRyaWNzUm91dGVyID0gbmV3IFVSTChcIi9tZXRyaWNzL3B1YmxpYy9jYXB0dXJlXCIsIGNvbm50b1VybCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKG1ldHJpY3NSb3V0ZXIudG9TdHJpbmcoKSwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYmF0Y2hQYXlsb2FkKSxcbiAgICAgICAga2VlcGFsaXZlOiB0cnVlXG4gICAgICAgIC8vIFRvIHNlbmQgZXZlbnRzIGV2ZW4gaWYgdGhlIHBhZ2UgaXMgdW5sb2FkZWRcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRoaXMucXVldWUgPSB0aGlzLnF1ZXVlLnNsaWNlKGJhdGNoLmxlbmd0aCk7XG4gICAgICAgIHRoaXMuc2F2ZVF1ZXVlVG9TdG9yYWdlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhhbmRsZUZhaWxlZEJhdGNoKGJhdGNoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nX18kMShcIkVycm9yIHNlbmRpbmcgbWV0cmljcyBiYXRjaDpcIiwgZXJyb3IpO1xuICAgICAgdGhpcy5oYW5kbGVGYWlsZWRCYXRjaChiYXRjaCk7XG4gICAgfVxuICB9XG4gIGhhbmRsZUZhaWxlZEJhdGNoKGJhdGNoKSB7XG4gICAgYmF0Y2guZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LmF0dGVtcHRDb3VudCsrO1xuICAgIH0pO1xuICAgIGNvbnN0IGV2ZW50c1RvS2VlcCA9IGJhdGNoLmZpbHRlcigoZXZlbnQpID0+IGV2ZW50LmF0dGVtcHRDb3VudCA8IE1BWF9SRVRSWV9BVFRFTVBUUyk7XG4gICAgdGhpcy5xdWV1ZSA9IHRoaXMucXVldWUuc2xpY2UoYmF0Y2gubGVuZ3RoKTtcbiAgICB0aGlzLnF1ZXVlID0gWy4uLmV2ZW50c1RvS2VlcCwgLi4udGhpcy5xdWV1ZV07XG4gICAgdGhpcy5zYXZlUXVldWVUb1N0b3JhZ2UoKTtcbiAgfVxuICBjbGVhbnVwKCkge1xuICAgIGdldFdpbmRvd1NhZmUoKT8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm9mZmxpbmVcIiwgdGhpcy5vZmZsaW5lTGlzdGVuZXIpO1xuICAgIGdldFdpbmRvd1NhZmUoKT8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm9ubGluZVwiLCB0aGlzLm9ubGluZUxpc3RlbmVyKTtcbiAgICB0aGlzLmNhbmNlbEJhdGNoUHJvY2Vzc2luZygpO1xuICB9XG59XG5uZXcgTWV0cmljc1F1ZXVlKCk7XG5cbnokMS5vYmplY3Qoe1xuICBzdHJpcGVfcGs6IHokMS5zdHJpbmcoKSxcbiAgY2xpZW50X3NlY3JldDogeiQxLnN0cmluZygpLFxuICBzdHJpcGVfcG1faWQ6IHokMS5zdHJpbmcoKVxufSk7XG56JDEub2JqZWN0KHtcbiAgdHlwZTogeiQxLnN0cmluZygpLFxuICBjbGllbnRfc2VjcmV0OiB6JDEuc3RyaW5nKCksXG4gIHN0cmlwZV9wazogeiQxLnN0cmluZygpXG59KTtcblxuY29uc3QgZXh0cmFjdElzc3Vlc1BlckZpZWxkID0gKGVycm9yKSA9PiB7XG4gIGNvbnN0IGlzc3Vlc1BlckZpZWxkID0ge307XG4gIE9iamVjdC5lbnRyaWVzKGVycm9yKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmllbGROYW1lID0gRmllbGROYW1lRW51bS5wYXJzZShrZXkpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGlzc3Vlc1BlckZpZWxkW2ZpZWxkTmFtZV0gPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZS5fZXJyb3JzKSkge1xuICAgICAgICBpc3N1ZXNQZXJGaWVsZFtmaWVsZE5hbWVdID0gdmFsdWUuX2Vycm9ycztcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gaXNzdWVzUGVyRmllbGQ7XG59O1xuXG5jb25zdCB7IGxvZ19fLCBlcnJfXzogZXJyX18kMSB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJjb21tb24tY2NcIik7XG5jb25zdCBjcmVhdGVEeW5hbWljVmFsaWRhdGlvblNjaGVtYSA9ICh7XG4gIHJlcXVpcmVfemlwX2NvZGUsXG4gIHJlcXVpcmVfZnVsbF9iaWxsaW5nX2FkZHJlc3MsXG4gIHJlcXVpcmVfZnVsbF9zaGlwcGluZ19hZGRyZXNzLFxuICBwYXltZW50X21ldGhvZFxufSkgPT4ge1xuICBjb25zdCBjb25kaXRpb25hbEZpZWxkcyA9IHt9O1xuICBpZiAocGF5bWVudF9tZXRob2QgPT09IFwiYWNoXCIpIHtcbiAgICBjb25kaXRpb25hbEZpZWxkc1tGaWVsZE5hbWUuRklSU1RfTkFNRV0gPSB6JDEuc3RyaW5nKCkubWluKDIsIHsgbWVzc2FnZTogXCJNaW5pbXVtIGxlbmd0aCBpcyAyXCIgfSk7XG4gICAgY29uZGl0aW9uYWxGaWVsZHNbRmllbGROYW1lLkxBU1RfTkFNRV0gPSB6JDEuc3RyaW5nKCkubWluKDIsIHsgbWVzc2FnZTogXCJNaW5pbXVtIGxlbmd0aCBpcyAyXCIgfSk7XG4gIH1cbiAgaWYgKHJlcXVpcmVfemlwX2NvZGUpIHtcbiAgICBjb25kaXRpb25hbEZpZWxkc1tGaWVsZE5hbWUuWklQX0NPREVdID0gUmVxdWlyZWRTdHJpbmc7XG4gIH1cbiAgaWYgKHJlcXVpcmVfZnVsbF9iaWxsaW5nX2FkZHJlc3MpIHtcbiAgICBjb25kaXRpb25hbEZpZWxkc1tGaWVsZE5hbWUuTElORTFdID0gUmVxdWlyZWRTdHJpbmc7XG4gICAgY29uZGl0aW9uYWxGaWVsZHNbRmllbGROYW1lLkNJVFldID0gUmVxdWlyZWRTdHJpbmc7XG4gICAgY29uZGl0aW9uYWxGaWVsZHNbRmllbGROYW1lLlNUQVRFXSA9IFJlcXVpcmVkU3RyaW5nO1xuICAgIGNvbmRpdGlvbmFsRmllbGRzW0ZpZWxkTmFtZS5DT1VOVFJZXSA9IFJlcXVpcmVkU3RyaW5nO1xuICAgIGNvbmRpdGlvbmFsRmllbGRzW0ZpZWxkTmFtZS5aSVBfQ09ERV0gPSBSZXF1aXJlZFN0cmluZztcbiAgfVxuICBpZiAocmVxdWlyZV9mdWxsX3NoaXBwaW5nX2FkZHJlc3MpIHtcbiAgICBjb25kaXRpb25hbEZpZWxkc1tGaWVsZE5hbWUuU0hJUFBJTkdfTElORTFdID0gUmVxdWlyZWRTdHJpbmc7XG4gICAgY29uZGl0aW9uYWxGaWVsZHNbRmllbGROYW1lLlNISVBQSU5HX0NJVFldID0gUmVxdWlyZWRTdHJpbmc7XG4gICAgY29uZGl0aW9uYWxGaWVsZHNbRmllbGROYW1lLlNISVBQSU5HX1NUQVRFXSA9IFJlcXVpcmVkU3RyaW5nO1xuICAgIGNvbmRpdGlvbmFsRmllbGRzW0ZpZWxkTmFtZS5TSElQUElOR19DT1VOVFJZXSA9IFJlcXVpcmVkU3RyaW5nO1xuICAgIGNvbmRpdGlvbmFsRmllbGRzW0ZpZWxkTmFtZS5TSElQUElOR19aSVBfQ09ERV0gPSBSZXF1aXJlZFN0cmluZztcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoY29uZGl0aW9uYWxGaWVsZHMpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBSZXF1aXJlZEZvcm1GaWVsZHM7XG4gIH1cbiAgcmV0dXJuIFJlcXVpcmVkRm9ybUZpZWxkcy5leHRlbmQoY29uZGl0aW9uYWxGaWVsZHMpO1xufTtcbmNvbnN0IHZhbGlkYXRlTm9uQ2RlRm9ybUZpZWxkcyA9IChub25DZGVGb3JtSW5wdXRzLCBvblZhbGlkYXRpb25FcnJvciwgZGVmYXVsdEZpZWxkVmFsdWVzID0ge30pID0+IHtcbiAgaWYgKGRlZmF1bHRGaWVsZFZhbHVlcykge1xuICAgIGxvZ19fKGBSZWNlaXZlZCBkZWZhdWx0IGZpZWxkIHZhbHVlczogJHtKU09OLnN0cmluZ2lmeShkZWZhdWx0RmllbGRWYWx1ZXMpfWApO1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkZWZhdWx0RmllbGRWYWx1ZXMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGNvbnN0IHZhbHVlID0gZGVmYXVsdEZpZWxkVmFsdWVzW2tleV07XG4gICAgICBpZiAoIW5vbkNkZUZvcm1JbnB1dHNba2V5XSkge1xuICAgICAgICBub25DZGVGb3JtSW5wdXRzW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbm9uQ2RlRm9ybUlucHV0c1tGaWVsZE5hbWUuSVNfU0hJUFBJTkdfU0FNRV9BU19CSUxMSU5HXSA9ICEhbm9uQ2RlRm9ybUlucHV0c1tGaWVsZE5hbWUuSVNfU0hJUFBJTkdfU0FNRV9BU19CSUxMSU5HXTtcbiAgaWYgKG5vbkNkZUZvcm1JbnB1dHNbRmllbGROYW1lLklTX1NISVBQSU5HX1NBTUVfQVNfQklMTElOR10pIHtcbiAgICBub25DZGVGb3JtSW5wdXRzW0ZpZWxkTmFtZS5TSElQUElOR19MSU5FMV0gPSBub25DZGVGb3JtSW5wdXRzW0ZpZWxkTmFtZS5MSU5FMV07XG4gICAgbm9uQ2RlRm9ybUlucHV0c1tGaWVsZE5hbWUuU0hJUFBJTkdfTElORTJdID0gbm9uQ2RlRm9ybUlucHV0c1tGaWVsZE5hbWUuTElORTJdO1xuICAgIG5vbkNkZUZvcm1JbnB1dHNbRmllbGROYW1lLlNISVBQSU5HX0xJTkUzXSA9IG5vbkNkZUZvcm1JbnB1dHNbRmllbGROYW1lLkxJTkUzXTtcbiAgICBub25DZGVGb3JtSW5wdXRzW0ZpZWxkTmFtZS5TSElQUElOR19DSVRZXSA9IG5vbkNkZUZvcm1JbnB1dHNbRmllbGROYW1lLkNJVFldO1xuICAgIG5vbkNkZUZvcm1JbnB1dHNbRmllbGROYW1lLlNISVBQSU5HX1NUQVRFXSA9IG5vbkNkZUZvcm1JbnB1dHNbRmllbGROYW1lLlNUQVRFXTtcbiAgICBub25DZGVGb3JtSW5wdXRzW0ZpZWxkTmFtZS5TSElQUElOR19DT1VOVFJZXSA9IG5vbkNkZUZvcm1JbnB1dHNbRmllbGROYW1lLkNPVU5UUlldO1xuICAgIG5vbkNkZUZvcm1JbnB1dHNbRmllbGROYW1lLlNISVBQSU5HX1pJUF9DT0RFXSA9IG5vbkNkZUZvcm1JbnB1dHNbRmllbGROYW1lLlpJUF9DT0RFXTtcbiAgfVxuICBjb25zdCB2YWxpZGF0aW9uU2NoZW1hID0gY3JlYXRlRHluYW1pY1ZhbGlkYXRpb25TY2hlbWEoZGVmYXVsdEZpZWxkVmFsdWVzKTtcbiAgY29uc3QgcmVzdWx0ID0gdmFsaWRhdGlvblNjaGVtYS5zYWZlUGFyc2Uobm9uQ2RlRm9ybUlucHV0cyk7XG4gIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICBjb25zdCBmb3JtYXR0ZWQgPSByZXN1bHQuZXJyb3IuZm9ybWF0KCk7XG4gICAgY29uc3QgaXNzdWVzID0gZXh0cmFjdElzc3Vlc1BlckZpZWxkKGZvcm1hdHRlZCk7XG4gICAgY29uc3QgaXNzdWVLZXlzID0gT2JqZWN0LmtleXMoaXNzdWVzKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlzc3VlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZmllbGROYW1lID0gaXNzdWVLZXlzW2ldO1xuICAgICAgY29uc3QgZXJyb3JzID0gaXNzdWVzW2ZpZWxkTmFtZV07XG4gICAgICBvblZhbGlkYXRpb25FcnJvcihmaWVsZE5hbWUsIGVycm9ycywgZmllbGROYW1lKTtcbiAgICB9XG4gICAgZXJyX18kMShcIkdvdCB2YWxpZGF0aW9uIGVycm9ycyBpbiBub24tQ0RFIGZvcm0gZmllbGRzXCIsIGlzc3Vlcyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQWxtb3N0IHRoZXJlISBKdXN0IGEgZmV3IHRoaW5ncyBoaWdobGlnaHRlZCBhYm92ZSB0byBmaXggYmVmb3JlIHlvdSBjYW4gc3VibWl0LlwiKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0LmRhdGE7XG59O1xuXG5jb25zdCBQYXltZW50UHJvY2Vzc29yID0geiQxLmVudW0oW1wic3RyaXBlXCIsIFwiYWlyd2FsbGV4XCIsIFwiYXV0aG9yaXplX25ldFwiLCBcImFkeWVuXCIsIFwicGF5cGFsXCIsIFwicG9ja3l0XCIsIFwibG9vcFwiXSk7XG4oe1xuICBwcm9jZXNzb3I6IFBheW1lbnRQcm9jZXNzb3IuRW51bS5zdHJpcGV9KTtcblxueiQxLm9iamVjdCh7XG4gIFwib3AtYWlyd2FsbGV4LTNkcy11cmxcIjogeiQxLnN0cmluZygpLFxuICBcIm9wLWFpcndhbGxleC1pbml0aWFsLWludGVudC1pZFwiOiB6JDEuc3RyaW5nKCksXG4gIFwib3AtYWlyd2FsbGV4LWNvbnNlbnQtaWRcIjogeiQxLnN0cmluZygpXG59KTtcbnokMS5vYmplY3Qoe1xuICBwcm92aWRlcjogeiQxLmxpdGVyYWwoXCJhcHBsZV9wYXlcIiksXG4gIHByb2Nlc3Nvcl9uYW1lOiB6JDEubGl0ZXJhbChcImFpcndhbGxleFwiKSxcbiAgbWV0YWRhdGE6IHokMS5vYmplY3Qoe1xuICAgIHByb2Nlc3Nvcl9hY2NvdW50X2lkOiB6JDEuc3RyaW5nKCksXG4gICAgcHJvY2Vzc29yX2FjY291bnRfbmFtZTogeiQxLnN0cmluZygpXG4gIH0pXG59KTtcbnokMS5vYmplY3Qoe1xuICBwcm92aWRlcjogeiQxLmxpdGVyYWwoXCJnb29nbGVfcGF5XCIpLFxuICBwcm9jZXNzb3JfbmFtZTogeiQxLmxpdGVyYWwoXCJhaXJ3YWxsZXhcIiksXG4gIG1ldGFkYXRhOiB6JDEub2JqZWN0KHtcbiAgICBwcm9jZXNzb3JfYWNjb3VudF9pZDogeiQxLnN0cmluZygpLFxuICAgIHByb2Nlc3Nvcl9hY2NvdW50X25hbWU6IHokMS5zdHJpbmcoKSxcbiAgICBnb29nbGVfcGF5X21lcmNoYW50X2lkOiB6JDEuc3RyaW5nKCkubnVsbGlzaCgpXG4gIH0pXG59KTtcbmNvbnN0IEFXWF9MT0FESU5HID0ge1xuICBpc0F2YWlsYWJsZTogZmFsc2UsXG4gIGlzTG9hZGluZzogdHJ1ZSxcbiAgc3RhcnRGbG93OiBhc3luYyAoKSA9PiB7XG4gIH1cbn07XG5cbnokMS5vYmplY3Qoe1xuICBkYXRhOiB6JDEub2JqZWN0KHtcbiAgICBtZXNzYWdlSGVhZGVyczogeiQxLnJlY29yZCh6JDEuc3RyaW5nKCksIHokMS5hbnkoKSksXG4gICAgZXJyb3JzOiB6JDEuYXJyYXkoeiQxLmFueSgpKSxcbiAgICBtZXNzYWdlVHlwZTogeiQxLnN0cmluZygpLFxuICAgIG1lc3NhZ2VCb2R5OiB6JDEucmVjb3JkKHokMS5zdHJpbmcoKSwgeiQxLmFueSgpKVxuICB9KSxcbiAgb3JpZ2luOiB6JDEubGl0ZXJhbChcImh0dHBzOi8vYXBwbGVwYXkuY2RuLWFwcGxlLmNvbVwiKVxufSk7XG5cbmNvbnN0IEFkeWVuRW52aXJvbm1lbnQgPSB6JDEuZW51bShbXCJ0ZXN0XCIsIFwibGl2ZVwiLCBcImxpdmUtdXNcIiwgXCJsaXZlLWluXCIsIFwibGl2ZS1hcHNlXCIsIFwibGl2ZS1hdVwiXSk7XG56JDEuZW51bShbXG4gIFwiYXJcIixcbiAgXCJiZy1CR1wiLFxuICBcImNhLUVTXCIsXG4gIFwiY3MtQ1pcIixcbiAgXCJkYS1ES1wiLFxuICBcImRlLURFXCIsXG4gIFwiZWwtR1JcIixcbiAgXCJlbi1VU1wiLFxuICBcImVzLUVTXCIsXG4gIFwiZXQtRUVcIixcbiAgXCJmaS1GSVwiLFxuICBcImZyLUZSXCIsXG4gIFwiaHItSFJcIixcbiAgXCJodS1IVVwiLFxuICBcImlzLUlTXCIsXG4gIFwiaXQtSVRcIixcbiAgXCJqYS1KUFwiLFxuICBcImtvLUtSXCIsXG4gIFwibHQtTFRcIixcbiAgXCJsdi1MVlwiLFxuICBcIm5sLU5MXCIsXG4gIFwibm8tTk9cIixcbiAgXCJwbC1QTFwiLFxuICBcInB0LUJSXCIsXG4gIFwicHQtUFRcIixcbiAgXCJyby1ST1wiLFxuICBcInJ1LVJVXCIsXG4gIFwic2stU0tcIixcbiAgXCJzbC1TSVwiLFxuICBcInN2LVNFXCIsXG4gIFwiemgtQ05cIixcbiAgXCJ6aC1UV1wiXG5dKTtcbnokMS5vYmplY3Qoe1xuICBcIm9wLWFjY291bnQtaWRcIjogeiQxLnN0cmluZygpLFxuICBcIm9wLWFkeWVuLWNsaWVudC1rZXlcIjogeiQxLnN0cmluZygpLFxuICBcIm9wLWFkeWVuLWVudmlyb25tZW50XCI6IEFkeWVuRW52aXJvbm1lbnQsXG4gIFwib3AtYWR5ZW4tYWN0aW9uXCI6IHokMS5zdHJpbmcoKVxufSk7XG56JDEub2JqZWN0KHtcbiAgcHJvdmlkZXI6IHokMS5saXRlcmFsKFwiYXBwbGVfcGF5XCIpLFxuICBwcm9jZXNzb3JfbmFtZTogeiQxLmxpdGVyYWwoXCJhZHllblwiKSxcbiAgbWV0YWRhdGE6IHokMS5vYmplY3Qoe1xuICAgIHByb2Nlc3Nvcl9hY2NvdW50X2lkOiB6JDEuc3RyaW5nKCksXG4gICAgcHJvY2Vzc29yX2FjY291bnRfbmFtZTogeiQxLnN0cmluZygpXG4gIH0pXG59KTtcbnokMS5vYmplY3Qoe1xuICBwcm92aWRlcjogeiQxLmxpdGVyYWwoXCJnb29nbGVfcGF5XCIpLFxuICBwcm9jZXNzb3JfbmFtZTogeiQxLmxpdGVyYWwoXCJhZHllblwiKSxcbiAgbWV0YWRhdGE6IHokMS5vYmplY3Qoe1xuICAgIHByb2Nlc3Nvcl9hY2NvdW50X2lkOiB6JDEuc3RyaW5nKCksXG4gICAgcHJvY2Vzc29yX2FjY291bnRfbmFtZTogeiQxLnN0cmluZygpLFxuICAgIGdvb2dsZV9wYXlfbWVyY2hhbnRfaWQ6IHokMS5zdHJpbmcoKS5udWxsaXNoKClcbiAgfSlcbn0pO1xuXG56JDEub2JqZWN0KHtcbiAgcHJvdmlkZXI6IHokMS5saXRlcmFsKFwiYXBwbGVfcGF5XCIpLFxuICBwcm9jZXNzb3JfbmFtZTogeiQxLmxpdGVyYWwoXCJhdXRob3JpemVfbmV0XCIpLFxuICBtZXRhZGF0YTogeiQxLm9iamVjdCh7XG4gICAgcHJvY2Vzc29yX2FjY291bnRfaWQ6IHokMS5zdHJpbmcoKSxcbiAgICBwcm9jZXNzb3JfYWNjb3VudF9uYW1lOiB6JDEuc3RyaW5nKClcbiAgfSlcbn0pO1xueiQxLm9iamVjdCh7XG4gIHByb3ZpZGVyOiB6JDEubGl0ZXJhbChcImdvb2dsZV9wYXlcIiksXG4gIHByb2Nlc3Nvcl9uYW1lOiB6JDEubGl0ZXJhbChcImF1dGhvcml6ZV9uZXRcIiksXG4gIG1ldGFkYXRhOiB6JDEub2JqZWN0KHtcbiAgICBwcm9jZXNzb3JfYWNjb3VudF9pZDogeiQxLnN0cmluZygpLFxuICAgIHByb2Nlc3Nvcl9hY2NvdW50X25hbWU6IHokMS5zdHJpbmcoKSxcbiAgICBnb29nbGVfcGF5X21lcmNoYW50X2lkOiB6JDEuc3RyaW5nKCkubnVsbGlzaCgpXG4gIH0pXG59KTtcblxueiQxLm9iamVjdCh7XG4gIHN0ZXBfdXBfdXJsOiB6JDEuc3RyaW5nKCksXG4gIGFjY2Vzc190b2tlbjogeiQxLnN0cmluZygpLFxuICBkZF91cmw6IG51bGxPclVuZGVmT3IkMSh6JDEuc3RyaW5nKCkpLFxuICBkZF90b2tlbjogbnVsbE9yVW5kZWZPciQxKHokMS5zdHJpbmcoKSksXG4gIG1lcmNoYW50X2RhdGE6IHokMS5zdHJpbmcoKVxufSk7XG5cbnokMS5vYmplY3Qoe1xuICBcIm9wLXBvY2t5dC0zZHMtdXJsXCI6IHokMS5zdHJpbmcoKSxcbiAgXCJvcC1wb2NreXQtdHhuLW5vXCI6IHokMS5zdHJpbmcoKSxcbiAgXCJvcC1wb2NreXQtcmVmLW5vXCI6IHokMS5zdHJpbmcoKVxufSk7XG5cbnokMS5vYmplY3Qoe1xuICBzdHJpcGVfcGs6IHokMS5zdHJpbmcoKSxcbiAgY2xpZW50X3NlY3JldDogeiQxLnN0cmluZygpLFxuICBzdHJpcGVfcG1faWQ6IHokMS5zdHJpbmcoKVxufSk7XG5cbnokMS5hcnJheShcbiAgeiQxLm9iamVjdCh7XG4gICAgb3VyX2V4aXN0aW5nX3BtX2lkOiB6JDEuc3RyaW5nKClcbiAgfSlcbikubGVuZ3RoKDEpO1xuXG56JDEub2JqZWN0KHtcbiAgcHJvY2Vzc29yX25hbWU6IHokMS5saXRlcmFsKFwibG9vcFwiKSxcbiAgcHJvdmlkZXI6IHokMS5saXRlcmFsKFwiY3J5cHRvXCIpLFxuICBtZXRhZGF0YTogeiQxLm9iamVjdCh7XG4gICAgbWVyY2hhbnRfaWQ6IHokMS5zdHJpbmcoKSxcbiAgICBlbnRpdHlfaWQ6IHokMS5zdHJpbmcoKSxcbiAgICBhcGlfdG9rZW46IHokMS5zdHJpbmcoKSxcbiAgICBzdXBwb3J0ZWRfY3VycmVuY2llczogeiQxLmFycmF5KHokMS5zdHJpbmcoKSksXG4gICAgZW52aXJvbm1lbnQ6IHokMS5zdHJpbmcoKVxuICB9KVxufSk7XG52YXIgRW52aXJvbm1lbnQgPSAvKiBAX19QVVJFX18gKi8gKChFbnZpcm9ubWVudDIpID0+IHtcbiAgRW52aXJvbm1lbnQyW1wiTG9jYWxcIl0gPSBcImxvY2FsXCI7XG4gIEVudmlyb25tZW50MltcIkRldmVsb3BtZW50XCJdID0gXCJkZXZlbG9wbWVudFwiO1xuICBFbnZpcm9ubWVudDJbXCJTdGFnaW5nXCJdID0gXCJzdGFnaW5nXCI7XG4gIEVudmlyb25tZW50MltcIkRlbW9cIl0gPSBcImRlbW9cIjtcbiAgRW52aXJvbm1lbnQyW1wiUHJvZHVjdGlvblwiXSA9IFwicHJvZHVjdGlvblwiO1xuICByZXR1cm4gRW52aXJvbm1lbnQyO1xufSkoRW52aXJvbm1lbnQgfHwge30pO1xudmFyIFBheUluRmFpbGVkID0gLyogQF9fUFVSRV9fICovICgoUGF5SW5GYWlsZWQyKSA9PiB7XG4gIFBheUluRmFpbGVkMltcIk1FVEhPRF9DUkVBVElPTl9GQUlMRURcIl0gPSBcIm1ldGhvZENyZWF0aW9uRmFpbGVkXCI7XG4gIFBheUluRmFpbGVkMltcIklOU1VGRklDSUVOVF9CQUxBTkNFXCJdID0gXCJpbnN1ZmZpY2llbnRCYWxhbmNlXCI7XG4gIFBheUluRmFpbGVkMltcIklOU1VGRklDSUVOVF9BVVRIT1JJWkFUSU9OXCJdID0gXCJpbnN1ZmZpY2llbnRBdXRob3JpemF0aW9uXCI7XG4gIFBheUluRmFpbGVkMltcIlNJR05FRF9NRVNTQUdFX1JFUVVJUkVEXCJdID0gXCJzaWduZWRNZXNzYWdlUmVxdWlyZWRcIjtcbiAgUGF5SW5GYWlsZWQyW1wiQ1VTVE9NRVJfQ1JFQVRJT05fRkFJTEVEXCJdID0gXCJjdXN0b21lckNyZWF0aW9uRmFpbGVkXCI7XG4gIFBheUluRmFpbGVkMltcIlBBWU1FTlRfRkFJTEVEXCJdID0gXCJwYXltZW50RmFpbGVkXCI7XG4gIFBheUluRmFpbGVkMltcIlRSQU5TQUNUSU9OX0ZBSUxFRFwiXSA9IFwidHJhbnNhY3Rpb25GYWlsZWRcIjtcbiAgcmV0dXJuIFBheUluRmFpbGVkMjtcbn0pKFBheUluRmFpbGVkIHx8IHt9KTtcbnZhciBQYXlJblN0YXRlID0gLyogQF9fUFVSRV9fICovICgoUGF5SW5TdGF0ZTIpID0+IHtcbiAgUGF5SW5TdGF0ZTJbXCJJRExFXCJdID0gXCJpZGxlXCI7XG4gIFBheUluU3RhdGUyW1wiQ09ORklSTUlOR19CQUxBTkNFXCJdID0gXCJjb25maXJtaW5nQmFsYW5jZVwiO1xuICBQYXlJblN0YXRlMltcIkNPTkZJUk1JTkdfQVVUSE9SSVpBVElPTlwiXSA9IFwiY29uZmlybWluZ0F1dGhvcml6YXRpb25cIjtcbiAgUGF5SW5TdGF0ZTJbXCJVUERBVElOR19BVVRIT1JJWkFUSU9OXCJdID0gXCJ1cGRhdGluZ0F1dGhvcml6YXRpb25cIjtcbiAgUGF5SW5TdGF0ZTJbXCJTSUdOSU5HX01FU1NBR0VcIl0gPSBcInNpZ25pbmdNZXNzYWdlXCI7XG4gIFBheUluU3RhdGUyW1wiQ1JFQVRJTkdfQ1VTVE9NRVJcIl0gPSBcImNyZWF0aW5nQ3VzdG9tZXJcIjtcbiAgUGF5SW5TdGF0ZTJbXCJDUkVBVElOR19QQVlNRU5UX01FVEhPRFwiXSA9IFwiY3JlYXRpbmdQYXltZW50TWV0aG9kXCI7XG4gIFBheUluU3RhdGUyW1wiUFJPQ0VTU0lOR19QQVlNRU5UXCJdID0gXCJwcm9jZXNzaW5nUGF5bWVudFwiO1xuICBQYXlJblN0YXRlMltcIkNSRUFUSU5HX1BBWU1FTlRcIl0gPSBcImNyZWF0aW5nUGF5bWVudFwiO1xuICBQYXlJblN0YXRlMltcIkNPTkZJUk1JTkdfUEFZTUVOVFwiXSA9IFwiY29uZmlybWluZ1BheW1lbnRcIjtcbiAgUGF5SW5TdGF0ZTJbXCJDT01QTEVURVwiXSA9IFwiY29tcGxldGVcIjtcbiAgUGF5SW5TdGF0ZTJbXCJBVVRIT1JJWkVEXCJdID0gXCJhdXRob3JpemVkXCI7XG4gIHJldHVybiBQYXlJblN0YXRlMjtcbn0pKFBheUluU3RhdGUgfHwge30pO1xuXG5jb25zdCBMT09QX0xPQURJTkcgPSB7XG4gIGlzQXZhaWxhYmxlOiBmYWxzZSxcbiAgaXNMb2FkaW5nOiB0cnVlLFxuICBjb25maWc6IG51bGwsXG4gIHdpZGdldDogbnVsbFxufTtcblxueiQxLm9iamVjdCh7XG4gIHByb3ZpZGVyOiB6JDEubGl0ZXJhbChcInBheXBhbFwiKSxcbiAgbWV0YWRhdGE6IHokMS5vYmplY3QoeyBjbGllbnRfaWQ6IHokMS5zdHJpbmcoKSB9KSxcbiAgcHJvY2Vzc29yX25hbWU6IHokMS5saXRlcmFsKFwicGF5cGFsXCIpXG59KTtcblxueiQxLm9iamVjdCh7XG4gIHByb2Nlc3Nvcl9uYW1lOiB6JDEubGl0ZXJhbChcInBvY2t5dFwiKSxcbiAgcHJvdmlkZXI6IHokMS5saXRlcmFsKFwicGF5cGFsXCIpXG59KTtcbnokMS5hcnJheShcbiAgeiQxLm9iamVjdCh7XG4gICAgcGF5cGFsX2lmcmFtZV91cmw6IHokMS5zdHJpbmcoKSxcbiAgICB2ZXJpZnlfdG9rZW46IHokMS5zdHJpbmcoKVxuICB9KVxuKS5sZW5ndGgoMSk7XG5cbnokMS5vYmplY3Qoe1xuICBwcm92aWRlcjogeiQxLmxpdGVyYWwoXCJzdHJpcGVfbGlua1wiKSxcbiAgcHJvY2Vzc29yX25hbWU6IHokMS5saXRlcmFsKFwic3RyaXBlXCIpLFxuICBtZXRhZGF0YTogeiQxLm9iamVjdCh7XG4gICAgc3RyaXBlX3BrOiB6JDEuc3RyaW5nKClcbiAgfSlcbn0pO1xueiQxLmFycmF5KFxuICB6JDEub2JqZWN0KHtcbiAgICBvdXJfZXhpc3RpbmdfcG1faWQ6IHokMS5zdHJpbmcoKVxuICB9KVxuKS5sZW5ndGgoMSk7XG5cbnokMS5vYmplY3Qoe1xuICBwcm92aWRlcjogeiQxLnVuaW9uKFt6JDEubGl0ZXJhbChcImFwcGxlX3BheVwiKSwgeiQxLmxpdGVyYWwoXCJnb29nbGVfcGF5XCIpXSksXG4gIHByb2Nlc3Nvcl9uYW1lOiB6JDEubGl0ZXJhbChcInN0cmlwZVwiKSxcbiAgbWV0YWRhdGE6IHokMS5vYmplY3Qoe1xuICAgIHN0cmlwZV9wazogeiQxLnN0cmluZygpXG4gIH0pXG59KTtcblxuY29uc3QgeyBlcnJfXyB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJmb3JtLWNhbGxiYWNrc1wiKTtcbmNvbnN0IE9wdGlvbmFsRm4gPSB6JDEuZnVuY3Rpb24oKS5vcHRpb25hbCgpO1xuY29uc3QgWm9kRm9ybUNhbGxiYWNrcyA9IHokMS5vYmplY3Qoe1xuICBvbkZvY3VzOiBPcHRpb25hbEZuLFxuICBvbkJsdXI6IE9wdGlvbmFsRm4sXG4gIG9uQ2hhbmdlOiBPcHRpb25hbEZuLFxuICBvbkxvYWQ6IE9wdGlvbmFsRm4sXG4gIG9uTG9hZEVycm9yOiBPcHRpb25hbEZuLFxuICBvblZhbGlkYXRpb25FcnJvcjogT3B0aW9uYWxGbixcbiAgb25DaGVja291dFN0YXJ0ZWQ6IE9wdGlvbmFsRm4sXG4gIG9uQ2hlY2tvdXRTdWNjZXNzOiBPcHRpb25hbEZuLFxuICBvblNldHVwUGF5bWVudE1ldGhvZFN1Y2Nlc3M6IE9wdGlvbmFsRm4sXG4gIG9uQ2hlY2tvdXRFcnJvcjogT3B0aW9uYWxGbixcbiAgb25QYXltZW50UmVxdWVzdExvYWQ6IE9wdGlvbmFsRm5cbn0pO1xuY2xhc3MgRm9ybUNhbGxiYWNrcyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8qKlxuICAgICAqIFNldHMgQUxMIGZvcm0gY2FsbGJhY2tzLiBOb3RlIHRoYXQgYWxsIG9sZCBjYWxsYmFja3MgYXJlIHJlbW92ZWQuXG4gICAgICovXG4gICAgdGhpcy5zZXRDYWxsYmFja3MgPSAocmF3Q2FsbGJhY2tzKSA9PiB7XG4gICAgICB0aGlzLl9jYWxsYmFja3MgPSBGb3JtQ2FsbGJhY2tzLmNyZWF0ZUVtcHR5Q2FsbGJhY2tzKCk7XG4gICAgICBPYmplY3QuZW50cmllcyhyYXdDYWxsYmFja3MpLmZvckVhY2goKFtrZXksIHJhd0NhbGxiYWNrXSkgPT4ge1xuICAgICAgICBjb25zdCBzYWZlQ2FsbGJhY2sgPSBtYWtlQ2FsbGJhY2tTYWZlKGtleSwgcmF3Q2FsbGJhY2sgPz8gRm9ybUNhbGxiYWNrcy5OT09QLCBlcnJfXyk7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrc1trZXldID0gc2FmZUNhbGxiYWNrO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLl9jYWxsYmFja3MgPSBGb3JtQ2FsbGJhY2tzLmNyZWF0ZUVtcHR5Q2FsbGJhY2tzKCk7XG4gIH1cbiAgc3RhdGljIHtcbiAgICB0aGlzLk5PT1AgPSAoKSA9PiB7XG4gICAgfTtcbiAgfVxuICBzdGF0aWMge1xuICAgIHRoaXMuY3JlYXRlRW1wdHlDYWxsYmFja3MgPSAoKSA9PiB7XG4gICAgICBjb25zdCB4ID0ge307XG4gICAgICBPYmplY3Qua2V5cyhab2RGb3JtQ2FsbGJhY2tzLmtleW9mKCkuZW51bSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIHhba2V5XSA9IEZvcm1DYWxsYmFja3MuTk9PUDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHg7XG4gICAgfTtcbiAgfVxuICBzdGF0aWMge1xuICAgIHRoaXMuZnJvbU9iamVjdCA9IChvYmopID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IEZvcm1DYWxsYmFja3MoKTtcbiAgICAgIGluc3RhbmNlLnNldENhbGxiYWNrcyhab2RGb3JtQ2FsbGJhY2tzLnBhcnNlKG9iaikpO1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSByZWFkLW9ubHkgdmVyc2lvbiBvZiB0aGUgY2FsbGJhY2tzIG9iamVjdC5cbiAgICovXG4gIGdldCBnZXQoKSB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5fY2FsbGJhY2tzIH07XG4gIH1cbn1cblxudmFyIFN1Ym1pdE1ldGhvZHMgPSAvKiBAX19QVVJFX18gKi8gKChTdWJtaXRNZXRob2RzMikgPT4ge1xuICBTdWJtaXRNZXRob2RzMltcImNhcmRcIl0gPSBcImNhcmRcIjtcbiAgU3VibWl0TWV0aG9kczJbXCJwb2NreXRQYXlwYWxcIl0gPSBcInBvY2t5dC1wYXlwYWxcIjtcbiAgU3VibWl0TWV0aG9kczJbXCJhcHBsZVBheVwiXSA9IFwiYXBwbGUtcGF5XCI7XG4gIFN1Ym1pdE1ldGhvZHMyW1wiZ29vZ2xlUGF5XCJdID0gXCJnb29nbGUtcGF5XCI7XG4gIFN1Ym1pdE1ldGhvZHMyW1wibG9vcENyeXB0b1wiXSA9IFwibG9vcC1jcnlwdG9cIjtcbiAgU3VibWl0TWV0aG9kczJbXCJwYXlwYWxcIl0gPSBcInBheXBhbFwiO1xuICBTdWJtaXRNZXRob2RzMltcInN0cmlwZUxpbmtcIl0gPSBcInN0cmlwZS1saW5rXCI7XG4gIFN1Ym1pdE1ldGhvZHMyW1wiYWlyd2FsbGV4R29vZ2xlUGF5XCJdID0gXCJhaXJ3YWxsZXgtZ29vZ2xlLXBheVwiO1xuICBTdWJtaXRNZXRob2RzMltcImFpcndhbGxleEFwcGxlUGF5XCJdID0gXCJhaXJ3YWxsZXgtYXBwbGUtcGF5XCI7XG4gIFN1Ym1pdE1ldGhvZHMyW1wiYXV0aG9yaXplbmV0R29vZ2xlUGF5XCJdID0gXCJhdXRob3JpemVuZXQtZ29vZ2xlLXBheVwiO1xuICBTdWJtaXRNZXRob2RzMltcImF1dGhvcml6ZW5ldEFwcGxlUGF5XCJdID0gXCJhdXRob3JpemVuZXQtYXBwbGUtcGF5XCI7XG4gIFN1Ym1pdE1ldGhvZHMyW1wiYWR5ZW5Hb29nbGVQYXlcIl0gPSBcImFkeWVuLWdvb2dsZS1wYXlcIjtcbiAgU3VibWl0TWV0aG9kczJbXCJhZHllbkFwcGxlUGF5XCJdID0gXCJhZHllbi1hcHBsZS1wYXlcIjtcbiAgU3VibWl0TWV0aG9kczJbXCJhaXJ3YWxsZXhBQ0hcIl0gPSBcImFpcndhbGxleC1hY2hcIjtcbiAgU3VibWl0TWV0aG9kczJbXCJhaXJ3YWxsZXhFRlRcIl0gPSBcImFpcndhbGxleC1lZnRcIjtcbiAgU3VibWl0TWV0aG9kczJbXCJhaXJ3YWxsZXhCQUNTXCJdID0gXCJhaXJ3YWxsZXgtYmFjc1wiO1xuICBTdWJtaXRNZXRob2RzMltcImFpcndhbGxleFNFUEFcIl0gPSBcImFpcndhbGxleC1zZXBhXCI7XG4gIHJldHVybiBTdWJtaXRNZXRob2RzMjtcbn0pKFN1Ym1pdE1ldGhvZHMgfHwge30pO1xueiQxLm5hdGl2ZUVudW0oU3VibWl0TWV0aG9kcyk7XG5cbmNvbnN0IE1PQklMRV9XQUxMRVRfTE9BRElOR19TVEFURSA9IHtcbiAgaXNMb2FkaW5nOiB0cnVlLFxuICBpc0F2YWlsYWJsZTogZmFsc2UsXG4gIHByb2Nlc3NvcnM6IFtdLFxuICBzdGFydEZsb3c6IGFzeW5jICgpID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgc3RhcnRGbG93IHRyaWdnZXJlZCB3aGlsZSBwYXltZW50IHJlcXVlc3QgaXMgc3RpbGwgbm90IHJlYWR5LiBcbiAgICAgIFlvdSBjYW4gY2hlY2sgdGhlIFwiLmlzTG9hZGluZ1wiIHBhcmFtIHRvIGtub3cgd2hlbiBhIHBheW1lbnQgcmVxdWVzdCBpcyBzdGlsbCBsb2FkaW5nLCBcbiAgICAgIGFuZCBcIi5pc0F2YWlsYWJsZVwiIHRvIGtub3cgaWYgYSBwYXltZW50IHJlcXVlc3QgaXMgYXZhaWxhYmxlLmBcbiAgICApO1xuICB9XG59O1xuY29uc3QgZ2V0QXBwbGVQYXlQcm9jZXNzb3JzID0gKGluaXRGbG93cykgPT4ge1xuICBjb25zdCBhcHBsZVBheUluaXRGbG93cyA9IFtpbml0Rmxvd3MuYWlyd2FsbGV4QXBwbGVQYXksIGluaXRGbG93cy5hdXRob3JpemVOZXRBcHBsZVBheSwgaW5pdEZsb3dzLmFkeWVuQXBwbGVQYXldO1xuICBjb25zdCBhcHBsZVBheUluaXRSZXN1bHRzID0gW107XG4gIGFwcGxlUGF5SW5pdEZsb3dzLmZvckVhY2goKGZsb3cpID0+IHtcbiAgICBjb25zdCBmbG93VmFsdWUgPSBmbG93LnB1Ymxpc2hlci5nZXRWYWx1ZUlmTG9hZGVkRWxzZShudWxsKTtcbiAgICBpZiAoZmxvd1ZhbHVlPy5pc0F2YWlsYWJsZSkge1xuICAgICAgYXBwbGVQYXlJbml0UmVzdWx0cy5wdXNoKGZsb3dWYWx1ZSk7XG4gICAgfVxuICB9KTtcbiAgY29uc3Qgc3RyaXBlUFJGbG93UmVzdWx0ID0gaW5pdEZsb3dzLnN0cmlwZVBSLnB1Ymxpc2hlci5nZXRWYWx1ZUlmTG9hZGVkRWxzZShudWxsKTtcbiAgaWYgKHN0cmlwZVBSRmxvd1Jlc3VsdD8uaXNBdmFpbGFibGUpIHtcbiAgICBjb25zdCBpc0FwcGxlUGF5QXZhaWxhYmxlID0gc3RyaXBlUFJGbG93UmVzdWx0LmF2YWlsYWJsZVByb3ZpZGVycy5hcHBsZVBheTtcbiAgICBpZiAoaXNBcHBsZVBheUF2YWlsYWJsZSkge1xuICAgICAgYXBwbGVQYXlJbml0UmVzdWx0cy5wdXNoKHtcbiAgICAgICAgaXNBdmFpbGFibGU6IHRydWUsXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgIHByb2Nlc3NvcjogUGF5bWVudFByb2Nlc3Nvci5FbnVtLnN0cmlwZSxcbiAgICAgICAgc3RhcnRGbG93OiAoY3VzdG9tUGFyYW1zKSA9PiBzdHJpcGVQUkZsb3dSZXN1bHQuc3RhcnRGbG93KFwiYXBwbGVfcGF5XCIsIHtcbiAgICAgICAgICBvdmVycmlkZVBheW1lbnRSZXF1ZXN0OiBjdXN0b21QYXJhbXM/Lm92ZXJyaWRlUGF5bWVudFJlcXVlc3RcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIHByb2Nlc3NvcnM6IGFwcGxlUGF5SW5pdFJlc3VsdHMubWFwKChyZXN1bHQpID0+IHJlc3VsdC5wcm9jZXNzb3IpLFxuICAgIGlzQXZhaWxhYmxlOiBhcHBsZVBheUluaXRSZXN1bHRzLmxlbmd0aCA+IDAsXG4gICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICBzdGFydEZsb3c6IChjdXN0b21QYXJhbXMpID0+IHtcbiAgICAgIHJldHVybiBzdGFydEFwcGxlUGF5RmxvdyhhcHBsZVBheUluaXRSZXN1bHRzLCBjdXN0b21QYXJhbXMpO1xuICAgIH1cbiAgfTtcbn07XG5jb25zdCBnZXRHb29nbGVQYXlQcm9jZXNzb3JzID0gKGluaXRGbG93cykgPT4ge1xuICBjb25zdCBnb29nbGVQYXlJbml0Rmxvd3MgPSBbaW5pdEZsb3dzLmFpcndhbGxleEdvb2dsZVBheSwgaW5pdEZsb3dzLmF1dGhvcml6ZU5ldEdvb2dsZVBheSwgaW5pdEZsb3dzLmFkeWVuR29vZ2xlUGF5XTtcbiAgY29uc3QgZ29vZ2xlUGF5SW5pdFJlc3VsdHMgPSBbXTtcbiAgZ29vZ2xlUGF5SW5pdEZsb3dzLmZvckVhY2goKGZsb3cpID0+IHtcbiAgICBjb25zdCBmbG93VmFsdWUgPSBmbG93LnB1Ymxpc2hlci5nZXRWYWx1ZUlmTG9hZGVkRWxzZShudWxsKTtcbiAgICBpZiAoZmxvd1ZhbHVlPy5pc0F2YWlsYWJsZSkge1xuICAgICAgZ29vZ2xlUGF5SW5pdFJlc3VsdHMucHVzaChmbG93VmFsdWUpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IHN0cmlwZVBSRmxvd1Jlc3VsdCA9IGluaXRGbG93cy5zdHJpcGVQUi5wdWJsaXNoZXIuZ2V0VmFsdWVJZkxvYWRlZEVsc2UobnVsbCk7XG4gIGlmIChzdHJpcGVQUkZsb3dSZXN1bHQ/LmlzQXZhaWxhYmxlKSB7XG4gICAgY29uc3QgaXNHb29nbGVQYXlBdmFpbGFibGUgPSBzdHJpcGVQUkZsb3dSZXN1bHQuYXZhaWxhYmxlUHJvdmlkZXJzLmdvb2dsZVBheTtcbiAgICBpZiAoaXNHb29nbGVQYXlBdmFpbGFibGUpIHtcbiAgICAgIGdvb2dsZVBheUluaXRSZXN1bHRzLnB1c2goe1xuICAgICAgICBpc0F2YWlsYWJsZTogdHJ1ZSxcbiAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgcHJvY2Vzc29yOiBQYXltZW50UHJvY2Vzc29yLkVudW0uc3RyaXBlLFxuICAgICAgICBzdGFydEZsb3c6IChjdXN0b21QYXJhbXMpID0+IHN0cmlwZVBSRmxvd1Jlc3VsdC5zdGFydEZsb3coXCJnb29nbGVfcGF5XCIsIHtcbiAgICAgICAgICBvdmVycmlkZVBheW1lbnRSZXF1ZXN0OiBjdXN0b21QYXJhbXM/Lm92ZXJyaWRlUGF5bWVudFJlcXVlc3RcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIHByb2Nlc3NvcnM6IGdvb2dsZVBheUluaXRSZXN1bHRzLm1hcCgocmVzdWx0KSA9PiByZXN1bHQucHJvY2Vzc29yKSxcbiAgICBpc0F2YWlsYWJsZTogZ29vZ2xlUGF5SW5pdFJlc3VsdHMubGVuZ3RoID4gMCxcbiAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgIHN0YXJ0RmxvdzogKGN1c3RvbVBhcmFtcykgPT4ge1xuICAgICAgcmV0dXJuIHN0YXJ0R29vZ2xlUGF5Rmxvdyhnb29nbGVQYXlJbml0UmVzdWx0cywgY3VzdG9tUGFyYW1zKTtcbiAgICB9XG4gIH07XG59O1xuY29uc3Qgc3RhcnRBcHBsZVBheUZsb3cgPSAoaW5pdFJlc3VsdHMsIGN1c3RvbVBhcmFtcykgPT4ge1xuICBpZiAoY3VzdG9tUGFyYW1zPy5wcm9jZXNzb3IpIHtcbiAgICBjb25zdCBmbG93ID0gaW5pdFJlc3VsdHMuZmluZCgocmVzdWx0KSA9PiByZXN1bHQucHJvY2Vzc29yID09PSBjdXN0b21QYXJhbXMucHJvY2Vzc29yKTtcbiAgICBpZiAoZmxvdz8uaXNBdmFpbGFibGUpIHtcbiAgICAgIHJldHVybiBmbG93LnN0YXJ0RmxvdyhjdXN0b21QYXJhbXMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNwZWNpZmllZCBBcHBsZSBQYXkgcHJvY2Vzc29yICR7Y3VzdG9tUGFyYW1zLnByb2Nlc3Nvcn0gaXMgbm90IGF2YWlsYWJsZWApO1xuICB9XG4gIGNvbnN0IGF2YWlsYWJsZUZsb3cgPSBpbml0UmVzdWx0cy5maW5kKChyZXN1bHQpID0+IHJlc3VsdC5pc0F2YWlsYWJsZSk7XG4gIGlmIChhdmFpbGFibGVGbG93KSB7XG4gICAgcmV0dXJuIGF2YWlsYWJsZUZsb3cuc3RhcnRGbG93KGN1c3RvbVBhcmFtcyk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiTm8gYXZhaWxhYmxlIEFwcGxlIFBheSBwcm9jZXNzb3IgZm91bmRcIik7XG59O1xuY29uc3Qgc3RhcnRHb29nbGVQYXlGbG93ID0gKGluaXRSZXN1bHRzLCBjdXN0b21QYXJhbXMpID0+IHtcbiAgaWYgKGN1c3RvbVBhcmFtcz8ucHJvY2Vzc29yKSB7XG4gICAgY29uc3QgZmxvdyA9IGluaXRSZXN1bHRzLmZpbmQoKHJlc3VsdCkgPT4gcmVzdWx0LnByb2Nlc3NvciA9PT0gY3VzdG9tUGFyYW1zLnByb2Nlc3Nvcik7XG4gICAgaWYgKGZsb3c/LmlzQXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm4gZmxvdy5zdGFydEZsb3coY3VzdG9tUGFyYW1zKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTcGVjaWZpZWQgR29vZ2xlIFBheSBwcm9jZXNzb3IgJHtjdXN0b21QYXJhbXMucHJvY2Vzc29yfSBpcyBub3QgYXZhaWxhYmxlYCk7XG4gIH1cbiAgY29uc3QgYXZhaWxhYmxlRmxvdyA9IGluaXRSZXN1bHRzLmZpbmQoKHJlc3VsdCkgPT4gcmVzdWx0LmlzQXZhaWxhYmxlKTtcbiAgaWYgKGF2YWlsYWJsZUZsb3cpIHtcbiAgICByZXR1cm4gYXZhaWxhYmxlRmxvdy5zdGFydEZsb3coY3VzdG9tUGFyYW1zKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXCJObyBhdmFpbGFibGUgR29vZ2xlIFBheSBwcm9jZXNzb3IgZm91bmRcIik7XG59O1xuXG5jb25zdCBjb252ZXJ0U3R5bGVzVG9RdWVyeVN0cmluZyA9IChzdHlsZXMpID0+IHtcbiAgY29uc3Qgc2VyaWFsaXplZFN0eWxlcyA9IEpTT04uc3RyaW5naWZ5KHN0eWxlcyk7XG4gIHJldHVybiBzZXJpYWxpemVkU3R5bGVzO1xufTtcblxuY29uc3QgRWxlbWVudHNDb250ZXh0ID0gY3JlYXRlQ29udGV4dCh7XG4gIGZvcm1JZDogXCJcIixcbiAgZm9ybUhlaWdodDogXCJcIixcbiAgcmVmZXJyZXI6IHZvaWQgMCxcbiAgY2hlY2tvdXRTZWN1cmVUb2tlbjogdm9pZCAwLFxuICByZWdpc3RlcklmcmFtZTogKCkgPT4ge1xuICB9LFxuICBiYXNlVXJsOiBcIlwiXG59KTtcblxuY29uc3QgdXNlT3BlblBheUVsZW1lbnRzID0gKCkgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChFbGVtZW50c0NvbnRleHQpO1xuICBpZiAoIWNvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1c2VPcGVuUGF5RWxlbWVudHMgbXVzdCBiZSB1c2VkIHdpdGhpbiBhbiBPcGVuUGF5RWxlbWVudHNQcm92aWRlclwiKTtcbiAgfVxuICByZXR1cm4gY29udGV4dDtcbn07XG5cbmNvbnN0IEVsZW1lbnRGcmFtZSA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IGVsZW1lbnRUeXBlLCBzdHlsZXMgfSA9IHByb3BzO1xuICBjb25zdCB7IGZvcm1JZCwgcmVmZXJyZXIsIGZvcm1IZWlnaHQsIGNoZWNrb3V0U2VjdXJlVG9rZW4sIHJlZ2lzdGVySWZyYW1lLCBiYXNlVXJsIH0gPSB1c2VPcGVuUGF5RWxlbWVudHMoKTtcbiAgY29uc3Qgc3ViUGF0aCA9IGVsZW1lbnRUeXBlLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IFtoYXNMb2FkZWQsIHNldEhhc0xvYWRlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IGlmcmFtZVJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgZWxlbWVudFN0eWxlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFzdHlsZXMpIHJldHVybiBcIlwiO1xuICAgIHJldHVybiBjb252ZXJ0U3R5bGVzVG9RdWVyeVN0cmluZyhzdHlsZXMpO1xuICB9LCBbc3R5bGVzXSk7XG4gIGNvbnN0IGZyYW1lU3R5bGUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgIGhlaWdodDogZm9ybUhlaWdodFxuICAgIH07XG4gIH0sIFtmb3JtSGVpZ2h0XSk7XG4gIGNvbnN0IHF1ZXJ5U3RyaW5nID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFjaGVja291dFNlY3VyZVRva2VuIHx8ICFyZWZlcnJlcikgcmV0dXJuIFwiXCI7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgIHBhcmFtcy5hcHBlbmQoXCJyZWZlcmVyXCIsIHJlZmVycmVyKTtcbiAgICBwYXJhbXMuYXBwZW5kKFwic3R5bGVzXCIsIGVsZW1lbnRTdHlsZSk7XG4gICAgcGFyYW1zLmFwcGVuZChcImZvcm1JZFwiLCBmb3JtSWQpO1xuICAgIHBhcmFtcy5hcHBlbmQoXCJzZWN1cmVUb2tlblwiLCBjaGVja291dFNlY3VyZVRva2VuKTtcbiAgICByZXR1cm4gcGFyYW1zLnRvU3RyaW5nKCk7XG4gIH0sIFtlbGVtZW50U3R5bGUsIGZvcm1JZCwgcmVmZXJyZXIsIGNoZWNrb3V0U2VjdXJlVG9rZW5dKTtcbiAgdXNlRWZmZWN0KCgpID0+IHNldEhhc0xvYWRlZCh0cnVlKSwgW10pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghaWZyYW1lUmVmLmN1cnJlbnQgfHwgIWhhc0xvYWRlZCkgcmV0dXJuO1xuICAgIHJlZ2lzdGVySWZyYW1lKGVsZW1lbnRUeXBlLCBpZnJhbWVSZWYuY3VycmVudCk7XG4gIH0sIFtoYXNMb2FkZWRdKTtcbiAgaWYgKCFjaGVja291dFNlY3VyZVRva2VuKSB7XG4gICAgY29uc29sZS5lcnJvcihcIltmb3JtXSBDYW5ub3QgcmVuZGVyIHBhcnRpYWxseSBpbml0aWFsaXplZCBmcmFtZVwiKTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcImRpdlwiLCB7fSk7XG4gIH1cbiAgY29uc3QgdXJsID0gbmV3IFVSTChgL2FwcC92MS8ke3N1YlBhdGh9LWVsZW1lbnQvYCwgYmFzZVVybCk7XG4gIHVybC5zZWFyY2ggPSBxdWVyeVN0cmluZztcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgXCJpZnJhbWVcIixcbiAgICB7XG4gICAgICBpZDogYG9qcy0ke3N1YlBhdGh9LWVsZW1lbnRgLFxuICAgICAgbmFtZTogYCR7c3ViUGF0aH0tZWxlbWVudGAsXG4gICAgICBjbGFzc05hbWU6IFwib2pzLWlmcmFtZVwiLFxuICAgICAgc3JjOiB1cmwudG9TdHJpbmcoKSxcbiAgICAgIHN0eWxlOiBmcmFtZVN0eWxlLFxuICAgICAgcmVmOiBpZnJhbWVSZWZcbiAgICB9XG4gICk7XG59O1xuXG5jb25zdCBDYXJkRWxlbWVudCA9ICh7IHN0eWxlcyB9KSA9PiB7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KEVsZW1lbnRGcmFtZSwgeyBzdHlsZXMsIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZUVudW0uQ0FSRCB9KTtcbn07XG5cbmNvbnN0IENhcmRDdmNFbGVtZW50ID0gKHsgc3R5bGVzIH0pID0+IHtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goRWxlbWVudEZyYW1lLCB7IHN0eWxlcywgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlRW51bS5DQVJEX0NWQyB9KTtcbn07XG5cbmNvbnN0IENhcmRFeHBpcnlFbGVtZW50ID0gKHsgc3R5bGVzIH0pID0+IHtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goRWxlbWVudEZyYW1lLCB7IHN0eWxlcywgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlRW51bS5DQVJEX0VYUElSWSB9KTtcbn07XG5cbmNvbnN0IENhcmROdW1iZXJFbGVtZW50ID0gKHsgc3R5bGVzIH0pID0+IHtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goRWxlbWVudEZyYW1lLCB7IHN0eWxlcywgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlRW51bS5DQVJEX05VTUJFUiB9KTtcbn07XG5cbmZ1bmN0aW9uIHVvKGUsIHQpIHtcbiAgdmFyIHIgPSBPYmplY3Quc2V0UHJvdG90eXBlT2Y7XG4gIHIgPyByKGUsIHQpIDogZS5fX3Byb3RvX18gPSB0O1xufVxuZnVuY3Rpb24gcG8oZSwgdCkge1xuICB0ID09PSB2b2lkIDAgJiYgKHQgPSBlLmNvbnN0cnVjdG9yKTtcbiAgdmFyIHIgPSBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZTtcbiAgciAmJiByKGUsIHQpO1xufVxudmFyIG1vID0gLyogQF9fUFVSRV9fICovIChmdW5jdGlvbigpIHtcbiAgdmFyIGUgPSBmdW5jdGlvbihyLCBuKSB7XG4gICAgcmV0dXJuIGUgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwge1xuICAgICAgX19wcm90b19fOiBbXVxuICAgIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbihvLCBpKSB7XG4gICAgICBvLl9fcHJvdG9fXyA9IGk7XG4gICAgfSB8fCBmdW5jdGlvbihvLCBpKSB7XG4gICAgICBmb3IgKHZhciBzIGluIGkpXG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpLCBzKSAmJiAob1tzXSA9IGlbc10pO1xuICAgIH0sIGUociwgbik7XG4gIH07XG4gIHJldHVybiBmdW5jdGlvbih0LCByKSB7XG4gICAgaWYgKHR5cGVvZiByICE9IFwiZnVuY3Rpb25cIiAmJiByICE9PSBudWxsKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhyKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgZSh0LCByKTtcbiAgICBmdW5jdGlvbiBuKCkge1xuICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IHQ7XG4gICAgfVxuICAgIHQucHJvdG90eXBlID0gciA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUocikgOiAobi5wcm90b3R5cGUgPSByLnByb3RvdHlwZSwgbmV3IG4oKSk7XG4gIH07XG59KSgpLCBfbyA9IChmdW5jdGlvbihlKSB7XG4gIG1vKHQsIGUpO1xuICBmdW5jdGlvbiB0KHIsIG4pIHtcbiAgICB2YXIgbyA9IHRoaXMuY29uc3RydWN0b3IsIGkgPSBlLmNhbGwodGhpcywgciwgbikgfHwgdGhpcztcbiAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGksIFwibmFtZVwiLCB7XG4gICAgICB2YWx1ZTogby5uYW1lLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KSwgdW8oaSwgby5wcm90b3R5cGUpLCBwbyhpKSwgaTtcbiAgfVxuICByZXR1cm4gdDtcbn0pKEVycm9yKTtcbmNvbnN0IEEgPSB6JDEuc3RyaW5nKCkudHJpbSgpLm1pbigxLCB7IG1lc3NhZ2U6IFwiUGxlYXNlIGZpbGwgaW4gdGhpcyBmaWVsZFwiIH0pLCBiID0geiQxLnN0cmluZygpLnRyaW0oKS5vcHRpb25hbCgpLCB4ID0gKGUpID0+IHokMS5udWxsYWJsZShlLm9wdGlvbmFsKCkpO1xudmFyIHAgPSAvKiBAX19QVVJFX18gKi8gKChlKSA9PiAoZS5GSVJTVF9OQU1FID0gXCJmaXJzdE5hbWVcIiwgZS5MQVNUX05BTUUgPSBcImxhc3ROYW1lXCIsIGUuUEhPTkUgPSBcInBob25lXCIsIGUuRU1BSUwgPSBcImVtYWlsXCIsIGUuTElORTEgPSBcImxpbmUxXCIsIGUuTElORTIgPSBcImxpbmUyXCIsIGUuTElORTMgPSBcImxpbmUzXCIsIGUuQ0lUWSA9IFwiY2l0eVwiLCBlLlNUQVRFID0gXCJzdGF0ZVwiLCBlLkNPVU5UUlkgPSBcImNvdW50cnlcIiwgZS5aSVBfQ09ERSA9IFwiemlwQ29kZVwiLCBlLlNISVBQSU5HX0xJTkUxID0gXCJzaGlwcGluZ0FkZHJlc3NMaW5lMVwiLCBlLlNISVBQSU5HX0xJTkUyID0gXCJzaGlwcGluZ0FkZHJlc3NMaW5lMlwiLCBlLlNISVBQSU5HX0xJTkUzID0gXCJzaGlwcGluZ0FkZHJlc3NMaW5lM1wiLCBlLlNISVBQSU5HX0NJVFkgPSBcInNoaXBwaW5nQWRkcmVzc0NpdHlcIiwgZS5TSElQUElOR19TVEFURSA9IFwic2hpcHBpbmdBZGRyZXNzU3RhdGVcIiwgZS5TSElQUElOR19DT1VOVFJZID0gXCJzaGlwcGluZ0FkZHJlc3NDb3VudHJ5XCIsIGUuU0hJUFBJTkdfWklQX0NPREUgPSBcInNoaXBwaW5nQWRkcmVzc1ppcENvZGVcIiwgZS5JU19TSElQUElOR19TQU1FX0FTX0JJTExJTkcgPSBcImlzU2hpcHBpbmdTYW1lQXNCaWxsaW5nXCIsIGUuUFJPTU9USU9OX0NPREUgPSBcInByb21vdGlvbkNvZGVcIiwgZS5JU19CVVNJTkVTU19QVVJDSEFTRSA9IFwiaXNCdXNpbmVzc1B1cmNoYXNlXCIsIGUuQlVTSU5FU1NfTkFNRSA9IFwiYnVzaW5lc3NOYW1lXCIsIGUuVEFYX0lEID0gXCJ0YXhJZFwiLCBlLlRBWF9JRF9UWVBFID0gXCJ0YXhJZFR5cGVcIiwgZSkpKHAgfHwge30pO1xuY29uc3QgVnIgPSB6JDEubmF0aXZlRW51bShwKTtcbnZhciBxciA9IC8qIEBfX1BVUkVfXyAqLyAoKGUpID0+IChlLkNBUkRfTlVNQkVSID0gXCJjYXJkTnVtYmVyXCIsIGUuQ0FSRF9FWFBJUlkgPSBcImNhcmRFeHBpcnlcIiwgZS5DQVJEX0NWQyA9IFwiY2FyZEN2Y1wiLCBlKSkocXIgfHwge30pO1xuY29uc3QgenIgPSB6JDEubmF0aXZlRW51bShxciksIEJyID0geiQxLnVuaW9uKFtWciwgenJdKTtcbnZhciBkZSA9IC8qIEBfX1BVUkVfXyAqLyAoKGUpID0+IChlLkNBUkQgPSBcImNhcmRcIiwgZS5DQVJEX05VTUJFUiA9IFwiY2FyZC1udW1iZXJcIiwgZS5DQVJEX0VYUElSWSA9IFwiY2FyZC1leHBpcnlcIiwgZS5DQVJEX0NWQyA9IFwiY2FyZC1jdmNcIiwgZS5DREVfQlJJREdFID0gXCJjZGUtYnJpZGdlXCIsIGUpKShkZSB8fCB7fSk7XG5jb25zdCBmbyA9IHokMS5lbnVtKFtcImNhcmRcIiwgXCJjYXJkLW51bWJlclwiLCBcImNhcmQtZXhwaXJ5XCIsIFwiY2FyZC1jdmNcIiwgXCJjZGUtYnJpZGdlXCJdKSwgRXQgPSB6JDEub2JqZWN0KHtcbiAgcHJvdmlkZXI6IHokMS5zdHJpbmcoKSxcbiAgcHJvY2Vzc29yX25hbWU6IHgoeiQxLnN0cmluZygpKSxcbiAgbWV0YWRhdGE6IHgoeiQxLnJlY29yZCh6JDEuc3RyaW5nKCksIHokMS5hbnkoKSkpXG59KSwgeW8gPSB6JDEub2JqZWN0KHtcbiAgaWQ6IHokMS5zdHJpbmcoKVxufSksIEN0ID0geiQxLm9iamVjdCh7XG4gIGJhY2tncm91bmRDb2xvcjogYixcbiAgY29sb3I6IGIsXG4gIGZvbnRGYW1pbHk6IGIsXG4gIGZvbnRTaXplOiBiLFxuICBmb250V2VpZ2h0OiBiLFxuICBtYXJnaW46IGIsXG4gIHBhZGRpbmc6IGIsXG4gIGxldHRlclNwYWNpbmc6IGIsXG4gIGxpbmVIZWlnaHQ6IGIsXG4gIGhpZGVJY29uOiBiLFxuICBwbGFjZWhvbGRlclN0eWxlOiB6JDEub2JqZWN0KHtcbiAgICBjb2xvcjogYixcbiAgICBmb250U2l6ZTogYixcbiAgICBmb250V2VpZ2h0OiBiLFxuICAgIGZvbnRGYW1pbHk6IGIsXG4gICAgbGV0dGVyU3BhY2luZzogYixcbiAgICBsaW5lSGVpZ2h0OiBiXG4gIH0pLm9wdGlvbmFsKClcbn0pO1xuQ3QuZXh0ZW5kKHtcbiAgZGlzYWJsZUF1dG9GaWxsOiBiLFxuICBwbGFjZWhvbGRlcjogeiQxLm9iamVjdCh7XG4gICAgY2FyZE51bWJlcjogYixcbiAgICBleHBpcnk6IGIsXG4gICAgY3ZjOiBiXG4gIH0pLm9wdGlvbmFsKClcbn0pO1xuQ3QuZXh0ZW5kKHtcbiAgZGlzYWJsZUF1dG9GaWxsOiBiLFxuICBwbGFjZWhvbGRlcjogeiQxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gIC8qKlxuICAgKiBUaGUgY2FyZCBpY29uIGF0IHRoZSBzdGFydCBvZiB0aGUgY2FyZCBudW1iZXIgaW5wdXQgZmllbGRcbiAgICogSXQgd29uJ3QgYWZmZWN0IGFmdGVyIHRoZSBpY29uIGNoYW5nZWQgdG8gY2FyZCBicmFuZCBhZnRlciB0aGUgdXNlciBpbnB1dCB0aGUgY2FyZCBudW1iZXJcbiAgICovXG4gIGljb246IHokMS5vYmplY3Qoe1xuICAgIGNvbG9yOiB6JDEuc3RyaW5nKCkub3B0aW9uYWwoKVxuICB9KS5vcHRpb25hbCgpXG59KTtcbkN0LmV4dGVuZCh7XG4gIGRpc2FibGVBdXRvRmlsbDogYixcbiAgcGxhY2Vob2xkZXI6IHokMS5zdHJpbmcoKS5vcHRpb25hbCgpXG59KTtcbkN0LmV4dGVuZCh7XG4gIGRpc2FibGVBdXRvRmlsbDogYixcbiAgcGxhY2Vob2xkZXI6IHokMS5zdHJpbmcoKS5vcHRpb25hbCgpXG59KTtcbmNvbnN0IG5lID0geiQxLmVudW0oW1xuICAvLyBFbGVtZW50IC0+IEZvcm1cbiAgXCJMQVlPVVRcIixcbiAgXCJMT0FERURcIixcbiAgXCJCTFVSXCIsXG4gIFwiRk9DVVNcIixcbiAgXCJDSEFOR0VcIixcbiAgXCJUT0tFTklaRV9TVEFSVEVEXCIsXG4gIFwiQ0hFQ0tPVVRfU1RBUlRFRFwiLFxuICBcIlBBWU1FTlRfRkxPV19TVEFSVEVEXCIsXG4gIFwiVE9LRU5JWkVfU1VDQ0VTU1wiLFxuICBcIkNIRUNLT1VUX1NVQ0NFU1NcIixcbiAgXCJMT0FEX0VSUk9SXCIsXG4gIFwiVkFMSURBVElPTl9FUlJPUlwiLFxuICBcIlRPS0VOSVpFX0VSUk9SXCIsXG4gIFwiQ0hFQ0tPVVRfRVJST1JcIixcbiAgXCJTRVRVUF9QQVlNRU5UX01FVEhPRF9TVUNDRVNTXCIsXG4gIC8vIEZvcm0gLT4gRWxlbWVudFxuICBcIlRPS0VOSVpFXCIsXG4gIFwiQ0hFQ0tPVVRcIixcbiAgXCJTVEFSVF9QQVlNRU5UX0ZMT1dcIlxuXSksIGhvID0gbmUuZXh0cmFjdChbXCJUT0tFTklaRV9TVEFSVEVEXCIsIFwiQ0hFQ0tPVVRfU1RBUlRFRFwiXSksIGdvID0geiQxLm9iamVjdCh7IHR5cGU6IGhvIH0pLCB3byA9IG5lLmV4dHJhY3QoW1wiQkxVUlwiLCBcIkZPQ1VTXCIsIFwiQ0hBTkdFXCJdKSwgdm8gPSB6JDEub2JqZWN0KHtcbiAgdHlwZTogd28sXG4gIGVsZW1lbnRUeXBlOiB6cixcbiAgZXJyb3JzOiB6JDEuYXJyYXkoeiQxLnN0cmluZygpKS5vcHRpb25hbCgpLFxuICBvYmZ1c2NhdGVkVmFsdWU6IHokMS5zdHJpbmcoKS5vcHRpb25hbCgpXG59KSwgYm8gPSBuZS5leHRyYWN0KFtcIkxPQURfRVJST1JcIiwgXCJUT0tFTklaRV9FUlJPUlwiLCBcIkNIRUNLT1VUX0VSUk9SXCJdKSwgUG8gPSB6JDEub2JqZWN0KHtcbiAgdHlwZTogYm8sXG4gIG1lc3NhZ2U6IEEsXG4gIGhlYWRlcnM6IHokMS5yZWNvcmQoeiQxLnN0cmluZygpLCB6JDEuc3RyaW5nKCkpLm9wdGlvbmFsKClcbn0pLCBFbyA9IG5lLmV4dHJhY3QoW1wiVkFMSURBVElPTl9FUlJPUlwiXSksIENvID0geiQxLm9iamVjdCh7XG4gIHR5cGU6IEVvLFxuICBlbGVtZW50VHlwZTogQnIsXG4gIGVycm9yczogeiQxLmFycmF5KHokMS5zdHJpbmcoKSlcbn0pLCBTbyA9IHokMS5vYmplY3Qoe1xuICB0eXBlOiB6JDEubGl0ZXJhbChuZS5lbnVtLkxBWU9VVCksXG4gIGhlaWdodDogQVxufSksIGtvID0geiQxLm9iamVjdCh7XG4gIHR5cGU6IHokMS5saXRlcmFsKG5lLmVudW0uTE9BREVEKSxcbiAgc2Vzc2lvbklkOiBBLFxuICB0b3RhbEFtb3VudEF0b21zOiB6JDEubnVtYmVyKCksXG4gIGN1cnJlbmN5OiBiLFxuICBjaGVja291dFBheW1lbnRNZXRob2RzOiB6JDEuYXJyYXkoRXQpXG59KSwgQW8gPSB6JDEub2JqZWN0KHtcbiAgdHlwZTogeiQxLmxpdGVyYWwobmUuZW51bS5QQVlNRU5UX0ZMT1dfU1RBUlRFRCksXG4gIG5leHRBY3Rpb25NZXRhZGF0YTogeiQxLnJlY29yZCh6JDEuc3RyaW5nKCksIHokMS5hbnkoKSksXG4gIHBheW1lbnRGbG93TWV0YWRhdGE6IHokMS5hbnkoKS5vcHRpb25hbCgpLFxuICBzdGFydFBGTWV0YWRhdGE6IHokMS5vcHRpb25hbCh6JDEucmVjb3JkKHokMS5zdHJpbmcoKSwgeiQxLmFueSgpKSlcbn0pLCBJbyA9IHokMS5vYmplY3Qoe1xuICB0eXBlOiB6JDEubGl0ZXJhbChuZS5lbnVtLlNFVFVQX1BBWU1FTlRfTUVUSE9EX1NVQ0NFU1MpLFxuICBwYXltZW50TWV0aG9kSWQ6IHokMS5zdHJpbmcoKVxufSksIEZlID0geiQxLm9iamVjdCh7XG4gIGVtYWlsOiBBLmVtYWlsKHsgbWVzc2FnZTogXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzXCIgfSksXG4gIGZpcnN0TmFtZTogQSxcbiAgbGFzdE5hbWU6IEEsXG4gIHByb21vdGlvbkNvZGU6IGIsXG4gIGxpbmUxOiBiLFxuICBsaW5lMjogYixcbiAgbGluZTM6IGIsXG4gIGNpdHk6IGIsXG4gIHN0YXRlOiBiLFxuICBjb3VudHJ5OiBBLFxuICB6aXBDb2RlOiBiLFxuICBpc1NoaXBwaW5nU2FtZUFzQmlsbGluZzogeiQxLmN1c3RvbSgpLm9wdGlvbmFsKCkuZGVmYXVsdCh0cnVlKSxcbiAgc2hpcHBpbmdBZGRyZXNzTGluZTE6IGIsXG4gIHNoaXBwaW5nQWRkcmVzc0xpbmUyOiBiLFxuICBzaGlwcGluZ0FkZHJlc3NMaW5lMzogYixcbiAgc2hpcHBpbmdBZGRyZXNzQ2l0eTogYixcbiAgc2hpcHBpbmdBZGRyZXNzU3RhdGU6IGIsXG4gIHNoaXBwaW5nQWRkcmVzc0NvdW50cnk6IGIsXG4gIHNoaXBwaW5nQWRkcmVzc1ppcENvZGU6IGIsXG4gIGJ1c2luZXNzTmFtZTogYixcbiAgdGF4SWQ6IGIsXG4gIHRheElkVHlwZTogYlxufSksIFJvID0geiQxLm9iamVjdCh7XG4gIGVtYWlsOiBBLmVtYWlsKHsgbWVzc2FnZTogXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzXCIgfSksXG4gIGZpcnN0TmFtZTogYixcbiAgbGFzdE5hbWU6IGIsXG4gIHByb21vdGlvbkNvZGU6IGIsXG4gIGxpbmUxOiBiLFxuICBsaW5lMjogYixcbiAgbGluZTM6IGIsXG4gIGNpdHk6IGIsXG4gIHN0YXRlOiBiLFxuICBjb3VudHJ5OiBBLFxuICB6aXBDb2RlOiBiLFxuICBpc1NoaXBwaW5nU2FtZUFzQmlsbGluZzogeiQxLmN1c3RvbSgpLm9wdGlvbmFsKCkuZGVmYXVsdCh0cnVlKSxcbiAgc2hpcHBpbmdBZGRyZXNzTGluZTE6IGIsXG4gIHNoaXBwaW5nQWRkcmVzc0xpbmUyOiBiLFxuICBzaGlwcGluZ0FkZHJlc3NMaW5lMzogYixcbiAgc2hpcHBpbmdBZGRyZXNzQ2l0eTogYixcbiAgc2hpcHBpbmdBZGRyZXNzU3RhdGU6IGIsXG4gIHNoaXBwaW5nQWRkcmVzc0NvdW50cnk6IGIsXG4gIHNoaXBwaW5nQWRkcmVzc1ppcENvZGU6IGIsXG4gIGJ1c2luZXNzTmFtZTogYixcbiAgdGF4SWQ6IGIsXG4gIHRheElkVHlwZTogYlxufSk7XG56JDEub2JqZWN0KHtcbiAgbGluZTE6IEEsXG4gIGNpdHk6IEEsXG4gIHN0YXRlOiBBLFxuICBjb3VudHJ5OiBBXG59KTtcbnokMS5vYmplY3Qoe1xuICBzaGlwcGluZ0FkZHJlc3NDb3VudHJ5OiBBLFxuICBzaGlwcGluZ0FkZHJlc3NaaXBDb2RlOiBBXG59KTtcbnokMS5vYmplY3Qoe1xuICBzaGlwcGluZ0FkZHJlc3NMaW5lMTogQSxcbiAgc2hpcHBpbmdBZGRyZXNzQ2l0eTogQSxcbiAgc2hpcHBpbmdBZGRyZXNzU3RhdGU6IEEsXG4gIHNoaXBwaW5nQWRkcmVzc0NvdW50cnk6IEEsXG4gIHNoaXBwaW5nQWRkcmVzc1ppcENvZGU6IEFcbn0pO1xuY29uc3QgVG8gPSBuZS5leHRyYWN0KFtcIlRPS0VOSVpFXCIsIFwiQ0hFQ0tPVVRcIiwgXCJTVEFSVF9QQVlNRU5UX0ZMT1dcIl0pLCBObyA9IHokMS5vYmplY3Qoe1xuICB0eXBlOiBUbyxcbiAgc2Vzc2lvbklkOiBBLFxuICBjaGVja291dFBheW1lbnRNZXRob2Q6IEV0LFxuICBwYXltZW50Rmxvd01ldGFkYXRhOiB6JDEuYW55KCkub3B0aW9uYWwoKSxcbiAgZG9Ob3RVc2VMZWdhY3lDQ0Zsb3c6IHokMS5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgZXhpc3RpbmdDQ1BNSWQ6IGIsXG4gIHBheW1lbnRSb3V0ZUlkOiBiXG59KS5leHRlbmQoRmUuc2hhcGUpLCBGbyA9IHokMS5vYmplY3Qoe1xuICB0eXBlOiB6JDEubGl0ZXJhbChuZS5lbnVtLlRPS0VOSVpFX1NVQ0NFU1MpLFxuICBpc1JlYWR5Rm9yQ2hlY2tvdXQ6IHokMS5ib29sZWFuKClcbn0pLCBMbyA9IHokMS5vYmplY3Qoe1xuICB0eXBlOiB6JDEubGl0ZXJhbChuZS5lbnVtLkNIRUNLT1VUX1NVQ0NFU1MpLFxuICBpbnZvaWNlVXJsczogeiQxLmFycmF5KHokMS5zdHJpbmcoKSksXG4gIHN1YnNjcmlwdGlvbklkczogeiQxLmFycmF5KHokMS5zdHJpbmcoKSksXG4gIGN1c3RvbWVySWQ6IHokMS5zdHJpbmcoKSxcbiAgcGF5bWVudE1ldGhvZElkOiBiXG59KSwgTW8gPSB6JDEuZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gIGdvLFxuICB2byxcbiAgUG8sXG4gIENvLFxuICBTbyxcbiAga28sXG4gIE5vLFxuICBGbyxcbiAgTG8sXG4gIEFvLFxuICBJb1xuXSksIHhvID0geiQxLm9iamVjdCh7XG4gIHBheWxvYWQ6IE1vLFxuICBub25jZTogQSxcbiAgZm9ybUlkOiBBLFxuICBlbGVtZW50SWQ6IEFcbn0pO1xueiQxLm9iamVjdCh7XG4gIGFtb3VudEF0b206IHokMS5udW1iZXIoKSxcbiAgLyoqXG4gICAqIFRoZSB0aHJlZS1sZXR0ZXIgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBmb3IgdGhlIHBheW1lbnQuXG4gICAqL1xuICBjdXJyZW5jeTogQVxufSk7XG56JDEuZW51bShbXCJhcHBsZV9wYXlcIiwgXCJnb29nbGVfcGF5XCJdKTtcbnokMS5vYmplY3Qoe1xuICBzZWN1cmVfdG9rZW46IHokMS5zdHJpbmcoKSxcbiAgcHJvbW90aW9uX2NvZGU6IHokMS5zdHJpbmcoKS5vcHRpb25hbCgpXG59KTtcbnokMS5vYmplY3Qoe1xuICBzZWN1cmVfdG9rZW46IHokMS5zdHJpbmcoKSxcbiAgZXhpc3RpbmdfY2NfcG1faWQ6IHgoeiQxLnN0cmluZygpKSxcbiAgdGhlaXJfcG1faWQ6IHgoeiQxLnN0cmluZygpKSxcbiAgY2hlY2tvdXRfYXR0ZW1wdF9pZDogeCh6JDEuc3RyaW5nKCkpLFxuICBwcm9jZXNzb3Jfc3BlY2lmaWNfbWV0YWRhdGE6IHgoeiQxLnJlY29yZCh6JDEuc3RyaW5nKCksIHokMS5hbnkoKSkpXG59KTtcbmNvbnN0IFplID0geiQxLm9iamVjdCh7XG4gIGludm9pY2VfdXJsczogeiQxLmFycmF5KHokMS5zdHJpbmcoKSksXG4gIHN1YnNjcmlwdGlvbl9pZHM6IHokMS5hcnJheSh6JDEuc3RyaW5nKCkpLFxuICBjdXN0b21lcl9pZDogeiQxLnN0cmluZygpLFxuICBwYXltZW50X21ldGhvZF9pZDogeCh6JDEuc3RyaW5nKCkpLFxuICBwcm9jZXNzb3JzX3VzZWQ6IHgoeiQxLmFycmF5KHokMS5zdHJpbmcoKSkpXG59KSwgRG8gPSB6JDEub2JqZWN0KHtcbiAgZWxlbWVudFR5cGU6IHokMS5zdHJpbmcoKSxcbiAgZXJyb3JzOiB6JDEuYXJyYXkoeiQxLnN0cmluZygpKVxufSk7XG56JDEub2JqZWN0KHtcbiAgc2Vzc2lvbl9pZDogeiQxLnN0cmluZygpXG59KTtcbmNvbnN0IE9vID0geiQxLm9iamVjdCh7XG4gIHN1Y2Nlc3M6IHokMS5saXRlcmFsKGZhbHNlKSxcbiAgZXJyb3JfdHlwZTogeiQxLmxpdGVyYWwoXCJ2YWxpZGF0aW9uX2Vycm9yXCIpLFxuICBlcnJvcnM6IHokMS5hcnJheShEbylcbn0pLCBVbyA9IHokMS5kaXNjcmltaW5hdGVkVW5pb24oXCJzdWNjZXNzXCIsIFtcbiAgeiQxLm9iamVjdCh7IHN1Y2Nlc3M6IHokMS5saXRlcmFsKHRydWUpIH0pLFxuICBPb1xuXSk7XG56JDEub2JqZWN0KHtcbiAgc2Vzc2lvbl9pZDogeiQxLnN0cmluZygpLFxuICBjaGVja291dF9wYXltZW50X21ldGhvZDogRXQsXG4gIG5vbl9jZGVfZm9ybV9maWVsZHM6IEZlLFxuICBkb19ub3RfdXNlX2xlZ2FjeV9jY19mbG93OiB6JDEuYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIGV4aXN0aW5nX2NjX3BtX2lkOiB4KHokMS5zdHJpbmcoKSksXG4gIGV4dHJhX21ldGFkYXRhOiB6JDEucmVjb3JkKHokMS5zdHJpbmcoKSwgeiQxLmFueSgpKSxcbiAgcGF5bWVudF9yb3V0ZV9pZDogeCh6JDEuc3RyaW5nKCkpLFxuICBjdXN0b21lcl9sYW5ndWFnZTogeCh6JDEuc3RyaW5nKCkpXG59KTtcbnokMS5vYmplY3Qoe1xuICBzZXNzaW9uX2lkOiB6JDEuc3RyaW5nKCksXG4gIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBFdCxcbiAgbm9uX2NkZV9mb3JtX2ZpZWxkczogRmUsXG4gIGV4dHJhX21ldGFkYXRhOiB6JDEucmVjb3JkKHokMS5zdHJpbmcoKSwgeiQxLmFueSgpKS5vcHRpb25hbCgpLFxuICBwYXltZW50X3JvdXRlX2lkOiB4KHokMS5zdHJpbmcoKSksXG4gIGN1c3RvbWVyX2xhbmd1YWdlOiB4KHokMS5zdHJpbmcoKSlcbn0pO1xudmFyIE4gPSAvKiBAX19QVVJFX18gKi8gKChlKSA9PiAoZS5TVUNDRVNTID0gXCJzdWNjZXNzXCIsIGUuRkFJTFVSRSA9IFwiZmFpbHVyZVwiLCBlLkNBTkNFTExFRCA9IFwiY2FuY2VsbGVkXCIsIGUpKShOIHx8IHt9KTtcbmNvbnN0IEhyID0geiQxLm9iamVjdCh7XG4gIHN0YXR1czogeiQxLmVudW0oW1xuICAgIFwic3VjY2Vzc1wiLFxuICAgIFwiZmFpbHVyZVwiLFxuICAgIFwiY2FuY2VsbGVkXCJcbiAgICAvKiBDQU5DRUxMRUQgKi9cbiAgXSksXG4gIGhyZWY6IHokMS5zdHJpbmcoKS5vcHRpb25hbCgpLm51bGxhYmxlKClcbn0pO1xueiQxLm9iamVjdCh7XG4gIGhyZWY6IHokMS5zdHJpbmcoKS5vcHRpb25hbCgpLm51bGxhYmxlKClcbn0pO1xuY29uc3Qgam8gPSB6JDEub2JqZWN0KHtcbiAgdHlwZTogeiQxLnN0cmluZygpLFxuICByZWRpcmVjdF91cmw6IHokMS5zdHJpbmcoKSxcbiAgaW5pdGlhbF9pbnRlbnRfaWQ6IHokMS5zdHJpbmcoKSxcbiAgY29uc2VudF9pZDogeiQxLnN0cmluZygpLFxuICB0aGVpcl9wbV9pZDogeiQxLnN0cmluZygpLm9wdGlvbmFsKClcbn0pLCAkbyA9IHokMS5vYmplY3Qoe1xuICBiYW5rX25hbWU6IHokMS5zdHJpbmcoKSxcbiAgZGlzcGxheV9uYW1lOiB6JDEuc3RyaW5nKCksXG4gIHJlc291cmNlczogeiQxLm9iamVjdCh7XG4gICAgbG9nb191cmw6IHokMS5zdHJpbmcoKS5vcHRpb25hbCgpXG4gIH0pXG59KSwgWXIgPSB6JDEub2JqZWN0KHtcbiAgdHlwZTogeiQxLnN0cmluZygpLFxuICByZWRpcmVjdF91cmw6IHgoeiQxLnN0cmluZygpKSxcbiAgaW5pdGlhbF9pbnRlbnRfaWQ6IHgoeiQxLnN0cmluZygpKSxcbiAgY29uc2VudF9pZDogeCh6JDEuc3RyaW5nKCkpLFxuICB0aGVpcl9wbV9pZDogeCh6JDEuc3RyaW5nKCkpLFxuICBwYXltZW50X3Nlc3Npb246IHgoeiQxLnJlY29yZCh6JDEuc3RyaW5nKCksIHokMS5hbnkoKSkpLFxuICBhdmFpbGFibGVfYmFua3M6IHgoeiQxLmFycmF5KCRvKSlcbn0pLCBHbyA9IHokMS5kaXNjcmltaW5hdGVkVW5pb24oXCJwcmVzZW50XCIsIFtcbiAgeiQxLm9iamVjdCh7IHByZXNlbnQ6IHokMS5saXRlcmFsKHRydWUpLCBocmVmOiB6JDEuc3RyaW5nKCkgfSksXG4gIHokMS5vYmplY3QoeyBwcmVzZW50OiB6JDEubGl0ZXJhbChmYWxzZSkgfSlcbl0pLCBWbyA9IHokMS5vYmplY3Qoe1xuICBwYXltZW50X21ldGhvZHM6IHokMS5hcnJheSh5byksXG4gIHBheV9maXJzdF9zdWNjZXNzX3Jlc3BvbnNlOiB4KFplKSxcbiAgcmVxdWlyZWRfdXNlcl9hY3Rpb25zOiB4KHokMS5hcnJheShZcikpLFxuICBwb3N0X2NoZWNrb3V0X3JlZGlyZWN0X3RvOiB4KHokMS5zdHJpbmcoKSksXG4gIGNoZWNrb3V0X3N1Y2Nlc3NfcmVzcG9uc2U6IHgoWmUpXG59KSwgcW8gPSB6JDEub2JqZWN0KHtcbiAgaW5zdGl0dXRpb25OdW1iZXI6IHokMS5zdHJpbmcoKSxcbiAgdHJhbnNpdE51bWJlcjogeiQxLnN0cmluZygpLFxuICBhY2NvdW50TnVtYmVyOiB6JDEuc3RyaW5nKCksXG4gIGFjY291bnRUeXBlOiB6JDEuZW51bShbXCJwZXJzb25hbFwiLCBcImJ1c2luZXNzXCJdKVxufSk7XG56JDEub2JqZWN0KHtcbiAgc3RhdHVzOiB6JDEuZW51bShbXCJzdWNjZXNzXCIsIFwiZmFpbHVyZVwiXSksXG4gIHBheWxvYWQ6IHFvLm9wdGlvbmFsKClcbn0pO1xuY29uc3Qgem8gPSB6JDEub2JqZWN0KHtcbiAgc29ydENvZGU6IHokMS5zdHJpbmcoKSxcbiAgYWNjb3VudE51bWJlcjogeiQxLnN0cmluZygpLFxuICBhY2NvdW50VHlwZTogeiQxLmVudW0oW1wicGVyc29uYWxcIiwgXCJidXNpbmVzc1wiXSlcbn0pO1xueiQxLm9iamVjdCh7XG4gIHN0YXR1czogeiQxLmVudW0oW1wic3VjY2Vzc1wiLCBcImZhaWx1cmVcIl0pLFxuICBwYXlsb2FkOiB6by5vcHRpb25hbCgpXG59KTtcbmNvbnN0IEJvID0geiQxLm9iamVjdCh7XG4gIGliYW46IHokMS5zdHJpbmcoKSxcbiAgYWNjb3VudFR5cGU6IHokMS5lbnVtKFtcInBlcnNvbmFsXCIsIFwiYnVzaW5lc3NcIl0pXG59KTtcbnokMS5vYmplY3Qoe1xuICBzdGF0dXM6IHokMS5lbnVtKFtcInN1Y2Nlc3NcIiwgXCJmYWlsdXJlXCJdKSxcbiAgcGF5bG9hZDogQm8ub3B0aW9uYWwoKVxufSk7XG5jb25zdCBIbyA9IHokMS5vYmplY3Qoe1xuICBhY2NvdW50X251bWJlcjogeiQxLnN0cmluZygpLFxuICBhYmFfcm91dGluZ19udW1iZXI6IHokMS5zdHJpbmcoKVxufSksIFlvID0geiQxLm9iamVjdCh7XG4gIGluc3RpdHV0aW9uX251bWJlcjogeiQxLnN0cmluZygpLFxuICB0cmFuc2l0X251bWJlcjogeiQxLnN0cmluZygpLFxuICBhY2NvdW50X251bWJlcjogeiQxLnN0cmluZygpXG59KSwgV28gPSB6JDEub2JqZWN0KHtcbiAgYWNjb3VudF9udW1iZXI6IHokMS5zdHJpbmcoKSxcbiAgc29ydF9jb2RlOiB6JDEuc3RyaW5nKClcbn0pLCBKbyA9IHokMS5vYmplY3Qoe1xuICBpYmFuOiB6JDEuc3RyaW5nKClcbn0pLCBabyA9IHokMS5vYmplY3Qoe1xuICBzdGF0dXM6IHokMS5lbnVtKFtcInN1Y2Nlc3NcIiwgXCJmYWlsdXJlXCJdKSxcbiAgcGF5bG9hZDogeiQxLnVuaW9uKFtcbiAgICBIbyxcbiAgICBZbyxcbiAgICBXbyxcbiAgICBKbyxcbiAgICB6JDEub2JqZWN0KHsgZXJyb3I6IHokMS5zdHJpbmcoKSB9KVxuICBdKS5vcHRpb25hbCgpXG59KSwgUCA9IChlKSA9PiB6JDEubnVsbGFibGUoZS5vcHRpb25hbCgpKTtcbnokMS5zdHJpbmcoKS50cmltKCkubWluKDEsIHsgbWVzc2FnZTogXCJDYW5ub3QgYmUgYmxhbmtcIiB9KTtcbmNvbnN0IEtvID0geiQxLm9iamVjdCh7XG4gIGNkZV9yZXNwb25zZV90eXBlOiB6JDEubGl0ZXJhbChcImVycm9yXCIpLFxuICBtZXNzYWdlOiB6JDEuc3RyaW5nKCksXG4gIGhlYWRlcnM6IHokMS5yZWNvcmQoeiQxLnN0cmluZygpLCB6JDEuc3RyaW5nKCkpLm9wdGlvbmFsKClcbn0pO1xueiQxLmVudW0oW1widXNkXCIsIFwiYnJsXCJdKTtcbmNvbnN0IFdyID0geiQxLm9iamVjdCh7XG4gIG5hbWU6IHokMS5zdHJpbmcoKSxcbiAgYW1vdW50X2F0b21fb2ZmOiBQKHokMS5udW1iZXIoKSksXG4gIHBlcmNlbnRfb2ZmOiBQKHokMS5udW1iZXIoKSksXG4gIGN1cnJlbmN5OiBQKHokMS5zdHJpbmcoKSksXG4gIGR1cmF0aW9uOiB6JDEuc3RyaW5nKCksXG4gIGR1cmF0aW9uX2luX21vbnRoczogUCh6JDEubnVtYmVyKCkpXG59KSwgSnIgPSB6JDEub2JqZWN0KHtcbiAgYW1vdW50X3N1YnRvdGFsX2F0b206IHokMS5udW1iZXIoKS5pbnQoKSxcbiAgYW1vdW50X3RvdGFsX2F0b206IHokMS5udW1iZXIoKS5pbnQoKSxcbiAgY3VycmVuY3k6IHokMS5zdHJpbmcoKSxcbiAgZGVzY3JpcHRpb246IFAoeiQxLnN0cmluZygpKSxcbiAgcHJpY2VfaWQ6IHokMS5zdHJpbmcoKSxcbiAgYmlsbGluZ19pbnRlcnZhbDogUCh6JDEuc3RyaW5nKCkpLFxuICBiaWxsaW5nX2ludGVydmFsX2NvdW50OiBQKHokMS5udW1iZXIoKS5pbnQoKSksXG4gIHF1YW50aXR5OiB6JDEubnVtYmVyKCkuaW50KClcbn0pLCBRbyA9IHokMS5yZWNvcmQoeiQxLnN0cmluZygpLCB6JDEuYW55KCkpLCBYbyA9IHokMS5vYmplY3Qoe1xuICBuYW1lOiB6JDEuc3RyaW5nKCksXG4gIHNldHRpbmdzOiBQKFFvKVxufSksIE9lID0geiQxLm9iamVjdCh7XG4gIHByb3ZpZGVyOiB6JDEuc3RyaW5nKCksXG4gIHByb2Nlc3Nvcl9uYW1lOiBQKHokMS5zdHJpbmcoKSksXG4gIG1ldGFkYXRhOiBQKHokMS5yZWNvcmQoeiQxLnN0cmluZygpLCB6JDEuYW55KCkpKVxufSksIGVhID0geiQxLm9iamVjdCh7XG4gIHF1YW50aXR5OiB6JDEubnVtYmVyKClcbn0pLCB0YSA9IHokMS5vYmplY3Qoe1xuICBpZDogUCh6JDEuc3RyaW5nKCkpLFxuICBiaWxsaW5nX2ludGVydmFsOiBQKHokMS5zdHJpbmcoKSksXG4gIGJpbGxpbmdfaW50ZXJ2YWxfY291bnQ6IFAoeiQxLm51bWJlcigpLmludCgpKSxcbiAgc3Vic2NyaXB0aW9uX2l0ZW1zOiB6JDEuYXJyYXkoZWEpLFxuICB0cmlhbF9zdGFydDogUCh6JDEuc3RyaW5nKCkpLFxuICB0cmlhbF9lbmQ6IFAoeiQxLnN0cmluZygpKVxufSksIFpyID0geiQxLm9iamVjdCh7XG4gIGFtb3VudF9hdG9tOiB6JDEubnVtYmVyKClcbn0pLCByYSA9IHokMS5vYmplY3Qoe1xuICBhbW91bnRfYXRvbTogeiQxLm51bWJlcigpLFxuICBhbW91bnRfYXRvbV9jb25zaWRlcmluZ19kaXNjb3VudF9hcHBsaWVkOiB6JDEubnVtYmVyKCksXG4gIGN1cnJlbmN5OiB6JDEuc3RyaW5nKCksXG4gIGRpc2NvdW50X2Ftb3VudF9hdG9tczogeiQxLmFycmF5KFpyKSxcbiAgc3Vic2NyaXB0aW9uX2l0ZW1faWQ6IHokMS5zdHJpbmcoKVxufSksIG5hID0geiQxLm9iamVjdCh7XG4gIGNvdXBvbjogV3Jcbn0pLCBvYSA9IHokMS5vYmplY3Qoe1xuICBjdXJyZW5jeTogeiQxLnN0cmluZygpLFxuICBkaXNjb3VudHM6IHokMS5hcnJheShuYSksXG4gIGhvc3RlZF9pbnZvaWNlX3VybDogUCh6JDEuc3RyaW5nKCkpLFxuICBsaW5lczogeiQxLmFycmF5KHJhKSxcbiAgcmVtYWluaW5nX2Ftb3VudF9hdG9tOiB6JDEubnVtYmVyKCksXG4gIHRheF9hbW91bnRfYXRvbTogeiQxLm51bWJlcigpLFxuICB0b3RhbF9hbW91bnRfYXRvbTogeiQxLm51bWJlcigpLFxuICB0b3RhbF9kaXNjb3VudF9hbW91bnRfYXRvbXM6IHokMS5hcnJheShacilcbn0pLCBtciA9IHokMS5vYmplY3Qoe1xuICBjcmVhdGVkOiB6JDEuYXJyYXkodGEpLFxuICBpbnZvaWNlczogeiQxLmFycmF5KG9hKSxcbiAgcHJvY2Vzc29yc191c2VkOiBQKHokMS5hcnJheSh6JDEuc3RyaW5nKCkpKSxcbiAgcGF5bWVudF9tZXRob2RfaWQ6IFAoeiQxLnN0cmluZygpKVxufSksIEtyID0geiQxLm9iamVjdCh7XG4gIHByZXZpZXc6IG1yLFxuICBwcmV2aWV3X3Bvc3RfdHJpYWw6IFAobXIpLFxuICBjb3Vwb25zOiB6JDEuYXJyYXkoV3IpXG59KSwgX3IgPSB6JDEub2JqZWN0KHtcbiAgc3RhdHVzOiB6JDEubGl0ZXJhbChcIm9wZW5cIiksXG4gIGxvY2FsZTogUCh6JDEuc3RyaW5nKCkpLFxuICB0b2tlbjogeiQxLnN0cmluZygpLFxuICBlbWFpbDogUCh6JDEuc3RyaW5nKCkpLFxuICBjaGVja291dF9zZXR0aW5nczogeiQxLnJlY29yZCh6JDEuc3RyaW5nKCksIHokMS5hbnkoKSksXG4gIGxpbmVfaXRlbXM6IHokMS5hcnJheShKciksXG4gIGFtb3VudF9zdWJ0b3RhbF9hdG9tOiB6JDEubnVtYmVyKCkuaW50KCksXG4gIGFtb3VudF90b3RhbF9hdG9tOiB6JDEubnVtYmVyKCkuaW50KCksXG4gIGJyYW5kOiBYbyxcbiAgc3Vic19wcmV2aWV3OiBQKEtyKSxcbiAgLy8gTnVsbCBpbiBzZXR1cCBtb2RlXG4gIG1ldGhvZHNfYXZhaWxhYmxlOiB6JDEuYXJyYXkoT2UpLFxuICByZXR1cm5fdXJsOiBQKHokMS5zdHJpbmcoKSksXG4gIHN1Y2Nlc3NfdXJsOiBQKHokMS5zdHJpbmcoKSksXG4gIGZpbmFsX2ZlYXR1cmVfcm9sbG91dF9zZXR0aW5nczogUCh6JDEucmVjb3JkKHokMS5zdHJpbmcoKSwgeiQxLmFueSgpKSlcbn0pLCBRciA9IHokMS5kaXNjcmltaW5hdGVkVW5pb24oXCJtb2RlXCIsIFtcbiAgeiQxLm9iamVjdCh7XG4gICAgbW9kZTogeiQxLmxpdGVyYWwoXCJzZXR1cFwiKSxcbiAgICBjdXJyZW5jeTogeiQxLm51bGxhYmxlKHokMS51bmRlZmluZWQoKSlcbiAgfSkuZXh0ZW5kKF9yLnNoYXBlKSxcbiAgeiQxLm9iamVjdCh7XG4gICAgbW9kZTogeiQxLmVudW0oW1wicGF5bWVudFwiLCBcInN1YnNjcmlwdGlvblwiXSksXG4gICAgY3VycmVuY3k6IHokMS5zdHJpbmcoKVxuICB9KS5leHRlbmQoX3Iuc2hhcGUpXG5dKSwgYWEgPSB6JDEub2JqZWN0KHtcbiAgc3RhdHVzOiB6JDEubGl0ZXJhbChcImNvbXBsZXRlXCIpXG59KSwgaWEgPSB6JDEub2JqZWN0KHtcbiAgc3RhdHVzOiB6JDEubGl0ZXJhbChcImV4cGlyZWRcIilcbn0pO1xueiQxLnVuaW9uKFtRciwgYWEsIGlhXSk7XG56JDEub2JqZWN0KHtcbiAgbG9nbzogeiQxLnN0cmluZygpLFxuICBpY29uOiB6JDEuc3RyaW5nKCksXG4gIHByaW1hcnlfY29sb3I6IHokMS5zdHJpbmcoKSxcbiAgc2Vjb25kYXJ5X2NvbG9yOiB6JDEuc3RyaW5nKClcbn0pO1xueiQxLm9iamVjdCh7XG4gIHNlY3VyZV90b2tlbjogeiQxLnN0cmluZygpLFxuICBwbV9pZDogeiQxLnN0cmluZygpXG59KTtcbmNvbnN0IGZ0ID0geiQxLm9iamVjdCh7XG4gIGxpbmUxOiB6JDEuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgbGluZTI6IHokMS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBsaW5lMzogeiQxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGNpdHk6IHokMS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBzdGF0ZTogeiQxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGNvdW50cnk6IHokMS5zdHJpbmcoKSxcbiAgemlwX2NvZGU6IHokMS5zdHJpbmcoKS5vcHRpb25hbCgpXG59KTtcbnokMS5vYmplY3Qoe1xuICBzZWN1cmVfdG9rZW46IHokMS5zdHJpbmcoKSxcbiAgcGF5bWVudF9pbnB1dDogeiQxLmFueSgpLFxuICAvLyBTaG91bGQgZm9sbG93IEFueVBheW1lbnRJbnB1dCBmcm9tIENERVxuICBjdXN0b21lcl9lbWFpbDogeiQxLnN0cmluZygpLFxuICBjdXN0b21lcl9sYXN0X25hbWU6IHokMS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBjdXN0b21lcl9maXJzdF9uYW1lOiB6JDEuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgY3VzdG9tZXJfYWRkcmVzczogZnQsXG4gIGN1c3RvbWVyX3NoaXBwaW5nX2FkZHJlc3M6IGZ0Lm9wdGlvbmFsKCksXG4gIGxpbmVfaXRlbXM6IHokMS5hcnJheShKciksXG4gIHRvdGFsX2Ftb3VudF9hdG9tOiB6JDEubnVtYmVyKCkuaW50KCksXG4gIGNhbmNlbF9hdF9lbmQ6IHokMS5ib29sZWFuKCksXG4gIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBPZSxcbiAgcHJvbW90aW9uX2NvZGU6IHokMS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBkb19ub3RfdXNlX2xlZ2FjeV9jY19mbG93OiB6JDEuYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIHVzZV9jb25maXJtZWRfcG1faWQ6IFAoeiQxLnN0cmluZygpKSxcbiAgcGF5bWVudF9yb3V0ZV9pZDogUCh6JDEuc3RyaW5nKCkpXG59KTtcbmNvbnN0IFhyID0geiQxLm9iamVjdCh7XG4gIHBheW1lbnRfbWV0aG9kX2lkOiB6JDEuc3RyaW5nKClcbn0pO1xueiQxLm9iamVjdCh7XG4gIGlkOiB6JDEuc3RyaW5nKCksXG4gIHJldHVybl91cmw6IHokMS5zdHJpbmcoKVxufSk7XG5jb25zdCBzYSA9IHokMS5vYmplY3Qoe1xuICB0eXBlOiB6JDEuc3RyaW5nKCksXG4gIGxvYzogeiQxLmFycmF5KHokMS5zdHJpbmcoKSksXG4gIG1zZzogeiQxLnN0cmluZygpLFxuICB1cmw6IHokMS5zdHJpbmcoKVxufSk7XG56JDEuYXJyYXkoc2EpO1xuY29uc3QgY2EgPSB6JDEub2JqZWN0KHtcbiAgbmV3X2N1c3RvbWVyX2VtYWlsOiB6JDEuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgbmV3X2N1c3RvbWVyX2xhc3RfbmFtZTogeiQxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gIG5ld19jdXN0b21lcl9maXJzdF9uYW1lOiB6JDEuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgY3VzdG9tZXJfYnVzaW5lc3NfbmFtZTogeiQxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGN1c3RvbWVyX3RheF9pZDogeiQxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGN1c3RvbWVyX3RheF9pZF90eXBlOiB6JDEuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgbmV3X2N1c3RvbWVyX2FkZHJlc3M6IGZ0LFxuICBuZXdfY3VzdG9tZXJfc2hpcHBpbmdfYWRkcmVzczogZnQub3B0aW9uYWwoKVxufSksIGxhID0geiQxLm9iamVjdCh7XG4gIHByaWNlX2lkOiB6JDEuc3RyaW5nKCksXG4gIHF1YW50aXR5OiB6JDEubnVtYmVyKCkuaW50KClcbn0pLCBlbiA9IHokMS5vYmplY3Qoe1xuICBsaW5lX2l0ZW1zOiB6JDEuYXJyYXkobGEpLFxuICBwcm9tb3Rpb25fY29kZTogeiQxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGRpc3BsYXllZF90b3RhbF9hbW91bnRfYXRvbTogeiQxLm51bWJlcigpLmludCgpXG59KSwgdWEgPSB6JDEub2JqZWN0KHtcbiAgcHJvY2Vzc29yX3NwZWNpZmljX21ldGFkYXRhOiBQKHokMS5yZWNvcmQoeiQxLnN0cmluZygpLCB6JDEuYW55KCkpKVxufSk7XG56JDEub2JqZWN0KHtcbiAgcGF5bWVudF9wcm92aWRlcjogeiQxLnN0cmluZygpLFxuICBjaGVja291dF9wYXltZW50X21ldGhvZDogT2UsXG4gIGV4aXN0aW5nX2NjX3BtX2lkOiB6JDEuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgdGhlaXJfZXhpc3RpbmdfcG1faWQ6IHokMS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB1c2VfcGF5X2ZpcnN0X2Zsb3c6IHokMS5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgcGF5X2ZpcnN0X2Zsb3dfY2FydF9pbmZvOiBlbi5vcHRpb25hbCgpLFxuICBjdXN0b21lcl9sYW5ndWFnZTogeiQxLnN0cmluZygpLm9wdGlvbmFsKClcbn0pLmV4dGVuZChjYS5zaGFwZSkuZXh0ZW5kKHVhLnNoYXBlKTtcbmNvbnN0IHRuID0geiQxLm9iamVjdCh7XG4gIHJlcXVpcmVkX3VzZXJfYWN0aW9uczogeiQxLmFycmF5KHokMS5yZWNvcmQoeiQxLnN0cmluZygpLCB6JDEuYW55KCkpKSxcbiAgY2hlY2tvdXRfYXR0ZW1wdF9pZDogUCh6JDEuc3RyaW5nKCkpXG59KTtcbnokMS5vYmplY3Qoe1xuICBmaWVsZHM6IFJvLFxuICBjaGVja291dFBheW1lbnRNZXRob2Q6IE9lLFxuICBwYXltZW50X3JvdXRlX2lkOiBQKHokMS5zdHJpbmcoKSlcbn0pO1xueiQxLm9iamVjdCh7XG4gIHNlc3Npb25faWQ6IHokMS5zdHJpbmcoKSxcbiAgbm9uX2NkZV9mb3JtX2ZpZWxkczogRmUsXG4gIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBPZSxcbiAgZXh0cmFfbWV0YWRhdGE6IHokMS5yZWNvcmQoeiQxLnN0cmluZygpLCB6JDEuYW55KCkpLFxuICAvLyBUaGlzIGlzIG9wdGlvbmFsIGluIENERSwgYnV0IG5vdCBpbiBPSlMgbW92aW5nIGZvcndhcmRcbiAgdXNlX3VuaWZpZWRfY2NfZmxvdzogUCh6JDEuYm9vbGVhbigpKSxcbiAgcGF5X2ZpcnN0X2Zsb3dfY2FydF9pbmZvOiBlbi5vcHRpb25hbCgpLFxuICBwYXltZW50X3JvdXRlX2lkOiBQKHokMS5zdHJpbmcoKSksXG4gIGN1c3RvbWVyX2xhbmd1YWdlOiB6JDEuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgZXhpc3RpbmdfY2NfcG1faWQ6IFAoeiQxLnN0cmluZygpKVxufSk7XG5jb25zdCBkYSA9IHokMS5vYmplY3Qoe1xuICByZXF1aXJlZF91c2VyX2FjdGlvbnM6IHokMS5hcnJheSh6JDEucmVjb3JkKHokMS5zdHJpbmcoKSwgeiQxLmFueSgpKSksXG4gIGNjX3BtX2lkOiB6JDEuc3RyaW5nKCksXG4gIGNoZWNrb3V0X3N1Y2Nlc3NfcmVzcG9uc2U6IFAoWmUpLFxuICBjaGVja291dF9hdHRlbXB0X2lkOiBQKHokMS5zdHJpbmcoKSlcbn0pO1xueiQxLnJlY29yZCh6JDEuYW55KCkpO1xueiQxLm9iamVjdCh7XG4gIGZpcnN0X25hbWU6IFAoeiQxLnN0cmluZygpKSxcbiAgbGFzdF9uYW1lOiBQKHokMS5zdHJpbmcoKSksXG4gIGxpbmUxOiBQKHokMS5zdHJpbmcoKSksXG4gIGxpbmUyOiBQKHokMS5zdHJpbmcoKSksXG4gIGxpbmUzOiBQKHokMS5zdHJpbmcoKSksXG4gIGNpdHk6IFAoeiQxLnN0cmluZygpKSxcbiAgc3RhdGU6IFAoeiQxLnN0cmluZygpKSxcbiAgY291bnRyeTogUCh6JDEuc3RyaW5nKCkpLFxuICB6aXBfY29kZTogUCh6JDEuc3RyaW5nKCkpLFxuICBlbWFpbDogUCh6JDEuc3RyaW5nKCkpLFxuICBiaWxsaW5nX2VtYWlsOiBQKHokMS5zdHJpbmcoKSksXG4gIHBob25lX251bWJlcjogUCh6JDEuc3RyaW5nKCkpLFxuICBidXNpbmVzc19uYW1lOiBQKHokMS5zdHJpbmcoKSksXG4gIHRheF9pZDogUCh6JDEuc3RyaW5nKCkpLFxuICB0YXhfaWRfdHlwZTogUCh6JDEuc3RyaW5nKCkpLFxuICB1cGRhdGVfcHJvY2Vzc29yX2N1c3RvbWVyOiBQKHokMS5ib29sZWFuKCkpXG59KTtcbnokMS5vYmplY3Qoe1xuICBpZDogeiQxLnN0cmluZygpLFxuICBlbWFpbDogUCh6JDEuc3RyaW5nKCkpLFxuICBmaXJzdF9uYW1lOiBQKHokMS5zdHJpbmcoKSksXG4gIGxhc3RfbmFtZTogUCh6JDEuc3RyaW5nKCkpLFxuICBwaG9uZV9udW1iZXI6IFAoeiQxLnN0cmluZygpKSxcbiAgYmlsbGluZ19lbWFpbDogUCh6JDEuc3RyaW5nKCkpLFxuICBhZGRyZXNzOiBQKHokMS5yZWNvcmQoeiQxLnN0cmluZygpLCB6JDEuYW55KCkpKVxufSk7XG56JDEub2JqZWN0KHtcbiAgbWVzc2FnZTogeiQxLnN0cmluZygpXG59KTtcbmNvbnN0IHBhID0geiQxLm9iamVjdCh7XG4gIGVycm9yX2NvZGU6IHokMS5zdHJpbmcoKVxufSk7XG56JDEub2JqZWN0KHtcbiAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IE9lLFxuICBwcm9jZXNzb3Jfc3BlY2lmaWNfbWV0YWRhdGE6IHokMS5yZWNvcmQoeiQxLmFueSgpKS5vcHRpb25hbCgpLFxuICBwYXltZW50X3JvdXRlX2lkOiBQKHokMS5zdHJpbmcoKSlcbn0pO1xuY29uc3QgbWEgPSB6JDEub2JqZWN0KHtcbiAgbmV4dF9hY3Rpb25fbWV0YWRhdGE6IFAoeiQxLnJlY29yZCh6JDEuYW55KCkpKVxufSk7XG56JDEub2JqZWN0KHtcbiAgZXZlbnRzOiB6JDEuYXJyYXkoXG4gICAgeiQxLm9iamVjdCh7XG4gICAgICBldmVudF9uYW1lOiB6JDEuc3RyaW5nKCksXG4gICAgICBkZXZpY2VfdG9rZW46IHokMS5zdHJpbmcoKSxcbiAgICAgIHByb3BlcnRpZXM6IHokMS5yZWNvcmQoeiQxLmFueSgpKS5vcHRpb25hbCgpLFxuICAgICAgY29udGV4dF9wcm9wZXJ0aWVzOiB6JDEucmVjb3JkKHokMS5hbnkoKSkub3B0aW9uYWwoKVxuICAgIH0pXG4gIClcbn0pO1xueiQxLmFueSgpLm9wdGlvbmFsKCk7XG56JDEub2JqZWN0KHtcbiAgZGV2aWNlX3Rva2VuOiB6JDEuc3RyaW5nKClcbn0pO1xuY29uc3QgX2EgPSB6JDEub2JqZWN0KHt9KSwgZmEgPSB6JDEub2JqZWN0KHtcbiAgX3VuaWZpZWRfY2NfYWN0aW9uX25hbWU6IHokMS5zdHJpbmcoKSxcbiAgX3VuaWZpZWRfY2NfcGNjc19pZDogeiQxLnN0cmluZygpXG59KS5jYXRjaGFsbCh6JDEuYW55KCkpLCB5YSA9IHokMS5vYmplY3Qoe1xuICB0eXBlOiB6JDEuc3RyaW5nKCksXG4gIGxvYzogeiQxLmFycmF5KHokMS5zdHJpbmcoKSksXG4gIG1zZzogeiQxLnN0cmluZygpLFxuICB1cmw6IHokMS5zdHJpbmcoKVxufSksIGhhID0geiQxLmFycmF5KHlhKSwgZ2EgPSB6JDEub2JqZWN0KHtcbiAgY29kZTogeiQxLnN0cmluZygpLFxuICBtZXNzYWdlOiB6JDEuc3RyaW5nKCksXG4gIHBhdGg6IHokMS5hcnJheSh6JDEuc3RyaW5nKCkpXG59KSwgd2EgPSB6JDEuYXJyYXkoZ2EpLCB2YSA9IHtcbiAgXCJmYWlsZWQgdG8gZmV0Y2hcIjogXCJDb25uZWN0aW9uIGVycm9yOiBwbGVhc2UgZG91YmxlIGNoZWNrIGlmIHlvdSBhcmUgY29ubmVjdGVkIHRvIHRoZSBpbnRlcm5ldCwgdGhlbiB0cnkgYWdhaW5cIlxufSwgVnQgPSAoZSkgPT4ge1xuICBjb25zdCB0ID0gZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgcmV0dXJuIHZhW3RdID8/IGU7XG59LCBiYSA9IChlKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHR5cGVvZiBKU09OLnBhcnNlKGUpID09IFwib2JqZWN0XCI7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufSwgUGEgPSAoZSkgPT4gZS5sZW5ndGggPT09IDEgPyBWdChlWzBdLm1zZykgOiBgUGxlYXNlIGZpeCB0aGUgZm9sbG93aW5nIGVycm9yczpcbiR7ZS5tYXAoKHIpID0+IGDigKIgJHtWdChyLm1zZyl9YCkuam9pbihgXG5gKX1gLCBFYSA9IChlKSA9PiBgRW5jb3VudGVyZWQgdGhlIGZvbGxvd2luZyBlcnJvcnM6XG4ke2UubWFwKChyKSA9PiBgLSAke3IucGF0aC5qb2luKFwiL1wiKX06ICR7ci5tZXNzYWdlfWApLmpvaW4oYFxuYCl9YCwgSyA9IChlKSA9PiB7XG4gIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpXG4gICAgaWYgKGJhKGUubWVzc2FnZSkpIHtcbiAgICAgIGNvbnN0IHQgPSBKU09OLnBhcnNlKGUubWVzc2FnZSk7XG4gICAgICByZXR1cm4gaGEuc2FmZVBhcnNlKHQpLnN1Y2Nlc3MgPyBQYSh0KSA6IHdhLnNhZmVQYXJzZSh0KS5zdWNjZXNzID8gRWEodCkgOiAoY29uc29sZS53YXJuKGBFbmNvdW50ZXJlZCB1bmtub3duIHN0cmluZ2lmaWVkIEpTT04gb2JqZWN0OlxuJHtlLm1lc3NhZ2V9YCksIGUubWVzc2FnZSk7XG4gICAgfSBlbHNlXG4gICAgICByZXR1cm4gVnQoZS5tZXNzYWdlKTtcbiAgaWYgKHR5cGVvZiBlID09IFwib2JqZWN0XCIpXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShlKTtcbiAgICB9IGNhdGNoICh0KSB7XG4gICAgICByZXR1cm4gdCArIFwiXCI7XG4gICAgfVxuICBlbHNlXG4gICAgcmV0dXJuIGUgKyBcIlwiO1xufSwgQ2EgPSAoZSwgdCwgcikgPT4gKCguLi5uKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHQoLi4ubik7XG4gIH0gY2F0Y2ggKG8pIHtcbiAgICByKGBbZm9ybV0gRXJyb3IgcnVubmluZyBjYWxsYmFjayAoJHtlfSk6YCwgbyk7XG4gICAgcmV0dXJuO1xuICB9XG59KSwgU2EgPSAoZSkgPT4gZS5yZWR1Y2UoKHQsIHIpID0+IHQgKyByLCAwKSwgcm4gPSAoZSkgPT4ge1xuICBlLnByZXZlbnREZWZhdWx0KCksIGUucmV0dXJuVmFsdWUgPSB0cnVlO1xufSwga2EgPSAoKSA9PiB7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIHJuKTtcbn0sIEFhID0gKCkgPT4ge1xuICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCBybik7XG59LCB6ID0gKGUpID0+IHtcbiAgbGV0IHQgPSBmYWxzZTtcbiAgcmV0dXJuIGFzeW5jIChyKSA9PiB7XG4gICAgaWYgKHQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIlNraXBwaW5nIHN1Ym1pc3Npb24gYmVjYXVzZSBpdCBpcyBhbHJlYWR5IGluIHByb2dyZXNzXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgci5jb250ZXh0LnByZXZlbnROYXZpZ2F0aW9uRHVyaW5nU3VibWlzc2lvbiAmJiBrYSgpLCByLmZvcm1DYWxsYmFja3MuZ2V0Lm9uQ2hlY2tvdXRTdGFydGVkPy4oKSwgZyhcImNoZWNrb3V0X3N0YXJ0ZWRcIiwge1xuICAgICAgICBjcG06IHIuY2hlY2tvdXRQYXltZW50TWV0aG9kXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG4gPSBhd2FpdCBlKHIpO1xuICAgICAgaWYgKGcoXCJjaGVja291dF9zdWNjZXNzXCIsIHtcbiAgICAgICAgY3BtOiByLmNoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICAgICAgLi4ublxuICAgICAgfSksIEFpKCksIG4ubW9kZSA9PT0gXCJzZXR1cFwiKVxuICAgICAgICByLmZvcm1DYWxsYmFja3MuZ2V0Lm9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2VzcyhuLnJlc3VsdC5wYXltZW50X21ldGhvZF9pZCk7XG4gICAgICBlbHNlIGlmIChuLm1vZGUgPT09IFwiY2hlY2tvdXRcIilcbiAgICAgICAgci5mb3JtQ2FsbGJhY2tzLmdldC5vbkNoZWNrb3V0U3VjY2VzcyhcbiAgICAgICAgICBuLnJlc3VsdC5pbnZvaWNlX3VybHMsXG4gICAgICAgICAgbi5yZXN1bHQuc3Vic2NyaXB0aW9uX2lkcyxcbiAgICAgICAgICBuLnJlc3VsdC5jdXN0b21lcl9pZCxcbiAgICAgICAgICBuLnJlc3VsdC5wcm9jZXNzb3JzX3VzZWQgPz8gW10sXG4gICAgICAgICAgbi5yZXN1bHQucGF5bWVudF9tZXRob2RfaWQgPz8gXCJcIlxuICAgICAgICApO1xuICAgICAgZWxzZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBtb2RlOiAke259YCk7XG4gICAgfSBjYXRjaCAobikge1xuICAgICAgdCA9IGZhbHNlO1xuICAgICAgY29uc3QgbyA9IEsobiksIGkgPSBhd2FpdCBFbihyLmNvbnRleHQuYW55Q2RlQ29ubmVjdGlvbiwgbyk7XG4gICAgICByLmZvcm1DYWxsYmFja3MuZ2V0Lm9uQ2hlY2tvdXRFcnJvcihvLCBpKSwgZyhcImNoZWNrb3V0X2Vycm9yXCIsIHsgY3BtOiByLmNoZWNrb3V0UGF5bWVudE1ldGhvZCwgZXJyb3JNZXNzYWdlOiBvLCBlcnJvckNvZGU6IGksIGVycm9yOiBuIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0ID0gZmFsc2UsIHIuY29udGV4dC5wcmV2ZW50TmF2aWdhdGlvbkR1cmluZ1N1Ym1pc3Npb24gJiYgQWEoKTtcbiAgICB9XG4gIH07XG59LCBtZSA9IChlKSA9PiBhc3luYyAodCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBlKHQpO1xuICB9IGNhdGNoIChyKSB7XG4gICAgY29uc3QgeyBlcnJfXzogbiB9ID0gSShcImluaXQtZXJyb3ItY2F0Y2hlclwiKSwgbyA9IEsociksIGkgPSBhd2FpdCBFbih0LmNvbnRleHQuYW55Q2RlQ29ubmVjdGlvbiwgbyk7XG4gICAgcmV0dXJuIG4oaSwgbywgciksIGcoXCJpbml0X2Zsb3dfZXJyb3JcIiwgeyBlcnJvck1lc3NhZ2U6IG8sIGVycm9yQ29kZTogaSwgZXJyb3I6IHIgfSksIHsgaXNBdmFpbGFibGU6IGZhbHNlLCByZWFzb246IG8sIGVycm9yQ29kZTogaSwgaXNMb2FkaW5nOiBmYWxzZSB9O1xuICB9XG59LCBJID0gKGUpID0+IHtcbiAgY29uc3QgdCA9ICguLi5uKSA9PiB7XG4gICAgd2luZG93LmNvbnNvbGUubG9nKGAke2NoYWxrLmdyZWVuLmJvbGQoXCJvanMvXCIpfSR7Y2hhbGsuYm9sZC5ncmF5KGAke2V9YCl9XHRgLCAuLi5uKTtcbiAgfSwgciA9ICguLi5uKSA9PiB7XG4gICAgd2luZG93LmNvbnNvbGUud2FybihgJHtjaGFsay5yZWQuYm9sZChcIm9qcy9cIil9JHtjaGFsay5ib2xkLmdyYXkoYCR7ZX1gKX1cdGAsIC4uLm4pO1xuICB9O1xuICByZXR1cm4ge1xuICAgIGxvZzogdCxcbiAgICBlcnI6IHIsXG4gICAgbG9nX186IHQsXG4gICAgZXJyX186IHJcbiAgfTtcbn07XG52YXIgcXQgPSBmdW5jdGlvbihlLCB0KSB7XG4gIHJldHVybiBxdCA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uKHIsIG4pIHtcbiAgICByLl9fcHJvdG9fXyA9IG47XG4gIH0gfHwgZnVuY3Rpb24ociwgbikge1xuICAgIGZvciAodmFyIG8gaW4gbikgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sIG8pICYmIChyW29dID0gbltvXSk7XG4gIH0sIHF0KGUsIHQpO1xufTtcbmZ1bmN0aW9uIHZlKGUsIHQpIHtcbiAgaWYgKHR5cGVvZiB0ICE9IFwiZnVuY3Rpb25cIiAmJiB0ICE9PSBudWxsKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKHQpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgcXQoZSwgdCk7XG4gIGZ1bmN0aW9uIHIoKSB7XG4gICAgdGhpcy5jb25zdHJ1Y3RvciA9IGU7XG4gIH1cbiAgZS5wcm90b3R5cGUgPSB0ID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZSh0KSA6IChyLnByb3RvdHlwZSA9IHQucHJvdG90eXBlLCBuZXcgcigpKTtcbn1cbmZ1bmN0aW9uIElhKGUsIHQsIHIsIG4pIHtcbiAgZnVuY3Rpb24gbyhpKSB7XG4gICAgcmV0dXJuIGkgaW5zdGFuY2VvZiByID8gaSA6IG5ldyByKGZ1bmN0aW9uKHMpIHtcbiAgICAgIHMoaSk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG5ldyAociB8fCAociA9IFByb21pc2UpKShmdW5jdGlvbihpLCBzKSB7XG4gICAgZnVuY3Rpb24gYyhkKSB7XG4gICAgICB0cnkge1xuICAgICAgICB1KG4ubmV4dChkKSk7XG4gICAgICB9IGNhdGNoIChmKSB7XG4gICAgICAgIHMoZik7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGwoZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdShuLnRocm93KGQpKTtcbiAgICAgIH0gY2F0Y2ggKGYpIHtcbiAgICAgICAgcyhmKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdShkKSB7XG4gICAgICBkLmRvbmUgPyBpKGQudmFsdWUpIDogbyhkLnZhbHVlKS50aGVuKGMsIGwpO1xuICAgIH1cbiAgICB1KChuID0gbi5hcHBseShlLCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufVxuZnVuY3Rpb24gbm4oZSwgdCkge1xuICB2YXIgciA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkge1xuICAgIGlmIChpWzBdICYgMSkgdGhyb3cgaVsxXTtcbiAgICByZXR1cm4gaVsxXTtcbiAgfSwgdHJ5czogW10sIG9wczogW10gfSwgbiwgbywgaSwgcyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PSBcImZ1bmN0aW9uXCIgPyBJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKTtcbiAgcmV0dXJuIHMubmV4dCA9IGMoMCksIHMudGhyb3cgPSBjKDEpLCBzLnJldHVybiA9IGMoMiksIHR5cGVvZiBTeW1ib2wgPT0gXCJmdW5jdGlvblwiICYmIChzW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSksIHM7XG4gIGZ1bmN0aW9uIGModSkge1xuICAgIHJldHVybiBmdW5jdGlvbihkKSB7XG4gICAgICByZXR1cm4gbChbdSwgZF0pO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gbCh1KSB7XG4gICAgaWYgKG4pIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgIGZvciAoOyBzICYmIChzID0gMCwgdVswXSAmJiAociA9IDApKSwgcjsgKSB0cnkge1xuICAgICAgaWYgKG4gPSAxLCBvICYmIChpID0gdVswXSAmIDIgPyBvLnJldHVybiA6IHVbMF0gPyBvLnRocm93IHx8ICgoaSA9IG8ucmV0dXJuKSAmJiBpLmNhbGwobyksIDApIDogby5uZXh0KSAmJiAhKGkgPSBpLmNhbGwobywgdVsxXSkpLmRvbmUpIHJldHVybiBpO1xuICAgICAgc3dpdGNoIChvID0gMCwgaSAmJiAodSA9IFt1WzBdICYgMiwgaS52YWx1ZV0pLCB1WzBdKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGkgPSB1O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgcmV0dXJuIHIubGFiZWwrKywgeyB2YWx1ZTogdVsxXSwgZG9uZTogITEgfTtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIHIubGFiZWwrKywgbyA9IHVbMV0sIHUgPSBbMF07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICB1ID0gci5vcHMucG9wKCksIHIudHJ5cy5wb3AoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoaSA9IHIudHJ5cywgIShpID0gaS5sZW5ndGggPiAwICYmIGlbaS5sZW5ndGggLSAxXSkgJiYgKHVbMF0gPT09IDYgfHwgdVswXSA9PT0gMikpIHtcbiAgICAgICAgICAgIHIgPSAwO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1WzBdID09PSAzICYmICghaSB8fCB1WzFdID4gaVswXSAmJiB1WzFdIDwgaVszXSkpIHtcbiAgICAgICAgICAgIHIubGFiZWwgPSB1WzFdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1WzBdID09PSA2ICYmIHIubGFiZWwgPCBpWzFdKSB7XG4gICAgICAgICAgICByLmxhYmVsID0gaVsxXSwgaSA9IHU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGkgJiYgci5sYWJlbCA8IGlbMl0pIHtcbiAgICAgICAgICAgIHIubGFiZWwgPSBpWzJdLCByLm9wcy5wdXNoKHUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlbMl0gJiYgci5vcHMucG9wKCksIHIudHJ5cy5wb3AoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHUgPSB0LmNhbGwoZSwgcik7XG4gICAgfSBjYXRjaCAoZCkge1xuICAgICAgdSA9IFs2LCBkXSwgbyA9IDA7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIG4gPSBpID0gMDtcbiAgICB9XG4gICAgaWYgKHVbMF0gJiA1KSB0aHJvdyB1WzFdO1xuICAgIHJldHVybiB7IHZhbHVlOiB1WzBdID8gdVsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICB9XG59XG5mdW5jdGlvbiBMZShlKSB7XG4gIHZhciB0ID0gdHlwZW9mIFN5bWJvbCA9PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCByID0gdCAmJiBlW3RdLCBuID0gMDtcbiAgaWYgKHIpIHJldHVybiByLmNhbGwoZSk7XG4gIGlmIChlICYmIHR5cGVvZiBlLmxlbmd0aCA9PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgIG5leHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGUgJiYgbiA+PSBlLmxlbmd0aCAmJiAoZSA9IHZvaWQgMCksIHsgdmFsdWU6IGUgJiYgZVtuKytdLCBkb25lOiAhZSB9O1xuICAgIH1cbiAgfTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcih0ID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufVxuZnVuY3Rpb24geXQoZSwgdCkge1xuICB2YXIgciA9IHR5cGVvZiBTeW1ib2wgPT0gXCJmdW5jdGlvblwiICYmIGVbU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFyKSByZXR1cm4gZTtcbiAgdmFyIG4gPSByLmNhbGwoZSksIG8sIGkgPSBbXSwgcztcbiAgdHJ5IHtcbiAgICBmb3IgKDsgKHQgPT09IHZvaWQgMCB8fCB0LS0gPiAwKSAmJiAhKG8gPSBuLm5leHQoKSkuZG9uZTsgKSBpLnB1c2goby52YWx1ZSk7XG4gIH0gY2F0Y2ggKGMpIHtcbiAgICBzID0geyBlcnJvcjogYyB9O1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBvICYmICFvLmRvbmUgJiYgKHIgPSBuLnJldHVybikgJiYgci5jYWxsKG4pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAocykgdGhyb3cgcy5lcnJvcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGk7XG59XG5mdW5jdGlvbiBodChlLCB0LCByKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBuID0gMCwgbyA9IHQubGVuZ3RoLCBpOyBuIDwgbzsgbisrKVxuICAgIChpIHx8ICEobiBpbiB0KSkgJiYgKGkgfHwgKGkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0LCAwLCBuKSksIGlbbl0gPSB0W25dKTtcbiAgcmV0dXJuIGUuY29uY2F0KGkgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCkpO1xufVxuZnVuY3Rpb24gUmUoZSkge1xuICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIFJlID8gKHRoaXMudiA9IGUsIHRoaXMpIDogbmV3IFJlKGUpO1xufVxuZnVuY3Rpb24gUmEoZSwgdCwgcikge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgbiA9IHIuYXBwbHkoZSwgdCB8fCBbXSksIG8sIGkgPSBbXTtcbiAgcmV0dXJuIG8gPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgQXN5bmNJdGVyYXRvciA9PSBcImZ1bmN0aW9uXCIgPyBBc3luY0l0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpLCBjKFwibmV4dFwiKSwgYyhcInRocm93XCIpLCBjKFwicmV0dXJuXCIsIHMpLCBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LCBvO1xuICBmdW5jdGlvbiBzKG0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oeSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh5KS50aGVuKG0sIGYpO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gYyhtLCB5KSB7XG4gICAgblttXSAmJiAob1ttXSA9IGZ1bmN0aW9uKGgpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih3LCBFKSB7XG4gICAgICAgIGkucHVzaChbbSwgaCwgdywgRV0pID4gMSB8fCBsKG0sIGgpO1xuICAgICAgfSk7XG4gICAgfSwgeSAmJiAob1ttXSA9IHkob1ttXSkpKTtcbiAgfVxuICBmdW5jdGlvbiBsKG0sIHkpIHtcbiAgICB0cnkge1xuICAgICAgdShuW21dKHkpKTtcbiAgICB9IGNhdGNoIChoKSB7XG4gICAgICBfKGlbMF1bM10sIGgpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB1KG0pIHtcbiAgICBtLnZhbHVlIGluc3RhbmNlb2YgUmUgPyBQcm9taXNlLnJlc29sdmUobS52YWx1ZS52KS50aGVuKGQsIGYpIDogXyhpWzBdWzJdLCBtKTtcbiAgfVxuICBmdW5jdGlvbiBkKG0pIHtcbiAgICBsKFwibmV4dFwiLCBtKTtcbiAgfVxuICBmdW5jdGlvbiBmKG0pIHtcbiAgICBsKFwidGhyb3dcIiwgbSk7XG4gIH1cbiAgZnVuY3Rpb24gXyhtLCB5KSB7XG4gICAgbSh5KSwgaS5zaGlmdCgpLCBpLmxlbmd0aCAmJiBsKGlbMF1bMF0sIGlbMF1bMV0pO1xuICB9XG59XG5mdW5jdGlvbiBUYShlKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciB0ID0gZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIHI7XG4gIHJldHVybiB0ID8gdC5jYWxsKGUpIDogKGUgPSB0eXBlb2YgTGUgPT0gXCJmdW5jdGlvblwiID8gTGUoZSkgOiBlW1N5bWJvbC5pdGVyYXRvcl0oKSwgciA9IHt9LCBuKFwibmV4dFwiKSwgbihcInRocm93XCIpLCBuKFwicmV0dXJuXCIpLCByW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LCByKTtcbiAgZnVuY3Rpb24gbihpKSB7XG4gICAgcltpXSA9IGVbaV0gJiYgZnVuY3Rpb24ocykge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGMsIGwpIHtcbiAgICAgICAgcyA9IGVbaV0ocyksIG8oYywgbCwgcy5kb25lLCBzLnZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gbyhpLCBzLCBjLCBsKSB7XG4gICAgUHJvbWlzZS5yZXNvbHZlKGwpLnRoZW4oZnVuY3Rpb24odSkge1xuICAgICAgaSh7IHZhbHVlOiB1LCBkb25lOiBjIH0pO1xuICAgIH0sIHMpO1xuICB9XG59XG5mdW5jdGlvbiBHKGUpIHtcbiAgcmV0dXJuIHR5cGVvZiBlID09IFwiZnVuY3Rpb25cIjtcbn1cbmZ1bmN0aW9uIFN0KGUpIHtcbiAgdmFyIHQgPSBmdW5jdGlvbihuKSB7XG4gICAgRXJyb3IuY2FsbChuKSwgbi5zdGFjayA9IG5ldyBFcnJvcigpLnN0YWNrO1xuICB9LCByID0gZSh0KTtcbiAgcmV0dXJuIHIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpLCByLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHIsIHI7XG59XG52YXIgeHQgPSBTdChmdW5jdGlvbihlKSB7XG4gIHJldHVybiBmdW5jdGlvbihyKSB7XG4gICAgZSh0aGlzKSwgdGhpcy5tZXNzYWdlID0gciA/IHIubGVuZ3RoICsgYCBlcnJvcnMgb2NjdXJyZWQgZHVyaW5nIHVuc3Vic2NyaXB0aW9uOlxuYCArIHIubWFwKGZ1bmN0aW9uKG4sIG8pIHtcbiAgICAgIHJldHVybiBvICsgMSArIFwiKSBcIiArIG4udG9TdHJpbmcoKTtcbiAgICB9KS5qb2luKGBcbiAgYCkgOiBcIlwiLCB0aGlzLm5hbWUgPSBcIlVuc3Vic2NyaXB0aW9uRXJyb3JcIiwgdGhpcy5lcnJvcnMgPSByO1xuICB9O1xufSk7XG5mdW5jdGlvbiBndChlLCB0KSB7XG4gIGlmIChlKSB7XG4gICAgdmFyIHIgPSBlLmluZGV4T2YodCk7XG4gICAgMCA8PSByICYmIGUuc3BsaWNlKHIsIDEpO1xuICB9XG59XG52YXIgcnQgPSAoZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIGUodCkge1xuICAgIHRoaXMuaW5pdGlhbFRlYXJkb3duID0gdCwgdGhpcy5jbG9zZWQgPSBmYWxzZSwgdGhpcy5fcGFyZW50YWdlID0gbnVsbCwgdGhpcy5fZmluYWxpemVycyA9IG51bGw7XG4gIH1cbiAgcmV0dXJuIGUucHJvdG90eXBlLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHQsIHIsIG4sIG8sIGk7XG4gICAgaWYgKCF0aGlzLmNsb3NlZCkge1xuICAgICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuICAgICAgdmFyIHMgPSB0aGlzLl9wYXJlbnRhZ2U7XG4gICAgICBpZiAocylcbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudGFnZSA9IG51bGwsIEFycmF5LmlzQXJyYXkocykpXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIGMgPSBMZShzKSwgbCA9IGMubmV4dCgpOyAhbC5kb25lOyBsID0gYy5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgdmFyIHUgPSBsLnZhbHVlO1xuICAgICAgICAgICAgICB1LnJlbW92ZSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChoKSB7XG4gICAgICAgICAgICB0ID0geyBlcnJvcjogaCB9O1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBsICYmICFsLmRvbmUgJiYgKHIgPSBjLnJldHVybikgJiYgci5jYWxsKGMpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgaWYgKHQpIHRocm93IHQuZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgcy5yZW1vdmUodGhpcyk7XG4gICAgICB2YXIgZCA9IHRoaXMuaW5pdGlhbFRlYXJkb3duO1xuICAgICAgaWYgKEcoZCkpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZCgpO1xuICAgICAgICB9IGNhdGNoIChoKSB7XG4gICAgICAgICAgaSA9IGggaW5zdGFuY2VvZiB4dCA/IGguZXJyb3JzIDogW2hdO1xuICAgICAgICB9XG4gICAgICB2YXIgZiA9IHRoaXMuX2ZpbmFsaXplcnM7XG4gICAgICBpZiAoZikge1xuICAgICAgICB0aGlzLl9maW5hbGl6ZXJzID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBfID0gTGUoZiksIG0gPSBfLm5leHQoKTsgIW0uZG9uZTsgbSA9IF8ubmV4dCgpKSB7XG4gICAgICAgICAgICB2YXIgeSA9IG0udmFsdWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBmcih5KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGgpIHtcbiAgICAgICAgICAgICAgaSA9IGkgPz8gW10sIGggaW5zdGFuY2VvZiB4dCA/IGkgPSBodChodChbXSwgeXQoaSkpLCB5dChoLmVycm9ycykpIDogaS5wdXNoKGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoaCkge1xuICAgICAgICAgIG4gPSB7IGVycm9yOiBoIH07XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG0gJiYgIW0uZG9uZSAmJiAobyA9IF8ucmV0dXJuKSAmJiBvLmNhbGwoXyk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChuKSB0aHJvdyBuLmVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGkpXG4gICAgICAgIHRocm93IG5ldyB4dChpKTtcbiAgICB9XG4gIH0sIGUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgcjtcbiAgICBpZiAodCAmJiB0ICE9PSB0aGlzKVxuICAgICAgaWYgKHRoaXMuY2xvc2VkKVxuICAgICAgICBmcih0KTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAodCBpbnN0YW5jZW9mIGUpIHtcbiAgICAgICAgICBpZiAodC5jbG9zZWQgfHwgdC5faGFzUGFyZW50KHRoaXMpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIHQuX2FkZFBhcmVudCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICAodGhpcy5fZmluYWxpemVycyA9IChyID0gdGhpcy5fZmluYWxpemVycykgIT09IG51bGwgJiYgciAhPT0gdm9pZCAwID8gciA6IFtdKS5wdXNoKHQpO1xuICAgICAgfVxuICB9LCBlLnByb3RvdHlwZS5faGFzUGFyZW50ID0gZnVuY3Rpb24odCkge1xuICAgIHZhciByID0gdGhpcy5fcGFyZW50YWdlO1xuICAgIHJldHVybiByID09PSB0IHx8IEFycmF5LmlzQXJyYXkocikgJiYgci5pbmNsdWRlcyh0KTtcbiAgfSwgZS5wcm90b3R5cGUuX2FkZFBhcmVudCA9IGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgciA9IHRoaXMuX3BhcmVudGFnZTtcbiAgICB0aGlzLl9wYXJlbnRhZ2UgPSBBcnJheS5pc0FycmF5KHIpID8gKHIucHVzaCh0KSwgcikgOiByID8gW3IsIHRdIDogdDtcbiAgfSwgZS5wcm90b3R5cGUuX3JlbW92ZVBhcmVudCA9IGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgciA9IHRoaXMuX3BhcmVudGFnZTtcbiAgICByID09PSB0ID8gdGhpcy5fcGFyZW50YWdlID0gbnVsbCA6IEFycmF5LmlzQXJyYXkocikgJiYgZ3QociwgdCk7XG4gIH0sIGUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgciA9IHRoaXMuX2ZpbmFsaXplcnM7XG4gICAgciAmJiBndChyLCB0KSwgdCBpbnN0YW5jZW9mIGUgJiYgdC5fcmVtb3ZlUGFyZW50KHRoaXMpO1xuICB9LCBlLkVNUFRZID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciB0ID0gbmV3IGUoKTtcbiAgICByZXR1cm4gdC5jbG9zZWQgPSB0cnVlLCB0O1xuICB9KSgpLCBlO1xufSkoKSwgb24gPSBydC5FTVBUWTtcbmZ1bmN0aW9uIGFuKGUpIHtcbiAgcmV0dXJuIGUgaW5zdGFuY2VvZiBydCB8fCBlICYmIFwiY2xvc2VkXCIgaW4gZSAmJiBHKGUucmVtb3ZlKSAmJiBHKGUuYWRkKSAmJiBHKGUudW5zdWJzY3JpYmUpO1xufVxuZnVuY3Rpb24gZnIoZSkge1xuICBHKGUpID8gZSgpIDogZS51bnN1YnNjcmliZSgpO1xufVxudmFyIE5hID0ge1xuICBQcm9taXNlOiB2b2lkIDBcbn0sIEZhID0ge1xuICBzZXRUaW1lb3V0OiBmdW5jdGlvbihlLCB0KSB7XG4gICAgZm9yICh2YXIgciA9IFtdLCBuID0gMjsgbiA8IGFyZ3VtZW50cy5sZW5ndGg7IG4rKylcbiAgICAgIHJbbiAtIDJdID0gYXJndW1lbnRzW25dO1xuICAgIHJldHVybiBzZXRUaW1lb3V0LmFwcGx5KHZvaWQgMCwgaHQoW2UsIHRdLCB5dChyKSkpO1xuICB9LFxuICBjbGVhclRpbWVvdXQ6IGZ1bmN0aW9uKGUpIHtcbiAgICByZXR1cm4gY2xlYXJUaW1lb3V0KGUpO1xuICB9LFxuICBkZWxlZ2F0ZTogdm9pZCAwXG59O1xuZnVuY3Rpb24gc24oZSkge1xuICBGYS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgIHRocm93IGU7XG4gIH0pO1xufVxuZnVuY3Rpb24geXIoKSB7XG59XG5mdW5jdGlvbiBwdChlKSB7XG4gIGUoKTtcbn1cbnZhciBKdCA9IChmdW5jdGlvbihlKSB7XG4gIHZlKHQsIGUpO1xuICBmdW5jdGlvbiB0KHIpIHtcbiAgICB2YXIgbiA9IGUuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgIHJldHVybiBuLmlzU3RvcHBlZCA9IGZhbHNlLCByID8gKG4uZGVzdGluYXRpb24gPSByLCBhbihyKSAmJiByLmFkZChuKSkgOiBuLmRlc3RpbmF0aW9uID0geGEsIG47XG4gIH1cbiAgcmV0dXJuIHQuY3JlYXRlID0gZnVuY3Rpb24ociwgbiwgbykge1xuICAgIHJldHVybiBuZXcgenQociwgbiwgbyk7XG4gIH0sIHQucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbihyKSB7XG4gICAgdGhpcy5pc1N0b3BwZWQgfHwgdGhpcy5fbmV4dChyKTtcbiAgfSwgdC5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbihyKSB7XG4gICAgdGhpcy5pc1N0b3BwZWQgfHwgKHRoaXMuaXNTdG9wcGVkID0gdHJ1ZSwgdGhpcy5fZXJyb3IocikpO1xuICB9LCB0LnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaXNTdG9wcGVkIHx8ICh0aGlzLmlzU3RvcHBlZCA9IHRydWUsIHRoaXMuX2NvbXBsZXRlKCkpO1xuICB9LCB0LnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuY2xvc2VkIHx8ICh0aGlzLmlzU3RvcHBlZCA9IHRydWUsIGUucHJvdG90eXBlLnVuc3Vic2NyaWJlLmNhbGwodGhpcyksIHRoaXMuZGVzdGluYXRpb24gPSBudWxsKTtcbiAgfSwgdC5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbihyKSB7XG4gICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHIpO1xuICB9LCB0LnByb3RvdHlwZS5fZXJyb3IgPSBmdW5jdGlvbihyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3Iocik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH0sIHQucHJvdG90eXBlLl9jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH0sIHQ7XG59KShydCksIExhID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBlKHQpIHtcbiAgICB0aGlzLnBhcnRpYWxPYnNlcnZlciA9IHQ7XG4gIH1cbiAgcmV0dXJuIGUucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih0KSB7XG4gICAgdmFyIHIgPSB0aGlzLnBhcnRpYWxPYnNlcnZlcjtcbiAgICBpZiAoci5uZXh0KVxuICAgICAgdHJ5IHtcbiAgICAgICAgci5uZXh0KHQpO1xuICAgICAgfSBjYXRjaCAobikge1xuICAgICAgICBzdChuKTtcbiAgICAgIH1cbiAgfSwgZS5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbih0KSB7XG4gICAgdmFyIHIgPSB0aGlzLnBhcnRpYWxPYnNlcnZlcjtcbiAgICBpZiAoci5lcnJvcilcbiAgICAgIHRyeSB7XG4gICAgICAgIHIuZXJyb3IodCk7XG4gICAgICB9IGNhdGNoIChuKSB7XG4gICAgICAgIHN0KG4pO1xuICAgICAgfVxuICAgIGVsc2VcbiAgICAgIHN0KHQpO1xuICB9LCBlLnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0ID0gdGhpcy5wYXJ0aWFsT2JzZXJ2ZXI7XG4gICAgaWYgKHQuY29tcGxldGUpXG4gICAgICB0cnkge1xuICAgICAgICB0LmNvbXBsZXRlKCk7XG4gICAgICB9IGNhdGNoIChyKSB7XG4gICAgICAgIHN0KHIpO1xuICAgICAgfVxuICB9LCBlO1xufSkoKSwgenQgPSAoZnVuY3Rpb24oZSkge1xuICB2ZSh0LCBlKTtcbiAgZnVuY3Rpb24gdChyLCBuLCBvKSB7XG4gICAgdmFyIGkgPSBlLmNhbGwodGhpcykgfHwgdGhpcywgcztcbiAgICByZXR1cm4gRyhyKSB8fCAhciA/IHMgPSB7XG4gICAgICBuZXh0OiByID8/IHZvaWQgMCxcbiAgICAgIGVycm9yOiBuID8/IHZvaWQgMCxcbiAgICAgIGNvbXBsZXRlOiBvID8/IHZvaWQgMFxuICAgIH0gOiBzID0gciwgaS5kZXN0aW5hdGlvbiA9IG5ldyBMYShzKSwgaTtcbiAgfVxuICByZXR1cm4gdDtcbn0pKEp0KTtcbmZ1bmN0aW9uIHN0KGUpIHtcbiAgc24oZSk7XG59XG5mdW5jdGlvbiBNYShlKSB7XG4gIHRocm93IGU7XG59XG52YXIgeGEgPSB7XG4gIGNsb3NlZDogdHJ1ZSxcbiAgbmV4dDogeXIsXG4gIGVycm9yOiBNYSxcbiAgY29tcGxldGU6IHlyXG59LCBadCA9IChmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHR5cGVvZiBTeW1ib2wgPT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5vYnNlcnZhYmxlIHx8IFwiQEBvYnNlcnZhYmxlXCI7XG59KSgpO1xuZnVuY3Rpb24gRGEoZSkge1xuICByZXR1cm4gZTtcbn1cbmZ1bmN0aW9uIE9hKGUpIHtcbiAgcmV0dXJuIGUubGVuZ3RoID09PSAwID8gRGEgOiBlLmxlbmd0aCA9PT0gMSA/IGVbMF0gOiBmdW5jdGlvbihyKSB7XG4gICAgcmV0dXJuIGUucmVkdWNlKGZ1bmN0aW9uKG4sIG8pIHtcbiAgICAgIHJldHVybiBvKG4pO1xuICAgIH0sIHIpO1xuICB9O1xufVxudmFyIHBlID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBlKHQpIHtcbiAgICB0ICYmICh0aGlzLl9zdWJzY3JpYmUgPSB0KTtcbiAgfVxuICByZXR1cm4gZS5wcm90b3R5cGUubGlmdCA9IGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgciA9IG5ldyBlKCk7XG4gICAgcmV0dXJuIHIuc291cmNlID0gdGhpcywgci5vcGVyYXRvciA9IHQsIHI7XG4gIH0sIGUucHJvdG90eXBlLnN1YnNjcmliZSA9IGZ1bmN0aW9uKHQsIHIsIG4pIHtcbiAgICB2YXIgbyA9IHRoaXMsIGkgPSBqYSh0KSA/IHQgOiBuZXcgenQodCwgciwgbik7XG4gICAgcmV0dXJuIHB0KGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHMgPSBvLCBjID0gcy5vcGVyYXRvciwgbCA9IHMuc291cmNlO1xuICAgICAgaS5hZGQoYyA/IGMuY2FsbChpLCBsKSA6IGwgPyBvLl9zdWJzY3JpYmUoaSkgOiBvLl90cnlTdWJzY3JpYmUoaSkpO1xuICAgIH0pLCBpO1xuICB9LCBlLnByb3RvdHlwZS5fdHJ5U3Vic2NyaWJlID0gZnVuY3Rpb24odCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3Vic2NyaWJlKHQpO1xuICAgIH0gY2F0Y2ggKHIpIHtcbiAgICAgIHQuZXJyb3Iocik7XG4gICAgfVxuICB9LCBlLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24odCwgcikge1xuICAgIHZhciBuID0gdGhpcztcbiAgICByZXR1cm4gciA9IGhyKHIpLCBuZXcgcihmdW5jdGlvbihvLCBpKSB7XG4gICAgICB2YXIgcyA9IG5ldyB6dCh7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uKGMpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdChjKTtcbiAgICAgICAgICB9IGNhdGNoIChsKSB7XG4gICAgICAgICAgICBpKGwpLCBzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogaSxcbiAgICAgICAgY29tcGxldGU6IG9cbiAgICAgIH0pO1xuICAgICAgbi5zdWJzY3JpYmUocyk7XG4gICAgfSk7XG4gIH0sIGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbih0KSB7XG4gICAgdmFyIHI7XG4gICAgcmV0dXJuIChyID0gdGhpcy5zb3VyY2UpID09PSBudWxsIHx8IHIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHIuc3Vic2NyaWJlKHQpO1xuICB9LCBlLnByb3RvdHlwZVtadF0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSwgZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uKCkge1xuICAgIGZvciAodmFyIHQgPSBbXSwgciA9IDA7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspXG4gICAgICB0W3JdID0gYXJndW1lbnRzW3JdO1xuICAgIHJldHVybiBPYSh0KSh0aGlzKTtcbiAgfSwgZS5wcm90b3R5cGUudG9Qcm9taXNlID0gZnVuY3Rpb24odCkge1xuICAgIHZhciByID0gdGhpcztcbiAgICByZXR1cm4gdCA9IGhyKHQpLCBuZXcgdChmdW5jdGlvbihuLCBvKSB7XG4gICAgICB2YXIgaTtcbiAgICAgIHIuc3Vic2NyaWJlKGZ1bmN0aW9uKHMpIHtcbiAgICAgICAgcmV0dXJuIGkgPSBzO1xuICAgICAgfSwgZnVuY3Rpb24ocykge1xuICAgICAgICByZXR1cm4gbyhzKTtcbiAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbihpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LCBlLmNyZWF0ZSA9IGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gbmV3IGUodCk7XG4gIH0sIGU7XG59KSgpO1xuZnVuY3Rpb24gaHIoZSkge1xuICB2YXIgdDtcbiAgcmV0dXJuICh0ID0gZSA/PyBOYS5Qcm9taXNlKSAhPT0gbnVsbCAmJiB0ICE9PSB2b2lkIDAgPyB0IDogUHJvbWlzZTtcbn1cbmZ1bmN0aW9uIFVhKGUpIHtcbiAgcmV0dXJuIGUgJiYgRyhlLm5leHQpICYmIEcoZS5lcnJvcikgJiYgRyhlLmNvbXBsZXRlKTtcbn1cbmZ1bmN0aW9uIGphKGUpIHtcbiAgcmV0dXJuIGUgJiYgZSBpbnN0YW5jZW9mIEp0IHx8IFVhKGUpICYmIGFuKGUpO1xufVxuZnVuY3Rpb24gJGEoZSkge1xuICByZXR1cm4gRyhlPy5saWZ0KTtcbn1cbmZ1bmN0aW9uIEdhKGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICBpZiAoJGEodCkpXG4gICAgICByZXR1cm4gdC5saWZ0KGZ1bmN0aW9uKHIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gZShyLCB0aGlzKTtcbiAgICAgICAgfSBjYXRjaCAobikge1xuICAgICAgICAgIHRoaXMuZXJyb3Iobik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJVbmFibGUgdG8gbGlmdCB1bmtub3duIE9ic2VydmFibGUgdHlwZVwiKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIFZhKGUsIHQsIHIsIG4sIG8pIHtcbiAgcmV0dXJuIG5ldyBxYShlLCB0LCByLCBuLCBvKTtcbn1cbnZhciBxYSA9IChmdW5jdGlvbihlKSB7XG4gIHZlKHQsIGUpO1xuICBmdW5jdGlvbiB0KHIsIG4sIG8sIGksIHMsIGMpIHtcbiAgICB2YXIgbCA9IGUuY2FsbCh0aGlzLCByKSB8fCB0aGlzO1xuICAgIHJldHVybiBsLm9uRmluYWxpemUgPSBzLCBsLnNob3VsZFVuc3Vic2NyaWJlID0gYywgbC5fbmV4dCA9IG4gPyBmdW5jdGlvbih1KSB7XG4gICAgICB0cnkge1xuICAgICAgICBuKHUpO1xuICAgICAgfSBjYXRjaCAoZCkge1xuICAgICAgICByLmVycm9yKGQpO1xuICAgICAgfVxuICAgIH0gOiBlLnByb3RvdHlwZS5fbmV4dCwgbC5fZXJyb3IgPSBpID8gZnVuY3Rpb24odSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaSh1KTtcbiAgICAgIH0gY2F0Y2ggKGQpIHtcbiAgICAgICAgci5lcnJvcihkKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICB9IDogZS5wcm90b3R5cGUuX2Vycm9yLCBsLl9jb21wbGV0ZSA9IG8gPyBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG8oKTtcbiAgICAgIH0gY2F0Y2ggKHUpIHtcbiAgICAgICAgci5lcnJvcih1KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICB9IDogZS5wcm90b3R5cGUuX2NvbXBsZXRlLCBsO1xuICB9XG4gIHJldHVybiB0LnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciByO1xuICAgIGlmICghdGhpcy5zaG91bGRVbnN1YnNjcmliZSB8fCB0aGlzLnNob3VsZFVuc3Vic2NyaWJlKCkpIHtcbiAgICAgIHZhciBuID0gdGhpcy5jbG9zZWQ7XG4gICAgICBlLnByb3RvdHlwZS51bnN1YnNjcmliZS5jYWxsKHRoaXMpLCAhbiAmJiAoKHIgPSB0aGlzLm9uRmluYWxpemUpID09PSBudWxsIHx8IHIgPT09IHZvaWQgMCB8fCByLmNhbGwodGhpcykpO1xuICAgIH1cbiAgfSwgdDtcbn0pKEp0KSwgemEgPSBTdChmdW5jdGlvbihlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBlKHRoaXMpLCB0aGlzLm5hbWUgPSBcIk9iamVjdFVuc3Vic2NyaWJlZEVycm9yXCIsIHRoaXMubWVzc2FnZSA9IFwib2JqZWN0IHVuc3Vic2NyaWJlZFwiO1xuICB9O1xufSksIGNuID0gKGZ1bmN0aW9uKGUpIHtcbiAgdmUodCwgZSk7XG4gIGZ1bmN0aW9uIHQoKSB7XG4gICAgdmFyIHIgPSBlLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICByZXR1cm4gci5jbG9zZWQgPSBmYWxzZSwgci5jdXJyZW50T2JzZXJ2ZXJzID0gbnVsbCwgci5vYnNlcnZlcnMgPSBbXSwgci5pc1N0b3BwZWQgPSBmYWxzZSwgci5oYXNFcnJvciA9IGZhbHNlLCByLnRocm93bkVycm9yID0gbnVsbCwgcjtcbiAgfVxuICByZXR1cm4gdC5wcm90b3R5cGUubGlmdCA9IGZ1bmN0aW9uKHIpIHtcbiAgICB2YXIgbiA9IG5ldyBncih0aGlzLCB0aGlzKTtcbiAgICByZXR1cm4gbi5vcGVyYXRvciA9IHIsIG47XG4gIH0sIHQucHJvdG90eXBlLl90aHJvd0lmQ2xvc2VkID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuY2xvc2VkKVxuICAgICAgdGhyb3cgbmV3IHphKCk7XG4gIH0sIHQucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbihyKSB7XG4gICAgdmFyIG4gPSB0aGlzO1xuICAgIHB0KGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG8sIGk7XG4gICAgICBpZiAobi5fdGhyb3dJZkNsb3NlZCgpLCAhbi5pc1N0b3BwZWQpIHtcbiAgICAgICAgbi5jdXJyZW50T2JzZXJ2ZXJzIHx8IChuLmN1cnJlbnRPYnNlcnZlcnMgPSBBcnJheS5mcm9tKG4ub2JzZXJ2ZXJzKSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yICh2YXIgcyA9IExlKG4uY3VycmVudE9ic2VydmVycyksIGMgPSBzLm5leHQoKTsgIWMuZG9uZTsgYyA9IHMubmV4dCgpKSB7XG4gICAgICAgICAgICB2YXIgbCA9IGMudmFsdWU7XG4gICAgICAgICAgICBsLm5leHQocik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoICh1KSB7XG4gICAgICAgICAgbyA9IHsgZXJyb3I6IHUgfTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYyAmJiAhYy5kb25lICYmIChpID0gcy5yZXR1cm4pICYmIGkuY2FsbChzKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKG8pIHRocm93IG8uZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0sIHQucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24ocikge1xuICAgIHZhciBuID0gdGhpcztcbiAgICBwdChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChuLl90aHJvd0lmQ2xvc2VkKCksICFuLmlzU3RvcHBlZCkge1xuICAgICAgICBuLmhhc0Vycm9yID0gbi5pc1N0b3BwZWQgPSB0cnVlLCBuLnRocm93bkVycm9yID0gcjtcbiAgICAgICAgZm9yICh2YXIgbyA9IG4ub2JzZXJ2ZXJzOyBvLmxlbmd0aDsgKVxuICAgICAgICAgIG8uc2hpZnQoKS5lcnJvcihyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSwgdC5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgciA9IHRoaXM7XG4gICAgcHQoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoci5fdGhyb3dJZkNsb3NlZCgpLCAhci5pc1N0b3BwZWQpIHtcbiAgICAgICAgci5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICBmb3IgKHZhciBuID0gci5vYnNlcnZlcnM7IG4ubGVuZ3RoOyApXG4gICAgICAgICAgbi5zaGlmdCgpLmNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sIHQucHJvdG90eXBlLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5pc1N0b3BwZWQgPSB0aGlzLmNsb3NlZCA9IHRydWUsIHRoaXMub2JzZXJ2ZXJzID0gdGhpcy5jdXJyZW50T2JzZXJ2ZXJzID0gbnVsbDtcbiAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCBcIm9ic2VydmVkXCIsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHI7XG4gICAgICByZXR1cm4gKChyID0gdGhpcy5vYnNlcnZlcnMpID09PSBudWxsIHx8IHIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHIubGVuZ3RoKSA+IDA7XG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSksIHQucHJvdG90eXBlLl90cnlTdWJzY3JpYmUgPSBmdW5jdGlvbihyKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Rocm93SWZDbG9zZWQoKSwgZS5wcm90b3R5cGUuX3RyeVN1YnNjcmliZS5jYWxsKHRoaXMsIHIpO1xuICB9LCB0LnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24ocikge1xuICAgIHJldHVybiB0aGlzLl90aHJvd0lmQ2xvc2VkKCksIHRoaXMuX2NoZWNrRmluYWxpemVkU3RhdHVzZXMociksIHRoaXMuX2lubmVyU3Vic2NyaWJlKHIpO1xuICB9LCB0LnByb3RvdHlwZS5faW5uZXJTdWJzY3JpYmUgPSBmdW5jdGlvbihyKSB7XG4gICAgdmFyIG4gPSB0aGlzLCBvID0gdGhpcywgaSA9IG8uaGFzRXJyb3IsIHMgPSBvLmlzU3RvcHBlZCwgYyA9IG8ub2JzZXJ2ZXJzO1xuICAgIHJldHVybiBpIHx8IHMgPyBvbiA6ICh0aGlzLmN1cnJlbnRPYnNlcnZlcnMgPSBudWxsLCBjLnB1c2gociksIG5ldyBydChmdW5jdGlvbigpIHtcbiAgICAgIG4uY3VycmVudE9ic2VydmVycyA9IG51bGwsIGd0KGMsIHIpO1xuICAgIH0pKTtcbiAgfSwgdC5wcm90b3R5cGUuX2NoZWNrRmluYWxpemVkU3RhdHVzZXMgPSBmdW5jdGlvbihyKSB7XG4gICAgdmFyIG4gPSB0aGlzLCBvID0gbi5oYXNFcnJvciwgaSA9IG4udGhyb3duRXJyb3IsIHMgPSBuLmlzU3RvcHBlZDtcbiAgICBvID8gci5lcnJvcihpKSA6IHMgJiYgci5jb21wbGV0ZSgpO1xuICB9LCB0LnByb3RvdHlwZS5hc09ic2VydmFibGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgciA9IG5ldyBwZSgpO1xuICAgIHJldHVybiByLnNvdXJjZSA9IHRoaXMsIHI7XG4gIH0sIHQuY3JlYXRlID0gZnVuY3Rpb24ociwgbikge1xuICAgIHJldHVybiBuZXcgZ3Iociwgbik7XG4gIH0sIHQ7XG59KShwZSksIGdyID0gKGZ1bmN0aW9uKGUpIHtcbiAgdmUodCwgZSk7XG4gIGZ1bmN0aW9uIHQociwgbikge1xuICAgIHZhciBvID0gZS5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgcmV0dXJuIG8uZGVzdGluYXRpb24gPSByLCBvLnNvdXJjZSA9IG4sIG87XG4gIH1cbiAgcmV0dXJuIHQucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbihyKSB7XG4gICAgdmFyIG4sIG87XG4gICAgKG8gPSAobiA9IHRoaXMuZGVzdGluYXRpb24pID09PSBudWxsIHx8IG4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG4ubmV4dCkgPT09IG51bGwgfHwgbyA9PT0gdm9pZCAwIHx8IG8uY2FsbChuLCByKTtcbiAgfSwgdC5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbihyKSB7XG4gICAgdmFyIG4sIG87XG4gICAgKG8gPSAobiA9IHRoaXMuZGVzdGluYXRpb24pID09PSBudWxsIHx8IG4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG4uZXJyb3IpID09PSBudWxsIHx8IG8gPT09IHZvaWQgMCB8fCBvLmNhbGwobiwgcik7XG4gIH0sIHQucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHIsIG47XG4gICAgKG4gPSAociA9IHRoaXMuZGVzdGluYXRpb24pID09PSBudWxsIHx8IHIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHIuY29tcGxldGUpID09PSBudWxsIHx8IG4gPT09IHZvaWQgMCB8fCBuLmNhbGwocik7XG4gIH0sIHQucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbihyKSB7XG4gICAgdmFyIG4sIG87XG4gICAgcmV0dXJuIChvID0gKG4gPSB0aGlzLnNvdXJjZSkgPT09IG51bGwgfHwgbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogbi5zdWJzY3JpYmUocikpICE9PSBudWxsICYmIG8gIT09IHZvaWQgMCA/IG8gOiBvbjtcbiAgfSwgdDtcbn0pKGNuKSwgQmEgPSB7XG4gIG5vdzogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIERhdGUubm93KCk7XG4gIH1cbn0sIEhhID0gKGZ1bmN0aW9uKGUpIHtcbiAgdmUodCwgZSk7XG4gIGZ1bmN0aW9uIHQociwgbikge1xuICAgIHJldHVybiBlLmNhbGwodGhpcykgfHwgdGhpcztcbiAgfVxuICByZXR1cm4gdC5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbihyLCBuKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sIHQ7XG59KShydCksIHdyID0ge1xuICBzZXRJbnRlcnZhbDogZnVuY3Rpb24oZSwgdCkge1xuICAgIGZvciAodmFyIHIgPSBbXSwgbiA9IDI7IG4gPCBhcmd1bWVudHMubGVuZ3RoOyBuKyspXG4gICAgICByW24gLSAyXSA9IGFyZ3VtZW50c1tuXTtcbiAgICByZXR1cm4gc2V0SW50ZXJ2YWwuYXBwbHkodm9pZCAwLCBodChbZSwgdF0sIHl0KHIpKSk7XG4gIH0sXG4gIGNsZWFySW50ZXJ2YWw6IGZ1bmN0aW9uKGUpIHtcbiAgICByZXR1cm4gY2xlYXJJbnRlcnZhbChlKTtcbiAgfSxcbiAgZGVsZWdhdGU6IHZvaWQgMFxufSwgWWEgPSAoZnVuY3Rpb24oZSkge1xuICB2ZSh0LCBlKTtcbiAgZnVuY3Rpb24gdChyLCBuKSB7XG4gICAgdmFyIG8gPSBlLmNhbGwodGhpcywgciwgbikgfHwgdGhpcztcbiAgICByZXR1cm4gby5zY2hlZHVsZXIgPSByLCBvLndvcmsgPSBuLCBvLnBlbmRpbmcgPSBmYWxzZSwgbztcbiAgfVxuICByZXR1cm4gdC5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbihyLCBuKSB7XG4gICAgdmFyIG87XG4gICAgaWYgKG4gPT09IHZvaWQgMCAmJiAobiA9IDApLCB0aGlzLmNsb3NlZClcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIHRoaXMuc3RhdGUgPSByO1xuICAgIHZhciBpID0gdGhpcy5pZCwgcyA9IHRoaXMuc2NoZWR1bGVyO1xuICAgIHJldHVybiBpICE9IG51bGwgJiYgKHRoaXMuaWQgPSB0aGlzLnJlY3ljbGVBc3luY0lkKHMsIGksIG4pKSwgdGhpcy5wZW5kaW5nID0gdHJ1ZSwgdGhpcy5kZWxheSA9IG4sIHRoaXMuaWQgPSAobyA9IHRoaXMuaWQpICE9PSBudWxsICYmIG8gIT09IHZvaWQgMCA/IG8gOiB0aGlzLnJlcXVlc3RBc3luY0lkKHMsIHRoaXMuaWQsIG4pLCB0aGlzO1xuICB9LCB0LnByb3RvdHlwZS5yZXF1ZXN0QXN5bmNJZCA9IGZ1bmN0aW9uKHIsIG4sIG8pIHtcbiAgICByZXR1cm4gbyA9PT0gdm9pZCAwICYmIChvID0gMCksIHdyLnNldEludGVydmFsKHIuZmx1c2guYmluZChyLCB0aGlzKSwgbyk7XG4gIH0sIHQucHJvdG90eXBlLnJlY3ljbGVBc3luY0lkID0gZnVuY3Rpb24ociwgbiwgbykge1xuICAgIGlmIChvID09PSB2b2lkIDAgJiYgKG8gPSAwKSwgbyAhPSBudWxsICYmIHRoaXMuZGVsYXkgPT09IG8gJiYgdGhpcy5wZW5kaW5nID09PSBmYWxzZSlcbiAgICAgIHJldHVybiBuO1xuICAgIG4gIT0gbnVsbCAmJiB3ci5jbGVhckludGVydmFsKG4pO1xuICB9LCB0LnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24ociwgbikge1xuICAgIGlmICh0aGlzLmNsb3NlZClcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoXCJleGVjdXRpbmcgYSBjYW5jZWxsZWQgYWN0aW9uXCIpO1xuICAgIHRoaXMucGVuZGluZyA9IGZhbHNlO1xuICAgIHZhciBvID0gdGhpcy5fZXhlY3V0ZShyLCBuKTtcbiAgICBpZiAobylcbiAgICAgIHJldHVybiBvO1xuICAgIHRoaXMucGVuZGluZyA9PT0gZmFsc2UgJiYgdGhpcy5pZCAhPSBudWxsICYmICh0aGlzLmlkID0gdGhpcy5yZWN5Y2xlQXN5bmNJZCh0aGlzLnNjaGVkdWxlciwgdGhpcy5pZCwgbnVsbCkpO1xuICB9LCB0LnByb3RvdHlwZS5fZXhlY3V0ZSA9IGZ1bmN0aW9uKHIsIG4pIHtcbiAgICB2YXIgbyA9IGZhbHNlLCBpO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLndvcmsocik7XG4gICAgfSBjYXRjaCAocykge1xuICAgICAgbyA9IHRydWUsIGkgPSBzIHx8IG5ldyBFcnJvcihcIlNjaGVkdWxlZCBhY3Rpb24gdGhyZXcgZmFsc3kgZXJyb3JcIik7XG4gICAgfVxuICAgIGlmIChvKVxuICAgICAgcmV0dXJuIHRoaXMudW5zdWJzY3JpYmUoKSwgaTtcbiAgfSwgdC5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuY2xvc2VkKSB7XG4gICAgICB2YXIgciA9IHRoaXMsIG4gPSByLmlkLCBvID0gci5zY2hlZHVsZXIsIGkgPSBvLmFjdGlvbnM7XG4gICAgICB0aGlzLndvcmsgPSB0aGlzLnN0YXRlID0gdGhpcy5zY2hlZHVsZXIgPSBudWxsLCB0aGlzLnBlbmRpbmcgPSBmYWxzZSwgZ3QoaSwgdGhpcyksIG4gIT0gbnVsbCAmJiAodGhpcy5pZCA9IHRoaXMucmVjeWNsZUFzeW5jSWQobywgbiwgbnVsbCkpLCB0aGlzLmRlbGF5ID0gbnVsbCwgZS5wcm90b3R5cGUudW5zdWJzY3JpYmUuY2FsbCh0aGlzKTtcbiAgICB9XG4gIH0sIHQ7XG59KShIYSksIHZyID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBlKHQsIHIpIHtcbiAgICByID09PSB2b2lkIDAgJiYgKHIgPSBlLm5vdyksIHRoaXMuc2NoZWR1bGVyQWN0aW9uQ3RvciA9IHQsIHRoaXMubm93ID0gcjtcbiAgfVxuICByZXR1cm4gZS5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbih0LCByLCBuKSB7XG4gICAgcmV0dXJuIHIgPT09IHZvaWQgMCAmJiAociA9IDApLCBuZXcgdGhpcy5zY2hlZHVsZXJBY3Rpb25DdG9yKHRoaXMsIHQpLnNjaGVkdWxlKG4sIHIpO1xuICB9LCBlLm5vdyA9IEJhLm5vdywgZTtcbn0pKCksIFdhID0gKGZ1bmN0aW9uKGUpIHtcbiAgdmUodCwgZSk7XG4gIGZ1bmN0aW9uIHQociwgbikge1xuICAgIG4gPT09IHZvaWQgMCAmJiAobiA9IHZyLm5vdyk7XG4gICAgdmFyIG8gPSBlLmNhbGwodGhpcywgciwgbikgfHwgdGhpcztcbiAgICByZXR1cm4gby5hY3Rpb25zID0gW10sIG8uX2FjdGl2ZSA9IGZhbHNlLCBvO1xuICB9XG4gIHJldHVybiB0LnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKHIpIHtcbiAgICB2YXIgbiA9IHRoaXMuYWN0aW9ucztcbiAgICBpZiAodGhpcy5fYWN0aXZlKSB7XG4gICAgICBuLnB1c2gocik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBvO1xuICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgZG9cbiAgICAgIGlmIChvID0gci5leGVjdXRlKHIuc3RhdGUsIHIuZGVsYXkpKVxuICAgICAgICBicmVhaztcbiAgICB3aGlsZSAociA9IG4uc2hpZnQoKSk7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZSA9IGZhbHNlLCBvKSB7XG4gICAgICBmb3IgKDsgciA9IG4uc2hpZnQoKTsgKVxuICAgICAgICByLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aHJvdyBvO1xuICAgIH1cbiAgfSwgdDtcbn0pKHZyKSwgSmEgPSBuZXcgV2EoWWEpLCBaYSA9IChmdW5jdGlvbihlKSB7XG4gIHJldHVybiBlICYmIHR5cGVvZiBlLmxlbmd0aCA9PSBcIm51bWJlclwiICYmIHR5cGVvZiBlICE9IFwiZnVuY3Rpb25cIjtcbn0pO1xuZnVuY3Rpb24gS2EoZSkge1xuICByZXR1cm4gRyhlPy50aGVuKTtcbn1cbmZ1bmN0aW9uIFFhKGUpIHtcbiAgcmV0dXJuIEcoZVtadF0pO1xufVxuZnVuY3Rpb24gWGEoZSkge1xuICByZXR1cm4gU3ltYm9sLmFzeW5jSXRlcmF0b3IgJiYgRyhlPy5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKTtcbn1cbmZ1bmN0aW9uIGVpKGUpIHtcbiAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoXCJZb3UgcHJvdmlkZWQgXCIgKyAoZSAhPT0gbnVsbCAmJiB0eXBlb2YgZSA9PSBcIm9iamVjdFwiID8gXCJhbiBpbnZhbGlkIG9iamVjdFwiIDogXCInXCIgKyBlICsgXCInXCIpICsgXCIgd2hlcmUgYSBzdHJlYW0gd2FzIGV4cGVjdGVkLiBZb3UgY2FuIHByb3ZpZGUgYW4gT2JzZXJ2YWJsZSwgUHJvbWlzZSwgUmVhZGFibGVTdHJlYW0sIEFycmF5LCBBc3luY0l0ZXJhYmxlLCBvciBJdGVyYWJsZS5cIik7XG59XG5mdW5jdGlvbiB0aSgpIHtcbiAgcmV0dXJuIHR5cGVvZiBTeW1ib2wgIT0gXCJmdW5jdGlvblwiIHx8ICFTeW1ib2wuaXRlcmF0b3IgPyBcIkBAaXRlcmF0b3JcIiA6IFN5bWJvbC5pdGVyYXRvcjtcbn1cbnZhciByaSA9IHRpKCk7XG5mdW5jdGlvbiBuaShlKSB7XG4gIHJldHVybiBHKGU/LltyaV0pO1xufVxuZnVuY3Rpb24gb2koZSkge1xuICByZXR1cm4gUmEodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbigpIHtcbiAgICB2YXIgciwgbiwgbywgaTtcbiAgICByZXR1cm4gbm4odGhpcywgZnVuY3Rpb24ocykge1xuICAgICAgc3dpdGNoIChzLmxhYmVsKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICByID0gZS5nZXRSZWFkZXIoKSwgcy5sYWJlbCA9IDE7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBzLnRyeXMucHVzaChbMSwgLCA5LCAxMF0pLCBzLmxhYmVsID0gMjtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHJldHVybiBbNCwgUmUoci5yZWFkKCkpXTtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHJldHVybiBuID0gcy5zZW50KCksIG8gPSBuLnZhbHVlLCBpID0gbi5kb25lLCBpID8gWzQsIFJlKHZvaWQgMCldIDogWzMsIDVdO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgcmV0dXJuIFsyLCBzLnNlbnQoKV07XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICByZXR1cm4gWzQsIFJlKG8pXTtcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIHJldHVybiBbNCwgcy5zZW50KCldO1xuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgcmV0dXJuIHMuc2VudCgpLCBbMywgMl07XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICByZXR1cm4gWzMsIDEwXTtcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIHJldHVybiByLnJlbGVhc2VMb2NrKCksIFs3XTtcbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICByZXR1cm4gWzJdO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGFpKGUpIHtcbiAgcmV0dXJuIEcoZT8uZ2V0UmVhZGVyKTtcbn1cbmZ1bmN0aW9uIGlpKGUpIHtcbiAgaWYgKGUgaW5zdGFuY2VvZiBwZSlcbiAgICByZXR1cm4gZTtcbiAgaWYgKGUgIT0gbnVsbCkge1xuICAgIGlmIChRYShlKSlcbiAgICAgIHJldHVybiBzaShlKTtcbiAgICBpZiAoWmEoZSkpXG4gICAgICByZXR1cm4gY2koZSk7XG4gICAgaWYgKEthKGUpKVxuICAgICAgcmV0dXJuIGxpKGUpO1xuICAgIGlmIChYYShlKSlcbiAgICAgIHJldHVybiBsbihlKTtcbiAgICBpZiAobmkoZSkpXG4gICAgICByZXR1cm4gdWkoZSk7XG4gICAgaWYgKGFpKGUpKVxuICAgICAgcmV0dXJuIGRpKGUpO1xuICB9XG4gIHRocm93IGVpKGUpO1xufVxuZnVuY3Rpb24gc2koZSkge1xuICByZXR1cm4gbmV3IHBlKGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgciA9IGVbWnRdKCk7XG4gICAgaWYgKEcoci5zdWJzY3JpYmUpKVxuICAgICAgcmV0dXJuIHIuc3Vic2NyaWJlKHQpO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcm92aWRlZCBvYmplY3QgZG9lcyBub3QgY29ycmVjdGx5IGltcGxlbWVudCBTeW1ib2wub2JzZXJ2YWJsZVwiKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBjaShlKSB7XG4gIHJldHVybiBuZXcgcGUoZnVuY3Rpb24odCkge1xuICAgIGZvciAodmFyIHIgPSAwOyByIDwgZS5sZW5ndGggJiYgIXQuY2xvc2VkOyByKyspXG4gICAgICB0Lm5leHQoZVtyXSk7XG4gICAgdC5jb21wbGV0ZSgpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGxpKGUpIHtcbiAgcmV0dXJuIG5ldyBwZShmdW5jdGlvbih0KSB7XG4gICAgZS50aGVuKGZ1bmN0aW9uKHIpIHtcbiAgICAgIHQuY2xvc2VkIHx8ICh0Lm5leHQociksIHQuY29tcGxldGUoKSk7XG4gICAgfSwgZnVuY3Rpb24ocikge1xuICAgICAgcmV0dXJuIHQuZXJyb3Iocik7XG4gICAgfSkudGhlbihudWxsLCBzbik7XG4gIH0pO1xufVxuZnVuY3Rpb24gdWkoZSkge1xuICByZXR1cm4gbmV3IHBlKGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgciwgbjtcbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgbyA9IExlKGUpLCBpID0gby5uZXh0KCk7ICFpLmRvbmU7IGkgPSBvLm5leHQoKSkge1xuICAgICAgICB2YXIgcyA9IGkudmFsdWU7XG4gICAgICAgIGlmICh0Lm5leHQocyksIHQuY2xvc2VkKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChjKSB7XG4gICAgICByID0geyBlcnJvcjogYyB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBpICYmICFpLmRvbmUgJiYgKG4gPSBvLnJldHVybikgJiYgbi5jYWxsKG8pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHIpIHRocm93IHIuZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIHQuY29tcGxldGUoKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBsbihlKSB7XG4gIHJldHVybiBuZXcgcGUoZnVuY3Rpb24odCkge1xuICAgIHBpKGUsIHQpLmNhdGNoKGZ1bmN0aW9uKHIpIHtcbiAgICAgIHJldHVybiB0LmVycm9yKHIpO1xuICAgIH0pO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGRpKGUpIHtcbiAgcmV0dXJuIGxuKG9pKGUpKTtcbn1cbmZ1bmN0aW9uIHBpKGUsIHQpIHtcbiAgdmFyIHIsIG4sIG8sIGk7XG4gIHJldHVybiBJYSh0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24oKSB7XG4gICAgdmFyIHMsIGM7XG4gICAgcmV0dXJuIG5uKHRoaXMsIGZ1bmN0aW9uKGwpIHtcbiAgICAgIHN3aXRjaCAobC5sYWJlbCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgbC50cnlzLnB1c2goWzAsIDUsIDYsIDExXSksIHIgPSBUYShlKSwgbC5sYWJlbCA9IDE7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICByZXR1cm4gWzQsIHIubmV4dCgpXTtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGlmIChuID0gbC5zZW50KCksICEhbi5kb25lKSByZXR1cm4gWzMsIDRdO1xuICAgICAgICAgIGlmIChzID0gbi52YWx1ZSwgdC5uZXh0KHMpLCB0LmNsb3NlZClcbiAgICAgICAgICAgIHJldHVybiBbMl07XG4gICAgICAgICAgbC5sYWJlbCA9IDM7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICByZXR1cm4gWzMsIDFdO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgcmV0dXJuIFszLCAxMV07XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICByZXR1cm4gYyA9IGwuc2VudCgpLCBvID0geyBlcnJvcjogYyB9LCBbMywgMTFdO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgcmV0dXJuIGwudHJ5cy5wdXNoKFs2LCAsIDksIDEwXSksIG4gJiYgIW4uZG9uZSAmJiAoaSA9IHIucmV0dXJuKSA/IFs0LCBpLmNhbGwocildIDogWzMsIDhdO1xuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgbC5zZW50KCksIGwubGFiZWwgPSA4O1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgcmV0dXJuIFszLCAxMF07XG4gICAgICAgIGNhc2UgOTpcbiAgICAgICAgICBpZiAobykgdGhyb3cgby5lcnJvcjtcbiAgICAgICAgICByZXR1cm4gWzddO1xuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIHJldHVybiBbN107XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgcmV0dXJuIHQuY29tcGxldGUoKSwgWzJdO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cbmZ1bmN0aW9uIG1pKGUsIHQsIHIsIG4sIG8pIHtcbiAgbiA9PT0gdm9pZCAwICYmIChuID0gMCksIG8gPT09IHZvaWQgMCAmJiAobyA9IGZhbHNlKTtcbiAgdmFyIGkgPSB0LnNjaGVkdWxlKGZ1bmN0aW9uKCkge1xuICAgIHIoKSwgbyA/IGUuYWRkKHRoaXMuc2NoZWR1bGUobnVsbCwgbikpIDogdGhpcy51bnN1YnNjcmliZSgpO1xuICB9LCBuKTtcbiAgaWYgKGUuYWRkKGkpLCAhbylcbiAgICByZXR1cm4gaTtcbn1cbmZ1bmN0aW9uIF9pKGUsIHQpIHtcbiAgdmFyIHIgPSBHKGUpID8gZSA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBlO1xuICB9LCBuID0gZnVuY3Rpb24obykge1xuICAgIHJldHVybiBvLmVycm9yKHIoKSk7XG4gIH07XG4gIHJldHVybiBuZXcgcGUobik7XG59XG52YXIgZmkgPSBTdChmdW5jdGlvbihlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBlKHRoaXMpLCB0aGlzLm5hbWUgPSBcIkVtcHR5RXJyb3JcIiwgdGhpcy5tZXNzYWdlID0gXCJubyBlbGVtZW50cyBpbiBzZXF1ZW5jZVwiO1xuICB9O1xufSk7XG5mdW5jdGlvbiB5aShlLCB0KSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyLCBuKSB7XG4gICAgdmFyIG8gPSBmYWxzZSwgaTtcbiAgICBlLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiBmdW5jdGlvbihzKSB7XG4gICAgICAgIGkgPSBzLCBvID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogbixcbiAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgbyA/IHIoaSkgOiBuKG5ldyBmaSgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5mdW5jdGlvbiBoaShlKSB7XG4gIHJldHVybiBlIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNOYU4oZSk7XG59XG52YXIgZ2kgPSBTdChmdW5jdGlvbihlKSB7XG4gIHJldHVybiBmdW5jdGlvbihyKSB7XG4gICAgciA9PT0gdm9pZCAwICYmIChyID0gbnVsbCksIGUodGhpcyksIHRoaXMubWVzc2FnZSA9IFwiVGltZW91dCBoYXMgb2NjdXJyZWRcIiwgdGhpcy5uYW1lID0gXCJUaW1lb3V0RXJyb3JcIiwgdGhpcy5pbmZvID0gcjtcbiAgfTtcbn0pO1xuZnVuY3Rpb24gd2koZSwgdCkge1xuICB2YXIgciA9IGhpKGUpID8geyBmaXJzdDogZSB9IDogdHlwZW9mIGUgPT0gXCJudW1iZXJcIiA/IHsgZWFjaDogZSB9IDogZSwgbiA9IHIuZmlyc3QsIG8gPSByLmVhY2gsIGkgPSByLndpdGgsIHMgPSBpID09PSB2b2lkIDAgPyB2aSA6IGksIGMgPSByLnNjaGVkdWxlciwgbCA9IGMgPT09IHZvaWQgMCA/IEphIDogYywgdSA9IHIubWV0YSwgZCA9IHUgPT09IHZvaWQgMCA/IG51bGwgOiB1O1xuICBpZiAobiA9PSBudWxsICYmIG8gPT0gbnVsbClcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTm8gdGltZW91dCBwcm92aWRlZC5cIik7XG4gIHJldHVybiBHYShmdW5jdGlvbihmLCBfKSB7XG4gICAgdmFyIG0sIHksIGggPSBudWxsLCB3ID0gMCwgRSA9IGZ1bmN0aW9uKHYpIHtcbiAgICAgIHkgPSBtaShfLCBsLCBmdW5jdGlvbigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBtLnVuc3Vic2NyaWJlKCksIGlpKHMoe1xuICAgICAgICAgICAgbWV0YTogZCxcbiAgICAgICAgICAgIGxhc3RWYWx1ZTogaCxcbiAgICAgICAgICAgIHNlZW46IHdcbiAgICAgICAgICB9KSkuc3Vic2NyaWJlKF8pO1xuICAgICAgICB9IGNhdGNoIChDKSB7XG4gICAgICAgICAgXy5lcnJvcihDKTtcbiAgICAgICAgfVxuICAgICAgfSwgdik7XG4gICAgfTtcbiAgICBtID0gZi5zdWJzY3JpYmUoVmEoXywgZnVuY3Rpb24odikge1xuICAgICAgeT8udW5zdWJzY3JpYmUoKSwgdysrLCBfLm5leHQoaCA9IHYpLCBvID4gMCAmJiBFKG8pO1xuICAgIH0sIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbigpIHtcbiAgICAgIHk/LmNsb3NlZCB8fCB5Py51bnN1YnNjcmliZSgpLCBoID0gbnVsbDtcbiAgICB9KSksICF3ICYmIEUobiAhPSBudWxsID8gdHlwZW9mIG4gPT0gXCJudW1iZXJcIiA/IG4gOiArbiAtIGwubm93KCkgOiBvKTtcbiAgfSk7XG59XG5mdW5jdGlvbiB2aShlKSB7XG4gIHRocm93IG5ldyBnaShlKTtcbn1cbmNsYXNzIFdlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5zZXQgPSAodCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2N1cnJlbnQuc3RhdHVzID09PSBcInN1Y2Nlc3NcIilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTG9hZGVkT25jZSBpcyBhbHJlYWR5IGluIHN1Y2Nlc3Mgc3RhdGVcIik7XG4gICAgICB0aGlzLl9jdXJyZW50ID0geyBzdGF0dXM6IFwic3VjY2Vzc1wiLCBpc1N1Y2Nlc3M6IHRydWUsIGxvYWRlZFZhbHVlOiB0IH0sIHRoaXMuX3N1YmplY3QubmV4dCh0KSwgdGhpcy5fc3ViamVjdC5jb21wbGV0ZSgpO1xuICAgIH0sIHRoaXMudGhyb3cgPSAodCwgcikgPT4ge1xuICAgICAgaWYgKHRoaXMuX2N1cnJlbnQuc3RhdHVzID09PSBcInN1Y2Nlc3NcIilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTG9hZGVkT25jZSBpcyBhbHJlYWR5IGluIHN1Y2Nlc3Mgc3RhdGVcIik7XG4gICAgICB0aGlzLl9jdXJyZW50ID0geyBzdGF0dXM6IFwiZXJyb3JcIiwgaXNTdWNjZXNzOiBmYWxzZSwgZXJyb3I6IHQsIGVyck1zZzogciB9LCB0aGlzLl9zdWJqZWN0LmVycm9yKHQpO1xuICAgIH0sIHRoaXMuZ2V0VmFsdWVJZkxvYWRlZEVsc2UgPSAodCkgPT4gdGhpcy5fY3VycmVudC5zdGF0dXMgPT09IFwic3VjY2Vzc1wiID8gdGhpcy5fY3VycmVudC5sb2FkZWRWYWx1ZSA6IHQsIHRoaXMuc3Vic2NyaWJlID0gKHQpID0+IHtcbiAgICAgIGlmICh0aGlzLl9jdXJyZW50LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgdCh0aGlzLl9jdXJyZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fY3VycmVudC5zdGF0dXMgPT09IFwiZXJyb3JcIiAmJiB0KHRoaXMuX2N1cnJlbnQpO1xuICAgICAgY29uc3QgciA9IHRoaXMuX3N1YmplY3Quc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50LnN0YXR1cyAhPT0gXCJzdWNjZXNzXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHN0YXRlIChuZXh0KTogcGxlYXNlIG1ha2Ugc3VyZSB0byB1cGRhdGUgX2N1cnJlbnQgYmVmb3JlIHRoZSBzdWJqZWN0XCIpO1xuICAgICAgICAgIHQodGhpcy5fY3VycmVudCksIHIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5fY3VycmVudC5zdGF0dXMgIT09IFwiZXJyb3JcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc3RhdGUgKGVycm9yKTogcGxlYXNlIG1ha2Ugc3VyZSB0byB1cGRhdGUgX2N1cnJlbnQgYmVmb3JlIHRoZSBzdWJqZWN0XCIpO1xuICAgICAgICAgIHQodGhpcy5fY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sIHRoaXMud2FpdEZvckxvYWQgPSAodCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2N1cnJlbnQuc3RhdHVzID09PSBcInN1Y2Nlc3NcIikgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9jdXJyZW50LmxvYWRlZFZhbHVlKTtcbiAgICAgIGlmICh0aGlzLl9jdXJyZW50LnN0YXR1cyA9PT0gXCJlcnJvclwiKSByZXR1cm4gUHJvbWlzZS5yZWplY3QodGhpcy5fY3VycmVudC5lcnJvcik7XG4gICAgICB0aGlzLl9jdXJyZW50LnN0YXR1cyAhPT0gXCJpbml0aWFsXCIgJiYgbnQodGhpcy5fY3VycmVudCk7XG4gICAgICBjb25zdCByID0ge1xuICAgICAgICBmaXJzdDogdC50aW1lb3V0U2VjICogMWUzLFxuICAgICAgICB3aXRoOiAoKSA9PiBfaSgoKSA9PiBuZXcgRXJyb3IodC50aW1lb3V0RXJyTXNnKSlcbiAgICAgIH07XG4gICAgICByZXR1cm4geWkodGhpcy5fc3ViamVjdC5waXBlKHdpKHIpKSk7XG4gICAgfSwgdGhpcy5fY3VycmVudCA9IHsgc3RhdHVzOiBcImluaXRpYWxcIiwgaXNTdWNjZXNzOiBmYWxzZSB9LCB0aGlzLl9zdWJqZWN0ID0gbmV3IGNuKCk7XG4gIH1cbiAgZ2V0IGN1cnJlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnQ7XG4gIH1cbn1cbmNvbnN0IGJyID0geiQxLmVudW0oW1wiZGV2XCIsIFwic3RnXCIsIFwicHJvZFwiXSksIGJpID0ge1xuICBwcm9kOiBcImh0dHBzOi8vY29ubnRvLmdldG9wZW5wYXkuY29tXCIsXG4gIHN0ZzogXCJodHRwczovL2Nvbm50by5vcGVucGF5c3RhZ2luZy5jb21cIixcbiAgZGV2OiBcImh0dHA6Ly9sb2NhbGhvc3Q6ODAwMFwiXG59LCBQaSA9IChlKSA9PiBiaVtlXSwgRHQgPSB7fSwgdW4gPSBhc3luYyAoZSkgPT4ge1xuICBpZiAoRHRbZV0pXG4gICAgcmV0dXJuIER0W2VdO1xuICB0cnkge1xuICAgIGNvbnN0IHQgPSBhd2FpdCBmZXRjaChuZXcgVVJMKFwiL2hlYWx0aC9lbnZpcm9ubWVudFwiLCBlKSkudGhlbigobikgPT4gbi5qc29uKCkpLCByID0gYnIucGFyc2UodC5lbnZpcm9ubWVudCk7XG4gICAgcmV0dXJuIER0W2VdID0gciwgcjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGJyLlZhbHVlcy5wcm9kO1xuICB9XG59O1xuZnVuY3Rpb24gbnQoZSkge1xuICB0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBjYXNlOiAke2V9YCk7XG59XG5jb25zdCBrdCA9IChlLCB0KSA9PiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoZSkuZmlsdGVyKChbcl0pID0+ICF0LmluY2x1ZGVzKHIpKSksICQgPSAoKSA9PiB7XG4gIGlmICghKHR5cGVvZiB3aW5kb3cgPiBcInVcIikpXG4gICAgcmV0dXJuIHdpbmRvdztcbn0sIEJ0ID0gbmV3IFdlKCksIFByID0gXCJvcF9tZXRyaWNzX3F1ZXVlXCIsIEVpID0gMywgQ2kgPSAzLCBTaSA9IDFlMywgeyBsb2dfXzogY3QgfSA9IEkoXCJvcC1tZXRyaWNzXCIpO1xuY2xhc3Mga2kge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnF1ZXVlID0gW10sIHRoaXMucHJvY2Vzc2luZ1F1ZXVlID0gZmFsc2UsIHRoaXMuYmF0Y2hUaW1lb3V0ID0gbnVsbCwgdGhpcy5sYXN0RXZlbnRUaW1lc3RhbXAgPSAwLCB0aGlzLm9mZmxpbmVMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgIGN0KFwiTmV0d29yayBvZmZsaW5lLCBtZXRyaWNzIHdpbGwgYmUgcXVldWVkXCIpLCB0aGlzLmNhbmNlbEJhdGNoUHJvY2Vzc2luZygpO1xuICAgIH0sIHRoaXMub25saW5lTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICBjdChcIk5ldHdvcmsgb25saW5lLCBwcm9jZXNzaW5nIG1ldHJpY3MgcXVldWVcIiksIHRoaXMucHJvY2Vzc1F1ZXVlKCk7XG4gICAgfSwgdGhpcy5sb2FkUXVldWVGcm9tU3RvcmFnZSgpLCAkKCk/LmFkZEV2ZW50TGlzdGVuZXIoXCJvZmZsaW5lXCIsIHRoaXMub2ZmbGluZUxpc3RlbmVyKSwgJCgpPy5hZGRFdmVudExpc3RlbmVyKFwib25saW5lXCIsIHRoaXMub25saW5lTGlzdGVuZXIpO1xuICB9XG4gIGFkZEV2ZW50KHQsIHIsIG4pIHtcbiAgICBjb25zdCBvID0ge1xuICAgICAgZXZlbnROYW1lOiB0LFxuICAgICAgcHJvcGVydGllczogciB8fCB7fSxcbiAgICAgIGNvbnRleHRQcm9wZXJ0aWVzOiBuIHx8IHt9LFxuICAgICAgbm9uY2U6IHY0KCksXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBkYXRldGltZTogKC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKS50b0lTT1N0cmluZygpLFxuICAgICAgYXR0ZW1wdENvdW50OiAwLFxuICAgICAgdGltZURpZmZGcm9tUHJldmlvdXNFdmVudDogdGhpcy5sYXN0RXZlbnRUaW1lc3RhbXAgPyBEYXRlLm5vdygpIC0gdGhpcy5sYXN0RXZlbnRUaW1lc3RhbXAgOiAwXG4gICAgfTtcbiAgICB0aGlzLmxhc3RFdmVudFRpbWVzdGFtcCA9IG8udGltZXN0YW1wLCB0aGlzLnF1ZXVlLnB1c2gobyksIHRoaXMuc2F2ZVF1ZXVlVG9TdG9yYWdlKCksIHRoaXMuc2NoZWR1bGVCYXRjaFByb2Nlc3NpbmcoKTtcbiAgfVxuICBsb2FkUXVldWVGcm9tU3RvcmFnZSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdCA9ICQoKT8ubG9jYWxTdG9yYWdlPy5nZXRJdGVtKFByKTtcbiAgICAgIHQgJiYgKHRoaXMucXVldWUgPSBKU09OLnBhcnNlKHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMucXVldWUgPSBbXSwgdGhpcy5zYXZlUXVldWVUb1N0b3JhZ2UoKTtcbiAgICB9XG4gIH1cbiAgc2F2ZVF1ZXVlVG9TdG9yYWdlKCkge1xuICAgICQoKT8ubG9jYWxTdG9yYWdlLnNldEl0ZW0oUHIsIEpTT04uc3RyaW5naWZ5KHRoaXMucXVldWUpKTtcbiAgfVxuICBzY2hlZHVsZUJhdGNoUHJvY2Vzc2luZygpIHtcbiAgICBjb25zdCB0ID0gJCgpO1xuICAgIHQgJiYgbmF2aWdhdG9yLm9uTGluZSAmJiAhdGhpcy5wcm9jZXNzaW5nUXVldWUgJiYgdGhpcy5xdWV1ZS5sZW5ndGggPiAwICYmICF0aGlzLmJhdGNoVGltZW91dCAmJiAodGhpcy5iYXRjaFRpbWVvdXQgPSB0LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5iYXRjaFRpbWVvdXQgPSBudWxsLCB0aGlzLnByb2Nlc3NRdWV1ZSgpO1xuICAgIH0sIFNpKSk7XG4gIH1cbiAgY2FuY2VsQmF0Y2hQcm9jZXNzaW5nKCkge1xuICAgIHRoaXMuYmF0Y2hUaW1lb3V0ICYmICgkKCk/LmNsZWFyVGltZW91dCh0aGlzLmJhdGNoVGltZW91dCksIHRoaXMuYmF0Y2hUaW1lb3V0ID0gbnVsbCksIHRoaXMucHJvY2Vzc2luZ1F1ZXVlID0gZmFsc2U7XG4gIH1cbiAgcHJvY2Vzc1F1ZXVlKCkge1xuICAgICFuYXZpZ2F0b3Iub25MaW5lIHx8IHRoaXMucHJvY2Vzc2luZ1F1ZXVlIHx8IHRoaXMucXVldWUubGVuZ3RoID09PSAwIHx8ICh0aGlzLnByb2Nlc3NpbmdRdWV1ZSA9IHRydWUsIHRoaXMuc2VuZEJhdGNoKCkuZmluYWxseSgoKSA9PiB7XG4gICAgICB0aGlzLnByb2Nlc3NpbmdRdWV1ZSA9IGZhbHNlLCB0aGlzLnF1ZXVlLmxlbmd0aCA+IDAgJiYgdGhpcy5zY2hlZHVsZUJhdGNoUHJvY2Vzc2luZygpO1xuICAgIH0pKTtcbiAgfVxuICBhc3luYyBzZW5kQmF0Y2goKSB7XG4gICAgaWYgKHRoaXMucXVldWUubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgdCA9IEJ0LmdldFZhbHVlSWZMb2FkZWRFbHNlKHZvaWQgMCk7XG4gICAgaWYgKCF0KSB7XG4gICAgICBjdChcIk1ldHJpY3MgY29udGV4dCBub3QgYXZhaWxhYmxlLCB3aWxsIHJldHJ5IGxhdGVyXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByID0gdGhpcy5xdWV1ZS5zbGljZSgwLCBDaSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG4gPSB7XG4gICAgICAgIGV2ZW50czogci5tYXAoKGMpID0+ICh7XG4gICAgICAgICAgZXZlbnRfbmFtZTogYy5ldmVudE5hbWUsXG4gICAgICAgICAgZGV2aWNlX3Rva2VuOiB0LmRldmljZVRva2VuLFxuICAgICAgICAgIGNvbnRleHRfcHJvcGVydGllczoge1xuICAgICAgICAgICAgLi4udCxcbiAgICAgICAgICAgIC4uLmMuY29udGV4dFByb3BlcnRpZXNcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG5vbmNlOiBjLm5vbmNlLFxuICAgICAgICAgICAgZGF0ZXRpbWU6IGMuZGF0ZXRpbWUsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IGMudGltZXN0YW1wLFxuICAgICAgICAgICAgdGltZV9kaWZmX2Zyb21fcHJldmlvdXNfZXZlbnQ6IGMudGltZURpZmZGcm9tUHJldmlvdXNFdmVudCxcbiAgICAgICAgICAgIGNoZWNrb3V0X3NlY3VyZV90b2tlbjogdC5jaGVja291dFNlY3VyZVRva2VuLFxuICAgICAgICAgICAgLi4uYy5wcm9wZXJ0aWVzXG4gICAgICAgICAgfVxuICAgICAgICB9KSlcbiAgICAgIH0sIG8gPSBQaSh0LmVudmlyb25tZW50KSwgaSA9IG5ldyBVUkwoXCIvbWV0cmljcy9wdWJsaWMvY2FwdHVyZVwiLCBvKTtcbiAgICAgIChhd2FpdCBmZXRjaChpLnRvU3RyaW5nKCksIHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KG4pLFxuICAgICAgICBrZWVwYWxpdmU6ICEwXG4gICAgICAgIC8vIFRvIHNlbmQgZXZlbnRzIGV2ZW4gaWYgdGhlIHBhZ2UgaXMgdW5sb2FkZWRcbiAgICAgIH0pKS5vayA/ICh0aGlzLnF1ZXVlID0gdGhpcy5xdWV1ZS5zbGljZShyLmxlbmd0aCksIHRoaXMuc2F2ZVF1ZXVlVG9TdG9yYWdlKCkpIDogdGhpcy5oYW5kbGVGYWlsZWRCYXRjaChyKTtcbiAgICB9IGNhdGNoIChuKSB7XG4gICAgICBjdChcIkVycm9yIHNlbmRpbmcgbWV0cmljcyBiYXRjaDpcIiwgbiksIHRoaXMuaGFuZGxlRmFpbGVkQmF0Y2gocik7XG4gICAgfVxuICB9XG4gIGhhbmRsZUZhaWxlZEJhdGNoKHQpIHtcbiAgICB0LmZvckVhY2goKG4pID0+IHtcbiAgICAgIG4uYXR0ZW1wdENvdW50Kys7XG4gICAgfSk7XG4gICAgY29uc3QgciA9IHQuZmlsdGVyKChuKSA9PiBuLmF0dGVtcHRDb3VudCA8IEVpKTtcbiAgICB0aGlzLnF1ZXVlID0gdGhpcy5xdWV1ZS5zbGljZSh0Lmxlbmd0aCksIHRoaXMucXVldWUgPSBbLi4uciwgLi4udGhpcy5xdWV1ZV0sIHRoaXMuc2F2ZVF1ZXVlVG9TdG9yYWdlKCk7XG4gIH1cbiAgY2xlYW51cCgpIHtcbiAgICAkKCk/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJvZmZsaW5lXCIsIHRoaXMub2ZmbGluZUxpc3RlbmVyKSwgJCgpPy5yZW1vdmVFdmVudExpc3RlbmVyKFwib25saW5lXCIsIHRoaXMub25saW5lTGlzdGVuZXIpLCB0aGlzLmNhbmNlbEJhdGNoUHJvY2Vzc2luZygpO1xuICB9XG59XG5jb25zdCBLdCA9IG5ldyBraSgpLCBnID0gKGUsIHQsIHIpID0+IHtcbiAgS3QuYWRkRXZlbnQoZSwgdCwgcik7XG59LCBBaSA9ICgpID0+IHtcbiAgS3QucHJvY2Vzc1F1ZXVlKCk7XG59LCBkbiA9IChlKSA9PiB7XG4gIGNvbnN0IHQgPSBLKGUucmVhc29uKTtcbiAgZyhcInVuaGFuZGxlZF9yZWplY3Rpb25fZXJyb3JcIiwge1xuICAgIGVycm9yX21lc3NhZ2U6IHQsXG4gICAgZXJyb3JfbmFtZTogZS5yZWFzb25cbiAgfSk7XG59LCBwbiA9IChlKSA9PiB7XG4gIGNvbnN0IHQgPSBLKGUuZXJyb3IpO1xuICBnKFwidW5jYXVnaHRfZXJyb3JcIiwge1xuICAgIGVycm9yX21lc3NhZ2U6IHQsXG4gICAgZXJyb3JfbmFtZTogZS5lcnJvcj8ubmFtZSxcbiAgICBlcnJvcl9zdGFjazogZS5lcnJvcj8uc3RhY2ssXG4gICAgZmlsZV9uYW1lOiBlLmZpbGVuYW1lLFxuICAgIGxpbmVfbnVtYmVyOiBlLmxpbmVubyxcbiAgICBjb2x1bW5fbnVtYmVyOiBlLmNvbG5vXG4gIH0pO1xufTtcbmxldCB3dCA9IG51bGw7XG5jb25zdCBJaSA9IGFzeW5jICgpID0+IHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPiBcInVcIikgcmV0dXJuIG51bGw7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHd0ID0gKGF3YWl0IGltcG9ydCgnLi9saWZlY3ljbGUtRDFCZEViWnMtIX57MDA1fX4uanMnKSkuZGVmYXVsdCwgd3Q7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIGxvYWQgcGFnZS1saWZlY3ljbGU6XCIsIGUpLCBudWxsO1xuICB9XG59LCBtbiA9IChlKSA9PiB7XG4gIGcoXCJwYWdlX2xpZmVjeWNsZV9zdGF0ZV9jaGFuZ2VcIiwge1xuICAgIG9sZF9zdGF0ZTogZS5vbGRTdGF0ZSxcbiAgICBuZXdfc3RhdGU6IGUubmV3U3RhdGVcbiAgfSksIChlLm5ld1N0YXRlID09PSBcImhpZGRlblwiIHx8IGUubmV3U3RhdGUgPT09IFwicGFzc2l2ZVwiKSAmJiBLdC5wcm9jZXNzUXVldWUoKTtcbn0sIFJpID0gYXN5bmMgKCkgPT4ge1xuICAkKCk/LmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBwbiksICQoKT8uYWRkRXZlbnRMaXN0ZW5lcihcInVuaGFuZGxlZHJlamVjdGlvblwiLCBkbik7XG4gIGNvbnN0IGUgPSBhd2FpdCBJaSgpO1xuICBlICYmIGUuYWRkRXZlbnRMaXN0ZW5lcihcInN0YXRlY2hhbmdlXCIsIG1uKTtcbn0sIFRpID0gYXN5bmMgKCkgPT4ge1xuICAkKCk/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBwbiksICQoKT8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInVuaGFuZGxlZHJlamVjdGlvblwiLCBkbiksICQoKSAmJiB3dCAmJiB3dC5yZW1vdmVFdmVudExpc3RlbmVyKFwic3RhdGVjaGFuZ2VcIiwgbW4pO1xufSwgTmkgPSB6JDEub2JqZWN0KHtcbiAgc3RyaXBlX3BrOiB6JDEuc3RyaW5nKCksXG4gIGNsaWVudF9zZWNyZXQ6IHokMS5zdHJpbmcoKSxcbiAgc3RyaXBlX3BtX2lkOiB6JDEuc3RyaW5nKClcbn0pLCBGaSA9IHokMS5vYmplY3Qoe1xuICB0eXBlOiB6JDEuc3RyaW5nKCksXG4gIGNsaWVudF9zZWNyZXQ6IHokMS5zdHJpbmcoKSxcbiAgc3RyaXBlX3BrOiB6JDEuc3RyaW5nKClcbn0pLCBMaSA9IHtcbiAgdXNkOiBcInVzZFwiLFxuICBicmw6IFwiYnJsXCJcbn0sIEF0ID0gYXN5bmMgKGUpID0+IHtcbiAgZm9yIChsZXQgciA9IDA7IHIgPCAxMDsgcisrKVxuICAgIEVyKCkgfHwgYXdhaXQgSXQoNTAwKTtcbiAgaWYgKCFFcigpKVxuICAgIHRocm93IGNvbnNvbGUubG9nKFwiU3RyaXBlIEpTIG5vdCBmb3VuZC5cIiksIG5ldyBFcnJvcihcIlN0cmlwZSBKUyBub3QgZm91bmQuXCIpO1xuICByZXR1cm4gbmV3IFN0cmlwZShlKTtcbn0sIE1pID0gYXN5bmMgKGUsIHQpID0+IHtcbiAgY29uc3QgciA9IGF3YWl0IEF0KGUpO1xuICByZXR1cm4ge1xuICAgIGVsZW1lbnRzOiByLmVsZW1lbnRzKHQpLFxuICAgIHN0cmlwZTogclxuICB9O1xufSwgeGkgPSBhc3luYyAoZSwgdCwgciwgbiwgbykgPT4ge1xuICBjb25zdCBpID0gYXdhaXQgQXQoZSksIHMgPSBMaVtyLnRvTG93ZXJDYXNlKCkudHJpbSgpXTtcbiAgcmV0dXJuIGkucGF5bWVudFJlcXVlc3Qoe1xuICAgIC8vIFRPRE86IHJlcGxhY2UgdGhpcyB3aXRoIHN0cmlwZSBhY2NvdW50IGNvdW50cnkgYXMgc29vbiBhcyB3ZSBzdXBwb3J0IGl0XG4gICAgY291bnRyeTogXCJVU1wiLFxuICAgIGN1cnJlbmN5OiBzLFxuICAgIHRvdGFsOiB7XG4gICAgICBsYWJlbDogXCJUb3RhbFwiLFxuICAgICAgYW1vdW50OiB0LFxuICAgICAgcGVuZGluZzogblxuICAgIH0sXG4gICAgLy8gcmVxdWVzdFNoaXBwaW5nOiB0cnVlLFxuICAgIHJlcXVlc3RQYXllck5hbWU6IHRydWUsXG4gICAgcmVxdWVzdFBheWVyRW1haWw6IHRydWUsXG4gICAgZGlzYWJsZVdhbGxldHM6IFtdXG4gIH0pO1xufSwgSXQgPSAoZSkgPT4gbmV3IFByb21pc2UoKHQpID0+IHtcbiAgc2V0VGltZW91dCh0LCBlKTtcbn0pLCBFciA9ICgpID0+IFwiU3RyaXBlXCIgaW4gd2luZG93LCBEaSA9IGFzeW5jIChlKSA9PiBuZXcgUHJvbWlzZSgodCwgcikgPT4ge1xuICB0cnkge1xuICAgIGUub24oXCJwYXltZW50bWV0aG9kXCIsIGFzeW5jIChuKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhcInBheW1lbnRtZXRob2QgRVZUOjogXCIsIG4pLCB0KG4pO1xuICAgIH0pLCBlLm9uKFwidG9rZW5cIiwgYXN5bmMgKG4pID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKFwidG9rZW4gRVZUOjogXCIsIG4pO1xuICAgIH0pLCBlLm9uKFwiY2FuY2VsXCIsICgpID0+IHtcbiAgICAgIHIobmV3IEVycm9yKFwiUGF5bWVudCBjYW5jZWxsZWQsIHBsZWFzZSBjbGljayBTdWJtaXQgYWdhaW4gdG8gcGF5XCIpKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAobikge1xuICAgIHIobik7XG4gIH1cbn0pLCBPaSA9IGFzeW5jIChlLCB0KSA9PiB7XG4gIGlmICghZS5zdHJpcGVfcGsgfHwgIWUuY2xpZW50X3NlY3JldClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbmV4dCBhY3Rpb24gbWV0YWRhdGEgZm9ybWF0OiAke0pTT04uc3RyaW5naWZ5KGUpfWApO1xuICBjb25zdCBuID0gYXdhaXQgKGF3YWl0IEF0KGUuc3RyaXBlX3BrKSkuY29uZmlybUNhcmRTZXR1cChlLmNsaWVudF9zZWNyZXQsIHtcbiAgICBwYXltZW50X21ldGhvZDogdC5wYXltZW50TWV0aG9kLmlkXG4gIH0pO1xuICBpZiAobi5lcnJvcilcbiAgICB0aHJvdyB0LmNvbXBsZXRlKFwiZmFpbFwiKSwgbmV3IEVycm9yKGBQYXltZW50IGZhaWxlZDogJHtuLmVycm9yLm1lc3NhZ2UgPz8gXCJ1bmtub3duXCJ9YCk7XG4gIHJldHVybiB0LmNvbXBsZXRlKFwic3VjY2Vzc1wiKSwgbjtcbn0sIFVpID0gYXN5bmMgKGUpID0+IHtcbiAgY29uc3QgciA9IGF3YWl0IChhd2FpdCBBdChlLnN0cmlwZV9waykpLmNvbmZpcm1DYXJkU2V0dXAoZS5jbGllbnRfc2VjcmV0LCB7XG4gICAgcGF5bWVudF9tZXRob2Q6IGUuc3RyaXBlX3BtX2lkXG4gIH0pLCBuID0gci5zZXR1cEludGVudD8uc3RhdHVzO1xuICBpZiAobiA9PT0gXCJzdWNjZWVkZWRcIilcbiAgICBjb25zb2xlLmxvZyhcIlszRFNdIENPTkZJUk1JTkcgUE06XCIsIGUuc3RyaXBlX3BtX2lkKSwgY29uc29sZS5sb2coXCJbM0RTXSBTZXR1cCBpbnRlbnQgY3JlYXRlZDpcIiwgci5zZXR1cEludGVudCk7XG4gIGVsc2UgdGhyb3cgbiA9PT0gXCJjYW5jZWxlZFwiID8gbmV3IEVycm9yKFwiUGF5bWVudCBjYW5jZWxsZWQsIHBsZWFzZSBjbGljayBTdWJtaXQgYWdhaW4gdG8gcGF5XCIpIDogbmV3IEVycm9yKFxuICAgIGAke3IuZXJyb3I/Lm1lc3NhZ2UgPz8gci5zZXR1cEludGVudD8ubGFzdF9zZXR1cF9lcnJvcj8ubWVzc2FnZSA/PyBcIlBheW1lbnQgZmFpbGVkLCBwbGVhc2UgY2xpY2sgc3VibWl0IGFnYWluIHRvIHBheS5cIn1gXG4gICk7XG59O1xudmFyIGppID0gdHlwZW9mIGdsb2JhbFRoaXMgPT0gXCJvYmplY3RcIiA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygc2VsZiA9PSBcIm9iamVjdFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgPT0gXCJvYmplY3RcIiA/IHdpbmRvdyA6IHR5cGVvZiBnbG9iYWwgPT0gXCJvYmplY3RcIiA/IGdsb2JhbCA6IHt9LCBDZSA9IFwiMS45LjBcIiwgQ3IgPSAvXihcXGQrKVxcLihcXGQrKVxcLihcXGQrKSgtKC4rKSk/JC87XG5mdW5jdGlvbiAkaShlKSB7XG4gIHZhciB0ID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoW2VdKSwgciA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCksIG4gPSBlLm1hdGNoKENyKTtcbiAgaWYgKCFuKVxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICB2YXIgbyA9IHtcbiAgICBtYWpvcjogK25bMV0sXG4gICAgbWlub3I6ICtuWzJdLFxuICAgIHBhdGNoOiArblszXSxcbiAgICBwcmVyZWxlYXNlOiBuWzRdXG4gIH07XG4gIGlmIChvLnByZXJlbGVhc2UgIT0gbnVsbClcbiAgICByZXR1cm4gZnVuY3Rpb24obCkge1xuICAgICAgcmV0dXJuIGwgPT09IGU7XG4gICAgfTtcbiAgZnVuY3Rpb24gaShjKSB7XG4gICAgcmV0dXJuIHIuYWRkKGMpLCBmYWxzZTtcbiAgfVxuICBmdW5jdGlvbiBzKGMpIHtcbiAgICByZXR1cm4gdC5hZGQoYyksIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKGwpIHtcbiAgICBpZiAodC5oYXMobCkpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoci5oYXMobCkpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHUgPSBsLm1hdGNoKENyKTtcbiAgICBpZiAoIXUpXG4gICAgICByZXR1cm4gaShsKTtcbiAgICB2YXIgZCA9IHtcbiAgICAgIG1ham9yOiArdVsxXSxcbiAgICAgIG1pbm9yOiArdVsyXSxcbiAgICAgIHBhdGNoOiArdVszXSxcbiAgICAgIHByZXJlbGVhc2U6IHVbNF1cbiAgICB9O1xuICAgIHJldHVybiBkLnByZXJlbGVhc2UgIT0gbnVsbCB8fCBvLm1ham9yICE9PSBkLm1ham9yID8gaShsKSA6IG8ubWFqb3IgPT09IDAgPyBvLm1pbm9yID09PSBkLm1pbm9yICYmIG8ucGF0Y2ggPD0gZC5wYXRjaCA/IHMobCkgOiBpKGwpIDogby5taW5vciA8PSBkLm1pbm9yID8gcyhsKSA6IGkobCk7XG4gIH07XG59XG52YXIgR2kgPSAkaShDZSksIFZpID0gQ2Uuc3BsaXQoXCIuXCIpWzBdLCBLZSA9IFN5bWJvbC5mb3IoXCJvcGVudGVsZW1ldHJ5LmpzLmFwaS5cIiArIFZpKSwgUWUgPSBqaTtcbmZ1bmN0aW9uIFF0KGUsIHQsIHIsIG4pIHtcbiAgdmFyIG87XG4gIG4gPT09IHZvaWQgMCAmJiAobiA9IGZhbHNlKTtcbiAgdmFyIGkgPSBRZVtLZV0gPSAobyA9IFFlW0tlXSkgIT09IG51bGwgJiYgbyAhPT0gdm9pZCAwID8gbyA6IHtcbiAgICB2ZXJzaW9uOiBDZVxuICB9O1xuICBpZiAoIW4gJiYgaVtlXSkge1xuICAgIHZhciBzID0gbmV3IEVycm9yKFwiQG9wZW50ZWxlbWV0cnkvYXBpOiBBdHRlbXB0ZWQgZHVwbGljYXRlIHJlZ2lzdHJhdGlvbiBvZiBBUEk6IFwiICsgZSk7XG4gICAgcmV0dXJuIHIuZXJyb3Iocy5zdGFjayB8fCBzLm1lc3NhZ2UpLCBmYWxzZTtcbiAgfVxuICBpZiAoaS52ZXJzaW9uICE9PSBDZSkge1xuICAgIHZhciBzID0gbmV3IEVycm9yKFwiQG9wZW50ZWxlbWV0cnkvYXBpOiBSZWdpc3RyYXRpb24gb2YgdmVyc2lvbiB2XCIgKyBpLnZlcnNpb24gKyBcIiBmb3IgXCIgKyBlICsgXCIgZG9lcyBub3QgbWF0Y2ggcHJldmlvdXNseSByZWdpc3RlcmVkIEFQSSB2XCIgKyBDZSk7XG4gICAgcmV0dXJuIHIuZXJyb3Iocy5zdGFjayB8fCBzLm1lc3NhZ2UpLCBmYWxzZTtcbiAgfVxuICByZXR1cm4gaVtlXSA9IHQsIHIuZGVidWcoXCJAb3BlbnRlbGVtZXRyeS9hcGk6IFJlZ2lzdGVyZWQgYSBnbG9iYWwgZm9yIFwiICsgZSArIFwiIHZcIiArIENlICsgXCIuXCIpLCB0cnVlO1xufVxuZnVuY3Rpb24gWGUoZSkge1xuICB2YXIgdCwgciwgbiA9ICh0ID0gUWVbS2VdKSA9PT0gbnVsbCB8fCB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0LnZlcnNpb247XG4gIGlmICghKCFuIHx8ICFHaShuKSkpXG4gICAgcmV0dXJuIChyID0gUWVbS2VdKSA9PT0gbnVsbCB8fCByID09PSB2b2lkIDAgPyB2b2lkIDAgOiByW2VdO1xufVxuZnVuY3Rpb24gWHQoZSwgdCkge1xuICB0LmRlYnVnKFwiQG9wZW50ZWxlbWV0cnkvYXBpOiBVbnJlZ2lzdGVyaW5nIGEgZ2xvYmFsIGZvciBcIiArIGUgKyBcIiB2XCIgKyBDZSArIFwiLlwiKTtcbiAgdmFyIHIgPSBRZVtLZV07XG4gIHIgJiYgZGVsZXRlIHJbZV07XG59XG52YXIgcWkgPSBmdW5jdGlvbihlLCB0KSB7XG4gIHZhciByID0gdHlwZW9mIFN5bWJvbCA9PSBcImZ1bmN0aW9uXCIgJiYgZVtTeW1ib2wuaXRlcmF0b3JdO1xuICBpZiAoIXIpIHJldHVybiBlO1xuICB2YXIgbiA9IHIuY2FsbChlKSwgbywgaSA9IFtdLCBzO1xuICB0cnkge1xuICAgIGZvciAoOyAodCA9PT0gdm9pZCAwIHx8IHQtLSA+IDApICYmICEobyA9IG4ubmV4dCgpKS5kb25lOyApIGkucHVzaChvLnZhbHVlKTtcbiAgfSBjYXRjaCAoYykge1xuICAgIHMgPSB7IGVycm9yOiBjIH07XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIG8gJiYgIW8uZG9uZSAmJiAociA9IG4ucmV0dXJuKSAmJiByLmNhbGwobik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChzKSB0aHJvdyBzLmVycm9yO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaTtcbn0sIHppID0gZnVuY3Rpb24oZSwgdCwgcikge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgbiA9IDAsIG8gPSB0Lmxlbmd0aCwgaTsgbiA8IG87IG4rKylcbiAgICAoaSB8fCAhKG4gaW4gdCkpICYmIChpIHx8IChpID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCwgMCwgbikpLCBpW25dID0gdFtuXSk7XG4gIHJldHVybiBlLmNvbmNhdChpIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQpKTtcbn0sIEJpID0gKFxuICAvKiogQGNsYXNzICovXG4gIChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBlKHQpIHtcbiAgICAgIHRoaXMuX25hbWVzcGFjZSA9IHQubmFtZXNwYWNlIHx8IFwiRGlhZ0NvbXBvbmVudExvZ2dlclwiO1xuICAgIH1cbiAgICByZXR1cm4gZS5wcm90b3R5cGUuZGVidWcgPSBmdW5jdGlvbigpIHtcbiAgICAgIGZvciAodmFyIHQgPSBbXSwgciA9IDA7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspXG4gICAgICAgIHRbcl0gPSBhcmd1bWVudHNbcl07XG4gICAgICByZXR1cm4gR2UoXCJkZWJ1Z1wiLCB0aGlzLl9uYW1lc3BhY2UsIHQpO1xuICAgIH0sIGUucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICBmb3IgKHZhciB0ID0gW10sIHIgPSAwOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKVxuICAgICAgICB0W3JdID0gYXJndW1lbnRzW3JdO1xuICAgICAgcmV0dXJuIEdlKFwiZXJyb3JcIiwgdGhpcy5fbmFtZXNwYWNlLCB0KTtcbiAgICB9LCBlLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24oKSB7XG4gICAgICBmb3IgKHZhciB0ID0gW10sIHIgPSAwOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKVxuICAgICAgICB0W3JdID0gYXJndW1lbnRzW3JdO1xuICAgICAgcmV0dXJuIEdlKFwiaW5mb1wiLCB0aGlzLl9uYW1lc3BhY2UsIHQpO1xuICAgIH0sIGUucHJvdG90eXBlLndhcm4gPSBmdW5jdGlvbigpIHtcbiAgICAgIGZvciAodmFyIHQgPSBbXSwgciA9IDA7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspXG4gICAgICAgIHRbcl0gPSBhcmd1bWVudHNbcl07XG4gICAgICByZXR1cm4gR2UoXCJ3YXJuXCIsIHRoaXMuX25hbWVzcGFjZSwgdCk7XG4gICAgfSwgZS5wcm90b3R5cGUudmVyYm9zZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgZm9yICh2YXIgdCA9IFtdLCByID0gMDsgciA8IGFyZ3VtZW50cy5sZW5ndGg7IHIrKylcbiAgICAgICAgdFtyXSA9IGFyZ3VtZW50c1tyXTtcbiAgICAgIHJldHVybiBHZShcInZlcmJvc2VcIiwgdGhpcy5fbmFtZXNwYWNlLCB0KTtcbiAgICB9LCBlO1xuICB9KSgpXG4pO1xuZnVuY3Rpb24gR2UoZSwgdCwgcikge1xuICB2YXIgbiA9IFhlKFwiZGlhZ1wiKTtcbiAgaWYgKG4pXG4gICAgcmV0dXJuIHIudW5zaGlmdCh0KSwgbltlXS5hcHBseShuLCB6aShbXSwgcWkociksIGZhbHNlKSk7XG59XG52YXIgWjtcbihmdW5jdGlvbihlKSB7XG4gIGVbZS5OT05FID0gMF0gPSBcIk5PTkVcIiwgZVtlLkVSUk9SID0gMzBdID0gXCJFUlJPUlwiLCBlW2UuV0FSTiA9IDUwXSA9IFwiV0FSTlwiLCBlW2UuSU5GTyA9IDYwXSA9IFwiSU5GT1wiLCBlW2UuREVCVUcgPSA3MF0gPSBcIkRFQlVHXCIsIGVbZS5WRVJCT1NFID0gODBdID0gXCJWRVJCT1NFXCIsIGVbZS5BTEwgPSA5OTk5XSA9IFwiQUxMXCI7XG59KShaIHx8IChaID0ge30pKTtcbmZ1bmN0aW9uIEhpKGUsIHQpIHtcbiAgZSA8IFouTk9ORSA/IGUgPSBaLk5PTkUgOiBlID4gWi5BTEwgJiYgKGUgPSBaLkFMTCksIHQgPSB0IHx8IHt9O1xuICBmdW5jdGlvbiByKG4sIG8pIHtcbiAgICB2YXIgaSA9IHRbbl07XG4gICAgcmV0dXJuIHR5cGVvZiBpID09IFwiZnVuY3Rpb25cIiAmJiBlID49IG8gPyBpLmJpbmQodCkgOiBmdW5jdGlvbigpIHtcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgZXJyb3I6IHIoXCJlcnJvclwiLCBaLkVSUk9SKSxcbiAgICB3YXJuOiByKFwid2FyblwiLCBaLldBUk4pLFxuICAgIGluZm86IHIoXCJpbmZvXCIsIFouSU5GTyksXG4gICAgZGVidWc6IHIoXCJkZWJ1Z1wiLCBaLkRFQlVHKSxcbiAgICB2ZXJib3NlOiByKFwidmVyYm9zZVwiLCBaLlZFUkJPU0UpXG4gIH07XG59XG52YXIgWWkgPSBmdW5jdGlvbihlLCB0KSB7XG4gIHZhciByID0gdHlwZW9mIFN5bWJvbCA9PSBcImZ1bmN0aW9uXCIgJiYgZVtTeW1ib2wuaXRlcmF0b3JdO1xuICBpZiAoIXIpIHJldHVybiBlO1xuICB2YXIgbiA9IHIuY2FsbChlKSwgbywgaSA9IFtdLCBzO1xuICB0cnkge1xuICAgIGZvciAoOyAodCA9PT0gdm9pZCAwIHx8IHQtLSA+IDApICYmICEobyA9IG4ubmV4dCgpKS5kb25lOyApIGkucHVzaChvLnZhbHVlKTtcbiAgfSBjYXRjaCAoYykge1xuICAgIHMgPSB7IGVycm9yOiBjIH07XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIG8gJiYgIW8uZG9uZSAmJiAociA9IG4ucmV0dXJuKSAmJiByLmNhbGwobik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChzKSB0aHJvdyBzLmVycm9yO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaTtcbn0sIFdpID0gZnVuY3Rpb24oZSwgdCwgcikge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgbiA9IDAsIG8gPSB0Lmxlbmd0aCwgaTsgbiA8IG87IG4rKylcbiAgICAoaSB8fCAhKG4gaW4gdCkpICYmIChpIHx8IChpID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCwgMCwgbikpLCBpW25dID0gdFtuXSk7XG4gIHJldHVybiBlLmNvbmNhdChpIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQpKTtcbn0sIEppID0gXCJkaWFnXCIsIHZ0ID0gKFxuICAvKiogQGNsYXNzICovXG4gIChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgZnVuY3Rpb24gdChvKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gW10sIHMgPSAwOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKVxuICAgICAgICAgICAgaVtzXSA9IGFyZ3VtZW50c1tzXTtcbiAgICAgICAgICB2YXIgYyA9IFhlKFwiZGlhZ1wiKTtcbiAgICAgICAgICBpZiAoYylcbiAgICAgICAgICAgIHJldHVybiBjW29dLmFwcGx5KGMsIFdpKFtdLCBZaShpKSwgZmFsc2UpKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHZhciByID0gdGhpcywgbiA9IGZ1bmN0aW9uKG8sIGkpIHtcbiAgICAgICAgdmFyIHMsIGMsIGw7XG4gICAgICAgIGlmIChpID09PSB2b2lkIDAgJiYgKGkgPSB7IGxvZ0xldmVsOiBaLklORk8gfSksIG8gPT09IHIpIHtcbiAgICAgICAgICB2YXIgdSA9IG5ldyBFcnJvcihcIkNhbm5vdCB1c2UgZGlhZyBhcyB0aGUgbG9nZ2VyIGZvciBpdHNlbGYuIFBsZWFzZSB1c2UgYSBEaWFnTG9nZ2VyIGltcGxlbWVudGF0aW9uIGxpa2UgQ29uc29sZURpYWdMb2dnZXIgb3IgYSBjdXN0b20gaW1wbGVtZW50YXRpb25cIik7XG4gICAgICAgICAgcmV0dXJuIHIuZXJyb3IoKHMgPSB1LnN0YWNrKSAhPT0gbnVsbCAmJiBzICE9PSB2b2lkIDAgPyBzIDogdS5tZXNzYWdlKSwgZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdHlwZW9mIGkgPT0gXCJudW1iZXJcIiAmJiAoaSA9IHtcbiAgICAgICAgICBsb2dMZXZlbDogaVxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGQgPSBYZShcImRpYWdcIiksIGYgPSBIaSgoYyA9IGkubG9nTGV2ZWwpICE9PSBudWxsICYmIGMgIT09IHZvaWQgMCA/IGMgOiBaLklORk8sIG8pO1xuICAgICAgICBpZiAoZCAmJiAhaS5zdXBwcmVzc092ZXJyaWRlTWVzc2FnZSkge1xuICAgICAgICAgIHZhciBfID0gKGwgPSBuZXcgRXJyb3IoKS5zdGFjaykgIT09IG51bGwgJiYgbCAhPT0gdm9pZCAwID8gbCA6IFwiPGZhaWxlZCB0byBnZW5lcmF0ZSBzdGFja3RyYWNlPlwiO1xuICAgICAgICAgIGQud2FybihcIkN1cnJlbnQgbG9nZ2VyIHdpbGwgYmUgb3ZlcndyaXR0ZW4gZnJvbSBcIiArIF8pLCBmLndhcm4oXCJDdXJyZW50IGxvZ2dlciB3aWxsIG92ZXJ3cml0ZSBvbmUgYWxyZWFkeSByZWdpc3RlcmVkIGZyb20gXCIgKyBfKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUXQoXCJkaWFnXCIsIGYsIHIsIHRydWUpO1xuICAgICAgfTtcbiAgICAgIHIuc2V0TG9nZ2VyID0gbiwgci5kaXNhYmxlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIFh0KEppLCByKTtcbiAgICAgIH0sIHIuY3JlYXRlQ29tcG9uZW50TG9nZ2VyID0gZnVuY3Rpb24obykge1xuICAgICAgICByZXR1cm4gbmV3IEJpKG8pO1xuICAgICAgfSwgci52ZXJib3NlID0gdChcInZlcmJvc2VcIiksIHIuZGVidWcgPSB0KFwiZGVidWdcIiksIHIuaW5mbyA9IHQoXCJpbmZvXCIpLCByLndhcm4gPSB0KFwid2FyblwiKSwgci5lcnJvciA9IHQoXCJlcnJvclwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGUuaW5zdGFuY2UgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZSB8fCAodGhpcy5faW5zdGFuY2UgPSBuZXcgZSgpKSwgdGhpcy5faW5zdGFuY2U7XG4gICAgfSwgZTtcbiAgfSkoKVxuKTtcbmZ1bmN0aW9uIFppKGUpIHtcbiAgcmV0dXJuIFN5bWJvbC5mb3IoZSk7XG59XG52YXIgS2kgPSAoXG4gIC8qKiBAY2xhc3MgKi9cbiAgLyogQF9fUFVSRV9fICovIChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBlKHQpIHtcbiAgICAgIHZhciByID0gdGhpcztcbiAgICAgIHIuX2N1cnJlbnRDb250ZXh0ID0gdCA/IG5ldyBNYXAodCkgOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCByLmdldFZhbHVlID0gZnVuY3Rpb24obikge1xuICAgICAgICByZXR1cm4gci5fY3VycmVudENvbnRleHQuZ2V0KG4pO1xuICAgICAgfSwgci5zZXRWYWx1ZSA9IGZ1bmN0aW9uKG4sIG8pIHtcbiAgICAgICAgdmFyIGkgPSBuZXcgZShyLl9jdXJyZW50Q29udGV4dCk7XG4gICAgICAgIHJldHVybiBpLl9jdXJyZW50Q29udGV4dC5zZXQobiwgbyksIGk7XG4gICAgICB9LCByLmRlbGV0ZVZhbHVlID0gZnVuY3Rpb24obikge1xuICAgICAgICB2YXIgbyA9IG5ldyBlKHIuX2N1cnJlbnRDb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIG8uX2N1cnJlbnRDb250ZXh0LmRlbGV0ZShuKSwgbztcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBlO1xuICB9KSgpXG4pLCBRaSA9IG5ldyBLaSgpLCBYaSA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgdmFyIHIgPSB0eXBlb2YgU3ltYm9sID09IFwiZnVuY3Rpb25cIiAmJiBlW1N5bWJvbC5pdGVyYXRvcl07XG4gIGlmICghcikgcmV0dXJuIGU7XG4gIHZhciBuID0gci5jYWxsKGUpLCBvLCBpID0gW10sIHM7XG4gIHRyeSB7XG4gICAgZm9yICg7ICh0ID09PSB2b2lkIDAgfHwgdC0tID4gMCkgJiYgIShvID0gbi5uZXh0KCkpLmRvbmU7ICkgaS5wdXNoKG8udmFsdWUpO1xuICB9IGNhdGNoIChjKSB7XG4gICAgcyA9IHsgZXJyb3I6IGMgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgbyAmJiAhby5kb25lICYmIChyID0gbi5yZXR1cm4pICYmIHIuY2FsbChuKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHMpIHRocm93IHMuZXJyb3I7XG4gICAgfVxuICB9XG4gIHJldHVybiBpO1xufSwgZXMgPSBmdW5jdGlvbihlLCB0LCByKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBuID0gMCwgbyA9IHQubGVuZ3RoLCBpOyBuIDwgbzsgbisrKVxuICAgIChpIHx8ICEobiBpbiB0KSkgJiYgKGkgfHwgKGkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0LCAwLCBuKSksIGlbbl0gPSB0W25dKTtcbiAgcmV0dXJuIGUuY29uY2F0KGkgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCkpO1xufSwgdHMgPSAoXG4gIC8qKiBAY2xhc3MgKi9cbiAgKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIGUoKSB7XG4gICAgfVxuICAgIHJldHVybiBlLnByb3RvdHlwZS5hY3RpdmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBRaTtcbiAgICB9LCBlLnByb3RvdHlwZS53aXRoID0gZnVuY3Rpb24odCwgciwgbikge1xuICAgICAgZm9yICh2YXIgbyA9IFtdLCBpID0gMzsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICAgICAgb1tpIC0gM10gPSBhcmd1bWVudHNbaV07XG4gICAgICByZXR1cm4gci5jYWxsLmFwcGx5KHIsIGVzKFtuXSwgWGkobyksIGZhbHNlKSk7XG4gICAgfSwgZS5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uKHQsIHIpIHtcbiAgICAgIHJldHVybiByO1xuICAgIH0sIGUucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSwgZS5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSwgZTtcbiAgfSkoKVxuKSwgcnMgPSBmdW5jdGlvbihlLCB0KSB7XG4gIHZhciByID0gdHlwZW9mIFN5bWJvbCA9PSBcImZ1bmN0aW9uXCIgJiYgZVtTeW1ib2wuaXRlcmF0b3JdO1xuICBpZiAoIXIpIHJldHVybiBlO1xuICB2YXIgbiA9IHIuY2FsbChlKSwgbywgaSA9IFtdLCBzO1xuICB0cnkge1xuICAgIGZvciAoOyAodCA9PT0gdm9pZCAwIHx8IHQtLSA+IDApICYmICEobyA9IG4ubmV4dCgpKS5kb25lOyApIGkucHVzaChvLnZhbHVlKTtcbiAgfSBjYXRjaCAoYykge1xuICAgIHMgPSB7IGVycm9yOiBjIH07XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIG8gJiYgIW8uZG9uZSAmJiAociA9IG4ucmV0dXJuKSAmJiByLmNhbGwobik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChzKSB0aHJvdyBzLmVycm9yO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaTtcbn0sIG5zID0gZnVuY3Rpb24oZSwgdCwgcikge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgbiA9IDAsIG8gPSB0Lmxlbmd0aCwgaTsgbiA8IG87IG4rKylcbiAgICAoaSB8fCAhKG4gaW4gdCkpICYmIChpIHx8IChpID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCwgMCwgbikpLCBpW25dID0gdFtuXSk7XG4gIHJldHVybiBlLmNvbmNhdChpIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQpKTtcbn0sIE90ID0gXCJjb250ZXh0XCIsIG9zID0gbmV3IHRzKCksIGVyID0gKFxuICAvKiogQGNsYXNzICovXG4gIChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBlKCkge1xuICAgIH1cbiAgICByZXR1cm4gZS5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlIHx8ICh0aGlzLl9pbnN0YW5jZSA9IG5ldyBlKCkpLCB0aGlzLl9pbnN0YW5jZTtcbiAgICB9LCBlLnByb3RvdHlwZS5zZXRHbG9iYWxDb250ZXh0TWFuYWdlciA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgIHJldHVybiBRdChPdCwgdCwgdnQuaW5zdGFuY2UoKSk7XG4gICAgfSwgZS5wcm90b3R5cGUuYWN0aXZlID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0Q29udGV4dE1hbmFnZXIoKS5hY3RpdmUoKTtcbiAgICB9LCBlLnByb3RvdHlwZS53aXRoID0gZnVuY3Rpb24odCwgciwgbikge1xuICAgICAgZm9yICh2YXIgbywgaSA9IFtdLCBzID0gMzsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7IHMrKylcbiAgICAgICAgaVtzIC0gM10gPSBhcmd1bWVudHNbc107XG4gICAgICByZXR1cm4gKG8gPSB0aGlzLl9nZXRDb250ZXh0TWFuYWdlcigpKS53aXRoLmFwcGx5KG8sIG5zKFt0LCByLCBuXSwgcnMoaSksIGZhbHNlKSk7XG4gICAgfSwgZS5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uKHQsIHIpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRDb250ZXh0TWFuYWdlcigpLmJpbmQodCwgcik7XG4gICAgfSwgZS5wcm90b3R5cGUuX2dldENvbnRleHRNYW5hZ2VyID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gWGUoT3QpIHx8IG9zO1xuICAgIH0sIGUucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuX2dldENvbnRleHRNYW5hZ2VyKCkuZGlzYWJsZSgpLCBYdChPdCwgdnQuaW5zdGFuY2UoKSk7XG4gICAgfSwgZTtcbiAgfSkoKVxuKSwgSHQ7XG4oZnVuY3Rpb24oZSkge1xuICBlW2UuTk9ORSA9IDBdID0gXCJOT05FXCIsIGVbZS5TQU1QTEVEID0gMV0gPSBcIlNBTVBMRURcIjtcbn0pKEh0IHx8IChIdCA9IHt9KSk7XG52YXIgX24gPSBcIjAwMDAwMDAwMDAwMDAwMDBcIiwgZm4gPSBcIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwXCIsIGFzID0ge1xuICB0cmFjZUlkOiBmbixcbiAgc3BhbklkOiBfbixcbiAgdHJhY2VGbGFnczogSHQuTk9ORVxufSwgSmUgPSAoXG4gIC8qKiBAY2xhc3MgKi9cbiAgKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIGUodCkge1xuICAgICAgdCA9PT0gdm9pZCAwICYmICh0ID0gYXMpLCB0aGlzLl9zcGFuQ29udGV4dCA9IHQ7XG4gICAgfVxuICAgIHJldHVybiBlLnByb3RvdHlwZS5zcGFuQ29udGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NwYW5Db250ZXh0O1xuICAgIH0sIGUucHJvdG90eXBlLnNldEF0dHJpYnV0ZSA9IGZ1bmN0aW9uKHQsIHIpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sIGUucHJvdG90eXBlLnNldEF0dHJpYnV0ZXMgPSBmdW5jdGlvbih0KSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBlLnByb3RvdHlwZS5hZGRFdmVudCA9IGZ1bmN0aW9uKHQsIHIpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sIGUucHJvdG90eXBlLmFkZExpbmsgPSBmdW5jdGlvbih0KSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBlLnByb3RvdHlwZS5hZGRMaW5rcyA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sIGUucHJvdG90eXBlLnNldFN0YXR1cyA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sIGUucHJvdG90eXBlLnVwZGF0ZU5hbWUgPSBmdW5jdGlvbih0KSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBlLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbih0KSB7XG4gICAgfSwgZS5wcm90b3R5cGUuaXNSZWNvcmRpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LCBlLnByb3RvdHlwZS5yZWNvcmRFeGNlcHRpb24gPSBmdW5jdGlvbih0LCByKSB7XG4gICAgfSwgZTtcbiAgfSkoKVxuKSwgdHIgPSBaaShcIk9wZW5UZWxlbWV0cnkgQ29udGV4dCBLZXkgU1BBTlwiKTtcbmZ1bmN0aW9uIHJyKGUpIHtcbiAgcmV0dXJuIGUuZ2V0VmFsdWUodHIpIHx8IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGlzKCkge1xuICByZXR1cm4gcnIoZXIuZ2V0SW5zdGFuY2UoKS5hY3RpdmUoKSk7XG59XG5mdW5jdGlvbiBucihlLCB0KSB7XG4gIHJldHVybiBlLnNldFZhbHVlKHRyLCB0KTtcbn1cbmZ1bmN0aW9uIHNzKGUpIHtcbiAgcmV0dXJuIGUuZGVsZXRlVmFsdWUodHIpO1xufVxuZnVuY3Rpb24gY3MoZSwgdCkge1xuICByZXR1cm4gbnIoZSwgbmV3IEplKHQpKTtcbn1cbmZ1bmN0aW9uIHluKGUpIHtcbiAgdmFyIHQ7XG4gIHJldHVybiAodCA9IHJyKGUpKSA9PT0gbnVsbCB8fCB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0LnNwYW5Db250ZXh0KCk7XG59XG52YXIgbHMgPSAvXihbMC05YS1mXXszMn0pJC9pLCB1cyA9IC9eWzAtOWEtZl17MTZ9JC9pO1xuZnVuY3Rpb24gZHMoZSkge1xuICByZXR1cm4gbHMudGVzdChlKSAmJiBlICE9PSBmbjtcbn1cbmZ1bmN0aW9uIHBzKGUpIHtcbiAgcmV0dXJuIHVzLnRlc3QoZSkgJiYgZSAhPT0gX247XG59XG5mdW5jdGlvbiBobihlKSB7XG4gIHJldHVybiBkcyhlLnRyYWNlSWQpICYmIHBzKGUuc3BhbklkKTtcbn1cbmZ1bmN0aW9uIG1zKGUpIHtcbiAgcmV0dXJuIG5ldyBKZShlKTtcbn1cbnZhciBVdCA9IGVyLmdldEluc3RhbmNlKCksIGduID0gKFxuICAvKiogQGNsYXNzICovXG4gIChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBlKCkge1xuICAgIH1cbiAgICByZXR1cm4gZS5wcm90b3R5cGUuc3RhcnRTcGFuID0gZnVuY3Rpb24odCwgciwgbikge1xuICAgICAgbiA9PT0gdm9pZCAwICYmIChuID0gVXQuYWN0aXZlKCkpO1xuICAgICAgdmFyIG8gPSAhIXI/LnJvb3Q7XG4gICAgICBpZiAobylcbiAgICAgICAgcmV0dXJuIG5ldyBKZSgpO1xuICAgICAgdmFyIGkgPSBuICYmIHluKG4pO1xuICAgICAgcmV0dXJuIF9zKGkpICYmIGhuKGkpID8gbmV3IEplKGkpIDogbmV3IEplKCk7XG4gICAgfSwgZS5wcm90b3R5cGUuc3RhcnRBY3RpdmVTcGFuID0gZnVuY3Rpb24odCwgciwgbiwgbykge1xuICAgICAgdmFyIGksIHMsIGM7XG4gICAgICBpZiAoIShhcmd1bWVudHMubGVuZ3RoIDwgMikpIHtcbiAgICAgICAgYXJndW1lbnRzLmxlbmd0aCA9PT0gMiA/IGMgPSByIDogYXJndW1lbnRzLmxlbmd0aCA9PT0gMyA/IChpID0gciwgYyA9IG4pIDogKGkgPSByLCBzID0gbiwgYyA9IG8pO1xuICAgICAgICB2YXIgbCA9IHMgPz8gVXQuYWN0aXZlKCksIHUgPSB0aGlzLnN0YXJ0U3Bhbih0LCBpLCBsKSwgZCA9IG5yKGwsIHUpO1xuICAgICAgICByZXR1cm4gVXQud2l0aChkLCBjLCB2b2lkIDAsIHUpO1xuICAgICAgfVxuICAgIH0sIGU7XG4gIH0pKClcbik7XG5mdW5jdGlvbiBfcyhlKSB7XG4gIHJldHVybiB0eXBlb2YgZSA9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBlLnNwYW5JZCA9PSBcInN0cmluZ1wiICYmIHR5cGVvZiBlLnRyYWNlSWQgPT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgZS50cmFjZUZsYWdzID09IFwibnVtYmVyXCI7XG59XG52YXIgZnMgPSBuZXcgZ24oKSwgeXMgPSAoXG4gIC8qKiBAY2xhc3MgKi9cbiAgKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIGUodCwgciwgbiwgbykge1xuICAgICAgdGhpcy5fcHJvdmlkZXIgPSB0LCB0aGlzLm5hbWUgPSByLCB0aGlzLnZlcnNpb24gPSBuLCB0aGlzLm9wdGlvbnMgPSBvO1xuICAgIH1cbiAgICByZXR1cm4gZS5wcm90b3R5cGUuc3RhcnRTcGFuID0gZnVuY3Rpb24odCwgciwgbikge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldFRyYWNlcigpLnN0YXJ0U3Bhbih0LCByLCBuKTtcbiAgICB9LCBlLnByb3RvdHlwZS5zdGFydEFjdGl2ZVNwYW4gPSBmdW5jdGlvbih0LCByLCBuLCBvKSB7XG4gICAgICB2YXIgaSA9IHRoaXMuX2dldFRyYWNlcigpO1xuICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkoaS5zdGFydEFjdGl2ZVNwYW4sIGksIGFyZ3VtZW50cyk7XG4gICAgfSwgZS5wcm90b3R5cGUuX2dldFRyYWNlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuX2RlbGVnYXRlKVxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGU7XG4gICAgICB2YXIgdCA9IHRoaXMuX3Byb3ZpZGVyLmdldERlbGVnYXRlVHJhY2VyKHRoaXMubmFtZSwgdGhpcy52ZXJzaW9uLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHQgPyAodGhpcy5fZGVsZWdhdGUgPSB0LCB0aGlzLl9kZWxlZ2F0ZSkgOiBmcztcbiAgICB9LCBlO1xuICB9KSgpXG4pLCBocyA9IChcbiAgLyoqIEBjbGFzcyAqL1xuICAoZnVuY3Rpb24oKSB7XG4gICAgZnVuY3Rpb24gZSgpIHtcbiAgICB9XG4gICAgcmV0dXJuIGUucHJvdG90eXBlLmdldFRyYWNlciA9IGZ1bmN0aW9uKHQsIHIsIG4pIHtcbiAgICAgIHJldHVybiBuZXcgZ24oKTtcbiAgICB9LCBlO1xuICB9KSgpXG4pLCBncyA9IG5ldyBocygpLCBTciA9IChcbiAgLyoqIEBjbGFzcyAqL1xuICAoZnVuY3Rpb24oKSB7XG4gICAgZnVuY3Rpb24gZSgpIHtcbiAgICB9XG4gICAgcmV0dXJuIGUucHJvdG90eXBlLmdldFRyYWNlciA9IGZ1bmN0aW9uKHQsIHIsIG4pIHtcbiAgICAgIHZhciBvO1xuICAgICAgcmV0dXJuIChvID0gdGhpcy5nZXREZWxlZ2F0ZVRyYWNlcih0LCByLCBuKSkgIT09IG51bGwgJiYgbyAhPT0gdm9pZCAwID8gbyA6IG5ldyB5cyh0aGlzLCB0LCByLCBuKTtcbiAgICB9LCBlLnByb3RvdHlwZS5nZXREZWxlZ2F0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHQ7XG4gICAgICByZXR1cm4gKHQgPSB0aGlzLl9kZWxlZ2F0ZSkgIT09IG51bGwgJiYgdCAhPT0gdm9pZCAwID8gdCA6IGdzO1xuICAgIH0sIGUucHJvdG90eXBlLnNldERlbGVnYXRlID0gZnVuY3Rpb24odCkge1xuICAgICAgdGhpcy5fZGVsZWdhdGUgPSB0O1xuICAgIH0sIGUucHJvdG90eXBlLmdldERlbGVnYXRlVHJhY2VyID0gZnVuY3Rpb24odCwgciwgbikge1xuICAgICAgdmFyIG87XG4gICAgICByZXR1cm4gKG8gPSB0aGlzLl9kZWxlZ2F0ZSkgPT09IG51bGwgfHwgbyA9PT0gdm9pZCAwID8gdm9pZCAwIDogby5nZXRUcmFjZXIodCwgciwgbik7XG4gICAgfSwgZTtcbiAgfSkoKVxuKSwgZXQ7XG4oZnVuY3Rpb24oZSkge1xuICBlW2UuSU5URVJOQUwgPSAwXSA9IFwiSU5URVJOQUxcIiwgZVtlLlNFUlZFUiA9IDFdID0gXCJTRVJWRVJcIiwgZVtlLkNMSUVOVCA9IDJdID0gXCJDTElFTlRcIiwgZVtlLlBST0RVQ0VSID0gM10gPSBcIlBST0RVQ0VSXCIsIGVbZS5DT05TVU1FUiA9IDRdID0gXCJDT05TVU1FUlwiO1xufSkoZXQgfHwgKGV0ID0ge30pKTtcbnZhciB3ZTtcbihmdW5jdGlvbihlKSB7XG4gIGVbZS5VTlNFVCA9IDBdID0gXCJVTlNFVFwiLCBlW2UuT0sgPSAxXSA9IFwiT0tcIiwgZVtlLkVSUk9SID0gMl0gPSBcIkVSUk9SXCI7XG59KSh3ZSB8fCAod2UgPSB7fSkpO1xudmFyIFRlID0gZXIuZ2V0SW5zdGFuY2UoKSwganQgPSBcInRyYWNlXCIsIHdzID0gKFxuICAvKiogQGNsYXNzICovXG4gIChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBlKCkge1xuICAgICAgdGhpcy5fcHJveHlUcmFjZXJQcm92aWRlciA9IG5ldyBTcigpLCB0aGlzLndyYXBTcGFuQ29udGV4dCA9IG1zLCB0aGlzLmlzU3BhbkNvbnRleHRWYWxpZCA9IGhuLCB0aGlzLmRlbGV0ZVNwYW4gPSBzcywgdGhpcy5nZXRTcGFuID0gcnIsIHRoaXMuZ2V0QWN0aXZlU3BhbiA9IGlzLCB0aGlzLmdldFNwYW5Db250ZXh0ID0geW4sIHRoaXMuc2V0U3BhbiA9IG5yLCB0aGlzLnNldFNwYW5Db250ZXh0ID0gY3M7XG4gICAgfVxuICAgIHJldHVybiBlLmdldEluc3RhbmNlID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2UgfHwgKHRoaXMuX2luc3RhbmNlID0gbmV3IGUoKSksIHRoaXMuX2luc3RhbmNlO1xuICAgIH0sIGUucHJvdG90eXBlLnNldEdsb2JhbFRyYWNlclByb3ZpZGVyID0gZnVuY3Rpb24odCkge1xuICAgICAgdmFyIHIgPSBRdChqdCwgdGhpcy5fcHJveHlUcmFjZXJQcm92aWRlciwgdnQuaW5zdGFuY2UoKSk7XG4gICAgICByZXR1cm4gciAmJiB0aGlzLl9wcm94eVRyYWNlclByb3ZpZGVyLnNldERlbGVnYXRlKHQpLCByO1xuICAgIH0sIGUucHJvdG90eXBlLmdldFRyYWNlclByb3ZpZGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gWGUoanQpIHx8IHRoaXMuX3Byb3h5VHJhY2VyUHJvdmlkZXI7XG4gICAgfSwgZS5wcm90b3R5cGUuZ2V0VHJhY2VyID0gZnVuY3Rpb24odCwgcikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VHJhY2VyUHJvdmlkZXIoKS5nZXRUcmFjZXIodCwgcik7XG4gICAgfSwgZS5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgWHQoanQsIHZ0Lmluc3RhbmNlKCkpLCB0aGlzLl9wcm94eVRyYWNlclByb3ZpZGVyID0gbmV3IFNyKCk7XG4gICAgfSwgZTtcbiAgfSkoKVxuKSwgTWUgPSB3cy5nZXRJbnN0YW5jZSgpO1xuY29uc3QgdnMgPSBhc3luYyAoZSwgdCwgcikgPT4ge1xuICBjb25zdCBuID0gTWUuZ2V0VHJhY2VyKFwib3BlbnBheS1qc1wiKSwgbyA9IFRlLmFjdGl2ZSgpLCBpID0gbi5zdGFydFNwYW4oXG4gICAgYGNkZS4ke3QudHlwZX1gLFxuICAgIHtcbiAgICAgIGtpbmQ6IGV0LkNMSUVOVCxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgXCJtZXNzYWdlLnR5cGVcIjogdC50eXBlLFxuICAgICAgICAuLi5lLnRyYWNpbmdDb250ZXh0ICYmIHtcbiAgICAgICAgICBcIm9qcy5jaGVja291dFNlY3VyZVRva2VuXCI6IGUudHJhY2luZ0NvbnRleHQuY2hlY2tvdXRTZWN1cmVUb2tlbixcbiAgICAgICAgICBcIm9qcy5kZXZpY2VUb2tlblwiOiBlLnRyYWNpbmdDb250ZXh0LmRldmljZVRva2VuLFxuICAgICAgICAgIFwib2pzLmZvcm1JZFwiOiBlLnRyYWNpbmdDb250ZXh0LmZvcm1JZCxcbiAgICAgICAgICBcIm9qcy52ZXJzaW9uXCI6IGUudHJhY2luZ0NvbnRleHQudmVyc2lvbixcbiAgICAgICAgICBcIm9qcy5yZWxlYXNlX3ZlcnNpb25cIjogZS50cmFjaW5nQ29udGV4dC5yZWxlYXNlVmVyc2lvbixcbiAgICAgICAgICBcIm9qcy5iYXNlX3VybFwiOiBlLnRyYWNpbmdDb250ZXh0LmJhc2VVcmwsXG4gICAgICAgICAgXCJvanMucmVmZXJyZXJcIjogZS50cmFjaW5nQ29udGV4dC5yZWZlcnJlclxuICAgICAgICB9LFxuICAgICAgICBcImNkZS5tZXNzYWdlLnR5cGVcIjogdC50eXBlLFxuICAgICAgICBcImNkZS5tZXNzYWdlLnBheWxvYWRcIjogSlNPTi5zdHJpbmdpZnkodC5wYXlsb2FkKVxuICAgICAgfVxuICAgIH0sXG4gICAgb1xuICApO1xuICByZXR1cm4gVGUud2l0aChNZS5zZXRTcGFuKG8sIGkpLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHMgPSBhd2FpdCByKCk7XG4gICAgICByZXR1cm4gaS5zZXRTdGF0dXMoeyBjb2RlOiB3ZS5PSyB9KSwgcztcbiAgICB9IGNhdGNoIChzKSB7XG4gICAgICB0aHJvdyBpLnNldFN0YXR1cyh7XG4gICAgICAgIGNvZGU6IHdlLkVSUk9SLFxuICAgICAgICBtZXNzYWdlOiBzIGluc3RhbmNlb2YgRXJyb3IgPyBzLm1lc3NhZ2UgOiBcIlVua25vd24gZXJyb3JcIlxuICAgICAgfSksIHM7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGkuZW5kKCk7XG4gICAgfVxuICB9KTtcbn0sIGx0ID0gYXN5bmMgKGUsIHQpID0+IHtcbiAgY29uc3QgciA9IE1lLmdldFRyYWNlcihcIm9wZW5wYXktanNcIiksIG4gPSBUZS5hY3RpdmUoKSwgbyA9IHIuc3RhcnRTcGFuKFxuICAgIGBmb3JtLiR7ZS5zcGFuTmFtZX1gLFxuICAgIHtcbiAgICAgIGtpbmQ6IGV0LkNMSUVOVCxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgXCJvanMuY2hlY2tvdXRTZWN1cmVUb2tlblwiOiBlLmNoZWNrb3V0U2VjdXJlVG9rZW4sXG4gICAgICAgIFwib2pzLmRldmljZVRva2VuXCI6IGUuZGV2aWNlVG9rZW4sXG4gICAgICAgIFwib2pzLmZvcm1JZFwiOiBlLmZvcm1JZCxcbiAgICAgICAgXCJvanMudmVyc2lvblwiOiBlLnZlcnNpb24sXG4gICAgICAgIFwib2pzLnJlbGVhc2VfdmVyc2lvblwiOiBlLnJlbGVhc2VWZXJzaW9uLFxuICAgICAgICBcIm9qcy5iYXNlX3VybFwiOiBlLmJhc2VVcmwsXG4gICAgICAgIFwib2pzLnJlZmVycmVyXCI6IGUucmVmZXJyZXIsXG4gICAgICAgIC4uLmUucGF5bWVudFJvdXRlSWQgJiYgeyBcInBheW1lbnQucm91dGVfaWRcIjogZS5wYXltZW50Um91dGVJZCB9XG4gICAgICB9XG4gICAgfSxcbiAgICBuXG4gICk7XG4gIHRyeSB7XG4gICAgY29uc3QgaSA9IGF3YWl0IHQoKTtcbiAgICByZXR1cm4gby5zZXRTdGF0dXMoeyBjb2RlOiB3ZS5PSyB9KSwgaTtcbiAgfSBjYXRjaCAoaSkge1xuICAgIGNvbnN0IHMgPSBpIGluc3RhbmNlb2YgRXJyb3IgPyBpLm1lc3NhZ2UgOiBcIlVua25vd24gZXJyb3JcIjtcbiAgICB0aHJvdyBvLnNldFN0YXR1cyh7XG4gICAgICBjb2RlOiB3ZS5FUlJPUixcbiAgICAgIG1lc3NhZ2U6IHNcbiAgICB9KSwgaTtcbiAgfSBmaW5hbGx5IHtcbiAgICBvLmVuZCgpO1xuICB9XG59O1xuY2xhc3Mgd24gZXh0ZW5kcyBfbyB7XG4gIGNvbnN0cnVjdG9yKHQpIHtcbiAgICBjb25zdCByID0gYCR7dC5tZXNzYWdlfWA7XG4gICAgc3VwZXIociksIHRoaXMucmVzcG9uc2UgPSB0O1xuICB9XG4gIGdldCBvcmlnaW5hbEVycm9yTWVzc2FnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXNwb25zZS5tZXNzYWdlO1xuICB9XG59XG5jb25zdCBCID0gYXN5bmMgKGUsIHQsIHIsIG4pID0+IHZzKGUsIHQsIGFzeW5jICgpID0+IHtcbiAgbiAmJiBnKG4sIHtcbiAgICAuLi50XG4gIH0pO1xuICBjb25zdCBvID0gYXdhaXQgZS5zZW5kKHQpO1xuICBpZiAoUHMobykpIHtcbiAgICBjb25zdCBpID0gbmF2aWdhdG9yLmNvbm5lY3Rpb247XG4gICAgdGhyb3cgZyhcImNkZV9yZXNwb25zZV9lcnJvclwiLCB7XG4gICAgICBlcnJvcl9tZXNzYWdlOiBvLm1lc3NhZ2UsXG4gICAgICBtZXNzYWdlX3R5cGU6IHQudHlwZSxcbiAgICAgIHVzZXJfYWdlbnQ6IG5hdmlnYXRvci51c2VyQWdlbnQsXG4gICAgICBvbmxpbmU6IG5hdmlnYXRvci5vbkxpbmUsXG4gICAgICBoYXNfZm9jdXM6IGRvY3VtZW50Lmhhc0ZvY3VzKCksXG4gICAgICBocmVmOiB3aW5kb3cubG9jYXRpb24uaHJlZixcbiAgICAgIGRvY3VtZW50X3Zpc2liaWxpdHlfc3RhdGU6IGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSxcbiAgICAgIGNvbm5lY3Rpb25fZG93bmxpbms6IGk/LmRvd25saW5rLFxuICAgICAgY29ubmVjdGlvbl9lZmZlY3RpdmVfdHlwZTogaT8uZWZmZWN0aXZlVHlwZSxcbiAgICAgIGNvbm5lY3Rpb25fcnR0OiBpPy5ydHQsXG4gICAgICBjb25uZWN0aW9uX3NhdmVfZGF0YTogaT8uc2F2ZURhdGFcbiAgICB9KSwgbmV3IHduKG8pO1xuICB9XG4gIGlmICghYnMobywgcikpIHtcbiAgICBjb25zdCBpID0gci5zYWZlUGFyc2Uobyk7XG4gICAgdGhyb3cgaS5zdWNjZXNzID8gbmV3IEVycm9yKFwiSW52YWxpZCBzdGF0ZVwiKSA6IChjb25zb2xlLmVycm9yKFwiT0pTIHF1ZXJ5QXBpIGdvdCBhIHNjaGVtYSBlcnJvci4gRXhwZWN0ZWQgc2NoZW1hOlwiLCByLCBcIkFjdHVhbDpcIiwgbyksIGkuZXJyb3IpO1xuICB9XG4gIHJldHVybiBuICYmIGcobiwge1xuICAgIC4uLm9cbiAgfSksIG87XG59KSwgYnMgPSAoZSwgdCkgPT4gdC5zYWZlUGFyc2UoZSkuc3VjY2VzcywgUHMgPSAoZSkgPT4gS28uc2FmZVBhcnNlKGUpLnN1Y2Nlc3MsIEVzID0gYXN5bmMgKGUsIHQpID0+IGF3YWl0IEIoZSwgeyB0eXBlOiBcImdldF9jaGVja291dF9wcmV2aWV3XCIsIHBheWxvYWQ6IHQgfSwgS3IpLCBNID0gYXN5bmMgKGUpID0+IGF3YWl0IEIoZSwgeyB0eXBlOiBcImdldF9wcmVmaWxsXCIsIHBheWxvYWQ6IHt9IH0sIFFyKSwgWCA9IGFzeW5jIChlLCB0KSA9PiBhd2FpdCBCKFxuICBlLFxuICB7IHR5cGU6IFwidjJfc3RhcnRfcGF5bWVudF9mbG93XCIsIHBheWxvYWQ6IHQgfSxcbiAgdG4sXG4gIFwic3RhcnRfcGF5bWVudF9mbG93XCJcbiksIHZuID0gYXN5bmMgKGUsIHQpID0+IGF3YWl0IEIoXG4gIGUsXG4gIHsgdHlwZTogXCJzdGFydF9wYXltZW50X2Zsb3dfZm9yX2NjXCIsIHBheWxvYWQ6IHQgfSxcbiAgZGEsXG4gIFwic3RhcnRfcGF5bWVudF9mbG93X2Zvcl9jY1wiXG4pLCBDcyA9IGFzeW5jIChlLCB0KSA9PiB7XG4gIGcoXCJzdGFydF9wYXltZW50X2Zsb3dfZm9yX3ByXCIsIHtcbiAgICAuLi50XG4gIH0pO1xuICBjb25zdCByID0gYXdhaXQgQihlLCB7IHR5cGU6IFwic3RhcnRfcGF5bWVudF9mbG93X2Zvcl9wclwiLCBwYXlsb2FkOiB0IH0sIHRuKTtcbiAgcmV0dXJuIGcoXCJzdGFydF9wYXltZW50X2Zsb3dfZm9yX3ByX3Jlc3VsdFwiLCB7XG4gICAgLi4uclxuICB9KSwgcjtcbn0sIEQgPSBhc3luYyAoZSwgdCkgPT4gYXdhaXQgQihcbiAgZSxcbiAgeyB0eXBlOiBcImNvbmZpcm1fcGF5bWVudF9mbG93XCIsIHBheWxvYWQ6IHQgfSxcbiAgVm8sXG4gIFwiY29uZmlybV9wYXltZW50X2Zsb3dcIlxuKSwgU3MgPSBhc3luYyAoZSwgdCkgPT4gYXdhaXQgQihcbiAgZSxcbiAgeyB0eXBlOiBcImZpbmFsaXplX3NldHVwX3BheW1lbnRfbWV0aG9kXCIsIHBheWxvYWQ6IHQgfSxcbiAgWHIsXG4gIFwiZmluYWxpemVfc2V0dXBfcGF5bWVudF9tZXRob2RcIlxuKSwga3MgPSBhc3luYyAoZSwgdCkgPT4gYXdhaXQgQihcbiAgZSxcbiAgeyB0eXBlOiBcImNoZWNrX2lmX3BvcHVwX3dpbmRvd192ZXJpZmllZFwiLCBwYXlsb2FkOiB0IH0sXG4gIEdvLFxuICBcImNoZWNrX2lmX3BvcHVwX3dpbmRvd192ZXJpZmllZFwiXG4pLCBBcyA9IGFzeW5jIChlLCB0LCByKSA9PiB7XG4gIGNvbnN0IG4gPSBhd2FpdCBFcyhlLCB7XG4gICAgc2VjdXJlX3Rva2VuOiB0LFxuICAgIHByb21vdGlvbl9jb2RlOiByXG4gIH0pLCBvID0gbmV3IFNldChuLnByZXZpZXcuaW52b2ljZXMubWFwKChjKSA9PiBjLmN1cnJlbmN5KSk7XG4gIGlmIChvLnNpemUgIT09IDEpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBleGFjdGx5IG9uZSBjdXJyZW5jeSwgZ290ICR7by5zaXplfWApO1xuICBjb25zdCBpID0gby52YWx1ZXMoKS5uZXh0KCkudmFsdWUgPz8gXCJ1c2RcIiwgcyA9IFNhKG4ucHJldmlldy5pbnZvaWNlcy5tYXAoKGMpID0+IGMucmVtYWluaW5nX2Ftb3VudF9hdG9tKSk7XG4gIHJldHVybiB7XG4gICAgY3VycmVuY3k6IGksXG4gICAgYW1vdW50QXRvbTogc1xuICB9O1xufSwgX2UgPSBhc3luYyAoZSwgdCwgciwgbikgPT4ge1xuICBpZiAocilcbiAgICByZXR1cm4geyBhbW91bnRBdG9tOiAwLCBjdXJyZW5jeTogXCJ1c2RcIiB9O1xuICB7XG4gICAgbiA9IG4gfHwgdm9pZCAwLCBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwicHJvbW9Db2RlXCIpICYmICFuICYmIChuID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcInByb21vQ29kZVwiKSk7XG4gICAgY29uc3QgbyA9IGF3YWl0IEFzKGUsIHQsIG4pO1xuICAgIHJldHVybiB7IGFtb3VudEF0b206IG8uYW1vdW50QXRvbSwgY3VycmVuY3k6IG8uY3VycmVuY3kgfTtcbiAgfVxufSwgYm4gPSBhc3luYyAoZSwgdCkgPT4ge1xuICBpZiAoZS5zaXplID09PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIENERSBjb25uZWN0aW9ucyBmb3VuZFwiKTtcbiAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIEFycmF5LmZyb20oZS52YWx1ZXMoKSkubWFwKFxuICAgICAgKG4pID0+IEIobiwgeyB0eXBlOiBcInRva2VuaXplX2NhcmRcIiwgcGF5bG9hZDogdCB9LCBVbylcbiAgICApXG4gICk7XG59LCBrciA9IGFzeW5jIChlLCB0KSA9PiBhd2FpdCBCKFxuICBlLFxuICB7IHR5cGU6IFwiY2hlY2tvdXRfY2FyZF9lbGVtZW50c1wiLCBwYXlsb2FkOiB0IH0sXG4gIFplLFxuICBcImNoZWNrb3V0X2NhcmRfZWxlbWVudHNcIlxuKSwgSXMgPSBhc3luYyAoZSwgdCkgPT4gYXdhaXQgQihlLCB7IHR5cGU6IFwic2V0dXBfcGF5bWVudF9tZXRob2RcIiwgcGF5bG9hZDogdCB9LCBYciwgXCJzZXR1cF9jaGVja291dFwiKSwgb3IgPSBhc3luYyAoZSwgdCkgPT4gYXdhaXQgQihlLCB7IHR5cGU6IFwiY2hlY2tvdXRcIiwgcGF5bG9hZDogdCB9LCBaZSwgXCJwZXJmb3JtX2NoZWNrb3V0XCIpLCBQbiA9IDFlMywgUnMgPSBhc3luYyAoZSwgdCwgciwgbikgPT4ge1xuICBjb25zb2xlLmxvZyh0KTtcbiAgY29uc3QgaSA9IGF3YWl0IGNvbm5lY3RUb0NoaWxkKHtcbiAgICBpZnJhbWU6IGUsXG4gICAgZGVidWc6IHRydWUsXG4gICAgdGltZW91dDogUG4sXG4gICAgY2hpbGRPcmlnaW46IFwiKlwiXG4gICAgLy8gVE9ETzogdXNlIHdpdGggcHJvcGVyIGNoaWxkT3JpZ2luXG4gIH0pLnByb21pc2UsIHMgPSBhd2FpdCBCKGksIHsgdHlwZTogciB9LCBuKTtcbiAgcmV0dXJuIGNvbnNvbGUubG9nKFwi8J+foiBDREUgY29ubmVjdGlvbiBzdWNjZXNzZnVsISBTdG9wcGluZyBwb2xsaW5nLi4uIFJlc3VsdDpcIiwgcyksIHM7XG59LCBSdCA9IGFzeW5jIChlLCB0KSA9PiBhd2FpdCBCKFxuICBlLFxuICB7IHR5cGU6IFwicHJlcGFyZV9wYXltZW50X2Zsb3dcIiwgcGF5bG9hZDogdCB9LFxuICBtYSxcbiAgXCJwcmVwYXJlX3BheW1lbnRfZmxvd1wiXG4pLCBFbiA9IGFzeW5jIChlLCB0KSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChhd2FpdCBCKFxuICAgICAgZSxcbiAgICAgIHsgdHlwZTogXCJnZXRfc3RhbmRhcmRpemVkX2Vycm9yX2NvZGVcIiwgcGF5bG9hZDogeyBtZXNzYWdlOiB0IH0gfSxcbiAgICAgIHBhXG4gICAgKSkuZXJyb3JfY29kZTtcbiAgfSBjYXRjaCAocikge1xuICAgIHJldHVybiBjb25zb2xlLmVycm9yKFwiW2NkZS1jbGllbnRdIEVycm9yIGR1cmluZyBnZXRTdGFuZGFyZGl6ZWRFcnJvckNvZGU6XCIsIEsocikpLCBcIlBBWU1FTlRfRkFJTEVEX0dFTkVSSUNcIjtcbiAgfVxufSwgVHMgPSBhc3luYyAoZSwgdCkgPT4gYXdhaXQgQihcbiAgZSxcbiAgeyB0eXBlOiBcInNldF91c2VyX2RldmljZV90b2tlblwiLCBwYXlsb2FkOiB7IGRldmljZV90b2tlbjogdCB9IH0sXG4gIF9hXG4pLCBOcyA9IGFzeW5jIChlKSA9PiB7XG4gIGlmICh0eXBlb2YgZSAhPSBcIm9iamVjdFwiIHx8ICFlKSByZXR1cm4gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3QgdCA9IHsgdHlwZTogXCJwaW5nXCIgfSwgciA9IGF3YWl0IGUuc2VuZCh0KTtcbiAgICBpZiAociAhPT0gITApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICd0cnVlJyBhZnRlciBwaW5nLCBnb3QgJHtKU09OLnN0cmluZ2lmeShyKX1gKTtcbiAgICByZXR1cm4gITA7XG4gIH0gY2F0Y2ggKHQpIHtcbiAgICByZXR1cm4gY29uc29sZS5lcnJvcihcIkludmFsaWQgQ0RFIGNvbm5lY3Rpb24gY2hlY2s6XCIsIHQpLCBmYWxzZTtcbiAgfVxufSwgRnMgPSAoZSwgdCkgPT4gISFlICYmIHQsIENuID0gXCJodHRwczovL2NkZS5nZXRvcGVucGF5LmNvbVwiLCBTbiA9IFwiMDEyMzQ1Njc4OUFCQ0RFRkdISktNTlBRUlNUVldYWVpcIiwgYnQgPSAzMiwgTHMgPSAxNiwga24gPSAxMCwgQXIgPSAyODE0NzQ5NzY3MTA2NTU7XG52YXIgU2U7XG4oZnVuY3Rpb24oZSkge1xuICBlLkJhc2UzMkluY29ycmVjdEVuY29kaW5nID0gXCJCMzJfRU5DX0lOVkFMSURcIiwgZS5EZWNvZGVUaW1lSW52YWxpZENoYXJhY3RlciA9IFwiREVDX1RJTUVfQ0hBUlwiLCBlLkRlY29kZVRpbWVWYWx1ZU1hbGZvcm1lZCA9IFwiREVDX1RJTUVfTUFMRk9STUVEXCIsIGUuRW5jb2RlVGltZU5lZ2F0aXZlID0gXCJFTkNfVElNRV9ORUdcIiwgZS5FbmNvZGVUaW1lU2l6ZUV4Y2VlZGVkID0gXCJFTkNfVElNRV9TSVpFX0VYQ0VFRFwiLCBlLkVuY29kZVRpbWVWYWx1ZU1hbGZvcm1lZCA9IFwiRU5DX1RJTUVfTUFMRk9STUVEXCIsIGUuUFJOR0RldGVjdEZhaWx1cmUgPSBcIlBSTkdfREVURUNUXCIsIGUuVUxJREludmFsaWQgPSBcIlVMSURfSU5WQUxJRFwiLCBlLlVuZXhwZWN0ZWQgPSBcIlVORVhQRUNURURcIiwgZS5VVUlESW52YWxpZCA9IFwiVVVJRF9JTlZBTElEXCI7XG59KShTZSB8fCAoU2UgPSB7fSkpO1xuY2xhc3MgemUgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHQsIHIpIHtcbiAgICBzdXBlcihgJHtyfSAoJHt0fSlgKSwgdGhpcy5uYW1lID0gXCJVTElERXJyb3JcIiwgdGhpcy5jb2RlID0gdDtcbiAgfVxufVxuZnVuY3Rpb24gTXMoZSkge1xuICBjb25zdCB0ID0gTWF0aC5mbG9vcihlKCkgKiBidCkgJSBidDtcbiAgcmV0dXJuIFNuLmNoYXJBdCh0KTtcbn1cbmZ1bmN0aW9uIHhzKGUpIHtcbiAgY29uc3QgdCA9IERzKCksIHIgPSB0ICYmICh0LmNyeXB0byB8fCB0Lm1zQ3J5cHRvKSB8fCBudWxsO1xuICBpZiAodHlwZW9mIHI/LmdldFJhbmRvbVZhbHVlcyA9PSBcImZ1bmN0aW9uXCIpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IG4gPSBuZXcgVWludDhBcnJheSgxKTtcbiAgICAgIHJldHVybiByLmdldFJhbmRvbVZhbHVlcyhuKSwgblswXSAvIDI1NTtcbiAgICB9O1xuICBpZiAodHlwZW9mIHI/LnJhbmRvbUJ5dGVzID09IFwiZnVuY3Rpb25cIilcbiAgICByZXR1cm4gKCkgPT4gci5yYW5kb21CeXRlcygxKS5yZWFkVUludDgoKSAvIDI1NTtcbiAgdGhyb3cgbmV3IHplKFNlLlBSTkdEZXRlY3RGYWlsdXJlLCBcIkZhaWxlZCB0byBmaW5kIGEgcmVsaWFibGUgUFJOR1wiKTtcbn1cbmZ1bmN0aW9uIERzKCkge1xuICByZXR1cm4ganMoKSA/IHNlbGYgOiB0eXBlb2Ygd2luZG93IDwgXCJ1XCIgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsIDwgXCJ1XCIgPyBnbG9iYWwgOiB0eXBlb2YgZ2xvYmFsVGhpcyA8IFwidVwiID8gZ2xvYmFsVGhpcyA6IG51bGw7XG59XG5mdW5jdGlvbiBPcyhlLCB0KSB7XG4gIGxldCByID0gXCJcIjtcbiAgZm9yICg7IGUgPiAwOyBlLS0pXG4gICAgciA9IE1zKHQpICsgcjtcbiAgcmV0dXJuIHI7XG59XG5mdW5jdGlvbiBVcyhlLCB0ID0ga24pIHtcbiAgaWYgKGlzTmFOKGUpKVxuICAgIHRocm93IG5ldyB6ZShTZS5FbmNvZGVUaW1lVmFsdWVNYWxmb3JtZWQsIGBUaW1lIG11c3QgYmUgYSBudW1iZXI6ICR7ZX1gKTtcbiAgaWYgKGUgPiBBcilcbiAgICB0aHJvdyBuZXcgemUoU2UuRW5jb2RlVGltZVNpemVFeGNlZWRlZCwgYENhbm5vdCBlbmNvZGUgYSB0aW1lIGxhcmdlciB0aGFuICR7QXJ9OiAke2V9YCk7XG4gIGlmIChlIDwgMClcbiAgICB0aHJvdyBuZXcgemUoU2UuRW5jb2RlVGltZU5lZ2F0aXZlLCBgVGltZSBtdXN0IGJlIHBvc2l0aXZlOiAke2V9YCk7XG4gIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGUpID09PSBmYWxzZSlcbiAgICB0aHJvdyBuZXcgemUoU2UuRW5jb2RlVGltZVZhbHVlTWFsZm9ybWVkLCBgVGltZSBtdXN0IGJlIGFuIGludGVnZXI6ICR7ZX1gKTtcbiAgbGV0IHIsIG4gPSBcIlwiO1xuICBmb3IgKGxldCBvID0gdDsgbyA+IDA7IG8tLSlcbiAgICByID0gZSAlIGJ0LCBuID0gU24uY2hhckF0KHIpICsgbiwgZSA9IChlIC0gcikgLyBidDtcbiAgcmV0dXJuIG47XG59XG5mdW5jdGlvbiBqcygpIHtcbiAgcmV0dXJuIHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSA8IFwidVwiICYmIHNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZTtcbn1cbmZ1bmN0aW9uICRzKGUsIHQpIHtcbiAgY29uc3QgciA9IHhzKCksIG4gPSBEYXRlLm5vdygpO1xuICByZXR1cm4gVXMobiwga24pICsgT3MoTHMsIHIpO1xufVxuY29uc3QgQW4gPSBcIm9wX2FuYWx5dGljc19kZXZpY2VfdG9rZW5cIiwgSW4gPSAoKSA9PiB7XG4gIGNvbnN0IGUgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoXCI7XCIpLmZpbmQoKHIpID0+IHIuaW5jbHVkZXMoQW4pKTtcbiAgaWYgKGUpXG4gICAgcmV0dXJuIGUuc3BsaXQoXCI9XCIpWzFdO1xuICBjb25zdCB0ID0gJHMoKTtcbiAgcmV0dXJuIEdzKHQpLCB0O1xufSwgR3MgPSAoZSkgPT4ge1xuICBjb25zdCB0ID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7XG4gIHQuc2V0RnVsbFllYXIodC5nZXRGdWxsWWVhcigpICsgMSksIGRvY3VtZW50LmNvb2tpZSA9IGAke0FufT0ke2V9OyBwYXRoPS87IGV4cGlyZXM9JHt0LnRvVVRDU3RyaW5nKCl9YDtcbn0sIFZzID0gKGUpID0+IHtcbiAgY29uc3QgdCA9IHt9O1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZSkuZm9yRWFjaCgoW3IsIG5dKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG8gPSBWci5wYXJzZShyKTtcbiAgICAgIEFycmF5LmlzQXJyYXkobikgPyB0W29dID0gbiA6IEFycmF5LmlzQXJyYXkobi5fZXJyb3JzKSAmJiAodFtvXSA9IG4uX2Vycm9ycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9KSwgdDtcbn0sIFUgPSAoZSwgdCkgPT4gQXJyYXkuZnJvbShlLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1vcGlkXVwiKSA/PyBbXSkucmVkdWNlKChvLCBpKSA9PiB7XG4gIGNvbnN0IHMgPSBpLmdldEF0dHJpYnV0ZShcImRhdGEtb3BpZFwiKTtcbiAgaWYgKCFzKSByZXR1cm4gbztcbiAgY29uc3QgYyA9IGkudHlwZSA9PT0gXCJjaGVja2JveFwiID8gaS5jaGVja2VkIDogaS52YWx1ZTtcbiAgcmV0dXJuIHsgLi4ubywgW3NdOiBjIH07XG59LCB7fSksIHFzID0gKGUpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geG8ucGFyc2UoZSk7XG4gIH0gY2F0Y2ggKHQpIHtcbiAgICB0aHJvdyBjb25zb2xlLmVycm9yKFwiRXJyb3IgcGFyc2luZyBldmVudCBwYXlsb2FkOlwiLCBlLCB0KSwgdDtcbiAgfVxufSwgenMgPSAoKSA9PiB7XG4gIGNvbnN0IGUgPSB2NCgpLnNwbGl0KFwiLVwiKVswXTtcbiAgcmV0dXJuIHtcbiAgICBmaXJzdE5hbWU6IGB4eF8ke2V9YCxcbiAgICBsYXN0TmFtZTogYHh4XyR7ZX1gLFxuICAgIGVtYWlsOiBgeHhfJHtlfUBlbWFpbC5jb21gLFxuICAgIHppcENvZGU6IGB4eF8ke2V9YCxcbiAgICBjb3VudHJ5OiBcIlVTXCJcbiAgfTtcbn0sIG90ID0gKGUpID0+ICh7XG4gIGxpbmUxOiBlW3AuTElORTFdLFxuICBsaW5lMjogZVtwLkxJTkUyXSxcbiAgbGluZTM6IGVbcC5MSU5FM10sXG4gIGNpdHk6IGVbcC5DSVRZXSxcbiAgc3RhdGU6IGVbcC5TVEFURV0sXG4gIGNvdW50cnk6IGVbcC5DT1VOVFJZXSxcbiAgemlwX2NvZGU6IGVbcC5aSVBfQ09ERV1cbn0pLCBUdCA9IChlLCB0KSA9PiB7XG4gIGlmICh0LnJlcXVpcmVfZnVsbF9zaGlwcGluZ19hZGRyZXNzKVxuICAgIHJldHVybiB7XG4gICAgICBsaW5lMTogZVtwLlNISVBQSU5HX0xJTkUxXSxcbiAgICAgIGxpbmUyOiBlW3AuU0hJUFBJTkdfTElORTJdLFxuICAgICAgbGluZTM6IGVbcC5TSElQUElOR19MSU5FM10sXG4gICAgICBjaXR5OiBlW3AuU0hJUFBJTkdfQ0lUWV0sXG4gICAgICBzdGF0ZTogZVtwLlNISVBQSU5HX1NUQVRFXSxcbiAgICAgIGNvdW50cnk6IGVbcC5TSElQUElOR19DT1VOVFJZXSxcbiAgICAgIHppcF9jb2RlOiBlW3AuU0hJUFBJTkdfWklQX0NPREVdXG4gICAgfTtcbn0sIE50ID0gKGUsIHQpID0+IFtlLCB0XS5maWx0ZXIoQm9vbGVhbikuam9pbihcIiBcIiksIEJzID0gKHsgd2lkdGg6IGUsIGhlaWdodDogdCB9KSA9PiBgXG5Aa2V5ZnJhbWVzIGZhZGVJbiB7XG4gIGZyb20ge1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjkpO1xuICB9XG4gIHRvIHtcbiAgICBvcGFjaXR5OiAxO1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gIH1cbn1cblxuLm92ZXJsYXkge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgei1pbmRleDogMjE0NzQ4MzY0OCAhaW1wb3J0YW50O1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjUpO1xufVxuLmNvbnRhaW5lciB7XG4gIG1heC13aWR0aDogJHtlID8/IFwiNTAwcHhcIn07XG4gIG1heC1oZWlnaHQ6ICR7dCA/PyBcIjYwMHB4XCJ9O1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBhbmltYXRpb246IGZhZGVJbiAwLjNzIGVhc2Utb3V0O1xufVxuLmZyYW1lLCAjYWR5ZW4tY29udGFpbmVyLCAjYWR5ZW4tY29udGFpbmVyID4gKiB7XG4gIG1heC13aWR0aDogJHtlID8/IFwiNTAwcHhcIn07XG4gIG1heC1oZWlnaHQ6ICR7dCA/PyBcIjYwMHB4XCJ9O1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBib3JkZXI6IG5vbmU7XG59XG4uY2FuY2VsLWJ1dHRvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlcjogbm9uZTtcbiAgZm9udC1zaXplOiAxcmVtO1xuICBjb2xvcjogI2ZmZjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB0b3A6IC0xLjVyZW07XG4gIHBhZGRpbmc6IDA7XG4gIHJpZ2h0OiAwO1xufVxuYCwgSHMgPSAoeyB3aWR0aDogZSwgaGVpZ2h0OiB0IH0pID0+IGBcbkBrZXlmcmFtZXMgZmFkZUluIHtcbiAgZnJvbSB7XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOSk7XG4gIH1cbiAgdG8ge1xuICAgIG9wYWNpdHk6IDE7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgfVxufVxuXG4ub3ZlcmxheSB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICB6LWluZGV4OiAyMTQ3NDgzNjQ4ICFpbXBvcnRhbnQ7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNSk7XG59XG4uY29udGFpbmVyIHtcbiAgbWF4LXdpZHRoOiAke2UgPz8gXCI1MDBweFwifTtcbiAgbWF4LWhlaWdodDogJHt0ID8/IFwiNjAwcHhcIn07XG4gIHdpZHRoOiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBhbmltYXRpb246IGZhZGVJbiAwLjNzIGVhc2Utb3V0O1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGJveC1zaGFkb3c6IDAgMTBweCAyNXB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcbn1cbi5iYW5rLXNlbGVjdG9yLWNvbnRlbnQge1xuICBwYWRkaW5nOiAyNHB4O1xuICBtYXgtaGVpZ2h0OiBjYWxjKCR7dCA/PyBcIjYwMHB4XCJ9IC0gNDhweCk7XG4gIG92ZXJmbG93LXk6IGF1dG87XG59XG4uYmFuay1zZWxlY3Rvci1oZWFkZXIge1xuICBmb250LXNpemU6IDEuMjVyZW07XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG4gIGNvbG9yOiAjMWExYTFhO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG4uYmFuay1saXN0IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAxMnB4O1xufVxuLmJhbmstaXRlbSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHBhZGRpbmc6IDE2cHg7XG4gIGJvcmRlcjogMnB4IHNvbGlkICNlNWU1ZTU7XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xufVxuLmJhbmstaXRlbTpob3ZlciB7XG4gIGJvcmRlci1jb2xvcjogIzNiODJmNjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZmFmYztcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpO1xuICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcbn1cbi5iYW5rLWl0ZW06YWN0aXZlIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xufVxuLmJhbmstbG9nbyB7XG4gIHdpZHRoOiA0MHB4O1xuICBoZWlnaHQ6IDQwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgb2JqZWN0LWZpdDogY29udGFpbjtcbiAgbWFyZ2luLXJpZ2h0OiAxNnB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOWZhO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZTllY2VmO1xufVxuLmJhbmstbG9nby1wbGFjZWhvbGRlciB7XG4gIHdpZHRoOiA0MHB4O1xuICBoZWlnaHQ6IDQwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZWNlZjtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIG1hcmdpbi1yaWdodDogMTZweDtcbiAgY29sb3I6ICM2Yzc1N2Q7XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG4uYmFuay1pbmZvIHtcbiAgZmxleDogMTtcbn1cbi5iYW5rLWRpc3BsYXktbmFtZSB7XG4gIGZvbnQtc2l6ZTogMXJlbTtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgY29sb3I6ICMxYTFhMWE7XG4gIG1hcmdpbi1ib3R0b206IDJweDtcbn1cbi5iYW5rLW5hbWUge1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBjb2xvcjogIzZjNzU3ZDtcbn1cbi5jYW5jZWwtYnV0dG9uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgYm9yZGVyOiBub25lO1xuICBmb250LXNpemU6IDFyZW07XG4gIGNvbG9yOiAjZmZmO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRvcDogLTEuNXJlbTtcbiAgcGFkZGluZzogMDtcbiAgcmlnaHQ6IDA7XG59XG5gLCBGdCA9IChlLCB0KSA9PiB7XG4gIGNvbnN0IHsgaWQ6IHIsIHRpdGxlOiBuLCB3aWR0aDogbywgaGVpZ2h0OiBpLCBuYW1lOiBzIH0gPSB0ID8/IHt9LCBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICBjLmlubmVySFRNTCA9IGBcbiAgICA8c3R5bGU+XG4gICAgICAke0JzKHsgd2lkdGg6IG8sIGhlaWdodDogaSB9KX1cbiAgICA8L3N0eWxlPlxuICAgIDxkaXYgY2xhc3M9XCJvdmVybGF5XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJjYW5jZWwtYnV0dG9uXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDxpZnJhbWUgc3JjPVwiJHtlfVwiIGNsYXNzPVwiZnJhbWVcIiBpZD1cIiR7ciA/PyBcInRocmVlLWRzLWlmcmFtZVwifVwiIHRpdGxlPVwiJHtuID8/IFwiM0QgU2VjdXJlIHZlcmlmaWNhdGlvblwifVwiIGFsbG93PVwicGF5bWVudFwiIG5hbWU9XCIke3MgPz8gXCJ0aHJlZS1kcy1pZnJhbWVcIn1cIj48L2lmcmFtZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgO1xuICBjb25zdCBsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSwgdSA9IGwuYXR0YWNoU2hhZG93KHsgbW9kZTogXCJvcGVuXCIgfSk7XG4gIHUuYXBwZW5kQ2hpbGQoYy5jb250ZW50LmNsb25lTm9kZSh0cnVlKSk7XG4gIGNvbnN0IGQgPSB1LnF1ZXJ5U2VsZWN0b3IoXCIjdGhyZWUtZHMtaWZyYW1lXCIpLCBmID0gdS5xdWVyeVNlbGVjdG9yKFwiLmNhbmNlbC1idXR0b25cIik7XG4gIHJldHVybiBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpLCB7IGhvc3Q6IGwsIGlmcmFtZTogZCwgY2FuY2VsQnV0dG9uOiBmIH07XG59LCBSbiA9IChlLCB0KSA9PiB7XG4gIGNvbnN0IHsgd2lkdGg6IHIsIGhlaWdodDogbiwgdGl0bGU6IG8gfSA9IHQgPz8ge307XG4gIHJldHVybiBuZXcgUHJvbWlzZSgoaSwgcykgPT4ge1xuICAgIGNvbnN0IGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIiksIGwgPSBlLm1hcCgoeSwgaCkgPT4ge1xuICAgICAgY29uc3QgdyA9IHkucmVzb3VyY2VzLmxvZ29fdXJsID8gYDxpbWcgc3JjPVwiJHt5LnJlc291cmNlcy5sb2dvX3VybH1cIiBhbHQ9XCIke3kuZGlzcGxheV9uYW1lfVwiIGNsYXNzPVwiYmFuay1sb2dvXCIgLz5gIDogYDxkaXYgY2xhc3M9XCJiYW5rLWxvZ28tcGxhY2Vob2xkZXJcIj4ke3kuZGlzcGxheV9uYW1lLnN1YnN0cmluZygwLCAyKS50b1VwcGVyQ2FzZSgpfTwvZGl2PmA7XG4gICAgICByZXR1cm4gYFxuICAgICAgICA8ZGl2IGNsYXNzPVwiYmFuay1pdGVtXCIgZGF0YS1iYW5rLWluZGV4PVwiJHtofVwiPlxuICAgICAgICAgICR7d31cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFuay1pbmZvXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFuay1kaXNwbGF5LW5hbWVcIj4ke3kuZGlzcGxheV9uYW1lfTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhbmstbmFtZVwiPiR7eS5iYW5rX25hbWV9PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgYDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICAgIGMuaW5uZXJIVE1MID0gYFxuICAgICAgPHN0eWxlPlxuICAgICAgICAke0hzKHsgd2lkdGg6IHIsIGhlaWdodDogbiB9KX1cbiAgICAgIDwvc3R5bGU+XG4gICAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbmNlbC1idXR0b25cIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFuay1zZWxlY3Rvci1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFuay1zZWxlY3Rvci1oZWFkZXJcIj4ke28gPz8gXCJTZWxlY3QgeW91ciBiYW5rXCJ9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFuay1saXN0XCI+XG4gICAgICAgICAgICAgICR7bH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gICAgY29uc3QgdSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksIGQgPSB1LmF0dGFjaFNoYWRvdyh7IG1vZGU6IFwib3BlblwiIH0pO1xuICAgIGQuYXBwZW5kQ2hpbGQoYy5jb250ZW50LmNsb25lTm9kZSh0cnVlKSk7XG4gICAgY29uc3QgZiA9IGQucXVlcnlTZWxlY3RvcihcIi5jYW5jZWwtYnV0dG9uXCIpLCBfID0gZC5xdWVyeVNlbGVjdG9yQWxsKFwiLmJhbmstaXRlbVwiKSwgbSA9ICgpID0+IHtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodSk7XG4gICAgfTtcbiAgICBmLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICBtKCksIHMobmV3IEVycm9yKFwiQmFuayBzZWxlY3Rpb24gY2FuY2VsbGVkXCIpKTtcbiAgICB9KSwgXy5mb3JFYWNoKCh5LCBoKSA9PiB7XG4gICAgICB5LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgIG0oKSwgaShlW2hdKTtcbiAgICAgIH0pO1xuICAgIH0pLCBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHUpO1xuICB9KTtcbn0sIEx0ID0gKGUsIHQpID0+IHtcbiAgY29uc3QgeyB3aWR0aDogciwgaGVpZ2h0OiBuLCBiYXNlVXJsOiBvIH0gPSB0ID8/IHt9LCBpID0gbmV3IFVSTChgYXBwL2RpcmVjdF9kZWJpdC9taWNyb19kZXBvc2l0Lz90eXBlPSR7ZX1gLCBvKS50b1N0cmluZygpO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHMsIGMpID0+IHtcbiAgICBjb25zdCBsID0gRnQoaSwgeyB3aWR0aDogciwgaGVpZ2h0OiBuLCB0aXRsZTogXCJNaWNybyBEZXBvc2l0IEZvcm1cIiB9KSwgdSA9ICgpID0+IHtcbiAgICAgIGwuaG9zdC5yZW1vdmUoKTtcbiAgICB9LCBkID0gKCkgPT4ge1xuICAgICAgdSgpLCBjKG5ldyBFcnJvcihcIk1pY3JvIGRlcG9zaXQgZm9ybSBjYW5jZWxsZWRcIikpO1xuICAgIH0sIGYgPSAodykgPT4ge1xuICAgICAgdSgpLCB3LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIgJiYgdy5wYXlsb2FkID8gXCJlcnJvclwiIGluIHcucGF5bG9hZCA/IGMobmV3IEVycm9yKHcucGF5bG9hZC5lcnJvcikpIDogcyh3LnBheWxvYWQpIDogYyhuZXcgRXJyb3IoXCJNaWNybyBkZXBvc2l0IGZvcm0gZmFpbGVkXCIpKTtcbiAgICB9O1xuICAgIGwuY2FuY2VsQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBkKTtcbiAgICBjb25zdCBfID0gYXIoXG4gICAgICBsLmlmcmFtZSxcbiAgICAgIGYsXG4gICAgICBuZXcgVVJMKG8pLm9yaWdpbixcbiAgICAgIFwibWljcm8tZGVwb3NpdC1zdGF0dXNcIixcbiAgICAgIFpvXG4gICAgKSwgbSA9ICgpID0+IHtcbiAgICAgIGwuY2FuY2VsQnV0dG9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBkKSwgY2xlYXJJbnRlcnZhbChfKTtcbiAgICB9LCB5ID0gZCwgaCA9ICgpID0+IHtcbiAgICAgIG0oKSwgeSgpO1xuICAgIH07XG4gICAgbC5jYW5jZWxCdXR0b24ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGQpLCBsLmNhbmNlbEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaCk7XG4gIH0pO1xufTtcbmZ1bmN0aW9uIGFyKGUsIHQsIHIsIG4sIG8pIHtcbiAgY29uc3QgaSA9IGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYyA9IGF3YWl0IFJzKGUsIHIsIG4sIG8pO1xuICAgICAgYyAmJiAoY2xlYXJJbnRlcnZhbChzKSwgdChjKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgfVxuICB9O1xuICBpKCk7XG4gIGNvbnN0IHMgPSBzZXRJbnRlcnZhbChpLCBQbik7XG4gIHJldHVybiBzO1xufVxuZnVuY3Rpb24gVG4oe1xuICBlbGVtZW50czogZSxcbiAgcG9sbGluZ0ludGVydmFsOiB0LFxuICByZXNvbHZlOiByXG59KSB7XG4gIGNvbnN0IG4gPSAoKSA9PiB7XG4gICAgY2xlYXJJbnRlcnZhbCh0KSwgZS5ob3N0LnJlbW92ZSgpLCByKHsgc3RhdHVzOiBOLkNBTkNFTExFRCB9KTtcbiAgfTtcbiAgcmV0dXJuIGUuY2FuY2VsQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBuKSwgKCkgPT4ge1xuICAgIGUuY2FuY2VsQnV0dG9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBuKTtcbiAgfTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGZlKGUpIHtcbiAgY29uc3QgeyB1cmw6IHQsIGJhc2VVcmw6IHIsIGZyYW1lV2lkdGg6IG4sIGZyYW1lSGVpZ2h0OiBvLCBmcmFtZVRpdGxlOiBpIH0gPSBlLCBzID0gRnQodCwgeyB3aWR0aDogbiwgaGVpZ2h0OiBvLCB0aXRsZTogaSB9KTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChjKSA9PiB7XG4gICAgY29uc3QgbCA9IChmKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgcy5ob3N0LnJlbW92ZSgpO1xuICAgICAgfSwgMWUzKSwgYyhmKSwgZD8uKCk7XG4gICAgfSwgdSA9IGFyKFxuICAgICAgcy5pZnJhbWUsXG4gICAgICBsLFxuICAgICAgbmV3IFVSTChyKS5vcmlnaW4sXG4gICAgICBcInBpbmctM2RzLXN0YXR1c1wiLFxuICAgICAgSHJcbiAgICApLCBkID0gVG4oe1xuICAgICAgZWxlbWVudHM6IHMsXG4gICAgICBwb2xsaW5nSW50ZXJ2YWw6IHUsXG4gICAgICByZXNvbHZlOiBjXG4gICAgfSk7XG4gIH0pO1xufVxuY29uc3QgTm4gPSBhc3luYyAoZSkgPT4ge1xuICBjb25zdCB0ID0gYXdhaXQgZmUoZSk7XG4gIGlmICh0LnN0YXR1cyA9PT0gTi5DQU5DRUxMRUQpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiM0RTIHZlcmlmaWNhdGlvbiBjYW5jZWxsZWRcIik7XG4gIGlmICh0LnN0YXR1cyA9PT0gTi5GQUlMVVJFKVxuICAgIHRocm93IG5ldyBFcnJvcihcIjNEUyB2ZXJpZmljYXRpb24gZmFpbGVkXCIpO1xuICByZXR1cm4gdC5zdGF0dXMgIT09IE4uU1VDQ0VTUyAmJiBudCh0LnN0YXR1cyksIHtcbiAgICBocmVmOiB0LmhyZWZcbiAgfTtcbn0sIFlzID0gKGUsIHQpID0+IHtcbiAgY29uc3QgciA9IHdpbmRvdy5vcGVuKHQsIFwiX2JsYW5rXCIpO1xuICBpZiAoIXIpXG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2V9IHBvcHVwIHdpbmRvdyBibG9ja2VkLiBQbGVhc2UgYWxsb3cgcG9wdXBzIGZvciB0aGlzIHNpdGUuYCk7XG4gIHJldHVybiByO1xufSwgRm4gPSBhc3luYyAoZSwgdCwgciwgbikgPT4ge1xuICBjb25zdCB7IGVycl9fOiBvIH0gPSBJKFwicG9wdXAtdmVyaWZ5XCIpO1xuICByZXR1cm4gbmV3IFByb21pc2UoKGksIHMpID0+IHtcbiAgICBjb25zdCBjID0gWXMoZSwgbiksIGwgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1ID0gYXdhaXQga3ModCwgcik7XG4gICAgICAgIGlmICh1LnByZXNlbnQpXG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChsKSwgYy5jbG9zZSgpLCBpKHsgaHJlZjogdS5ocmVmIH0pO1xuICAgICAgICBlbHNlIGlmIChjLmNsb3NlZClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZX0gcGF5bWVudCBjYW5jZWxsZWRgKTtcbiAgICAgIH0gY2F0Y2ggKHUpIHtcbiAgICAgICAgbyhLKHUpKSwgY2xlYXJJbnRlcnZhbChsKSwgcyhLKHUpKTtcbiAgICAgIH1cbiAgICB9LCAxZTMpO1xuICB9KTtcbn0sIG9lID0gKCkgPT4ge1xuICBsZXQgdCA9IChuYXZpZ2F0b3IubGFuZ3VhZ2VzICYmIG5hdmlnYXRvci5sYW5ndWFnZXMubGVuZ3RoID8gbmF2aWdhdG9yLmxhbmd1YWdlcyA6IFtuYXZpZ2F0b3IubGFuZ3VhZ2VdKT8uWzBdO1xuICByZXR1cm4gdCAmJiAodCA9IHQuc3BsaXQoXCItXCIpWzBdKSwgdDtcbn0sIHsgbG9nX186IFdzLCBlcnJfXzogSnMgfSA9IEkoXCJjb21tb24tY2NcIiksIFpzID0gKHtcbiAgcmVxdWlyZV96aXBfY29kZTogZSxcbiAgcmVxdWlyZV9mdWxsX2JpbGxpbmdfYWRkcmVzczogdCxcbiAgcmVxdWlyZV9mdWxsX3NoaXBwaW5nX2FkZHJlc3M6IHIsXG4gIHBheW1lbnRfbWV0aG9kOiBuXG59KSA9PiB7XG4gIGNvbnN0IG8gPSB7fTtcbiAgcmV0dXJuIG4gPT09IFwiYWNoXCIgJiYgKG9bcC5GSVJTVF9OQU1FXSA9IHokMS5zdHJpbmcoKS5taW4oMiwgeyBtZXNzYWdlOiBcIk1pbmltdW0gbGVuZ3RoIGlzIDJcIiB9KSwgb1twLkxBU1RfTkFNRV0gPSB6JDEuc3RyaW5nKCkubWluKDIsIHsgbWVzc2FnZTogXCJNaW5pbXVtIGxlbmd0aCBpcyAyXCIgfSkpLCBlICYmIChvW3AuWklQX0NPREVdID0gQSksIHQgJiYgKG9bcC5MSU5FMV0gPSBBLCBvW3AuQ0lUWV0gPSBBLCBvW3AuU1RBVEVdID0gQSwgb1twLkNPVU5UUlldID0gQSwgb1twLlpJUF9DT0RFXSA9IEEpLCByICYmIChvW3AuU0hJUFBJTkdfTElORTFdID0gQSwgb1twLlNISVBQSU5HX0NJVFldID0gQSwgb1twLlNISVBQSU5HX1NUQVRFXSA9IEEsIG9bcC5TSElQUElOR19DT1VOVFJZXSA9IEEsIG9bcC5TSElQUElOR19aSVBfQ09ERV0gPSBBKSwgT2JqZWN0LmtleXMobykubGVuZ3RoID09PSAwID8gRmUgOiBGZS5leHRlbmQobyk7XG59LCBLcyA9IChlLCB0LCByID0ge30pID0+IHtcbiAgaWYgKHIpIHtcbiAgICBXcyhgUmVjZWl2ZWQgZGVmYXVsdCBmaWVsZCB2YWx1ZXM6ICR7SlNPTi5zdHJpbmdpZnkocil9YCk7XG4gICAgY29uc3QgaSA9IE9iamVjdC5rZXlzKHIpO1xuICAgIGZvciAobGV0IHMgPSAwOyBzIDwgaS5sZW5ndGg7IHMrKykge1xuICAgICAgY29uc3QgYyA9IGlbc10sIGwgPSByW2NdO1xuICAgICAgZVtjXSB8fCAoZVtjXSA9IGwpO1xuICAgIH1cbiAgfVxuICBlW3AuSVNfU0hJUFBJTkdfU0FNRV9BU19CSUxMSU5HXSA9ICEhZVtwLklTX1NISVBQSU5HX1NBTUVfQVNfQklMTElOR10sIGVbcC5JU19TSElQUElOR19TQU1FX0FTX0JJTExJTkddICYmIChlW3AuU0hJUFBJTkdfTElORTFdID0gZVtwLkxJTkUxXSwgZVtwLlNISVBQSU5HX0xJTkUyXSA9IGVbcC5MSU5FMl0sIGVbcC5TSElQUElOR19MSU5FM10gPSBlW3AuTElORTNdLCBlW3AuU0hJUFBJTkdfQ0lUWV0gPSBlW3AuQ0lUWV0sIGVbcC5TSElQUElOR19TVEFURV0gPSBlW3AuU1RBVEVdLCBlW3AuU0hJUFBJTkdfQ09VTlRSWV0gPSBlW3AuQ09VTlRSWV0sIGVbcC5TSElQUElOR19aSVBfQ09ERV0gPSBlW3AuWklQX0NPREVdKTtcbiAgY29uc3QgbyA9IFpzKHIpLnNhZmVQYXJzZShlKTtcbiAgaWYgKCFvLnN1Y2Nlc3MpIHtcbiAgICBjb25zdCBpID0gby5lcnJvci5mb3JtYXQoKSwgcyA9IFZzKGkpLCBjID0gT2JqZWN0LmtleXMocyk7XG4gICAgZm9yIChsZXQgbCA9IDA7IGwgPCBjLmxlbmd0aDsgbCsrKSB7XG4gICAgICBjb25zdCB1ID0gY1tsXSwgZCA9IHNbdV07XG4gICAgICB0KHUsIGQsIHUpO1xuICAgIH1cbiAgICB0aHJvdyBKcyhcIkdvdCB2YWxpZGF0aW9uIGVycm9ycyBpbiBub24tQ0RFIGZvcm0gZmllbGRzXCIsIHMpLCBuZXcgRXJyb3IoXCJBbG1vc3QgdGhlcmUhIEp1c3QgYSBmZXcgdGhpbmdzIGhpZ2hsaWdodGVkIGFib3ZlIHRvIGZpeCBiZWZvcmUgeW91IGNhbiBzdWJtaXQuXCIpO1xuICB9XG4gIHJldHVybiBvLmRhdGE7XG59LCB7IGxvZ19fOiBRcywgZXJyX186IFhzIH0gPSBJKFwiY29tbW9uLWNjXCIpLCBWID0gS3MsIExuID0gKGUsIHQpID0+IHtcbiAgZm9yIChjb25zdCByIG9mIGUpXG4gICAgaWYgKHIuc3VjY2VzcyA9PT0gZmFsc2UpXG4gICAgICB0aHJvdyByLmVycm9ycy5mb3JFYWNoKChuKSA9PiB7XG4gICAgICAgIGNvbnN0IG8gPSBCci5zYWZlUGFyc2Uobi5lbGVtZW50VHlwZSk7XG4gICAgICAgIGlmICghby5zdWNjZXNzKVxuICAgICAgICAgIFhzKGBVbmtub3duIGZpZWxkIG5hbWUgaW4gb25WYWxpZGF0aW9uRXJyb3I6ICR7bi5lbGVtZW50VHlwZX0uIEVycm9yIG9iamVjdDpgLCBuKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29uc3QgaSA9IG8uZGF0YTtcbiAgICAgICAgICB0KGksIG4uZXJyb3JzKTtcbiAgICAgICAgfVxuICAgICAgfSksIFFzKGBFcnJvciB0b2tlbml6aW5nIGNhcmQ6IGdvdCB2YWxpZGF0aW9uIGVycm9yczogJHtKU09OLnN0cmluZ2lmeShyLmVycm9ycyl9YCksIG5ldyBFcnJvcihcIkdvdCB2YWxpZGF0aW9uIGVycm9ycyB3aGlsZSB0b2tlbml6aW5nIGNhcmRcIik7XG59LCB7IGVycl9fOiBNbiB9ID0gSShcImNvbW1vblwiKSwgYXQgPSAoZSkgPT4ge1xuICBpZiAoZS5wYXltZW50X21ldGhvZHMubGVuZ3RoICE9PSAxKVxuICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZXhhY3RseSBvbmUgcGF5bWVudCBtZXRob2QsIGdvdCAke2UucGF5bWVudF9tZXRob2RzLmxlbmd0aH1gKTtcbiAgcmV0dXJuIHsgcGF5bWVudF9tZXRob2RfaWQ6IGUucGF5bWVudF9tZXRob2RzWzBdLmlkIH07XG59LCBxID0gKGUsIHQpID0+IHtcbiAgY29uc3QgciA9IGUuZmluZCgobikgPT4gdC5zYWZlUGFyc2Uobikuc3VjY2Vzcyk7XG4gIGlmICghcilcbiAgICB0aHJvdyBNbihcIk5vIENQTXMgZm91bmQgZm9yIG1vZGVsLiBBbGwgbW9kZWxzOlwiLCBlKSwgbmV3IEVycm9yKFwiTm8gQ1BNcyBmb3VuZCBmb3IgbW9kZWxcIik7XG4gIHJldHVybiB0LnBhcnNlKHIpO1xufSwgVyA9IChlLCB0KSA9PiAoe1xuICBuZXdfY3VzdG9tZXJfZW1haWw6IGUuZW1haWwsXG4gIG5ld19jdXN0b21lcl9sYXN0X25hbWU6IGUubGFzdE5hbWUsXG4gIG5ld19jdXN0b21lcl9maXJzdF9uYW1lOiBlLmZpcnN0TmFtZSxcbiAgY3VzdG9tZXJfYnVzaW5lc3NfbmFtZTogZS5idXNpbmVzc05hbWUsXG4gIGN1c3RvbWVyX3RheF9pZDogZS50YXhJZCxcbiAgY3VzdG9tZXJfdGF4X2lkX3R5cGU6IGUudGF4SWRUeXBlLFxuICBuZXdfY3VzdG9tZXJfYWRkcmVzczogb3QoZSksXG4gIG5ld19jdXN0b21lcl9zaGlwcGluZ19hZGRyZXNzOiBUdChlLCB0KVxufSksIGFlID0gYXN5bmMgKGUpID0+IHtcbiAgY29uc3QgeyBsb2dfXzogdCB9ID0gSShlLmxvZ1ByZWZpeCksIHIgPSBhd2FpdCBNKGUuYW55Q2RlQ29ubmVjdGlvbiksIG4gPSBhdChlLmNvbmZpcm1SZXN1bHQpO1xuICBpZiAoci5tb2RlID09PSBcInNldHVwXCIpXG4gICAgcmV0dXJuIHQoXCJTZXR0aW5nIHVwIHBheW1lbnQgbWV0aG9kLi4uXCIpLCB7IG1vZGU6IFwic2V0dXBcIiwgcmVzdWx0OiBhd2FpdCBTcyhlLmFueUNkZUNvbm5lY3Rpb24sIHtcbiAgICAgIHNlY3VyZV90b2tlbjogci50b2tlbixcbiAgICAgIHBtX2lkOiBuLnBheW1lbnRfbWV0aG9kX2lkXG4gICAgfSkgfTtcbiAge1xuICAgIGlmIChlLnVzZVBheUZpcnN0Rmxvdykge1xuICAgICAgaWYgKHQoXCJVc2luZyBwYXktZmlyc3QgZmxvdy4uLlwiKSwgIWUuY29uZmlybVJlc3VsdC5wYXlfZmlyc3Rfc3VjY2Vzc19yZXNwb25zZSlcbiAgICAgICAgdGhyb3cgTW4oXCJDaGVja291dCBmYWlsZWQsIG5vIHBheS1maXJzdCBzdWNjZXNzIHJlc3BvbnNlOlwiLCBlLmNvbmZpcm1SZXN1bHQpLCBuZXcgRXJyb3IoXCJDaGVja291dCBmYWlsZWQsIHBsZWFzZSB0cnkgYWdhaW4gd2l0aCBhbm90aGVyIHBheW1lbnQgbWV0aG9kLlwiKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1vZGU6IFwiY2hlY2tvdXRcIixcbiAgICAgICAgcmVzdWx0OiBlLmNvbmZpcm1SZXN1bHQucGF5X2ZpcnN0X3N1Y2Nlc3NfcmVzcG9uc2VcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IG8gPSB7XG4gICAgICBzZWN1cmVfdG9rZW46IHIudG9rZW4sXG4gICAgICBwYXltZW50X2lucHV0OiB7IHByb3ZpZGVyX3R5cGU6IGUuY2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyIH0sXG4gICAgICBjdXN0b21lcl9lbWFpbDogZS5yZXF1aXJlZEZvcm1GaWVsZHNbcC5FTUFJTF0sXG4gICAgICBjdXN0b21lcl9hZGRyZXNzOiBvdChlLnJlcXVpcmVkRm9ybUZpZWxkcyksXG4gICAgICBjdXN0b21lcl9zaGlwcGluZ19hZGRyZXNzOiBUdChlLnJlcXVpcmVkRm9ybUZpZWxkcywgci5jaGVja291dF9zZXR0aW5ncyksXG4gICAgICBwcm9tb3Rpb25fY29kZTogZS5yZXF1aXJlZEZvcm1GaWVsZHNbcC5QUk9NT1RJT05fQ09ERV0sXG4gICAgICBsaW5lX2l0ZW1zOiByLmxpbmVfaXRlbXMsXG4gICAgICB0b3RhbF9hbW91bnRfYXRvbTogci5hbW91bnRfdG90YWxfYXRvbSxcbiAgICAgIGNhbmNlbF9hdF9lbmQ6IGZhbHNlLFxuICAgICAgdXNlX2NvbmZpcm1lZF9wbV9pZDogbi5wYXltZW50X21ldGhvZF9pZCxcbiAgICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBlLmNoZWNrb3V0UGF5bWVudE1ldGhvZFxuICAgIH07XG4gICAgcmV0dXJuIHQoXCJEb2luZyBjaGVja291dC4uLlwiLCBvKSwgeyBtb2RlOiBcImNoZWNrb3V0XCIsIHJlc3VsdDogYXdhaXQgb3IoZS5hbnlDZGVDb25uZWN0aW9uLCBvKSB9O1xuICB9XG59LCBPID0geiQxLmVudW0oW1wic3RyaXBlXCIsIFwiYWlyd2FsbGV4XCIsIFwiYXV0aG9yaXplX25ldFwiLCBcImFkeWVuXCIsIFwicGF5cGFsXCIsIFwicG9ja3l0XCIsIFwibG9vcFwiXSk7XG5PLkVudW0uc3RyaXBlO1xuY29uc3QgeG4gPSAoe1xuICBzY3JpcHRJZDogZSxcbiAgc3JjOiB0LFxuICBjaGVja0xvYWRlZEZuOiByXG59KSA9PiB7XG4gIGNvbnN0IG4gPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgobywgaSkgPT4ge1xuICAgIGxldCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICBzLnNyYyA9IHQsIHMuaWQgPSBlLCBzLmFzeW5jID0gdHJ1ZTtcbiAgICBjb25zdCBjID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk7XG4gICAgcigpID8gbygpIDogYyA/IHMgPSBjIDogZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzKSwgcy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgXCJsb2FkXCIsXG4gICAgICAoKSA9PiB7XG4gICAgICAgIG4uYWJvcnQoKSwgbygpO1xuICAgICAgfSxcbiAgICAgIHsgc2lnbmFsOiBuLnNpZ25hbCB9XG4gICAgKSwgcy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgXCJlcnJvclwiLFxuICAgICAgKCkgPT4ge1xuICAgICAgICBuLmFib3J0KCksIGkoXCJGYWlsZWQgdG8gbG9hZCB0aGUgc2NyaXB0XCIpO1xuICAgICAgfSxcbiAgICAgIHsgc2lnbmFsOiBuLnNpZ25hbCB9XG4gICAgKTtcbiAgfSk7XG59LCBVZSA9ICh7XG4gIGdhdGV3YXk6IGUsXG4gIGdhdGV3YXlNZXJjaGFudElkOiB0LFxuICBtZXJjaGFudE5hbWU6IHIsXG4gIG1lcmNoYW50SWQ6IG4sXG4gIGluaXRpYWxQcmV2aWV3OiBvLFxuICBvdmVycmlkZVBheW1lbnRSZXF1ZXN0OiBpLFxuICBwcmVmaWxsOiBzXG59KSA9PiB7XG4gIGNvbnN0IGMgPSBpPy5hbW91bnQ/LmFtb3VudEF0b20gPz8gbz8uYW1vdW50QXRvbSA/PyAwLCBsID0gTWF0aC5tYXgoYyAvIDEwMCwgMCksIHUgPSAoaT8uYW1vdW50Py5jdXJyZW5jeSA/PyBzPy5jdXJyZW5jeSA/PyBvLmN1cnJlbmN5KS50b1VwcGVyQ2FzZSgpLCBkID0ge1xuICAgIGFwaVZlcnNpb246IDIsXG4gICAgYXBpVmVyc2lvbk1pbm9yOiAwLFxuICAgIGFsbG93ZWRQYXltZW50TWV0aG9kczogW1xuICAgICAge1xuICAgICAgICB0eXBlOiBcIkNBUkRcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIGFsbG93ZWRBdXRoTWV0aG9kczogW1wiUEFOX09OTFlcIiwgXCJDUllQVE9HUkFNXzNEU1wiXSxcbiAgICAgICAgICBhbGxvd2VkQ2FyZE5ldHdvcmtzOiBbXCJBTUVYXCIsIFwiRElTQ09WRVJcIiwgXCJJTlRFUkFDXCIsIFwiSkNCXCIsIFwiTUFTVEVSQ0FSRFwiLCBcIlZJU0FcIl0sXG4gICAgICAgICAgYmlsbGluZ0FkZHJlc3NSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBiaWxsaW5nQWRkcmVzc1BhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogXCJGVUxMXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFsbG93Q3JlZGl0Q2FyZHM6IHRydWUsXG4gICAgICAgICAgYWxsb3dQcmVwYWlkQ2FyZHM6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgdG9rZW5pemF0aW9uU3BlY2lmaWNhdGlvbjoge1xuICAgICAgICAgIHR5cGU6IFwiUEFZTUVOVF9HQVRFV0FZXCIsXG4gICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgZ2F0ZXdheTogZSxcbiAgICAgICAgICAgIGdhdGV3YXlNZXJjaGFudElkOiB0XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgXSxcbiAgICBlbWFpbFJlcXVpcmVkOiB0cnVlLFxuICAgIHNoaXBwaW5nQWRkcmVzc1JlcXVpcmVkOiBzLmNoZWNrb3V0X3NldHRpbmdzLnJlcXVpcmVfZnVsbF9zaGlwcGluZ19hZGRyZXNzLFxuICAgIG1lcmNoYW50SW5mbzoge1xuICAgICAgLy8gUFJPRCBlbnYgd2lsbCBuZWVkIHRoaXNcbiAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3BheS9hcGkvd2ViL3JlZmVyZW5jZS9yZXF1ZXN0LW9iamVjdHMjTWVyY2hhbnRJbmZvXG4gICAgICBtZXJjaGFudElkOiBuID8/IFwiXCIsXG4gICAgICBtZXJjaGFudE5hbWU6IHJcbiAgICB9LFxuICAgIHRyYW5zYWN0aW9uSW5mbzoge1xuICAgICAgY291bnRyeUNvZGU6IFwiVVNcIixcbiAgICAgIGN1cnJlbmN5Q29kZTogdSxcbiAgICAgIHRvdGFsUHJpY2VTdGF0dXM6IGk/LnBlbmRpbmcgPyBcIkVTVElNQVRFRFwiIDogXCJGSU5BTFwiLFxuICAgICAgdG90YWxQcmljZTogbC50b0ZpeGVkKDIpXG4gICAgfVxuICB9O1xuICByZXR1cm4gaT8uZ29vZ2xlUGF5UGF5bWVudFJlcXVlc3QgPyB0eXBlb2YgaS5nb29nbGVQYXlQYXltZW50UmVxdWVzdCA9PSBcImZ1bmN0aW9uXCIgPyB7IC4uLmQsIC4uLmkuZ29vZ2xlUGF5UGF5bWVudFJlcXVlc3QoZCkgfSA6IHsgLi4uZCwgLi4uaS5nb29nbGVQYXlQYXltZW50UmVxdWVzdCB9IDogZDtcbn0sIGlyID0gKCkgPT4geG4oe1xuICBzY3JpcHRJZDogXCJfX29wX2ludGVybmFsX2dvb2dsZV9wYXlfc2RrXCIsXG4gIHNyYzogXCJodHRwczovL3BheS5nb29nbGUuY29tL2dwL3AvanMvcGF5LmpzXCIsXG4gIGNoZWNrTG9hZGVkRm46ICgpID0+ICEhd2luZG93Lmdvb2dsZT8ucGF5bWVudHM/LmFwaVxufSk7XG5sZXQgJHQgPSBudWxsO1xuY29uc3Qgc3IgPSBhc3luYyAoZSkgPT4gYXdhaXQgdW4oZSkgPT09IFwicHJvZFwiID8gXCJQUk9EVUNUSU9OXCIgOiBcIlRFU1RcIiwgamUgPSBhc3luYyAoZSwgdCkgPT4ge1xuICBjb25zdCByID0gYXdhaXQgc3IoZSk7XG4gIHJldHVybiAkdCA9PT0gbnVsbCAmJiAoJHQgPSBuZXcgd2luZG93Lmdvb2dsZS5wYXltZW50cy5hcGkuUGF5bWVudHNDbGllbnQoe1xuICAgIGVudmlyb25tZW50OiByLFxuICAgIG1lcmNoYW50SW5mbzogdC5tZXJjaGFudEluZm9cbiAgfSkpLCAkdDtcbn0sICRlID0gKGUpID0+IHtcbiAgY29uc3QgdCA9IGUucmVxdWlyZWRfdXNlcl9hY3Rpb25zLmZpbmQoKHIpID0+IHIudHlwZSA9PT0gXCJhaXJ3YWxsZXhfcGF5bWVudF9jb25zZW50XCIpO1xuICByZXR1cm4gdCA/IFlyLnBhcnNlKHQpIDogbnVsbDtcbn0sIGNyID0gKGUsIHQpID0+IHtcbiAgY29uc3QgciA9IHsgLi4uZSB9LCBuID0gdC5wYXltZW50TWV0aG9kRGF0YT8uaW5mbz8uYmlsbGluZ0FkZHJlc3MsIG8gPSB0LnNoaXBwaW5nQWRkcmVzcztcbiAgaWYgKG4pIHtcbiAgICBjb25zdCBbaSwgLi4uc10gPSBuLm5hbWU/LnRyaW0oKT8uc3BsaXQoL1xccysvKSA/PyBbXSwgYyA9IHMuam9pbihcIiBcIikgfHwgdm9pZCAwO1xuICAgIHJbcC5FTUFJTF0gPSByW3AuRU1BSUxdIHx8IHQuZW1haWwgfHwgXCJvcF91bmZpbGxlZEBnZXRvcGVucGF5LmNvbVwiLCByW3AuTElORTFdID0gcltwLkxJTkUxXSB8fCBuLmFkZHJlc3MxIHx8IFwiXCIsIHJbcC5MSU5FMl0gPSByW3AuTElORTJdIHx8IG4uYWRkcmVzczIgfHwgXCJcIiwgcltwLkxJTkUzXSA9IHJbcC5MSU5FM10gfHwgbi5hZGRyZXNzMyB8fCBcIlwiLCByW3AuQ0lUWV0gPSByW3AuQ0lUWV0gfHwgbi5sb2NhbGl0eSB8fCBcIlwiLCByW3AuU1RBVEVdID0gcltwLlNUQVRFXSB8fCBuLmFkbWluaXN0cmF0aXZlQXJlYSB8fCBcIlwiLCByW3AuQ09VTlRSWV0gPSByW3AuQ09VTlRSWV0gfHwgbi5jb3VudHJ5Q29kZSB8fCBcIlVTXCIsIHJbcC5aSVBfQ09ERV0gPSByW3AuWklQX0NPREVdIHx8IG4ucG9zdGFsQ29kZSB8fCBcIjAwMDAwXCI7XG4gICAgY29uc3QgbCA9IHJbcC5GSVJTVF9OQU1FXSB8fCBpIHx8IFwiXCIsIHUgPSByW3AuTEFTVF9OQU1FXSB8fCBjIHx8IFwiXCI7XG4gICAgbCB8fCB1ID8gKHJbcC5GSVJTVF9OQU1FXSA9IGwsIHJbcC5MQVNUX05BTUVdID0gdSkgOiAocltwLkZJUlNUX05BTUVdID0gXCJfT1BfVU5LTk9XTlwiLCByW3AuTEFTVF9OQU1FXSA9IFwiXCIpO1xuICB9XG4gIHJldHVybiBvICYmIChyW3AuU0hJUFBJTkdfTElORTFdID0gcltwLlNISVBQSU5HX0xJTkUxXSB8fCBvLmFkZHJlc3MxIHx8IFwiXCIsIHJbcC5TSElQUElOR19MSU5FMl0gPSByW3AuU0hJUFBJTkdfTElORTJdIHx8IG8uYWRkcmVzczIgfHwgXCJcIiwgcltwLlNISVBQSU5HX0xJTkUzXSA9IHJbcC5TSElQUElOR19MSU5FM10gfHwgby5hZGRyZXNzMyB8fCBcIlwiLCByW3AuU0hJUFBJTkdfQ0lUWV0gPSByW3AuU0hJUFBJTkdfQ0lUWV0gfHwgby5sb2NhbGl0eSB8fCBcIlwiLCByW3AuU0hJUFBJTkdfWklQX0NPREVdID0gcltwLlNISVBQSU5HX1pJUF9DT0RFXSB8fCBvLnBvc3RhbENvZGUgfHwgXCIwMDAwMFwiLCByW3AuU0hJUFBJTkdfU1RBVEVdID0gcltwLlNISVBQSU5HX1NUQVRFXSB8fCBvLmFkbWluaXN0cmF0aXZlQXJlYSB8fCBcIlwiLCByW3AuU0hJUFBJTkdfQ09VTlRSWV0gPSByW3AuU0hJUFBJTkdfQ09VTlRSWV0gfHwgby5jb3VudHJ5Q29kZSB8fCBcIlVTXCIpLCByO1xufSwgeyBsb2dfXzogaGUsIGVycl9fOiBlYyB9ID0gSShcImF3eC1iYWNzXCIpLCB0YyA9IHooXG4gIGFzeW5jICh7XG4gICAgY29udGV4dDogZSxcbiAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IHQsXG4gICAgbm9uQ2RlRm9ybUlucHV0czogcixcbiAgICBmb3JtQ2FsbGJhY2tzOiBuLFxuICAgIGN1c3RvbVBhcmFtczogb1xuICB9KSA9PiB7XG4gICAgY29uc3QgaSA9IFYociwgbi5nZXQub25WYWxpZGF0aW9uRXJyb3IpLCBzID0gZS5hbnlDZGVDb25uZWN0aW9uLCBjID0gYXdhaXQgTShzKSwgbCA9IG8udmVyaWZpY2F0aW9uTWV0aG9kID8/IFwidHJ1ZWxheWVyXCI7XG4gICAgbGV0IHUgPSBudWxsO1xuICAgIGlmIChsID09PSBcIm1pY3JvX2RlcG9zaXRcIikge1xuICAgICAgaGUoXCJNaWNybyBkZXBvc2l0IHZlcmlmaWNhdGlvbiBzZWxlY3RlZCwgc2hvd2luZyBmb3JtLi4uXCIpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdSA9IGF3YWl0IEx0KFwiYmFjc19kaXJlY3RfZGViaXRcIiwge1xuICAgICAgICAgIHdpZHRoOiBcIjQ1MHB4XCIsXG4gICAgICAgICAgaGVpZ2h0OiBcIjM1MHB4XCIsXG4gICAgICAgICAgYmFzZVVybDogZS5iYXNlVXJsXG4gICAgICAgIH0pLCBoZShcIk1pY3JvIGRlcG9zaXQgZGF0YSBjb2xsZWN0ZWRcIik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdGhyb3cgaGUoXCJNaWNybyBkZXBvc2l0IGZvcm0gY2FuY2VsbGVkXCIpLCBuZXcgRXJyb3IoXCJNaWNybyBkZXBvc2l0IGZvcm0gY2FuY2VsbGVkXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkID0gYXdhaXQgWChzLCB7XG4gICAgICBwYXltZW50X3Byb3ZpZGVyOiB0LnByb3ZpZGVyLFxuICAgICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IHQsXG4gICAgICAuLi5XKGksIGMuY2hlY2tvdXRfc2V0dGluZ3MpLFxuICAgICAgY3VzdG9tZXJfbGFuZ3VhZ2U6IG9lKClcbiAgICB9KSwgZiA9ICRlKGQpLCBfID0gZj8uY29uc2VudF9pZCwgbSA9IGY/LmF2YWlsYWJsZV9iYW5rcztcbiAgICBsZXQgeTtcbiAgICBpZiAobCA9PT0gXCJ0cnVlbGF5ZXJcIiAmJiBtICYmIG0ubGVuZ3RoID49IDEpIHtcbiAgICAgIGhlKFwiTXVsdGlwbGUgYmFua3MgYXZhaWxhYmxlLCBzaG93aW5nIGJhbmsgc2VsZWN0b3IuLi5cIik7XG4gICAgICB0cnkge1xuICAgICAgICB5ID0gYXdhaXQgUm4obSwge1xuICAgICAgICAgIHdpZHRoOiBcIjQ1MHB4XCIsXG4gICAgICAgICAgaGVpZ2h0OiBcIjUwMHB4XCIsXG4gICAgICAgICAgdGl0bGU6IFwiU2VsZWN0IGJhbmtcIlxuICAgICAgICB9KSwgaGUoYEJhbmsgc2VsZWN0ZWQ6ICR7eS5kaXNwbGF5X25hbWV9YCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdGhyb3cgaGUoXCJCYW5rIHNlbGVjdGlvbiBjYW5jZWxsZWRcIiksIG5ldyBFcnJvcihcIkJhbmsgc2VsZWN0aW9uIGNhbmNlbGxlZFwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaCA9IG90KGkpLCB3ID0ge1xuICAgICAgdHlwZTogXCJiYWNzX2RpcmVjdF9kZWJpdFwiLFxuICAgICAgYmFjc19kaXJlY3RfZGViaXQ6IHtcbiAgICAgICAgLy8gVHJ1ZUxheWVyXG4gICAgICAgIGJhbmtfbmFtZTogeT8uYmFua19uYW1lLFxuICAgICAgICAvLyBNaWNyb2RlcG9zaXRcbiAgICAgICAgb3duZXJfbmFtZTogTnQoaVtwLkZJUlNUX05BTUVdLCBpW3AuTEFTVF9OQU1FXSksXG4gICAgICAgIG93bmVyX2VtYWlsOiBpW3AuRU1BSUxdLFxuICAgICAgICBjb3VudHJ5X2NvZGU6IGlbcC5DT1VOVFJZXSxcbiAgICAgICAgYWNjb3VudF9udW1iZXI6IHU/LmFjY291bnRfbnVtYmVyLFxuICAgICAgICBzb3J0X2NvZGU6IHU/LnNvcnRfY29kZSxcbiAgICAgICAgYWRkcmVzczogeyAuLi5oLCB0b3duOiBoLmNpdHksIHBvc3Rjb2RlOiBoLnppcF9jb2RlIH1cbiAgICAgIH1cbiAgICB9LCB2ID0gKGF3YWl0IEQocywge1xuICAgICAgc2VjdXJlX3Rva2VuOiBjLnRva2VuLFxuICAgICAgcHJvY2Vzc29yX3NwZWNpZmljX21ldGFkYXRhOiB7XG4gICAgICAgIHBheW1lbnRfcHJvdmlkZXI6IHQucHJvdmlkZXIsXG4gICAgICAgIGFpcndhbGxleF9jb25zZW50X2lkOiBfLFxuICAgICAgICB2ZXJpZmljYXRpb25fbWV0aG9kOiBsLFxuICAgICAgICBkaXJlY3RfZGViaXRfZGF0YTogd1xuICAgICAgfVxuICAgIH0pKS5yZXF1aXJlZF91c2VyX2FjdGlvbnM/LmZpbmQoXG4gICAgICAoUykgPT4gUy50eXBlID09PSBcImFpcndhbGxleF9wYXltZW50X2NvbnNlbnRcIlxuICAgICk/LnJlZGlyZWN0X3VybDtcbiAgICBpZiAodikge1xuICAgICAgaGUoXCJCQUNTIHZlcmlmaWNhdGlvbiByZXF1aXJlZCwgc3RhcnRpbmcgdmVyaWZpY2F0aW9uLi4uXCIpO1xuICAgICAgY29uc3QgeyBzdGF0dXM6IFMgfSA9IGF3YWl0IGZlKHtcbiAgICAgICAgdXJsOiB2LFxuICAgICAgICBiYXNlVXJsOiBlLmJhc2VVcmwsXG4gICAgICAgIGZyYW1lV2lkdGg6IFwiNTAwcHhcIixcbiAgICAgICAgZnJhbWVIZWlnaHQ6IFwiNzAwcHhcIixcbiAgICAgICAgZnJhbWVUaXRsZTogXCJCQUNTIHZlcmlmaWNhdGlvblwiXG4gICAgICB9KTtcbiAgICAgIGlmIChoZShg4pWwIEJBQ1MgdmVyaWZpY2F0aW9uIGNvbXBsZXRlZCBbU3RhdHVzOiAke1N9XWApLCBTID09PSBOLkNBTkNFTExFRClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQkFDUyB2ZXJpZmljYXRpb24gY2FuY2VsbGVkXCIpO1xuICAgICAgaWYgKFMgPT09IE4uRkFJTFVSRSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQkFDUyB2ZXJpZmljYXRpb24gZmFpbGVkXCIpO1xuICAgIH1cbiAgICBjb25zdCBDID0gYXdhaXQgRChzLCB7XG4gICAgICBzZWN1cmVfdG9rZW46IGMudG9rZW4sXG4gICAgICBwcm9jZXNzb3Jfc3BlY2lmaWNfbWV0YWRhdGE6IHtcbiAgICAgICAgcGF5bWVudF9wcm92aWRlcjogdC5wcm92aWRlcixcbiAgICAgICAgYWlyd2FsbGV4X2NvbnNlbnRfaWQ6IF9cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGFlKHtcbiAgICAgICAgbG9nUHJlZml4OiBcImF3eC1iYWNzXCIsXG4gICAgICAgIGFueUNkZUNvbm5lY3Rpb246IHMsXG4gICAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogdCxcbiAgICAgICAgcmVxdWlyZWRGb3JtRmllbGRzOiBpLFxuICAgICAgICBjb25maXJtUmVzdWx0OiBDLFxuICAgICAgICB1c2VQYXlGaXJzdEZsb3c6ICExXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChTKSB7XG4gICAgICB0aHJvdyBlYyhcIkJBQ1MgcGF5bWVudCBlcnJvclwiLCBTKSwgZyhcImNoZWNrb3V0X2Vycm9yXCIsIHtcbiAgICAgICAgZXJyb3I6IFNcbiAgICAgIH0pLCBuZXcgRXJyb3IoUz8ubWVzc2FnZSA/PyBcIlVua25vd24gZXJyb3JcIik7XG4gICAgfVxuICB9XG4pLCB7IGxvZ19fOiBWZSwgZXJyX186IHJjIH0gPSBJKFwiYXd4LWVmdFwiKSwgbmMgPSB6KFxuICBhc3luYyAoe1xuICAgIGNvbnRleHQ6IGUsXG4gICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiB0LFxuICAgIG5vbkNkZUZvcm1JbnB1dHM6IHIsXG4gICAgZm9ybUNhbGxiYWNrczogbixcbiAgICBjdXN0b21QYXJhbXM6IG9cbiAgfSkgPT4ge1xuICAgIGNvbnN0IGkgPSBWKHIsIG4uZ2V0Lm9uVmFsaWRhdGlvbkVycm9yKSwgcyA9IGUuYW55Q2RlQ29ubmVjdGlvbiwgYyA9IGF3YWl0IE0ocyksIGwgPSBvLnZlcmlmaWNhdGlvbk1ldGhvZCA/PyBcInBsYWlkXCI7XG4gICAgbGV0IHUgPSBudWxsO1xuICAgIGlmIChsID09PSBcIm1pY3JvX2RlcG9zaXRcIikge1xuICAgICAgVmUoXCJNaWNybyBkZXBvc2l0IHZlcmlmaWNhdGlvbiBzZWxlY3RlZCwgc2hvd2luZyBmb3JtLi4uXCIpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdSA9IGF3YWl0IEx0KFwiZWZ0X2RpcmVjdF9kZWJpdFwiLCB7XG4gICAgICAgICAgd2lkdGg6IFwiNDUwcHhcIixcbiAgICAgICAgICBoZWlnaHQ6IFwiNDUwcHhcIixcbiAgICAgICAgICBiYXNlVXJsOiBlLmJhc2VVcmxcbiAgICAgICAgfSksIFZlKFwiTWljcm8gZGVwb3NpdCBkYXRhIGNvbGxlY3RlZFwiKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aHJvdyBWZShcIk1pY3JvIGRlcG9zaXQgZm9ybSBjYW5jZWxsZWRcIiksIG5ldyBFcnJvcihcIk1pY3JvIGRlcG9zaXQgZm9ybSBjYW5jZWxsZWRcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGQgPSBhd2FpdCBYKHMsIHtcbiAgICAgIHBheW1lbnRfcHJvdmlkZXI6IHQucHJvdmlkZXIsXG4gICAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogdCxcbiAgICAgIC4uLlcoaSwgYy5jaGVja291dF9zZXR0aW5ncyksXG4gICAgICBjdXN0b21lcl9sYW5ndWFnZTogb2UoKVxuICAgIH0pLCBfID0gJGUoZCk/LmNvbnNlbnRfaWQsIG0gPSB7XG4gICAgICB0eXBlOiBcImVmdF9kaXJlY3RfZGViaXRcIixcbiAgICAgIGVmdF9kaXJlY3RfZGViaXQ6IHtcbiAgICAgICAgLy8gUGxhaWRcbiAgICAgICAgYnVzaW5lc3NfYWNjb3VudDogby5pc0J1c2luZXNzQWNjb3VudCA/PyAhMSxcbiAgICAgICAgb3duZXJfbmFtZTogTnQoaVtwLkZJUlNUX05BTUVdLCBpW3AuTEFTVF9OQU1FXSksXG4gICAgICAgIG93bmVyX2VtYWlsOiBpW3AuRU1BSUxdLFxuICAgICAgICAvLyBNaWNyb2RlcG9zaXRcbiAgICAgICAgaW5zdGl0dXRpb25fbnVtYmVyOiB1Py5pbnN0aXR1dGlvbl9udW1iZXIsXG4gICAgICAgIHRyYW5zaXRfbnVtYmVyOiB1Py50cmFuc2l0X251bWJlcixcbiAgICAgICAgYWNjb3VudF9udW1iZXI6IHU/LmFjY291bnRfbnVtYmVyXG4gICAgICAgIC8vIG1hbmRhdGVfdmVyc2lvbjogdW5kZWZpbmVkIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgIH1cbiAgICB9LCBoID0gKGF3YWl0IEQocywge1xuICAgICAgc2VjdXJlX3Rva2VuOiBjLnRva2VuLFxuICAgICAgcHJvY2Vzc29yX3NwZWNpZmljX21ldGFkYXRhOiB7XG4gICAgICAgIHBheW1lbnRfcHJvdmlkZXI6IHQucHJvdmlkZXIsXG4gICAgICAgIGFpcndhbGxleF9jb25zZW50X2lkOiBfLFxuICAgICAgICB2ZXJpZmljYXRpb25fbWV0aG9kOiBsLFxuICAgICAgICBkaXJlY3RfZGViaXRfZGF0YTogbVxuICAgICAgfVxuICAgIH0pKS5yZXF1aXJlZF91c2VyX2FjdGlvbnM/LmZpbmQoXG4gICAgICAoRSkgPT4gRS50eXBlID09PSBcImFpcndhbGxleF9wYXltZW50X2NvbnNlbnRcIlxuICAgICk/LnJlZGlyZWN0X3VybDtcbiAgICBpZiAoaCkge1xuICAgICAgVmUoXCJFRlQgdmVyaWZpY2F0aW9uIHJlcXVpcmVkLCBzdGFydGluZyB2ZXJpZmljYXRpb24uLi5cIik7XG4gICAgICBjb25zdCB7IHN0YXR1czogRSB9ID0gYXdhaXQgZmUoe1xuICAgICAgICB1cmw6IGgsXG4gICAgICAgIGJhc2VVcmw6IGUuYmFzZVVybCxcbiAgICAgICAgZnJhbWVXaWR0aDogXCI1MDBweFwiLFxuICAgICAgICBmcmFtZUhlaWdodDogXCI3MDBweFwiLFxuICAgICAgICBmcmFtZVRpdGxlOiBcIkVGVCB2ZXJpZmljYXRpb25cIlxuICAgICAgfSk7XG4gICAgICBpZiAoVmUoYOKVsCBFRlQgdmVyaWZpY2F0aW9uIGNvbXBsZXRlZCBbU3RhdHVzOiAke0V9XWApLCBFID09PSBOLkNBTkNFTExFRClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRUZUIHZlcmlmaWNhdGlvbiBjYW5jZWxsZWRcIik7XG4gICAgICBpZiAoRSA9PT0gTi5GQUlMVVJFKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFRlQgdmVyaWZpY2F0aW9uIGZhaWxlZFwiKTtcbiAgICB9XG4gICAgY29uc3QgdyA9IGF3YWl0IEQocywge1xuICAgICAgc2VjdXJlX3Rva2VuOiBjLnRva2VuLFxuICAgICAgcHJvY2Vzc29yX3NwZWNpZmljX21ldGFkYXRhOiB7XG4gICAgICAgIHBheW1lbnRfcHJvdmlkZXI6IHQucHJvdmlkZXIsXG4gICAgICAgIGFpcndhbGxleF9jb25zZW50X2lkOiBfXG4gICAgICB9XG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhZSh7XG4gICAgICAgIGxvZ1ByZWZpeDogXCJhd3gtZWZ0XCIsXG4gICAgICAgIGFueUNkZUNvbm5lY3Rpb246IHMsXG4gICAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogdCxcbiAgICAgICAgcmVxdWlyZWRGb3JtRmllbGRzOiBpLFxuICAgICAgICBjb25maXJtUmVzdWx0OiB3LFxuICAgICAgICB1c2VQYXlGaXJzdEZsb3c6ICExXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChFKSB7XG4gICAgICB0aHJvdyByYyhcIkVGVCBwYXltZW50IGVycm9yXCIsIEUpLCBnKFwiY2hlY2tvdXRfZXJyb3JcIiwge1xuICAgICAgICBlcnJvcjogRVxuICAgICAgfSksIG5ldyBFcnJvcihFPy5tZXNzYWdlID8/IFwiVW5rbm93biBlcnJvclwiKTtcbiAgICB9XG4gIH1cbiksIHsgbG9nX186IGdlLCBlcnJfXzogb2MgfSA9IEkoXCJhd3gtc2VwYVwiKSwgYWMgPSB6KFxuICBhc3luYyAoe1xuICAgIGNvbnRleHQ6IGUsXG4gICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiB0LFxuICAgIG5vbkNkZUZvcm1JbnB1dHM6IHIsXG4gICAgZm9ybUNhbGxiYWNrczogbixcbiAgICBjdXN0b21QYXJhbXM6IG9cbiAgfSkgPT4ge1xuICAgIGNvbnN0IGkgPSBWKHIsIG4uZ2V0Lm9uVmFsaWRhdGlvbkVycm9yKSwgcyA9IGUuYW55Q2RlQ29ubmVjdGlvbiwgYyA9IGF3YWl0IE0ocyksIGwgPSBvLnZlcmlmaWNhdGlvbk1ldGhvZCA/PyBcInRydWVsYXllclwiO1xuICAgIGxldCB1ID0gbnVsbDtcbiAgICBpZiAobCA9PT0gXCJtaWNyb19kZXBvc2l0XCIpIHtcbiAgICAgIGdlKFwiTWljcm8gZGVwb3NpdCB2ZXJpZmljYXRpb24gc2VsZWN0ZWQsIHNob3dpbmcgZm9ybS4uLlwiKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHUgPSBhd2FpdCBMdChcInNlcGFfZGlyZWN0X2RlYml0XCIsIHtcbiAgICAgICAgICB3aWR0aDogXCI0NTBweFwiLFxuICAgICAgICAgIGhlaWdodDogXCIzMDBweFwiLFxuICAgICAgICAgIGJhc2VVcmw6IGUuYmFzZVVybFxuICAgICAgICB9KSwgZ2UoXCJNaWNybyBkZXBvc2l0IGRhdGEgY29sbGVjdGVkXCIpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRocm93IGdlKFwiTWljcm8gZGVwb3NpdCBmb3JtIGNhbmNlbGxlZFwiKSwgbmV3IEVycm9yKFwiTWljcm8gZGVwb3NpdCBmb3JtIGNhbmNlbGxlZFwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZCA9IGF3YWl0IFgocywge1xuICAgICAgcGF5bWVudF9wcm92aWRlcjogdC5wcm92aWRlcixcbiAgICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiB0LFxuICAgICAgLi4uVyhpLCBjLmNoZWNrb3V0X3NldHRpbmdzKSxcbiAgICAgIGN1c3RvbWVyX2xhbmd1YWdlOiBvZSgpXG4gICAgfSksIGYgPSAkZShkKSwgXyA9IGY/LmNvbnNlbnRfaWQsIG0gPSBmPy5hdmFpbGFibGVfYmFua3M7XG4gICAgbGV0IHk7XG4gICAgaWYgKGwgPT09IFwidHJ1ZWxheWVyXCIgJiYgbSAmJiBtLmxlbmd0aCA+PSAxKSB7XG4gICAgICBnZShcIk11bHRpcGxlIGJhbmtzIGF2YWlsYWJsZSwgc2hvd2luZyBiYW5rIHNlbGVjdG9yLi4uXCIpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgeSA9IGF3YWl0IFJuKG0sIHtcbiAgICAgICAgICB3aWR0aDogXCI0NTBweFwiLFxuICAgICAgICAgIGhlaWdodDogXCI1MDBweFwiLFxuICAgICAgICAgIHRpdGxlOiBcIlNlbGVjdCBiYW5rXCJcbiAgICAgICAgfSksIGdlKGBCYW5rIHNlbGVjdGVkOiAke3kuZGlzcGxheV9uYW1lfWApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRocm93IGdlKFwiQmFuayBzZWxlY3Rpb24gY2FuY2VsbGVkXCIpLCBuZXcgRXJyb3IoXCJCYW5rIHNlbGVjdGlvbiBjYW5jZWxsZWRcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHcgPSAoYXdhaXQgRChzLCB7XG4gICAgICBzZWN1cmVfdG9rZW46IGMudG9rZW4sXG4gICAgICBwcm9jZXNzb3Jfc3BlY2lmaWNfbWV0YWRhdGE6IHtcbiAgICAgICAgcGF5bWVudF9wcm92aWRlcjogdC5wcm92aWRlcixcbiAgICAgICAgYWlyd2FsbGV4X2NvbnNlbnRfaWQ6IF8sXG4gICAgICAgIHZlcmlmaWNhdGlvbl9tZXRob2Q6IGwsXG4gICAgICAgIGRpcmVjdF9kZWJpdF9kYXRhOiB7XG4gICAgICAgICAgdHlwZTogXCJzZXBhX2RpcmVjdF9kZWJpdFwiLFxuICAgICAgICAgIHNlcGFfZGlyZWN0X2RlYml0OiB7XG4gICAgICAgICAgICAvLyB0cnVlbGF5ZXJcbiAgICAgICAgICAgIGJhbmtfbmFtZTogeT8uYmFua19uYW1lLFxuICAgICAgICAgICAgY291bnRyeV9jb2RlOiBpW3AuQ09VTlRSWV0sXG4gICAgICAgICAgICAvLyBtaWNyb2RlcG9zaXRcbiAgICAgICAgICAgIG93bmVyX25hbWU6IE50KGlbcC5GSVJTVF9OQU1FXSwgaVtwLkxBU1RfTkFNRV0pLFxuICAgICAgICAgICAgb3duZXJfZW1haWw6IGlbcC5FTUFJTF0sXG4gICAgICAgICAgICBpYmFuOiB1Py5pYmFuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkpLnJlcXVpcmVkX3VzZXJfYWN0aW9ucz8uZmluZChcbiAgICAgICh2KSA9PiB2LnR5cGUgPT09IFwiYWlyd2FsbGV4X3BheW1lbnRfY29uc2VudFwiXG4gICAgKT8ucmVkaXJlY3RfdXJsO1xuICAgIGlmICh3KSB7XG4gICAgICBnZShcIlNFUEEgdmVyaWZpY2F0aW9uIHJlcXVpcmVkLCBzdGFydGluZyB2ZXJpZmljYXRpb24uLi5cIik7XG4gICAgICBjb25zdCB7IHN0YXR1czogdiB9ID0gYXdhaXQgZmUoe1xuICAgICAgICB1cmw6IHcsXG4gICAgICAgIGJhc2VVcmw6IGUuYmFzZVVybCxcbiAgICAgICAgZnJhbWVXaWR0aDogXCI1MDBweFwiLFxuICAgICAgICBmcmFtZUhlaWdodDogXCI3MDBweFwiLFxuICAgICAgICBmcmFtZVRpdGxlOiBcIlNFUEEgdmVyaWZpY2F0aW9uXCJcbiAgICAgIH0pO1xuICAgICAgaWYgKGdlKGDilbAgU0VQQSB2ZXJpZmljYXRpb24gY29tcGxldGVkIFtTdGF0dXM6ICR7dn1dYCksIHYgPT09IE4uQ0FOQ0VMTEVEKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTRVBBIHZlcmlmaWNhdGlvbiBjYW5jZWxsZWRcIik7XG4gICAgICBpZiAodiA9PT0gTi5GQUlMVVJFKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTRVBBIHZlcmlmaWNhdGlvbiBmYWlsZWRcIik7XG4gICAgfVxuICAgIGNvbnN0IEUgPSBhd2FpdCBEKHMsIHtcbiAgICAgIHNlY3VyZV90b2tlbjogYy50b2tlbixcbiAgICAgIHByb2Nlc3Nvcl9zcGVjaWZpY19tZXRhZGF0YToge1xuICAgICAgICBwYXltZW50X3Byb3ZpZGVyOiB0LnByb3ZpZGVyLFxuICAgICAgICBhaXJ3YWxsZXhfY29uc2VudF9pZDogX1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYWUoe1xuICAgICAgICBsb2dQcmVmaXg6IFwiYXd4LXNlcGFcIixcbiAgICAgICAgYW55Q2RlQ29ubmVjdGlvbjogcyxcbiAgICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiB0LFxuICAgICAgICByZXF1aXJlZEZvcm1GaWVsZHM6IGksXG4gICAgICAgIGNvbmZpcm1SZXN1bHQ6IEUsXG4gICAgICAgIHVzZVBheUZpcnN0RmxvdzogITFcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKHYpIHtcbiAgICAgIHRocm93IG9jKFwiU0VQQSBwYXltZW50IGVycm9yXCIsIHYpLCBnKFwiY2hlY2tvdXRfZXJyb3JcIiwge1xuICAgICAgICBlcnJvcjogdlxuICAgICAgfSksIG5ldyBFcnJvcih2Py5tZXNzYWdlID8/IFwiVW5rbm93biBlcnJvclwiKTtcbiAgICB9XG4gIH1cbiksIHsgbG9nX186IGljLCBlcnJfXzogbHIgfSA9IEkoXCJhaXJ3YWxsZXgtY2NcIiksIHNjID0geiQxLm9iamVjdCh7XG4gIFwib3AtYWlyd2FsbGV4LTNkcy11cmxcIjogeiQxLnN0cmluZygpLFxuICBcIm9wLWFpcndhbGxleC1pbml0aWFsLWludGVudC1pZFwiOiB6JDEuc3RyaW5nKCksXG4gIFwib3AtYWlyd2FsbGV4LWNvbnNlbnQtaWRcIjogeiQxLnN0cmluZygpXG59KSwgY2MgPSAoZSkgPT4ge1xuICBjb25zdCB0ID0gc2Muc2FmZVBhcnNlKGUpO1xuICBpZiAoIXQuc3VjY2Vzcykge1xuICAgIGNvbnN0IHIgPSBcIlVuYWJsZSB0byBwcm9jZXNzIHlvdXIgY3JlZGl0IGNhcmQuIFBsZWFzZSBjb250YWN0IHN1cHBvcnQgZm9yIGFzc2lzdGFuY2UuXCIsIG4gPSBgQWlyd2FsbGV4IDNEUyBpcyByZXF1aXJlZCBidXQgaGVhZGVycyBhcmUgbWFsZm9ybWVkLiBHb3Q6ICR7SlNPTi5zdHJpbmdpZnkoZSl9YDtcbiAgICB0aHJvdyBscihuKSwgbmV3IEVycm9yKHIpO1xuICB9XG4gIHJldHVybiB0LmRhdGE7XG59LCBEbiA9IChlKSA9PiBlPy5bXCJvcC1haXJ3YWxsZXgtM2RzLXVybFwiXSAhPT0gdm9pZCAwLCBsYyA9IChlKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdCA9IG5ldyBVUkwoZSA/PyBcIlwiKS5zZWFyY2hQYXJhbXMuZ2V0KFwicGF5bWVudF9pbnRlbnRfaWRcIik7XG4gICAgaWYgKCF0KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gaW50ZW50IElEIGZvdW5kIGluIEFpcndhbGxleCAzRFMgdmVyaWZpY2F0aW9uIHJlc3VsdFwiKTtcbiAgICByZXR1cm4gaWMoYEFpcndhbGxleCAzRFMgdmVyaWZpY2F0aW9uIHN1Y2Nlc3MuIFtJbnRlbnQgSUQ6ICR7dH1dYCksIHQ7XG4gIH0gY2F0Y2ggKHQpIHtcbiAgICBjb25zdCByID0gXCJFcnJvciB2ZXJpZnlpbmcgQWlyd2FsbGV4IDNEUyB2ZXJpZmljYXRpb24gcmVzdWx0LlwiO1xuICAgIHRocm93IGxyKHIsIGBSZXN1bHRpbmcgVVJMOiAke2V9LlxuRXJyb3I6ICR7Syh0KX1gKSwgbmV3IEVycm9yKHIpO1xuICB9XG59LCBPbiA9IGFzeW5jIChlLCB0KSA9PiB7XG4gIGNvbnN0IHIgPSBjYyh0KSwgbiA9IGF3YWl0IE5uKHsgdXJsOiByW1wib3AtYWlyd2FsbGV4LTNkcy11cmxcIl0sIGJhc2VVcmw6IGUgfSksIG8gPSBsYyhuLmhyZWYgPz8gXCJcIiksIGkgPSByW1wib3AtYWlyd2FsbGV4LWluaXRpYWwtaW50ZW50LWlkXCJdO1xuICBpZiAoaSAhPT0gbykge1xuICAgIGNvbnN0IGMgPSBcIlVuYWJsZSB0byBwcm9jZXNzIHlvdXIgY3JlZGl0IGNhcmQuIFBsZWFzZSBjb250YWN0IHN1cHBvcnQgZm9yIGFzc2lzdGFuY2UuXCIsIGwgPSBgSW50ZW50IElEIGZyb20gY2FsbGJhY2sgKCR7b30pIGRvZXMgbm90IG1hdGNoIHRoZSBpbml0aWFsIGludGVudCBJRCAoJHtpfSkuYDtcbiAgICB0aHJvdyBscihsKSwgbmV3IEVycm9yKGMpO1xuICB9XG4gIHJldHVybiB7XG4gICAgZXhpc3RpbmdfY2M6IHtcbiAgICAgIGluaXRpYWxfaW50ZW50X2lkOiBvLFxuICAgICAgY29uc2VudF9pZDogcltcIm9wLWFpcndhbGxleC1jb25zZW50LWlkXCJdXG4gICAgfVxuICB9O1xufSwgVW4gPSB6JDEub2JqZWN0KHtcbiAgcHJvdmlkZXI6IHokMS5saXRlcmFsKFwiYXBwbGVfcGF5XCIpLFxuICBwcm9jZXNzb3JfbmFtZTogeiQxLmxpdGVyYWwoXCJhaXJ3YWxsZXhcIiksXG4gIG1ldGFkYXRhOiB6JDEub2JqZWN0KHtcbiAgICBwcm9jZXNzb3JfYWNjb3VudF9pZDogeiQxLnN0cmluZygpLFxuICAgIHByb2Nlc3Nvcl9hY2NvdW50X25hbWU6IHokMS5zdHJpbmcoKVxuICB9KVxufSksIGpuID0geiQxLm9iamVjdCh7XG4gIHByb3ZpZGVyOiB6JDEubGl0ZXJhbChcImdvb2dsZV9wYXlcIiksXG4gIHByb2Nlc3Nvcl9uYW1lOiB6JDEubGl0ZXJhbChcImFpcndhbGxleFwiKSxcbiAgbWV0YWRhdGE6IHokMS5vYmplY3Qoe1xuICAgIHByb2Nlc3Nvcl9hY2NvdW50X2lkOiB6JDEuc3RyaW5nKCksXG4gICAgcHJvY2Vzc29yX2FjY291bnRfbmFtZTogeiQxLnN0cmluZygpLFxuICAgIGdvb2dsZV9wYXlfbWVyY2hhbnRfaWQ6IHokMS5zdHJpbmcoKS5udWxsaXNoKClcbiAgfSlcbn0pLCB1ciA9ICgpID0+IHhuKHtcbiAgc2NyaXB0SWQ6IFwiX19vcF9pbnRlcm5hbF9hcHBsZV9wYXlfc2RrXCIsXG4gIHNyYzogXCJodHRwczovL2FwcGxlcGF5LmNkbi1hcHBsZS5jb20vanNhcGkvMS5sYXRlc3QvYXBwbGUtcGF5LXNkay5qc1wiLFxuICBjaGVja0xvYWRlZEZuOiAoKSA9PiAhIXdpbmRvdy5BcHBsZVBheVNlc3Npb25cbn0pLCBkciA9IChlLCB0KSA9PiB7XG4gIGNvbnN0IHIgPSB0LnRva2VuLnBheW1lbnRNZXRob2QuYmlsbGluZ0NvbnRhY3QsIG4gPSB0LmJpbGxpbmdDb250YWN0LCBvID0gdC5zaGlwcGluZ0NvbnRhY3QsIGkgPSB7IC4uLmUgfTtcbiAgaWYgKHIgfHwgbiB8fCBvKSB7XG4gICAgaVtwLkVNQUlMXSA9IGlbcC5FTUFJTF0gfHwgcj8uZW1haWxBZGRyZXNzIHx8IG4/LmVtYWlsQWRkcmVzcyB8fCBvPy5lbWFpbEFkZHJlc3MgfHwgXCJvcF91bmZpbGxlZEBlbWFpbC5jb21cIiwgaVtwLkNPVU5UUlldID0gaVtwLkNPVU5UUlldIHx8IHI/LmNvdW50cnlDb2RlIHx8IG4/LmNvdW50cnlDb2RlIHx8IG8/LmNvdW50cnlDb2RlIHx8IFwiVVNcIiwgaVtwLlpJUF9DT0RFXSA9IGlbcC5aSVBfQ09ERV0gfHwgcj8ucG9zdGFsQ29kZSB8fCBuPy5wb3N0YWxDb2RlIHx8IG8/LnBvc3RhbENvZGUgfHwgXCIwMDAwMFwiO1xuICAgIGNvbnN0IHMgPSBpW3AuRklSU1RfTkFNRV0gfHwgcj8uZ2l2ZW5OYW1lIHx8IG4/LmdpdmVuTmFtZSB8fCBvPy5naXZlbk5hbWUgfHwgXCJcIiwgYyA9IGlbcC5MQVNUX05BTUVdIHx8IHI/LmZhbWlseU5hbWUgfHwgbj8uZmFtaWx5TmFtZSB8fCBvPy5mYW1pbHlOYW1lIHx8IFwiXCI7XG4gICAgcyB8fCBjID8gKGlbcC5GSVJTVF9OQU1FXSA9IHMsIGlbcC5MQVNUX05BTUVdID0gYykgOiAoaVtwLkZJUlNUX05BTUVdID0gXCJfT1BfVU5LTk9XTlwiLCBpW3AuTEFTVF9OQU1FXSA9IFwiXCIpO1xuICB9XG4gIHJldHVybiBpO1xufTtcbnokMS5vYmplY3Qoe1xuICBkYXRhOiB6JDEub2JqZWN0KHtcbiAgICBtZXNzYWdlSGVhZGVyczogeiQxLnJlY29yZCh6JDEuc3RyaW5nKCksIHokMS5hbnkoKSksXG4gICAgZXJyb3JzOiB6JDEuYXJyYXkoeiQxLmFueSgpKSxcbiAgICBtZXNzYWdlVHlwZTogeiQxLnN0cmluZygpLFxuICAgIG1lc3NhZ2VCb2R5OiB6JDEucmVjb3JkKHokMS5zdHJpbmcoKSwgeiQxLmFueSgpKVxuICB9KSxcbiAgb3JpZ2luOiB6JDEubGl0ZXJhbChcImh0dHBzOi8vYXBwbGVwYXkuY2RuLWFwcGxlLmNvbVwiKVxufSk7XG5jb25zdCB1YyA9ICh7XG4gIHRvdGFsOiBlLFxuICBwcmVmaWxsOiB0XG59KSA9PiB7XG4gIGlmICh0Lm1vZGUgPT09IFwic2V0dXBcIilcbiAgICByZXR1cm4ge1xuICAgICAgcGF5bWVudERlc2NyaXB0aW9uOiBcIlNldHVwIHJlY3VycmluZyBwYXltZW50XCIsXG4gICAgICByZWd1bGFyQmlsbGluZzoge1xuICAgICAgICBhbW91bnQ6IGUuYW1vdW50LFxuICAgICAgICBsYWJlbDogXCJTZXR1cCByZWN1cnJpbmcgcGF5bWVudFwiLFxuICAgICAgICBwYXltZW50VGltaW5nOiBcInJlY3VycmluZ1wiLFxuICAgICAgICB0eXBlOiBcImZpbmFsXCJcbiAgICAgIH0sXG4gICAgICAvLyBUT0RPOiB0aGlzIHNob3VsZCBiZSBiaWxsaW5nIHBvcnRhbCB1cmxcbiAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL3Bhc3NraXQvcGtyZWN1cnJpbmdwYXltZW50cmVxdWVzdC9tYW5hZ2VtZW50dXJsI0Rpc2N1c3Npb25cbiAgICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgdXNlZCB3aGVuIHVzZXIgcmVtb3ZlIGEgY2FyZCBmcm9tIHRoZWlyIEFwcGxlUGF5IHdhbGxldC5cbiAgICAgIC8vIEN1cnJlbnR5IHNldCB0byBjaGVja291dCBzZXNzaW9uIHVybCB0byBzYXRpc2Z5IEFwcGxlUGF5IHR5cGVzXG4gICAgICBtYW5hZ2VtZW50VVJMOiBuZXcgVVJMKGAvcGF5LyR7dC50b2tlbn1gLCBDbikudG9TdHJpbmcoKVxuICAgIH07XG4gIGNvbnN0IHIgPSB0LmxpbmVfaXRlbXM/LlswXTtcbiAgaWYgKHIpXG4gICAgcmV0dXJuIHtcbiAgICAgIHBheW1lbnREZXNjcmlwdGlvbjogcj8uZGVzY3JpcHRpb24gPz8gXCJcIixcbiAgICAgIHJlZ3VsYXJCaWxsaW5nOiB7XG4gICAgICAgIGFtb3VudDogZS5hbW91bnQsXG4gICAgICAgIGxhYmVsOiByPy5kZXNjcmlwdGlvbiA/PyBcIlwiLFxuICAgICAgICByZWN1cnJpbmdQYXltZW50SW50ZXJ2YWxVbml0OiByPy5iaWxsaW5nX2ludGVydmFsLFxuICAgICAgICByZWN1cnJpbmdQYXltZW50SW50ZXJ2YWxDb3VudDogcj8uYmlsbGluZ19pbnRlcnZhbF9jb3VudCA/PyB2b2lkIDAsXG4gICAgICAgIHBheW1lbnRUaW1pbmc6IFwicmVjdXJyaW5nXCIsXG4gICAgICAgIHR5cGU6IFwiZmluYWxcIlxuICAgICAgfSxcbiAgICAgIG1hbmFnZW1lbnRVUkw6IGBodHRwczovL2NkZS5nZXRvcGVucGF5LmNvbS9wYXkvJHt0LnRva2VufWBcbiAgICB9O1xufSwgZGMgPSAoe1xuICBvdmVycmlkZVBheW1lbnRSZXF1ZXN0OiBlLFxuICBpbml0aWFsUHJldmlldzogdCxcbiAgcHJlZmlsbDogcixcbiAgZGVmYXVsdExhYmVsOiBuID0gXCJUb3RhbFwiXG59KSA9PiB7XG4gIGNvbnN0IG8gPSAoZT8uYW1vdW50Py5jdXJyZW5jeSA/PyByPy5jdXJyZW5jeSA/PyB0LmN1cnJlbmN5KS50b1VwcGVyQ2FzZSgpLCBzID0gKChlPy5hbW91bnQ/LmFtb3VudEF0b20gPz8gdD8uYW1vdW50QXRvbSA/PyAwKSAvIDEwMCkudG9GaXhlZCgyKTtcbiAgcmV0dXJuIHtcbiAgICBjdXJyZW5jeUNvZGU6IG8sXG4gICAgdG90YWw6IHtcbiAgICAgIGxhYmVsOiBlPy5sYWJlbCA/PyBuID8/IFwiVG90YWxcIixcbiAgICAgIHR5cGU6IGU/LnBlbmRpbmcgPyBcInBlbmRpbmdcIiA6IFwiZmluYWxcIixcbiAgICAgIGFtb3VudDogc1xuICAgIH1cbiAgfTtcbn0sIHByID0gKHtcbiAgb3ZlcnJpZGVQYXltZW50UmVxdWVzdDogZSxcbiAgaW5pdGlhbFByZXZpZXc6IHQsXG4gIHByZWZpbGw6IHIsXG4gIGRlZmF1bHRMYWJlbDogblxufSkgPT4ge1xuICBjb25zdCB7IGN1cnJlbmN5Q29kZTogbywgdG90YWw6IGkgfSA9IGRjKHtcbiAgICBvdmVycmlkZVBheW1lbnRSZXF1ZXN0OiBlLFxuICAgIGluaXRpYWxQcmV2aWV3OiB0LFxuICAgIHByZWZpbGw6IHIsXG4gICAgZGVmYXVsdExhYmVsOiBuXG4gIH0pO1xuICBsZXQgcyA9IHtcbiAgICBjb3VudHJ5Q29kZTogXCJVU1wiLFxuICAgIGN1cnJlbmN5Q29kZTogbyxcbiAgICByZXF1aXJlZEJpbGxpbmdDb250YWN0RmllbGRzOiBbXCJlbWFpbFwiLCBcInBvc3RhbEFkZHJlc3NcIiwgXCJuYW1lXCJdLFxuICAgIHJlcXVpcmVkU2hpcHBpbmdDb250YWN0RmllbGRzOiBbXG4gICAgICBcImVtYWlsXCIsXG4gICAgICAuLi5yLmNoZWNrb3V0X3NldHRpbmdzLnJlcXVpcmVfZnVsbF9zaGlwcGluZ19hZGRyZXNzID8gW1wicG9zdGFsQWRkcmVzc1wiXSA6IFtdXG4gICAgXSxcbiAgICBzdXBwb3J0ZWROZXR3b3JrczogW1widmlzYVwiLCBcIm1hc3RlckNhcmRcIiwgXCJhbWV4XCIsIFwiZGlzY292ZXJcIiwgXCJqY2JcIl0sXG4gICAgbWVyY2hhbnRDYXBhYmlsaXRpZXM6IFtcInN1cHBvcnRzM0RTXCIsIFwic3VwcG9ydHNDcmVkaXRcIiwgXCJzdXBwb3J0c0RlYml0XCJdLFxuICAgIHRvdGFsOiBpXG4gIH07XG4gIHJldHVybiByLmxpbmVfaXRlbXMuZXZlcnkoKGwpID0+IGwuYmlsbGluZ19pbnRlcnZhbCAmJiBsLmJpbGxpbmdfaW50ZXJ2YWxfY291bnQpICYmIChzLnJlY3VycmluZ1BheW1lbnRSZXF1ZXN0ID0gdWMoe1xuICAgIHRvdGFsOiBpLFxuICAgIHByZWZpbGw6IHJcbiAgfSkpLCBlPy5hcHBsZVBheVBheW1lbnRSZXF1ZXN0ICYmICh0eXBlb2YgZS5hcHBsZVBheVBheW1lbnRSZXF1ZXN0ID09IFwiZnVuY3Rpb25cIiA/IHMgPSB7XG4gICAgLi4ucyxcbiAgICAuLi5lLmFwcGxlUGF5UGF5bWVudFJlcXVlc3QocylcbiAgfSA6IHMgPSB7IC4uLnMsIC4uLmUuYXBwbGVQYXlQYXltZW50UmVxdWVzdCB9KSwgcztcbn0sIHBjID0geiQxLmVudW0oW1widGVzdFwiLCBcImxpdmVcIiwgXCJsaXZlLXVzXCIsIFwibGl2ZS1pblwiLCBcImxpdmUtYXBzZVwiLCBcImxpdmUtYXVcIl0pLCBtYyA9IHokMS5lbnVtKFtcbiAgXCJhclwiLFxuICBcImJnLUJHXCIsXG4gIFwiY2EtRVNcIixcbiAgXCJjcy1DWlwiLFxuICBcImRhLURLXCIsXG4gIFwiZGUtREVcIixcbiAgXCJlbC1HUlwiLFxuICBcImVuLVVTXCIsXG4gIFwiZXMtRVNcIixcbiAgXCJldC1FRVwiLFxuICBcImZpLUZJXCIsXG4gIFwiZnItRlJcIixcbiAgXCJoci1IUlwiLFxuICBcImh1LUhVXCIsXG4gIFwiaXMtSVNcIixcbiAgXCJpdC1JVFwiLFxuICBcImphLUpQXCIsXG4gIFwia28tS1JcIixcbiAgXCJsdC1MVFwiLFxuICBcImx2LUxWXCIsXG4gIFwibmwtTkxcIixcbiAgXCJuby1OT1wiLFxuICBcInBsLVBMXCIsXG4gIFwicHQtQlJcIixcbiAgXCJwdC1QVFwiLFxuICBcInJvLVJPXCIsXG4gIFwicnUtUlVcIixcbiAgXCJzay1TS1wiLFxuICBcInNsLVNJXCIsXG4gIFwic3YtU0VcIixcbiAgXCJ6aC1DTlwiLFxuICBcInpoLVRXXCJcbl0pLCB7IGxvZ19fOiB4ZSwgZXJyX186IHR0IH0gPSBJKFwiYWR5ZW4tY2NcIiksIF9jID0geiQxLm9iamVjdCh7XG4gIFwib3AtYWNjb3VudC1pZFwiOiB6JDEuc3RyaW5nKCksXG4gIFwib3AtYWR5ZW4tY2xpZW50LWtleVwiOiB6JDEuc3RyaW5nKCksXG4gIFwib3AtYWR5ZW4tZW52aXJvbm1lbnRcIjogcGMsXG4gIFwib3AtYWR5ZW4tYWN0aW9uXCI6IHokMS5zdHJpbmcoKVxufSksICRuID0gXCJVbmFibGUgdG8gcHJvY2VzcyB5b3VyIGNyZWRpdCBjYXJkLiBQbGVhc2UgY29udGFjdCBzdXBwb3J0IGZvciBhc3Npc3RhbmNlLlwiLCBmYyA9IChlKSA9PiB7XG4gIGNvbnN0IHQgPSBfYy5zYWZlUGFyc2UoZSk7XG4gIGlmICghdC5zdWNjZXNzKVxuICAgIHRocm93IHR0KGBBZHllbiAzRFMgaXMgcmVxdWlyZWQgYnV0IGhlYWRlcnMgYXJlIG1hbGZvcm1lZC4gR290OiAke0pTT04uc3RyaW5naWZ5KGUpfWApLCBuZXcgRXJyb3IoJG4pO1xuICByZXR1cm4gdC5kYXRhO1xufSwgeWMgPSAoZSkgPT4gSlNPTi5wYXJzZShlKSwgSXIgPSAoKSA9PiBcIkFkeWVuV2ViXCIgaW4gd2luZG93ICYmIFwiQWR5ZW5DaGVja291dFwiIGluIHdpbmRvdy5BZHllbldlYiwgaGMgPSBhc3luYyAoKSA9PiB7XG4gIHhlKFwiV2FpdGluZyBmb3IgQWR5ZW4gU0RLIHRvIGxvYWQuLi5cIik7XG4gIGZvciAobGV0IGUgPSAwOyBlIDwgMTA7IGUrKylcbiAgICBJcigpIHx8IGF3YWl0IEl0KDUwMCk7XG4gIGlmICghSXIoKSlcbiAgICB0aHJvdyB0dChcIkFkeWVuIFNESyBub3QgbG9hZGVkIHByb3Blcmx5XCIpLCBuZXcgRXJyb3IoJG4pO1xuICByZXR1cm4geGUoXCJBZHllbiBTREsgbG9hZGVkIHN1Y2Nlc3NmdWxseVwiKSwgd2luZG93LkFkeWVuV2ViLkFkeWVuQ2hlY2tvdXQ7XG59LCBnYyA9IChlKSA9PiB7XG4gIGNvbnN0IHsgaGVhZGVyczogdCwgbG9jYWxlOiByLCBjb3VudHJ5Q29kZTogbiwgY29tcG9uZW50OiBvLCBob3N0OiBpLCBjYW5jZWxCdXR0b246IHMgfSA9IGUsIGMgPSB5Yyh0W1wib3AtYWR5ZW4tYWN0aW9uXCJdKTtcbiAgcmV0dXJuIHhlKGBSdW5uaW5nIEFkeWVuIDNEUyBmbG93IGZvciBhY3Rpb24gdHlwZTogJHtjLnR5cGV9YCksIG5ldyBQcm9taXNlKChsKSA9PiB7XG4gICAgY29uc3QgdSA9ICgpID0+IHtcbiAgICAgIHhlKFwiQ2xlYW5pbmcgdXAgQWR5ZW4gM0RTIGZsb3dcIiksIHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIF8pLCBpLnJlbW92ZSgpO1xuICAgIH0sIGQgPSAoeSkgPT4ge1xuICAgICAgdHQoXCJBdXRoZW50aWNhdGlvbiBmYWlsZWQuIFJlc3VsdDpcIiwgeSksIGwoeyBzdGF0dXM6IE4uRkFJTFVSRSwgY2xlYW51cDogdSB9KTtcbiAgICB9LCBmID0gKHkpID0+IHtcbiAgICAgIHR0KFwiQWR5ZW4gZXJyb3I6XCIsIHkpLCBsKHsgc3RhdHVzOiBOLkZBSUxVUkUsIGNsZWFudXA6IHUgfSk7XG4gICAgfSwgXyA9ICgpID0+IHtcbiAgICAgIGwoeyBzdGF0dXM6IE4uQ0FOQ0VMTEVELCBjbGVhbnVwOiB1IH0pO1xuICAgIH07XG4gICAgcy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgXyk7XG4gICAgY29uc3QgbSA9ICh5LCBoLCB3KSA9PiB7XG4gICAgICBpLnJlbW92ZSgpLCBsKHsgc3RhdHVzOiBOLlNVQ0NFU1MsIGFkZGl0aW9uYWxEZXRhaWxzOiB5LCBjbGVhbnVwOiB1IH0pO1xuICAgIH07XG4gICAgaGMoKS50aGVuKFxuICAgICAgKHkpID0+IHkoe1xuICAgICAgICBjbGllbnRLZXk6IHRbXCJvcC1hZHllbi1jbGllbnQta2V5XCJdLFxuICAgICAgICBlbnZpcm9ubWVudDogdFtcIm9wLWFkeWVuLWVudmlyb25tZW50XCJdLFxuICAgICAgICBsb2NhbGU6IHIsXG4gICAgICAgIGNvdW50cnlDb2RlOiBuLFxuICAgICAgICBvbkFkZGl0aW9uYWxEZXRhaWxzOiBtLFxuICAgICAgICBvblBheW1lbnRGYWlsZWQ6IGQsXG4gICAgICAgIG9uRXJyb3I6IGZcbiAgICAgIH0pXG4gICAgKS50aGVuKCh5KSA9PiB7XG4gICAgICB5LmNyZWF0ZUZyb21BY3Rpb24oYywgeyBjaGFsbGVuZ2VXaW5kb3dTaXplOiBcIjAzXCIgfSkubW91bnQobyk7XG4gICAgfSk7XG4gIH0pO1xufSwgd2MgPSAoZSkgPT4ge1xuICBjb25zdCB0ID0gbmF2aWdhdG9yLmxhbmd1YWdlcyAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzLmxlbmd0aCA/IG5hdmlnYXRvci5sYW5ndWFnZXNbMF0gOiBuYXZpZ2F0b3IubGFuZ3VhZ2UsIHIgPSBlID8/IHQsIG4gPSBtYy5zYWZlUGFyc2Uocik7XG4gIHJldHVybiBuLnN1Y2Nlc3MgPyAoeGUoYFJlc29sdmVkIGxvY2FsZTogJHtuLmRhdGF9YCksIG4uZGF0YSkgOiAodHQoYFJlc29sdmVkIGludmFsaWQgbG9jYWxlOiAke3J9LiBEZWZhdWx0aW5nIHRvIGVuLVVTLmApLCBcImVuLVVTXCIpO1xufSwgR24gPSAoZSkgPT4gZT8uW1wib3AtYWR5ZW4tYWN0aW9uXCJdICE9PSB2b2lkIDAsIFZuID0gYXN5bmMgKGUsIHQsIHIpID0+IHtcbiAgY29uc3QgbiA9IGZjKHQpLCBvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgby5pZCA9IFwiYWR5ZW4tY29udGFpbmVyXCI7XG4gIGNvbnN0IHsgaG9zdDogaSwgaWZyYW1lOiBzLCBjYW5jZWxCdXR0b246IGMgfSA9IEZ0KFwiaHR0cDovL2V4YW1wbGUuY29tXCIpO1xuICBzLnJlcGxhY2VXaXRoKG8pO1xuICBjb25zdCBsID0gYXdhaXQgZ2Moe1xuICAgIGhlYWRlcnM6IG4sXG4gICAgbG9jYWxlOiB3YyhyKSxcbiAgICBjb3VudHJ5Q29kZTogZSxcbiAgICBjb21wb25lbnQ6IG8sXG4gICAgaG9zdDogaSxcbiAgICBjYW5jZWxCdXR0b246IGNcbiAgfSk7XG4gIGlmIChsLmNsZWFudXAoKSwgbC5zdGF0dXMgPT09IE4uRkFJTFVSRSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCIzRFMgdmVyaWZpY2F0aW9uIGZhaWxlZFwiKTtcbiAgaWYgKGwuc3RhdHVzID09PSBOLkNBTkNFTExFRClcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCIzRFMgdmVyaWZpY2F0aW9uIGNhbmNlbGxlZFwiKTtcbiAgaWYgKGwuc3RhdHVzID09PSBOLlNVQ0NFU1MpIHtcbiAgICBpZiAoIWwuYWRkaXRpb25hbERldGFpbHMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCIzRFMgdmVyaWZpY2F0aW9uIHN1Y2NlZWRlZCBidXQgbm8gYWRkaXRpb25hbCBkZXRhaWxzIHdlcmUgcmV0dXJuZWRcIik7XG4gICAgcmV0dXJuIHhlKFwiM0RTIHZlcmlmaWNhdGlvbiBzdWNjZWVkZWRcIiksIHtcbiAgICAgIGV4aXN0aW5nX2NjOiB7XG4gICAgICAgIGFkZGl0aW9uYWxfZGV0YWlsczogbC5hZGRpdGlvbmFsRGV0YWlscy5kYXRhXG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlXG4gICAgbnQobC5zdGF0dXMpO1xufSwgcW4gPSB6JDEub2JqZWN0KHtcbiAgcHJvdmlkZXI6IHokMS5saXRlcmFsKFwiYXBwbGVfcGF5XCIpLFxuICBwcm9jZXNzb3JfbmFtZTogeiQxLmxpdGVyYWwoXCJhZHllblwiKSxcbiAgbWV0YWRhdGE6IHokMS5vYmplY3Qoe1xuICAgIHByb2Nlc3Nvcl9hY2NvdW50X2lkOiB6JDEuc3RyaW5nKCksXG4gICAgcHJvY2Vzc29yX2FjY291bnRfbmFtZTogeiQxLnN0cmluZygpXG4gIH0pXG59KSwgem4gPSB6JDEub2JqZWN0KHtcbiAgcHJvdmlkZXI6IHokMS5saXRlcmFsKFwiZ29vZ2xlX3BheVwiKSxcbiAgcHJvY2Vzc29yX25hbWU6IHokMS5saXRlcmFsKFwiYWR5ZW5cIiksXG4gIG1ldGFkYXRhOiB6JDEub2JqZWN0KHtcbiAgICBwcm9jZXNzb3JfYWNjb3VudF9pZDogeiQxLnN0cmluZygpLFxuICAgIHByb2Nlc3Nvcl9hY2NvdW50X25hbWU6IHokMS5zdHJpbmcoKSxcbiAgICBnb29nbGVfcGF5X21lcmNoYW50X2lkOiB6JDEuc3RyaW5nKCkubnVsbGlzaCgpXG4gIH0pXG59KSwgeyBsb2dfXzogdmMgfSA9IEkoXCJhd3gtYXBwbGUtcGF5XCIpO1xuYXN5bmMgZnVuY3Rpb24gYmMoZSwgdCkge1xuICB0cnkge1xuICAgIGNvbnN0IG8gPSAoYXdhaXQgUnQodC5jb25uZWN0aW9uLCB7XG4gICAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogdC5jaGVja291dFBheW1lbnRNZXRob2QsXG4gICAgICBwcm9jZXNzb3Jfc3BlY2lmaWNfbWV0YWRhdGE6IHtcbiAgICAgICAgYXBwbGVfcGF5X3Nlc3Npb246IHtcbiAgICAgICAgICB2YWxpZGF0aW9uX3VybDogZS52YWxpZGF0aW9uVVJMLFxuICAgICAgICAgIGluaXRpYXRpdmVfY29udGV4dDogd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLFxuICAgICAgICAgIHRoZWlyX2FjY291bnRfaWQ6IHQucHJvY2Vzc29yQWNjb3VudC5wcm9jZXNzb3JfYWNjb3VudF9pZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkpLm5leHRfYWN0aW9uX21ldGFkYXRhPy5hcHBsZV9wYXlfc2Vzc2lvbjtcbiAgICBpZiAoIW8pXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBzZXNzaW9uIGRhdGEgcmVjZWl2ZWQgZnJvbSBwYXltZW50IGZsb3dcIik7XG4gICAgdC5zZXNzaW9uLmNvbXBsZXRlTWVyY2hhbnRWYWxpZGF0aW9uKG8pLCBnKFwiYXBwbGVfcGF5X2NvbXBsZXRlX21lcmNoYW50X3ZhbGlkYXRpb25cIiwge1xuICAgICAgLi4ub1xuICAgIH0pO1xuICB9IGNhdGNoIChyKSB7XG4gICAgdGhyb3cgdC5zZXNzaW9uLmFib3J0KCksIHI7XG4gIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIFBjKGUsIHQpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByID0gZS5wYXltZW50LCBuID0gZHIodC5ub25DZGVGb3JtSW5wdXRzLCByKSwgbyA9IFYoXG4gICAgICBuLFxuICAgICAgdC5mb3JtQ2FsbGJhY2tzLmdldC5vblZhbGlkYXRpb25FcnJvcixcbiAgICAgIHQuZGVmYXVsdEZpZWxkVmFsdWVzXG4gICAgKTtcbiAgICBnKFwiYmlsbGluZ19kZXRhaWxzX3JlY2VpdmVkXCIsIHtcbiAgICAgIC4uLm9cbiAgICB9KSwgYXdhaXQgWCh0LmNvbm5lY3Rpb24sIHtcbiAgICAgIHBheW1lbnRfcHJvdmlkZXI6IHQuY2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyLFxuICAgICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IHQuY2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAgICAgLi4uVyhvLCB0LnByZWZpbGwuY2hlY2tvdXRfc2V0dGluZ3MpXG4gICAgfSk7XG4gICAgY29uc3QgaSA9IGF3YWl0IEQodC5jb25uZWN0aW9uLCB7XG4gICAgICBzZWN1cmVfdG9rZW46IHQucHJlZmlsbC50b2tlbixcbiAgICAgIHByb2Nlc3Nvcl9zcGVjaWZpY19tZXRhZGF0YToge1xuICAgICAgICBwYXltZW50X3Byb3ZpZGVyOiB0LmNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlcixcbiAgICAgICAgYnJvd3Nlcl9pbmZvOiBzbygpLFxuICAgICAgICBtb2JpbGVfd2FsbGV0X3BheW1lbnRfZGF0YToge1xuICAgICAgICAgIGVuY3J5cHRlZF9wYXltZW50X3Rva2VuOiBKU09OLnN0cmluZ2lmeShyLnRva2VuKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHZjKFwiWzFzdF0gQ29uZmlybSBwYXltZW50IGZsb3cgcmVzcG9uc2VcIiwgaSksICFpLnBheW1lbnRfbWV0aG9kcz8uWzBdPy5pZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIFBNIElEIGZvdW5kXCIpO1xuICAgIGNvbnN0IGMgPSB7XG4gICAgICBzdGF0dXM6IEFwcGxlUGF5U2Vzc2lvbi5TVEFUVVNfU1VDQ0VTU1xuICAgIH07XG4gICAgcmV0dXJuIHQuc2Vzc2lvbi5jb21wbGV0ZVBheW1lbnQoYyksIGFlKHtcbiAgICAgIGxvZ1ByZWZpeDogXCJhZHllbi1hcHBsZXBheVwiLFxuICAgICAgYW55Q2RlQ29ubmVjdGlvbjogdC5jb25uZWN0aW9uLFxuICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiB0LmNoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICAgIHJlcXVpcmVkRm9ybUZpZWxkczogbyxcbiAgICAgIGNvbmZpcm1SZXN1bHQ6IGksXG4gICAgICB1c2VQYXlGaXJzdEZsb3c6ICExXG4gICAgfSk7XG4gIH0gY2F0Y2ggKHIpIHtcbiAgICBjb25zdCBuID0ge1xuICAgICAgc3RhdHVzOiBBcHBsZVBheVNlc3Npb24uU1RBVFVTX0ZBSUxVUkVcbiAgICB9O1xuICAgIHRocm93IHQuc2Vzc2lvbi5jb21wbGV0ZVBheW1lbnQobiksIHI7XG4gIH1cbn1cbmNvbnN0IHsgbG9nX186IEJlLCBlcnJfXzogQm4gfSA9IEkoXCJhZHllbi1hcHBsZS1wYXlcIiksIEVjID0gbWUoXG4gIGFzeW5jICh7IGNvbnRleHQ6IGUsIGZvcm1DYWxsYmFja3M6IHQgfSkgPT4ge1xuICAgIGNvbnN0IHIgPSB7XG4gICAgICBwcm9jZXNzb3I6IE8uRW51bS5hZHllbixcbiAgICAgIGlzQXZhaWxhYmxlOiAhMSxcbiAgICAgIGlzTG9hZGluZzogITEsXG4gICAgICBzdGFydEZsb3c6IGFzeW5jICgpID0+IHtcbiAgICAgIH1cbiAgICB9LCBuID0gcShlLmNoZWNrb3V0UGF5bWVudE1ldGhvZHMsIHFuKTtcbiAgICBpZiAoIW4pXG4gICAgICByZXR1cm4gcjtcbiAgICBpZiAoQmUoXCJMb2FkaW5nIEFwcGxlIFBheSBzY3JpcHRcIiksIGF3YWl0IHVyKCksICF3aW5kb3cuQXBwbGVQYXlTZXNzaW9uIHx8ICFBcHBsZVBheVNlc3Npb24uY2FuTWFrZVBheW1lbnRzKCkpXG4gICAgICByZXR1cm4gQmUoXCJBcHBsZSBQYXkgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIGRldmljZS9icm93c2VyXCIpLCByO1xuICAgIGlmIChCZShcIkFwcGxlIFBheSBMb2FkZWRcIiksICFhd2FpdCBBcHBsZVBheVNlc3Npb24uY2FuTWFrZVBheW1lbnRzKCkpXG4gICAgICByZXR1cm4gQmUoXCJObyBhY3RpdmUgY2FyZHMgYXZhaWxhYmxlIGZvciBBcHBsZSBQYXlcIiksIHI7XG4gICAgaWYgKCFuLm1ldGFkYXRhLnByb2Nlc3Nvcl9hY2NvdW50X2lkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gZ2F0ZXdheSBtZXJjaGFudCBJRCBmb3VuZCBpbiBwcm9jZXNzb3IgYWNjb3VudFwiKTtcbiAgICBjb25zdCBzID0gZS5hbnlDZGVDb25uZWN0aW9uLCBjID0gYXdhaXQgTShzKSwgbCA9IGMubW9kZSA9PT0gXCJzZXR1cFwiLCB1ID0gYXdhaXQgX2UocywgYy50b2tlbiwgbCwgdm9pZCAwKSwgZCA9IGFzeW5jIChmKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBGLmFkeWVuQXBwbGVQYXkucnVuKHtcbiAgICAgICAgICBjb250ZXh0OiBlLFxuICAgICAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogbixcbiAgICAgICAgICBub25DZGVGb3JtSW5wdXRzOiBVKGUuZm9ybURpdiksXG4gICAgICAgICAgZm9ybUNhbGxiYWNrczogdCxcbiAgICAgICAgICBjdXN0b21QYXJhbXM6IHtcbiAgICAgICAgICAgIC4uLmYsXG4gICAgICAgICAgICBpbml0aWFsUHJldmlldzogdVxuICAgICAgICAgIH0sXG4gICAgICAgICAgaW5pdFJlc3VsdDogdm9pZCAwXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICBCbihcIkFwcGxlIFBheSBwYXltZW50IGVycm9yXCIsIF8pLCB0LmdldC5vbkNoZWNrb3V0RXJyb3IoXz8ubWVzc2FnZSA/PyBcIlVua25vd24gZXJyb3JcIik7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvY2Vzc29yOiBPLkVudW0uYWR5ZW4sXG4gICAgICBpc0F2YWlsYWJsZTogITAsXG4gICAgICBpc0xvYWRpbmc6ICExLFxuICAgICAgc3RhcnRGbG93OiBkXG4gICAgfTtcbiAgfVxuKSwgQ2MgPSB6KFxuICBhc3luYyAoe1xuICAgIGNvbnRleHQ6IGUsXG4gICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiB0LFxuICAgIG5vbkNkZUZvcm1JbnB1dHM6IHIsXG4gICAgY3VzdG9tUGFyYW1zOiBuLFxuICAgIGZvcm1DYWxsYmFja3M6IG9cbiAgfSkgPT4ge1xuICAgIGNvbnN0IGkgPSBxKGUuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgcW4pLCB7IG92ZXJyaWRlUGF5bWVudFJlcXVlc3Q6IHMsIGluaXRpYWxQcmV2aWV3OiBjIH0gPSBuLCBsID0gZS5hbnlDZGVDb25uZWN0aW9uLCB1ID0gYXdhaXQgTShsKSwgZCA9IHUubW9kZSA9PT0gXCJzZXR1cFwiLCBmID0gcHIoe1xuICAgICAgb3ZlcnJpZGVQYXltZW50UmVxdWVzdDogcyxcbiAgICAgIGluaXRpYWxQcmV2aWV3OiBjLFxuICAgICAgcHJlZmlsbDoge1xuICAgICAgICAuLi51XG4gICAgICB9LFxuICAgICAgZGVmYXVsdExhYmVsOiBpPy5tZXRhZGF0YT8ucHJvY2Vzc29yX2FjY291bnRfbmFtZVxuICAgIH0pLCBfID0gbmV3IEFwcGxlUGF5U2Vzc2lvbigzLCBmKSwgbSA9IHtcbiAgICAgIHNlc3Npb246IF8sXG4gICAgICBjb25uZWN0aW9uOiBlLmFueUNkZUNvbm5lY3Rpb24sXG4gICAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IHQsXG4gICAgICBub25DZGVGb3JtSW5wdXRzOiByLFxuICAgICAgcHJvY2Vzc29yQWNjb3VudDogaS5tZXRhZGF0YSxcbiAgICAgIHByZWZpbGw6IHUsXG4gICAgICBpc1NldHVwTW9kZTogZCxcbiAgICAgIGJhc2VVcmw6IGUuYmFzZVVybCxcbiAgICAgIGZvcm1DYWxsYmFja3M6IG8sXG4gICAgICBkZWZhdWx0RmllbGRWYWx1ZXM6IG4/LmRlZmF1bHRGaWVsZFZhbHVlc1xuICAgIH07XG4gICAgcmV0dXJuIGcoXCJhcHBsZV9wYXlfZmxvd19zdGFydGVkXCIsIHtcbiAgICAgIHByb2Nlc3Nvcl9uYW1lOiB0LnByb2Nlc3Nvcl9uYW1lLFxuICAgICAgcHJlZmlsbDoga3QodSwgW1wiYnJhbmRcIl0pLFxuICAgICAgb3ZlcnJpZGVQYXltZW50UmVxdWVzdDogc1xuICAgIH0pLCBuZXcgUHJvbWlzZSgoeSwgaCkgPT4ge1xuICAgICAgY29uc3QgdyA9ICgpID0+IHtcbiAgICAgICAgQmUoXCJQYXltZW50IGNhbmNlbGxlZCBieSB1c2VyXCIpLCBoKG5ldyBFcnJvcihcIlBheW1lbnQgY2FuY2VsbGVkIGJ5IHVzZXJcIikpO1xuICAgICAgfTtcbiAgICAgIF8ub252YWxpZGF0ZW1lcmNoYW50ID0gYXN5bmMgKEUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBiYyhFLCBtKTtcbiAgICAgICAgfSBjYXRjaCAodikge1xuICAgICAgICAgIGgodik7XG4gICAgICAgIH1cbiAgICAgIH0sIF8ub25wYXltZW50bWV0aG9kc2VsZWN0ZWQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IEUgPSB7XG4gICAgICAgICAgbmV3VG90YWw6IHsgLi4uZi50b3RhbCB9XG4gICAgICAgIH07XG4gICAgICAgIF8uY29tcGxldGVQYXltZW50TWV0aG9kU2VsZWN0aW9uKEUpO1xuICAgICAgfSwgXy5vbnBheW1lbnRhdXRob3JpemVkID0gYXN5bmMgKEUpID0+IHtcbiAgICAgICAgZyhcImFwcGxlX3BheV9wYXltZW50X2F1dGhvcml6ZWRcIik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdiA9IGF3YWl0IFBjKEUsIG0pO1xuICAgICAgICAgIHkodik7XG4gICAgICAgIH0gY2F0Y2ggKHYpIHtcbiAgICAgICAgICBoKHYpO1xuICAgICAgICB9XG4gICAgICB9LCBfLm9uY2FuY2VsID0gdywgXy5iZWdpbigpO1xuICAgIH0pLmNhdGNoKCh5KSA9PiB7XG4gICAgICB0aHJvdyBCbihcIkFwcGxlIFBheSBwYXltZW50IGVycm9yXCIsIHkpLCBnKFwiYXBwbGVfcGF5X3BheW1lbnRfZXJyb3JcIiwge1xuICAgICAgICBlcnJvcjogeVxuICAgICAgfSksIHk7XG4gICAgfSk7XG4gIH1cbiksIHsgbG9nX186IHJlLCBlcnJfXzogQWUgfSA9IEkoXCJhZHllbi1nb29nbGUtcGF5XCIpLCBTYyA9IG1lKFxuICBhc3luYyAoeyBjb250ZXh0OiBlLCBmb3JtQ2FsbGJhY2tzOiB0IH0pID0+IHtcbiAgICBjb25zdCByID0ge1xuICAgICAgcHJvY2Vzc29yOiBPLkVudW0uYWR5ZW4sXG4gICAgICBpc0F2YWlsYWJsZTogITEsXG4gICAgICBpc0xvYWRpbmc6ICExLFxuICAgICAgc3RhcnRGbG93OiBhc3luYyAoKSA9PiB7XG4gICAgICB9XG4gICAgfSwgbiA9IHEoZS5jaGVja291dFBheW1lbnRNZXRob2RzLCB6bik7XG4gICAgaWYgKCFuKVxuICAgICAgcmV0dXJuIHI7XG4gICAgcmUoXCJHb29nbGUgUGF5IENQTVwiLCBuKTtcbiAgICBjb25zdCBvID0gbi5tZXRhZGF0YTtcbiAgICBpZiAoIW8ucHJvY2Vzc29yX2FjY291bnRfaWQpXG4gICAgICByZXR1cm4gQWUoXCJObyBnYXRld2F5IG1lcmNoYW50IElEIGZvdW5kIGluIHByb2Nlc3NvciBhY2NvdW50XCIpLCByO1xuICAgIGlmIChyZShcIkxvYWRpbmcgR29vZ2xlIFBheSBzY3JpcHRcIiksIGF3YWl0IGlyKCksICF3aW5kb3cuZ29vZ2xlPy5wYXltZW50cz8uYXBpKVxuICAgICAgcmV0dXJuIEFlKFwiR29vZ2xlIFBheSBTREsgbm90IGxvYWRlZCBwcm9wZXJseVwiKSwgcjtcbiAgICBpZiAoYXdhaXQgc3IoZS5iYXNlVXJsKSA9PT0gXCJQUk9EVUNUSU9OXCIgJiYgIW8uZ29vZ2xlX3BheV9tZXJjaGFudF9pZClcbiAgICAgIHJldHVybiBBZShcIkdvb2dsZSBQYXkgbWVyY2hhbnQgSUQgaXMgcmVxdWlyZWQgZm9yIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRcIiksIHI7XG4gICAgcmUoXCJHb29nbGUgUGF5IFNESyBsb2FkZWRcIiwgd2luZG93Lmdvb2dsZS5wYXltZW50cyk7XG4gICAgY29uc3QgcyA9IGUuYW55Q2RlQ29ubmVjdGlvbiwgYyA9IGF3YWl0IE0ocyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGYgPSBVZSh7XG4gICAgICAgIHByZWZpbGw6IGMsXG4gICAgICAgIGdhdGV3YXk6IFwiYWlyd2FsbGV4XCIsXG4gICAgICAgIGdhdGV3YXlNZXJjaGFudElkOiBvLnByb2Nlc3Nvcl9hY2NvdW50X2lkLFxuICAgICAgICBtZXJjaGFudE5hbWU6IG8ucHJvY2Vzc29yX2FjY291bnRfbmFtZSxcbiAgICAgICAgbWVyY2hhbnRJZDogby5nb29nbGVfcGF5X21lcmNoYW50X2lkID8/IFwiXCIsXG4gICAgICAgIC8vIFRoaXMgaXMgZm9yIGluaXRpYWwgcGF5bWVudCByZXF1ZXN0IHRvIGNoZWNrIGF2YWlsYWJpbGl0eS4gQWN0dWFsIGBpbml0aWFsUHJldmlld2Agd2lsbCBiZSB1c2VkIHdoZW4gdGhlIFVJIGlzIHNob3duXG4gICAgICAgIGluaXRpYWxQcmV2aWV3OiB7XG4gICAgICAgICAgYW1vdW50QXRvbTogMCxcbiAgICAgICAgICBjdXJyZW5jeTogXCJVU0RcIlxuICAgICAgICB9XG4gICAgICB9KSwgXyA9IGF3YWl0IGplKGUuYmFzZVVybCwgZiksIHsgcmVzdWx0OiBtIH0gPSBhd2FpdCBfLmlzUmVhZHlUb1BheShmKTtcbiAgICAgIGlmICghbSlcbiAgICAgICAgcmV0dXJuIHJlKFwiR29vZ2xlIFBheSBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGlzIHVzZXJcIiksIHI7XG4gICAgfSBjYXRjaCAoZikge1xuICAgICAgcmV0dXJuIEFlKFwiRXJyb3IgY2hlY2tpbmcgR29vZ2xlIFBheSBhdmFpbGFiaWxpdHlcIiwgZiksIHI7XG4gICAgfVxuICAgIGNvbnN0IGwgPSBjLm1vZGUgPT09IFwic2V0dXBcIiwgdSA9IGF3YWl0IF9lKHMsIGMudG9rZW4sIGwsIHZvaWQgMCksIGQgPSBhc3luYyAoZikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgRi5hZHllbkdvb2dsZVBheS5ydW4oe1xuICAgICAgICAgIGNvbnRleHQ6IGUsXG4gICAgICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBuLFxuICAgICAgICAgIG5vbkNkZUZvcm1JbnB1dHM6IFUoZS5mb3JtRGl2KSxcbiAgICAgICAgICBmb3JtQ2FsbGJhY2tzOiB0LFxuICAgICAgICAgIGluaXRSZXN1bHQ6IHZvaWQgMCxcbiAgICAgICAgICBjdXN0b21QYXJhbXM6IHtcbiAgICAgICAgICAgIC4uLmYsXG4gICAgICAgICAgICBpbml0aWFsUHJldmlldzogdVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIEFlKFwiR29vZ2xlIFBheSBwYXltZW50IGVycm9yXCIsIF8pLCB0LmdldC5vbkNoZWNrb3V0RXJyb3IoXz8ubWVzc2FnZSA/PyBcIlVua25vd24gZXJyb3JcIik7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvY2Vzc29yOiBPLkVudW0uYWR5ZW4sXG4gICAgICBpc0F2YWlsYWJsZTogITAsXG4gICAgICBpc0xvYWRpbmc6ICExLFxuICAgICAgc3RhcnRGbG93OiBkXG4gICAgfTtcbiAgfVxuKSwga2MgPSB6KFxuICBhc3luYyAoe1xuICAgIGNvbnRleHQ6IGUsXG4gICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiB0LFxuICAgIG5vbkNkZUZvcm1JbnB1dHM6IHIsXG4gICAgZm9ybUNhbGxiYWNrczogbixcbiAgICBjdXN0b21QYXJhbXM6IG9cbiAgfSkgPT4ge1xuICAgIHJlKFwiU3RhcnRpbmcgR29vZ2xlIFBheSBmbG93Li4uXCIpO1xuICAgIGNvbnN0IGkgPSBxKGUuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgem4pLCB7IGluaXRpYWxQcmV2aWV3OiBzLCBvdmVycmlkZVBheW1lbnRSZXF1ZXN0OiBjIH0gPSBvLCBsID0gaS5tZXRhZGF0YTtcbiAgICBpZiAoIWwucHJvY2Vzc29yX2FjY291bnRfaWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBnYXRld2F5IG1lcmNoYW50IElEIGZvdW5kIGluIHByb2Nlc3NvciBhY2NvdW50XCIpO1xuICAgIGNvbnN0IHUgPSBlLmFueUNkZUNvbm5lY3Rpb24sIGQgPSBhd2FpdCBNKHUpLCBmID0gVWUoe1xuICAgICAgcHJlZmlsbDogZCxcbiAgICAgIGdhdGV3YXk6IFwiYWR5ZW5cIixcbiAgICAgIGdhdGV3YXlNZXJjaGFudElkOiBsLnByb2Nlc3Nvcl9hY2NvdW50X2lkLFxuICAgICAgbWVyY2hhbnROYW1lOiBsLnByb2Nlc3Nvcl9hY2NvdW50X25hbWUsXG4gICAgICBtZXJjaGFudElkOiBsLmdvb2dsZV9wYXlfbWVyY2hhbnRfaWQgPz8gXCJcIixcbiAgICAgIGluaXRpYWxQcmV2aWV3OiBzLFxuICAgICAgb3ZlcnJpZGVQYXltZW50UmVxdWVzdDogY1xuICAgIH0pO1xuICAgIGcoXCJnb29nbGVfcGF5X2Zsb3dfc3RhcnRlZFwiLCB7XG4gICAgICBwcm9jZXNzb3JfbmFtZTogaS5wcm9jZXNzb3JfbmFtZSxcbiAgICAgIHByZWZpbGw6IGt0KGQsIFtcImJyYW5kXCJdKSxcbiAgICAgIG92ZXJyaWRlUGF5bWVudFJlcXVlc3Q6IGNcbiAgICB9KTtcbiAgICBjb25zdCBfID0gYXdhaXQgamUoZS5iYXNlVXJsLCBmKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbSA9IGF3YWl0IF8ubG9hZFBheW1lbnREYXRhKGYpO1xuICAgICAgcmUoXCJHb29nbGUgUGF5IFBheW1lbnQgZGF0YVwiLCBtKTtcbiAgICAgIGNvbnN0IHkgPSBjcihyLCBtKSwgaCA9IFYoXG4gICAgICAgIHksXG4gICAgICAgIG4uZ2V0Lm9uVmFsaWRhdGlvbkVycm9yLFxuICAgICAgICBvPy5kZWZhdWx0RmllbGRWYWx1ZXNcbiAgICAgICk7XG4gICAgICBpZiAoZyhcImJpbGxpbmdfZGV0YWlsc19yZWNlaXZlZFwiLCB7XG4gICAgICAgIC4uLmhcbiAgICAgIH0pLCAhbS5wYXltZW50TWV0aG9kRGF0YT8udG9rZW5pemF0aW9uRGF0YT8udG9rZW4pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHBheW1lbnQgdG9rZW4gcmVjZWl2ZWQgZnJvbSBHb29nbGUgUGF5XCIpO1xuICAgICAgY29uc3QgRSA9IGF3YWl0IFgodSwge1xuICAgICAgICBwYXltZW50X3Byb3ZpZGVyOiB0LnByb3ZpZGVyLFxuICAgICAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogdCxcbiAgICAgICAgLi4uVyhoLCBkLmNoZWNrb3V0X3NldHRpbmdzKVxuICAgICAgfSksIHYgPSAkZShFKTtcbiAgICAgIHJlKFwiU3RhcnQgZmxvdyBuZXh0IGFjdGlvbnNcIiwgdik7XG4gICAgICBsZXQgQyA9IGF3YWl0IEQodSwge1xuICAgICAgICBzZWN1cmVfdG9rZW46IGQudG9rZW4sXG4gICAgICAgIHByb2Nlc3Nvcl9zcGVjaWZpY19tZXRhZGF0YToge1xuICAgICAgICAgIHBheW1lbnRfcHJvdmlkZXI6IHQucHJvdmlkZXIsXG4gICAgICAgICAgYnJvd3Nlcl9pbmZvOiBzbygpLFxuICAgICAgICAgIG1vYmlsZV93YWxsZXRfcGF5bWVudF9kYXRhOiB7XG4gICAgICAgICAgICBlbmNyeXB0ZWRfcGF5bWVudF90b2tlbjogbS5wYXltZW50TWV0aG9kRGF0YT8udG9rZW5pemF0aW9uRGF0YT8udG9rZW5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmUoXCJbMXN0XSBDb25maXJtIHBheW1lbnQgZmxvdyByZXNwb25zZVwiLCBDKTtcbiAgICAgIGxldCBTID0gQy5wYXltZW50X21ldGhvZHM/LlswXT8uaWQ7XG4gICAgICBjb25zdCBSID0gQy5yZXF1aXJlZF91c2VyX2FjdGlvbnM/LmZpbmQoKGspID0+IGsudHlwZSA9PT0gXCJhZHllbi0zZHNcIik7XG4gICAgICBpZiAoUiAmJiBSLnJlZGlyZWN0X3VybCkge1xuICAgICAgICByZShcIkFkeWVuIDNEUyBSZXF1aXJlZCwgc3RhcnRpbmcgdmVyaWZpY2F0aW9uLi4uXCIsIFIpO1xuICAgICAgICBjb25zdCB7IHN0YXR1czogayB9ID0gYXdhaXQgZmUoe1xuICAgICAgICAgIHVybDogUi5yZWRpcmVjdF91cmwsXG4gICAgICAgICAgYmFzZVVybDogZS5iYXNlVXJsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmUoYOKVsCBBZHllbiAzRFMgdmVyaWZpY2F0aW9uIGNvbXBsZXRlZCBbU3RhdHVzOiAke2t9XWApLCBrID09PSBOLkNBTkNFTExFRClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCIzRFMgdmVyaWZpY2F0aW9uIGNhbmNlbGxlZFwiKTtcbiAgICAgICAgaWYgKGsgPT09IE4uRkFJTFVSRSlcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCIzRFMgdmVyaWZpY2F0aW9uIGZhaWxlZFwiKTtcbiAgICAgIH1cbiAgICAgIGlmIChSICYmICFTICYmIChDID0gYXdhaXQgRCh1LCB7XG4gICAgICAgIHNlY3VyZV90b2tlbjogZC50b2tlbixcbiAgICAgICAgdGhlaXJfcG1faWQ6IFIudGhlaXJfcG1faWQsXG4gICAgICAgIHByb2Nlc3Nvcl9zcGVjaWZpY19tZXRhZGF0YToge1xuICAgICAgICAgIHBheW1lbnRfcHJvdmlkZXI6IHQucHJvdmlkZXJcbiAgICAgICAgfVxuICAgICAgfSksIHJlKFwiWzJuZF0gQ29uZmlybSBwYXltZW50IGZsb3cgcmVzcG9uc2UgYWZ0ZXIgM0RTXCIsIEMpLCBTID0gQy5wYXltZW50X21ldGhvZHM/LlswXT8uaWQpLCAhUylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gcGF5bWVudCBtZXRob2QgSUQgZm91bmRcIik7XG4gICAgICByZXR1cm4gYWUoe1xuICAgICAgICBsb2dQcmVmaXg6IFwiYWR5ZW4tZ29vZ2xlcGF5XCIsXG4gICAgICAgIGFueUNkZUNvbm5lY3Rpb246IHUsXG4gICAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogdCxcbiAgICAgICAgcmVxdWlyZWRGb3JtRmllbGRzOiBoLFxuICAgICAgICBjb25maXJtUmVzdWx0OiBDLFxuICAgICAgICB1c2VQYXlGaXJzdEZsb3c6ICExXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChtKSB7XG4gICAgICB0aHJvdyBBZShcIkdvb2dsZSBQYXkgcGF5bWVudCBlcnJvclwiLCBtKSwgZyhcImdvb2dsZV9wYXlfcGF5bWVudF9lcnJvclwiLCB7XG4gICAgICAgIGVycm9yOiBtXG4gICAgICB9KSwgbmV3IEVycm9yKG0/Lm1lc3NhZ2UgPz8gXCJVbmtub3duIGVycm9yXCIpO1xuICAgIH1cbiAgfVxuKSwgeyBsb2dfXzogcWUsIGVycl9fOiBBYyB9ID0gSShcImF3eC1hY2hcIiksIEljID0geihcbiAgYXN5bmMgKHtcbiAgICBjb250ZXh0OiBlLFxuICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogdCxcbiAgICBub25DZGVGb3JtSW5wdXRzOiByLFxuICAgIGZvcm1DYWxsYmFja3M6IG4sXG4gICAgY3VzdG9tUGFyYW1zOiBvXG4gIH0pID0+IHtcbiAgICBjb25zdCBpID0gVihyLCBuLmdldC5vblZhbGlkYXRpb25FcnJvciksIHMgPSBlLmFueUNkZUNvbm5lY3Rpb24sIGMgPSBhd2FpdCBNKHMpLCBsID0gby52ZXJpZmljYXRpb25NZXRob2QgPz8gXCJwbGFpZFwiO1xuICAgIGxldCB1ID0gbnVsbDtcbiAgICBpZiAobCA9PT0gXCJtaWNyb19kZXBvc2l0XCIpIHtcbiAgICAgIHFlKFwiTWljcm8gZGVwb3NpdCB2ZXJpZmljYXRpb24gc2VsZWN0ZWQsIHNob3dpbmcgZm9ybS4uLlwiKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHUgPSBhd2FpdCBMdChcImFjaF9kaXJlY3RfZGViaXRcIiwge1xuICAgICAgICAgIHdpZHRoOiBcIjQ1MHB4XCIsXG4gICAgICAgICAgaGVpZ2h0OiBcIjQwMHB4XCIsXG4gICAgICAgICAgYmFzZVVybDogZS5iYXNlVXJsXG4gICAgICAgIH0pLCBxZShcIk1pY3JvIGRlcG9zaXQgZGF0YSBjb2xsZWN0ZWRcIik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdGhyb3cgcWUoXCJNaWNybyBkZXBvc2l0IGZvcm0gY2FuY2VsbGVkXCIpLCBuZXcgRXJyb3IoXCJNaWNybyBkZXBvc2l0IGZvcm0gY2FuY2VsbGVkXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkID0gYXdhaXQgWChzLCB7XG4gICAgICBwYXltZW50X3Byb3ZpZGVyOiB0LnByb3ZpZGVyLFxuICAgICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IHQsXG4gICAgICAuLi5XKGksIGMuY2hlY2tvdXRfc2V0dGluZ3MpLFxuICAgICAgY3VzdG9tZXJfbGFuZ3VhZ2U6IG9lKClcbiAgICB9KSwgXyA9ICRlKGQpPy5jb25zZW50X2lkLCB5ID0gKGF3YWl0IEQocywge1xuICAgICAgc2VjdXJlX3Rva2VuOiBjLnRva2VuLFxuICAgICAgcHJvY2Vzc29yX3NwZWNpZmljX21ldGFkYXRhOiB7XG4gICAgICAgIHBheW1lbnRfcHJvdmlkZXI6IHQucHJvdmlkZXIsXG4gICAgICAgIGFpcndhbGxleF9jb25zZW50X2lkOiBfLFxuICAgICAgICB2ZXJpZmljYXRpb25fbWV0aG9kOiBsLFxuICAgICAgICBkaXJlY3RfZGViaXRfZGF0YToge1xuICAgICAgICAgIHR5cGU6IFwiYWNoX2RpcmVjdF9kZWJpdFwiLFxuICAgICAgICAgIGFjaF9kaXJlY3RfZGViaXQ6IHtcbiAgICAgICAgICAgIC8vcGxhaWQgdmVyaWZpY2F0aW9uIHJlcXVpcmVkIGZpZWxkc1xuICAgICAgICAgICAgYnVzaW5lc3NfYWNjb3VudDogby5pc0J1c2luZXNzQWNjb3VudCA/PyAhMSxcbiAgICAgICAgICAgIG93bmVyX25hbWU6IE50KGlbcC5GSVJTVF9OQU1FXSwgaVtwLkxBU1RfTkFNRV0pLFxuICAgICAgICAgICAgb3duZXJfZW1haWw6IGlbcC5FTUFJTF0sXG4gICAgICAgICAgICAvL0FDSCBtaWNybyBkZXBvc2l0IHZlcmlmaWNhdGlvbiByZXF1aXJlZCBmaWVsZHNcbiAgICAgICAgICAgIGFjY291bnRfbnVtYmVyOiB1Py5hY2NvdW50X251bWJlcixcbiAgICAgICAgICAgIGFiYV9yb3V0aW5nX251bWJlcjogdT8uYWJhX3JvdXRpbmdfbnVtYmVyXG4gICAgICAgICAgICAvLyBtYW5kYXRlX3ZlcnNpb246ICcxLjAnLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKS5yZXF1aXJlZF91c2VyX2FjdGlvbnM/LmZpbmQoXG4gICAgICAodykgPT4gdy50eXBlID09PSBcImFpcndhbGxleF9wYXltZW50X2NvbnNlbnRcIlxuICAgICk/LnJlZGlyZWN0X3VybDtcbiAgICBpZiAoeSkge1xuICAgICAgcWUoXCJQbGFpZCB2ZXJpZmljYXRpb24gUmVxdWlyZWQsIHN0YXJ0aW5nIHZlcmlmaWNhdGlvbi4uLlwiKTtcbiAgICAgIGNvbnN0IHsgc3RhdHVzOiB3IH0gPSBhd2FpdCBmZSh7XG4gICAgICAgIHVybDogeSxcbiAgICAgICAgYmFzZVVybDogZS5iYXNlVXJsLFxuICAgICAgICBmcmFtZVdpZHRoOiBcIjUwMHB4XCIsXG4gICAgICAgIGZyYW1lSGVpZ2h0OiBcIjcwMHB4XCIsXG4gICAgICAgIGZyYW1lVGl0bGU6IFwiQUNIIHZlcmlmaWNhdGlvblwiXG4gICAgICB9KTtcbiAgICAgIGlmIChxZShg4pWwIFBsYWlkIHZlcmlmaWNhdGlvbiBjb21wbGV0ZWQgW1N0YXR1czogJHt3fV1gKSwgdyA9PT0gTi5DQU5DRUxMRUQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBsYWlkIHZlcmlmaWNhdGlvbiBjYW5jZWxsZWRcIik7XG4gICAgICBpZiAodyA9PT0gTi5GQUlMVVJFKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQbGFpZCB2ZXJpZmljYXRpb24gZmFpbGVkXCIpO1xuICAgIH1cbiAgICBjb25zdCBoID0gYXdhaXQgRChzLCB7XG4gICAgICBzZWN1cmVfdG9rZW46IGMudG9rZW4sXG4gICAgICBwcm9jZXNzb3Jfc3BlY2lmaWNfbWV0YWRhdGE6IHtcbiAgICAgICAgcGF5bWVudF9wcm92aWRlcjogdC5wcm92aWRlcixcbiAgICAgICAgYWlyd2FsbGV4X2NvbnNlbnRfaWQ6IF9cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGFlKHtcbiAgICAgICAgbG9nUHJlZml4OiBcImF3eC1hY2hcIixcbiAgICAgICAgYW55Q2RlQ29ubmVjdGlvbjogcyxcbiAgICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiB0LFxuICAgICAgICByZXF1aXJlZEZvcm1GaWVsZHM6IGksXG4gICAgICAgIGNvbmZpcm1SZXN1bHQ6IGgsXG4gICAgICAgIHVzZVBheUZpcnN0RmxvdzogITFcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKHcpIHtcbiAgICAgIHRocm93IEFjKFwiQUNIIHBheW1lbnQgZXJyb3JcIiwgdyksIGcoXCJjaGVja291dF9lcnJvclwiLCB7XG4gICAgICAgIGVycm9yOiB3XG4gICAgICB9KSwgbmV3IEVycm9yKHc/Lm1lc3NhZ2UgPz8gXCJVbmtub3duIGVycm9yXCIpO1xuICAgIH1cbiAgfVxuKSwgeyBsb2dfXzogbXQgfSA9IEkoXCJhd3gtYXBwbGUtcGF5XCIpO1xuYXN5bmMgZnVuY3Rpb24gUmMoZSwgdCkge1xuICB0cnkge1xuICAgIGNvbnN0IG8gPSAoYXdhaXQgUnQodC5jb25uZWN0aW9uLCB7XG4gICAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogdC5jaGVja291dFBheW1lbnRNZXRob2QsXG4gICAgICBwcm9jZXNzb3Jfc3BlY2lmaWNfbWV0YWRhdGE6IHtcbiAgICAgICAgYWlyd2FsbGV4X3BheW1lbnRfc2Vzc2lvbjoge1xuICAgICAgICAgIHZhbGlkYXRpb25fdXJsOiBlLnZhbGlkYXRpb25VUkwsXG4gICAgICAgICAgaW5pdGlhdGl2ZV9jb250ZXh0OiB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsXG4gICAgICAgICAgdGhlaXJfYWNjb3VudF9pZDogdC5wcm9jZXNzb3JBY2NvdW50LnByb2Nlc3Nvcl9hY2NvdW50X2lkXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSkubmV4dF9hY3Rpb25fbWV0YWRhdGE/LmFwcGxlX3BheV9zZXNzaW9uO1xuICAgIGlmICghbylcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHNlc3Npb24gZGF0YSByZWNlaXZlZCBmcm9tIHBheW1lbnQgZmxvd1wiKTtcbiAgICB0LnNlc3Npb24uY29tcGxldGVNZXJjaGFudFZhbGlkYXRpb24obyksIGcoXCJhcHBsZV9wYXlfY29tcGxldGVfbWVyY2hhbnRfdmFsaWRhdGlvblwiLCB7XG4gICAgICAuLi5vXG4gICAgfSk7XG4gIH0gY2F0Y2ggKHIpIHtcbiAgICB0aHJvdyB0LnNlc3Npb24uYWJvcnQoKSwgcjtcbiAgfVxufVxuYXN5bmMgZnVuY3Rpb24gVGMoZSwgdCkge1xuICBpZiAoIWUucmVkaXJlY3RfdXJsKVxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHJlZGlyZWN0IFVSTCBmb3VuZFwiKTtcbiAgbXQoXCIzRFMgUmVxdWlyZWQsIHN0YXJ0aW5nIHZlcmlmaWNhdGlvbi4uLlwiLCBlKTtcbiAgY29uc3QgeyBzdGF0dXM6IHIgfSA9IGF3YWl0IGZlKHtcbiAgICB1cmw6IGUucmVkaXJlY3RfdXJsLFxuICAgIGJhc2VVcmw6IHQuYmFzZVVybFxuICB9KTtcbiAgaWYgKG10KGDilbAgM0RTIHZlcmlmaWNhdGlvbiBjb21wbGV0ZWQgW1N0YXR1czogJHtyfV1gKSwgciA9PT0gTi5DQU5DRUxMRUQpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiM0RTIHZlcmlmaWNhdGlvbiBjYW5jZWxsZWRcIik7XG4gIGlmIChyID09PSBOLkZBSUxVUkUpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiM0RTIHZlcmlmaWNhdGlvbiBmYWlsZWRcIik7XG4gIGNvbnN0IG4gPSBhd2FpdCBEKHQuY29ubmVjdGlvbiwge1xuICAgIHNlY3VyZV90b2tlbjogdC5wcmVmaWxsLnRva2VuLFxuICAgIHByb2Nlc3Nvcl9zcGVjaWZpY19tZXRhZGF0YToge1xuICAgICAgdGhlaXJfcG1faWQ6IGUudGhlaXJfcG1faWQsXG4gICAgICBhaXJ3YWxsZXhfY29uc2VudF9pZDogZS5jb25zZW50X2lkLFxuICAgICAgcGF5bWVudF9wcm92aWRlcjogdC5jaGVja291dFBheW1lbnRNZXRob2QucHJvdmlkZXJcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbXQoXCJbMm5kXSBDb25maXJtIHBheW1lbnQgZmxvdyByZXNwb25zZVwiLCBuKSwgbjtcbn1cbmFzeW5jIGZ1bmN0aW9uIE5jKGUsIHQpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByID0gZS5wYXltZW50LCBuID0gZHIodC5ub25DZGVGb3JtSW5wdXRzLCByKSwgbyA9IFYoXG4gICAgICBuLFxuICAgICAgdC5mb3JtQ2FsbGJhY2tzLmdldC5vblZhbGlkYXRpb25FcnJvcixcbiAgICAgIHQuZGVmYXVsdEZpZWxkVmFsdWVzXG4gICAgKTtcbiAgICBnKFwiYmlsbGluZ19kZXRhaWxzX3JlY2VpdmVkXCIsIHtcbiAgICAgIC4uLm9cbiAgICB9KTtcbiAgICBjb25zdCBjID0gKGF3YWl0IFgodC5jb25uZWN0aW9uLCB7XG4gICAgICBwYXltZW50X3Byb3ZpZGVyOiB0LmNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlcixcbiAgICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiB0LmNoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICAgIC4uLlcobywgdC5wcmVmaWxsLmNoZWNrb3V0X3NldHRpbmdzKSxcbiAgICAgIGN1c3RvbWVyX2xhbmd1YWdlOiBvZSgpXG4gICAgfSkpLnJlcXVpcmVkX3VzZXJfYWN0aW9uc1swXS5jb25zZW50X2lkO1xuICAgIGlmICghYylcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbnNlbnQgSUQgcmVjZWl2ZWQgZnJvbSBwYXltZW50IGZsb3dcIik7XG4gICAgbGV0IGwgPSBhd2FpdCBEKHQuY29ubmVjdGlvbiwge1xuICAgICAgc2VjdXJlX3Rva2VuOiB0LnByZWZpbGwudG9rZW4sXG4gICAgICBwcm9jZXNzb3Jfc3BlY2lmaWNfbWV0YWRhdGE6IHtcbiAgICAgICAgcGF5bWVudF9wcm92aWRlcjogdC5jaGVja291dFBheW1lbnRNZXRob2QucHJvdmlkZXIsXG4gICAgICAgIGFpcndhbGxleF9jb25zZW50X2lkOiBjLFxuICAgICAgICBhaXJ3YWxsZXhfcGF5bWVudF9tZXRob2RfZGF0YToge1xuICAgICAgICAgIHR5cGU6IFwiYXBwbGVwYXlcIixcbiAgICAgICAgICBhcHBsZXBheToge1xuICAgICAgICAgICAgcGF5bWVudF9kYXRhX3R5cGU6IFwiZW5jcnlwdGVkX3BheW1lbnRfdG9rZW5cIixcbiAgICAgICAgICAgIGVuY3J5cHRlZF9wYXltZW50X3Rva2VuOiBKU09OLnN0cmluZ2lmeShyLnRva2VuKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIG10KFwiWzFzdF0gQ29uZmlybSBwYXltZW50IGZsb3cgcmVzcG9uc2VcIiwgbCk7XG4gICAgbGV0IHUgPSBsLnBheW1lbnRfbWV0aG9kcz8uWzBdPy5pZDtcbiAgICBjb25zdCBkID0gbC5yZXF1aXJlZF91c2VyX2FjdGlvbnM/LmZpbmQoXG4gICAgICAoXykgPT4gXy50eXBlID09PSBcImFpcndhbGxleF9wYXltZW50X2NvbnNlbnRcIlxuICAgICk7XG4gICAgaWYgKGQ/LnJlZGlyZWN0X3VybCAmJiBkLmNvbnNlbnRfaWQgJiYgZC50aGVpcl9wbV9pZCAmJiAobCA9IGF3YWl0IFRjKGQsIHQpLCB1ID0gbC5wYXltZW50X21ldGhvZHM/LlswXT8uaWQpLCAhdSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIFBNIElEIGZvdW5kXCIpO1xuICAgIGNvbnN0IGYgPSB7XG4gICAgICBzdGF0dXM6IEFwcGxlUGF5U2Vzc2lvbi5TVEFUVVNfU1VDQ0VTU1xuICAgIH07XG4gICAgcmV0dXJuIHQuc2Vzc2lvbi5jb21wbGV0ZVBheW1lbnQoZiksIGFlKHtcbiAgICAgIGxvZ1ByZWZpeDogXCJhd3gtYXBwbGVwYXlcIixcbiAgICAgIGFueUNkZUNvbm5lY3Rpb246IHQuY29ubmVjdGlvbixcbiAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogdC5jaGVja291dFBheW1lbnRNZXRob2QsXG4gICAgICByZXF1aXJlZEZvcm1GaWVsZHM6IG8sXG4gICAgICBjb25maXJtUmVzdWx0OiBsLFxuICAgICAgdXNlUGF5Rmlyc3RGbG93OiAhMVxuICAgIH0pO1xuICB9IGNhdGNoIChyKSB7XG4gICAgY29uc3QgbiA9IHtcbiAgICAgIHN0YXR1czogQXBwbGVQYXlTZXNzaW9uLlNUQVRVU19GQUlMVVJFXG4gICAgfTtcbiAgICB0aHJvdyB0LnNlc3Npb24uY29tcGxldGVQYXltZW50KG4pLCByO1xuICB9XG59XG5jb25zdCB7IGxvZ19fOiBIZSwgZXJyX186IEhuIH0gPSBJKFwiYXd4LWFwcGxlLXBheVwiKSwgRmMgPSBtZShcbiAgYXN5bmMgKHsgY29udGV4dDogZSwgZm9ybUNhbGxiYWNrczogdCB9KSA9PiB7XG4gICAgY29uc3QgciA9IHtcbiAgICAgIHByb2Nlc3NvcjogTy5FbnVtLmFpcndhbGxleCxcbiAgICAgIGlzQXZhaWxhYmxlOiAhMSxcbiAgICAgIGlzTG9hZGluZzogITEsXG4gICAgICBzdGFydEZsb3c6IGFzeW5jICgpID0+IHtcbiAgICAgIH1cbiAgICB9LCBuID0gcShlLmNoZWNrb3V0UGF5bWVudE1ldGhvZHMsIFVuKTtcbiAgICBpZiAoIW4pXG4gICAgICByZXR1cm4gcjtcbiAgICBpZiAoSGUoXCJMb2FkaW5nIEFwcGxlIFBheSBzY3JpcHRcIiksIGF3YWl0IHVyKCksICF3aW5kb3cuQXBwbGVQYXlTZXNzaW9uIHx8ICFBcHBsZVBheVNlc3Npb24uY2FuTWFrZVBheW1lbnRzKCkpXG4gICAgICByZXR1cm4gSGUoXCJBcHBsZSBQYXkgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIGRldmljZS9icm93c2VyXCIpLCByO1xuICAgIGlmIChIZShcIkFwcGxlIFBheSBMb2FkZWRcIiksICFhd2FpdCBBcHBsZVBheVNlc3Npb24uY2FuTWFrZVBheW1lbnRzKCkpXG4gICAgICByZXR1cm4gSGUoXCJObyBhY3RpdmUgY2FyZHMgYXZhaWxhYmxlIGZvciBBcHBsZSBQYXlcIiksIHI7XG4gICAgaWYgKCFuLm1ldGFkYXRhLnByb2Nlc3Nvcl9hY2NvdW50X2lkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gZ2F0ZXdheSBtZXJjaGFudCBJRCBmb3VuZCBpbiBwcm9jZXNzb3IgYWNjb3VudFwiKTtcbiAgICBjb25zdCBzID0gZS5hbnlDZGVDb25uZWN0aW9uLCBjID0gYXdhaXQgTShzKSwgbCA9IGMubW9kZSA9PT0gXCJzZXR1cFwiLCB1ID0gYXdhaXQgX2UocywgYy50b2tlbiwgbCwgdm9pZCAwKSwgZCA9IGFzeW5jIChmKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBGLmFpcndhbGxleEFwcGxlUGF5LnJ1bih7XG4gICAgICAgICAgY29udGV4dDogZSxcbiAgICAgICAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IG4sXG4gICAgICAgICAgbm9uQ2RlRm9ybUlucHV0czogVShlLmZvcm1EaXYpLFxuICAgICAgICAgIGZvcm1DYWxsYmFja3M6IHQsXG4gICAgICAgICAgY3VzdG9tUGFyYW1zOiB7XG4gICAgICAgICAgICAuLi5mLFxuICAgICAgICAgICAgaW5pdGlhbFByZXZpZXc6IHVcbiAgICAgICAgICB9LFxuICAgICAgICAgIGluaXRSZXN1bHQ6IHZvaWQgMFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgSG4oXCJBcHBsZSBQYXkgcGF5bWVudCBlcnJvclwiLCBfKSwgdC5nZXQub25DaGVja291dEVycm9yKF8/Lm1lc3NhZ2UgPz8gXCJVbmtub3duIGVycm9yXCIpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb2Nlc3NvcjogTy5FbnVtLmFpcndhbGxleCxcbiAgICAgIGlzQXZhaWxhYmxlOiAhMCxcbiAgICAgIGlzTG9hZGluZzogITEsXG4gICAgICBzdGFydEZsb3c6IGRcbiAgICB9O1xuICB9XG4pLCBMYyA9IHooXG4gIGFzeW5jICh7XG4gICAgY29udGV4dDogZSxcbiAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IHQsXG4gICAgbm9uQ2RlRm9ybUlucHV0czogcixcbiAgICBjdXN0b21QYXJhbXM6IG4sXG4gICAgZm9ybUNhbGxiYWNrczogb1xuICB9KSA9PiB7XG4gICAgY29uc3QgaSA9IHEoZS5jaGVja291dFBheW1lbnRNZXRob2RzLCBVbiksIHsgb3ZlcnJpZGVQYXltZW50UmVxdWVzdDogcywgaW5pdGlhbFByZXZpZXc6IGMgfSA9IG4sIGwgPSBlLmFueUNkZUNvbm5lY3Rpb24sIHUgPSBhd2FpdCBNKGwpLCBkID0gdS5tb2RlID09PSBcInNldHVwXCIsIGYgPSBwcih7XG4gICAgICBvdmVycmlkZVBheW1lbnRSZXF1ZXN0OiBzLFxuICAgICAgaW5pdGlhbFByZXZpZXc6IGMsXG4gICAgICBwcmVmaWxsOiB7XG4gICAgICAgIC4uLnVcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0TGFiZWw6IGk/Lm1ldGFkYXRhPy5wcm9jZXNzb3JfYWNjb3VudF9uYW1lXG4gICAgfSksIF8gPSBuZXcgQXBwbGVQYXlTZXNzaW9uKDMsIGYpLCBtID0ge1xuICAgICAgc2Vzc2lvbjogXyxcbiAgICAgIGNvbm5lY3Rpb246IGUuYW55Q2RlQ29ubmVjdGlvbixcbiAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogdCxcbiAgICAgIG5vbkNkZUZvcm1JbnB1dHM6IHIsXG4gICAgICBwcm9jZXNzb3JBY2NvdW50OiBpLm1ldGFkYXRhLFxuICAgICAgcHJlZmlsbDogdSxcbiAgICAgIGlzU2V0dXBNb2RlOiBkLFxuICAgICAgYmFzZVVybDogZS5iYXNlVXJsLFxuICAgICAgZm9ybUNhbGxiYWNrczogbyxcbiAgICAgIGRlZmF1bHRGaWVsZFZhbHVlczogbj8uZGVmYXVsdEZpZWxkVmFsdWVzXG4gICAgfTtcbiAgICByZXR1cm4gZyhcImFwcGxlX3BheV9mbG93X3N0YXJ0ZWRcIiwge1xuICAgICAgcHJvY2Vzc29yX25hbWU6IHQucHJvY2Vzc29yX25hbWUsXG4gICAgICBwcmVmaWxsOiBrdCh1LCBbXCJicmFuZFwiXSksXG4gICAgICBvdmVycmlkZVBheW1lbnRSZXF1ZXN0OiBzXG4gICAgfSksIG5ldyBQcm9taXNlKCh5LCBoKSA9PiB7XG4gICAgICBjb25zdCB3ID0gKCkgPT4ge1xuICAgICAgICBIZShcIlBheW1lbnQgY2FuY2VsbGVkIGJ5IHVzZXJcIiksIGgobmV3IEVycm9yKFwiUGF5bWVudCBjYW5jZWxsZWQgYnkgdXNlclwiKSk7XG4gICAgICB9O1xuICAgICAgXy5vbmNhbmNlbCA9IHcsIF8ub252YWxpZGF0ZW1lcmNoYW50ID0gYXN5bmMgKEUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBSYyhFLCBtKTtcbiAgICAgICAgfSBjYXRjaCAodikge1xuICAgICAgICAgIGgodik7XG4gICAgICAgIH1cbiAgICAgIH0sIF8ub25wYXltZW50bWV0aG9kc2VsZWN0ZWQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IEUgPSB7XG4gICAgICAgICAgbmV3VG90YWw6IHsgLi4uZi50b3RhbCB9XG4gICAgICAgIH07XG4gICAgICAgIF8uY29tcGxldGVQYXltZW50TWV0aG9kU2VsZWN0aW9uKEUpO1xuICAgICAgfSwgXy5vbnBheW1lbnRhdXRob3JpemVkID0gYXN5bmMgKEUpID0+IHtcbiAgICAgICAgZyhcImFwcGxlX3BheV9wYXltZW50X2F1dGhvcml6ZWRcIik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdiA9IGF3YWl0IE5jKEUsIG0pO1xuICAgICAgICAgIHkodik7XG4gICAgICAgIH0gY2F0Y2ggKHYpIHtcbiAgICAgICAgICBoKHYpO1xuICAgICAgICB9XG4gICAgICB9LCBfLmJlZ2luKCk7XG4gICAgfSkuY2F0Y2goKHkpID0+IHtcbiAgICAgIHRocm93IEhuKFwiQXBwbGUgUGF5IHBheW1lbnQgZXJyb3JcIiwgeSksIGcoXCJhcHBsZV9wYXlfcGF5bWVudF9lcnJvclwiLCB7XG4gICAgICAgIGVycm9yOiB5XG4gICAgICB9KSwgeTtcbiAgICB9KTtcbiAgfVxuKSwgeyBsb2dfXzogUSwgZXJyX186IEllIH0gPSBJKFwiYXd4LWdvb2dsZS1wYXlcIiksIE1jID0gbWUoXG4gIGFzeW5jICh7IGNvbnRleHQ6IGUsIGZvcm1DYWxsYmFja3M6IHQgfSkgPT4ge1xuICAgIGNvbnN0IHIgPSB7XG4gICAgICBwcm9jZXNzb3I6IE8uRW51bS5haXJ3YWxsZXgsXG4gICAgICBpc0F2YWlsYWJsZTogITEsXG4gICAgICBpc0xvYWRpbmc6ICExLFxuICAgICAgc3RhcnRGbG93OiBhc3luYyAoKSA9PiB7XG4gICAgICB9XG4gICAgfSwgbiA9IHEoZS5jaGVja291dFBheW1lbnRNZXRob2RzLCBqbik7XG4gICAgaWYgKCFuKVxuICAgICAgcmV0dXJuIHI7XG4gICAgUShcIkdvb2dsZSBQYXkgQ1BNXCIsIG4pO1xuICAgIGNvbnN0IG8gPSBuLm1ldGFkYXRhO1xuICAgIGlmICghby5wcm9jZXNzb3JfYWNjb3VudF9pZClcbiAgICAgIHJldHVybiBJZShcIk5vIGdhdGV3YXkgbWVyY2hhbnQgSUQgZm91bmQgaW4gcHJvY2Vzc29yIGFjY291bnRcIiksIHI7XG4gICAgaWYgKFEoXCJMb2FkaW5nIEdvb2dsZSBQYXkgc2NyaXB0XCIpLCBhd2FpdCBpcigpLCAhd2luZG93Lmdvb2dsZT8ucGF5bWVudHM/LmFwaSlcbiAgICAgIHJldHVybiBJZShcIkdvb2dsZSBQYXkgU0RLIG5vdCBsb2FkZWQgcHJvcGVybHlcIiksIHI7XG4gICAgaWYgKGF3YWl0IHNyKGUuYmFzZVVybCkgPT09IFwiUFJPRFVDVElPTlwiICYmICFvLmdvb2dsZV9wYXlfbWVyY2hhbnRfaWQpXG4gICAgICByZXR1cm4gSWUoXCJHb29nbGUgUGF5IG1lcmNoYW50IElEIGlzIHJlcXVpcmVkIGZvciBwcm9kdWN0aW9uIGVudmlyb25tZW50XCIpLCByO1xuICAgIFEoXCJHb29nbGUgUGF5IFNESyBsb2FkZWRcIiwgd2luZG93Lmdvb2dsZS5wYXltZW50cyk7XG4gICAgY29uc3QgcyA9IGUuYW55Q2RlQ29ubmVjdGlvbiwgYyA9IGF3YWl0IE0ocyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGYgPSBVZSh7XG4gICAgICAgIHByZWZpbGw6IGMsXG4gICAgICAgIGdhdGV3YXk6IFwiYWlyd2FsbGV4XCIsXG4gICAgICAgIGdhdGV3YXlNZXJjaGFudElkOiBvLnByb2Nlc3Nvcl9hY2NvdW50X2lkLFxuICAgICAgICBtZXJjaGFudE5hbWU6IG8ucHJvY2Vzc29yX2FjY291bnRfbmFtZSxcbiAgICAgICAgbWVyY2hhbnRJZDogby5nb29nbGVfcGF5X21lcmNoYW50X2lkID8/IFwiXCIsXG4gICAgICAgIC8vIFRoaXMgaXMgZm9yIGluaXRpYWwgcGF5bWVudCByZXF1ZXN0IHRvIGNoZWNrIGF2YWlsYWJpbGl0eS4gQWN0dWFsIGBpbml0aWFsUHJldmlld2Agd2lsbCBiZSB1c2VkIHdoZW4gdGhlIFVJIGlzIHNob3duXG4gICAgICAgIGluaXRpYWxQcmV2aWV3OiB7XG4gICAgICAgICAgYW1vdW50QXRvbTogMCxcbiAgICAgICAgICBjdXJyZW5jeTogXCJVU0RcIlxuICAgICAgICB9XG4gICAgICB9KSwgXyA9IGF3YWl0IGplKGUuYmFzZVVybCwgZiksIHsgcmVzdWx0OiBtIH0gPSBhd2FpdCBfLmlzUmVhZHlUb1BheShmKTtcbiAgICAgIGlmICghbSlcbiAgICAgICAgcmV0dXJuIFEoXCJHb29nbGUgUGF5IGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgdXNlclwiKSwgcjtcbiAgICB9IGNhdGNoIChmKSB7XG4gICAgICByZXR1cm4gSWUoXCJFcnJvciBjaGVja2luZyBHb29nbGUgUGF5IGF2YWlsYWJpbGl0eVwiLCBmKSwgcjtcbiAgICB9XG4gICAgY29uc3QgbCA9IGMubW9kZSA9PT0gXCJzZXR1cFwiLCB1ID0gYXdhaXQgX2UocywgYy50b2tlbiwgbCwgdm9pZCAwKSwgZCA9IGFzeW5jIChmKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBGLmFpcndhbGxleEdvb2dsZVBheS5ydW4oe1xuICAgICAgICAgIGNvbnRleHQ6IGUsXG4gICAgICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBuLFxuICAgICAgICAgIG5vbkNkZUZvcm1JbnB1dHM6IFUoZS5mb3JtRGl2KSxcbiAgICAgICAgICBmb3JtQ2FsbGJhY2tzOiB0LFxuICAgICAgICAgIGluaXRSZXN1bHQ6IHZvaWQgMCxcbiAgICAgICAgICBjdXN0b21QYXJhbXM6IHtcbiAgICAgICAgICAgIC4uLmYsXG4gICAgICAgICAgICBpbml0aWFsUHJldmlldzogdVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIEllKFwiR29vZ2xlIFBheSBwYXltZW50IGVycm9yXCIsIF8pLCB0LmdldC5vbkNoZWNrb3V0RXJyb3IoXz8ubWVzc2FnZSA/PyBcIlVua25vd24gZXJyb3JcIik7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvY2Vzc29yOiBPLkVudW0uYWlyd2FsbGV4LFxuICAgICAgaXNBdmFpbGFibGU6ICEwLFxuICAgICAgaXNMb2FkaW5nOiAhMSxcbiAgICAgIHN0YXJ0RmxvdzogZFxuICAgIH07XG4gIH1cbiksIHhjID0geihcbiAgYXN5bmMgKHtcbiAgICBjb250ZXh0OiBlLFxuICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogdCxcbiAgICBub25DZGVGb3JtSW5wdXRzOiByLFxuICAgIGZvcm1DYWxsYmFja3M6IG4sXG4gICAgY3VzdG9tUGFyYW1zOiBvXG4gIH0pID0+IHtcbiAgICBRKFwiU3RhcnRpbmcgR29vZ2xlIFBheSBmbG93Li4uXCIpO1xuICAgIGNvbnN0IGkgPSBxKGUuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgam4pLCB7IGluaXRpYWxQcmV2aWV3OiBzLCBvdmVycmlkZVBheW1lbnRSZXF1ZXN0OiBjIH0gPSBvLCBsID0gaS5tZXRhZGF0YTtcbiAgICBpZiAoIWwucHJvY2Vzc29yX2FjY291bnRfaWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBnYXRld2F5IG1lcmNoYW50IElEIGZvdW5kIGluIHByb2Nlc3NvciBhY2NvdW50XCIpO1xuICAgIGNvbnN0IHUgPSBlLmFueUNkZUNvbm5lY3Rpb24sIGQgPSBhd2FpdCBNKHUpLCBmID0gVWUoe1xuICAgICAgcHJlZmlsbDogZCxcbiAgICAgIGdhdGV3YXk6IFwiYWlyd2FsbGV4XCIsXG4gICAgICBnYXRld2F5TWVyY2hhbnRJZDogbC5wcm9jZXNzb3JfYWNjb3VudF9pZCxcbiAgICAgIG1lcmNoYW50TmFtZTogbC5wcm9jZXNzb3JfYWNjb3VudF9uYW1lLFxuICAgICAgbWVyY2hhbnRJZDogbC5nb29nbGVfcGF5X21lcmNoYW50X2lkID8/IFwiXCIsXG4gICAgICBpbml0aWFsUHJldmlldzogcyxcbiAgICAgIG92ZXJyaWRlUGF5bWVudFJlcXVlc3Q6IGNcbiAgICB9KTtcbiAgICBnKFwiZ29vZ2xlX3BheV9mbG93X3N0YXJ0ZWRcIiwge1xuICAgICAgcHJvY2Vzc29yX25hbWU6IGkucHJvY2Vzc29yX25hbWUsXG4gICAgICBwcmVmaWxsOiBrdChkLCBbXCJicmFuZFwiXSksXG4gICAgICBvdmVycmlkZVBheW1lbnRSZXF1ZXN0OiBjXG4gICAgfSk7XG4gICAgY29uc3QgXyA9IGF3YWl0IGplKGUuYmFzZVVybCwgZik7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG0gPSBhd2FpdCBfLmxvYWRQYXltZW50RGF0YShmKTtcbiAgICAgIFEoXCJHb29nbGUgUGF5IFBheW1lbnQgZGF0YVwiLCBtKTtcbiAgICAgIGNvbnN0IHkgPSBjcihyLCBtKSwgaCA9IFYoXG4gICAgICAgIHksXG4gICAgICAgIG4uZ2V0Lm9uVmFsaWRhdGlvbkVycm9yLFxuICAgICAgICBvPy5kZWZhdWx0RmllbGRWYWx1ZXNcbiAgICAgICk7XG4gICAgICBRKFwiX19fXCIsIGgpLCBnKFwiYmlsbGluZ19kZXRhaWxzX3JlY2VpdmVkXCIsIHtcbiAgICAgICAgLi4uaFxuICAgICAgfSk7XG4gICAgICBjb25zdCB3ID0gbS5wYXltZW50TWV0aG9kRGF0YT8udG9rZW5pemF0aW9uRGF0YT8udG9rZW47XG4gICAgICBpZiAoIXcpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHBheW1lbnQgdG9rZW4gcmVjZWl2ZWQgZnJvbSBHb29nbGUgUGF5XCIpO1xuICAgICAgY29uc3QgRSA9IGF3YWl0IFgodSwge1xuICAgICAgICBwYXltZW50X3Byb3ZpZGVyOiB0LnByb3ZpZGVyLFxuICAgICAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogdCxcbiAgICAgICAgLi4uVyhoLCBkLmNoZWNrb3V0X3NldHRpbmdzKSxcbiAgICAgICAgY3VzdG9tZXJfbGFuZ3VhZ2U6IG9lKClcbiAgICAgIH0pLCB2ID0gJGUoRSk7XG4gICAgICBRKFwiU3RhcnQgZmxvdyBuZXh0IGFjdGlvbnNcIiwgdik7XG4gICAgICBsZXQgQyA9IGF3YWl0IEQodSwge1xuICAgICAgICBzZWN1cmVfdG9rZW46IGQudG9rZW4sXG4gICAgICAgIHByb2Nlc3Nvcl9zcGVjaWZpY19tZXRhZGF0YToge1xuICAgICAgICAgIHBheW1lbnRfcHJvdmlkZXI6IHQucHJvdmlkZXIsXG4gICAgICAgICAgLy8gR29vZ2xlUGF5J3MgZW5jcnlwdGVkX3BheW1lbnRfdG9rZW4gcHJvdmlkZWQgdG8gdmVyaWZ5IHRoZSBjb25zZW50IGZpcnN0XG4gICAgICAgICAgYWlyd2FsbGV4X2NvbnNlbnRfaWQ6IHY/LmNvbnNlbnRfaWQsXG4gICAgICAgICAgYWlyd2FsbGV4X3BheW1lbnRfbWV0aG9kX2RhdGE6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiZ29vZ2xlcGF5XCIsXG4gICAgICAgICAgICBnb29nbGVwYXk6IHtcbiAgICAgICAgICAgICAgcGF5bWVudF9kYXRhX3R5cGU6IFwiZW5jcnlwdGVkX3BheW1lbnRfdG9rZW5cIixcbiAgICAgICAgICAgICAgZW5jcnlwdGVkX3BheW1lbnRfdG9rZW46IHdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgUShcIlsxc3RdIENvbmZpcm0gcGF5bWVudCBmbG93IHJlc3BvbnNlXCIsIEMpO1xuICAgICAgbGV0IFMgPSBDLnBheW1lbnRfbWV0aG9kcz8uWzBdPy5pZDtcbiAgICAgIGNvbnN0IFIgPSBDLnJlcXVpcmVkX3VzZXJfYWN0aW9ucz8uZmluZChcbiAgICAgICAgKGspID0+IGsudHlwZSA9PT0gXCJhaXJ3YWxsZXhfcGF5bWVudF9jb25zZW50XCJcbiAgICAgICk7XG4gICAgICBpZiAoUiAmJiBSLnJlZGlyZWN0X3VybCkge1xuICAgICAgICBRKFwiM0RTIFJlcXVpcmVkLCBzdGFydGluZyB2ZXJpZmljYXRpb24uLi5cIiwgUik7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzOiBrIH0gPSBhd2FpdCBmZSh7XG4gICAgICAgICAgdXJsOiBSLnJlZGlyZWN0X3VybCxcbiAgICAgICAgICBiYXNlVXJsOiBlLmJhc2VVcmxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChRKGDilbAgM0RTIHZlcmlmaWNhdGlvbiBjb21wbGV0ZWQgW1N0YXR1czogJHtrfV1gKSwgayA9PT0gTi5DQU5DRUxMRUQpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiM0RTIHZlcmlmaWNhdGlvbiBjYW5jZWxsZWRcIik7XG4gICAgICAgIGlmIChrID09PSBOLkZBSUxVUkUpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiM0RTIHZlcmlmaWNhdGlvbiBmYWlsZWRcIik7XG4gICAgICB9XG4gICAgICBpZiAoUiAmJiAhUyAmJiAoQyA9IGF3YWl0IEQodSwge1xuICAgICAgICBzZWN1cmVfdG9rZW46IGQudG9rZW4sXG4gICAgICAgIHRoZWlyX3BtX2lkOiBSLnRoZWlyX3BtX2lkLFxuICAgICAgICBwcm9jZXNzb3Jfc3BlY2lmaWNfbWV0YWRhdGE6IHtcbiAgICAgICAgICBwYXltZW50X3Byb3ZpZGVyOiB0LnByb3ZpZGVyLFxuICAgICAgICAgIGFpcndhbGxleF9jb25zZW50X2lkOiBSLmNvbnNlbnRfaWRcbiAgICAgICAgfVxuICAgICAgfSksIFEoXCJbMm5kXSBDb25maXJtIHBheW1lbnQgZmxvdyByZXNwb25zZVwiLCBDKSwgUyA9IEMucGF5bWVudF9tZXRob2RzPy5bMF0/LmlkKSwgIVMpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIFBNIElEIGZvdW5kXCIpO1xuICAgICAgcmV0dXJuIGFlKHtcbiAgICAgICAgbG9nUHJlZml4OiBcImF3eC1nb29nbGVwYXlcIixcbiAgICAgICAgYW55Q2RlQ29ubmVjdGlvbjogdSxcbiAgICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiB0LFxuICAgICAgICByZXF1aXJlZEZvcm1GaWVsZHM6IGgsXG4gICAgICAgIGNvbmZpcm1SZXN1bHQ6IEMsXG4gICAgICAgIHVzZVBheUZpcnN0RmxvdzogITFcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKG0pIHtcbiAgICAgIHRocm93IEllKFwiR29vZ2xlIFBheSBwYXltZW50IGVycm9yXCIsIG0pLCBnKFwiZ29vZ2xlX3BheV9wYXltZW50X2Vycm9yXCIsIHtcbiAgICAgICAgZXJyb3I6IG1cbiAgICAgIH0pLCBuZXcgRXJyb3IobT8ubWVzc2FnZSA/PyBcIlVua25vd24gZXJyb3JcIik7XG4gICAgfVxuICB9XG4pLCBZbiA9IHokMS5vYmplY3Qoe1xuICBwcm92aWRlcjogeiQxLmxpdGVyYWwoXCJhcHBsZV9wYXlcIiksXG4gIHByb2Nlc3Nvcl9uYW1lOiB6JDEubGl0ZXJhbChcImF1dGhvcml6ZV9uZXRcIiksXG4gIG1ldGFkYXRhOiB6JDEub2JqZWN0KHtcbiAgICBwcm9jZXNzb3JfYWNjb3VudF9pZDogeiQxLnN0cmluZygpLFxuICAgIHByb2Nlc3Nvcl9hY2NvdW50X25hbWU6IHokMS5zdHJpbmcoKVxuICB9KVxufSksIFduID0geiQxLm9iamVjdCh7XG4gIHByb3ZpZGVyOiB6JDEubGl0ZXJhbChcImdvb2dsZV9wYXlcIiksXG4gIHByb2Nlc3Nvcl9uYW1lOiB6JDEubGl0ZXJhbChcImF1dGhvcml6ZV9uZXRcIiksXG4gIG1ldGFkYXRhOiB6JDEub2JqZWN0KHtcbiAgICBwcm9jZXNzb3JfYWNjb3VudF9pZDogeiQxLnN0cmluZygpLFxuICAgIHByb2Nlc3Nvcl9hY2NvdW50X25hbWU6IHokMS5zdHJpbmcoKSxcbiAgICBnb29nbGVfcGF5X21lcmNoYW50X2lkOiB6JDEuc3RyaW5nKCkubnVsbGlzaCgpXG4gIH0pXG59KTtcbmFzeW5jIGZ1bmN0aW9uIERjKGUsIHQpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBvID0gKGF3YWl0IFJ0KHQuY29ubmVjdGlvbiwge1xuICAgICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IHQuY2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAgICAgcHJvY2Vzc29yX3NwZWNpZmljX21ldGFkYXRhOiB7XG4gICAgICAgIGFwcGxlX3BheW1lbnRfc2Vzc2lvbjoge1xuICAgICAgICAgIHZhbGlkYXRpb25fdXJsOiBlLnZhbGlkYXRpb25VUkwsXG4gICAgICAgICAgaW5pdGlhdGl2ZV9jb250ZXh0OiB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsXG4gICAgICAgICAgdGhlaXJfYWNjb3VudF9pZDogdC5wcm9jZXNzb3JBY2NvdW50LnByb2Nlc3Nvcl9hY2NvdW50X2lkXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSkubmV4dF9hY3Rpb25fbWV0YWRhdGE/LmFwcGxlX3BheV9zZXNzaW9uO1xuICAgIGlmICghbylcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHNlc3Npb24gZGF0YSByZWNlaXZlZCBmcm9tIHBheW1lbnQgZmxvd1wiKTtcbiAgICB0LnNlc3Npb24uY29tcGxldGVNZXJjaGFudFZhbGlkYXRpb24obyksIGcoXCJhcHBsZV9wYXlfY29tcGxldGVfbWVyY2hhbnRfdmFsaWRhdGlvblwiLCB7XG4gICAgICAuLi5vXG4gICAgfSk7XG4gIH0gY2F0Y2ggKHIpIHtcbiAgICB0aHJvdyB0LnNlc3Npb24uYWJvcnQoKSwgcjtcbiAgfVxufVxuYXN5bmMgZnVuY3Rpb24gT2MoZSwgdCkge1xuICB0cnkge1xuICAgIGNvbnN0IHIgPSBlLnBheW1lbnQsIG4gPSBkcih0Lm5vbkNkZUZvcm1JbnB1dHMsIHIpLCBvID0gVihuLCB0LmZvcm1DYWxsYmFja3MuZ2V0Lm9uVmFsaWRhdGlvbkVycm9yKTtcbiAgICBnKFwiYmlsbGluZ19kZXRhaWxzX3JlY2VpdmVkXCIsIHtcbiAgICAgIC4uLm9cbiAgICB9KSwgYXdhaXQgWCh0LmNvbm5lY3Rpb24sIHtcbiAgICAgIHBheW1lbnRfcHJvdmlkZXI6IHQuY2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyLFxuICAgICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IHQuY2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAgICAgLi4uVyhvLCB0LnByZWZpbGwuY2hlY2tvdXRfc2V0dGluZ3MpLFxuICAgICAgY3VzdG9tZXJfbGFuZ3VhZ2U6IG9lKClcbiAgICB9KTtcbiAgICBjb25zdCBpID0ge1xuICAgICAgZGF0YURlc2NyaXB0b3I6IFwiQ09NTU9OLkFQUExFLklOQVBQLlBBWU1FTlRcIixcbiAgICAgIGRhdGFWYWx1ZTogd2luZG93LmJ0b2EoSlNPTi5zdHJpbmdpZnkoci50b2tlbi5wYXltZW50RGF0YSkpXG4gICAgfSwgcyA9IGF3YWl0IEQodC5jb25uZWN0aW9uLCB7XG4gICAgICBzZWN1cmVfdG9rZW46IHQucHJlZmlsbC50b2tlbixcbiAgICAgIHByb2Nlc3Nvcl9zcGVjaWZpY19tZXRhZGF0YToge1xuICAgICAgICBwYXltZW50X3Byb3ZpZGVyOiB0LmNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlcixcbiAgICAgICAgbW9iaWxlX3dhbGxldF9wYXltZW50X2RhdGE6IGlcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIXMucGF5bWVudF9tZXRob2RzPy5bMF0/LmlkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gUE0gSUQgZm91bmRcIik7XG4gICAgY29uc3QgbCA9IHtcbiAgICAgIHN0YXR1czogQXBwbGVQYXlTZXNzaW9uLlNUQVRVU19TVUNDRVNTXG4gICAgfTtcbiAgICByZXR1cm4gdC5zZXNzaW9uLmNvbXBsZXRlUGF5bWVudChsKSwgYWUoe1xuICAgICAgbG9nUHJlZml4OiBcImF1dGhuZXQtYXBwbGVwYXlcIixcbiAgICAgIGFueUNkZUNvbm5lY3Rpb246IHQuY29ubmVjdGlvbixcbiAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogdC5jaGVja291dFBheW1lbnRNZXRob2QsXG4gICAgICByZXF1aXJlZEZvcm1GaWVsZHM6IG8sXG4gICAgICBjb25maXJtUmVzdWx0OiBzLFxuICAgICAgdXNlUGF5Rmlyc3RGbG93OiAhMVxuICAgIH0pO1xuICB9IGNhdGNoIChyKSB7XG4gICAgY29uc3QgbiA9IHtcbiAgICAgIHN0YXR1czogQXBwbGVQYXlTZXNzaW9uLlNUQVRVU19GQUlMVVJFXG4gICAgfTtcbiAgICB0aHJvdyB0LnNlc3Npb24uY29tcGxldGVQYXltZW50KG4pLCByO1xuICB9XG59XG5jb25zdCB7IGxvZ19fOiBfdCwgZXJyX186IEpuIH0gPSBJKFwiYXV0aG5ldC1hcHBsZXBheVwiKSwgVWMgPSBtZShcbiAgYXN5bmMgKHsgY29udGV4dDogZSwgZm9ybUNhbGxiYWNrczogdCB9KSA9PiB7XG4gICAgY29uc3QgciA9IHtcbiAgICAgIHByb2Nlc3NvcjogTy5FbnVtLmF1dGhvcml6ZV9uZXQsXG4gICAgICBpc0F2YWlsYWJsZTogITEsXG4gICAgICBpc0xvYWRpbmc6ICExLFxuICAgICAgc3RhcnRGbG93OiBhc3luYyAoKSA9PiB7XG4gICAgICB9XG4gICAgfSwgbiA9IHEoZS5jaGVja291dFBheW1lbnRNZXRob2RzLCBZbik7XG4gICAgaWYgKCFuKVxuICAgICAgcmV0dXJuIHI7XG4gICAgaWYgKF90KFwiTG9hZGluZyBBcHBsZSBQYXkgc2NyaXB0XCIpLCBhd2FpdCB1cigpLCAhd2luZG93LkFwcGxlUGF5U2Vzc2lvbiB8fCAhQXBwbGVQYXlTZXNzaW9uLmNhbk1ha2VQYXltZW50cygpKVxuICAgICAgcmV0dXJuIF90KFwiQXBwbGUgUGF5IGlzIG5vdCBhdmFpbGFibGUgb24gdGhpcyBkZXZpY2UvYnJvd3NlclwiKSwgcjtcbiAgICBpZiAoIWF3YWl0IEFwcGxlUGF5U2Vzc2lvbi5jYW5NYWtlUGF5bWVudHMoKSlcbiAgICAgIHJldHVybiBfdChcIk5vIGFjdGl2ZSBjYXJkcyBhdmFpbGFibGUgZm9yIEFwcGxlIFBheVwiKSwgcjtcbiAgICBpZiAoIW4ubWV0YWRhdGEucHJvY2Vzc29yX2FjY291bnRfaWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBnYXRld2F5IG1lcmNoYW50IElEIGZvdW5kIGluIHByb2Nlc3NvciBhY2NvdW50XCIpO1xuICAgIGNvbnN0IHMgPSBlLmFueUNkZUNvbm5lY3Rpb24sIGMgPSBhd2FpdCBNKHMpLCBsID0gYy5tb2RlID09PSBcInNldHVwXCIsIHUgPSBhd2FpdCBfZShzLCBjLnRva2VuLCBsLCB2b2lkIDApLCBkID0gYXN5bmMgKGYpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IEYuYXV0aG9yaXplTmV0QXBwbGVQYXkucnVuKHtcbiAgICAgICAgICBjb250ZXh0OiBlLFxuICAgICAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogbixcbiAgICAgICAgICBub25DZGVGb3JtSW5wdXRzOiBVKGUuZm9ybURpdiksXG4gICAgICAgICAgZm9ybUNhbGxiYWNrczogdCxcbiAgICAgICAgICBjdXN0b21QYXJhbXM6IHtcbiAgICAgICAgICAgIC4uLmYsXG4gICAgICAgICAgICBpbml0aWFsUHJldmlldzogdVxuICAgICAgICAgIH0sXG4gICAgICAgICAgaW5pdFJlc3VsdDogdm9pZCAwXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICBKbihcIkFwcGxlIFBheSBwYXltZW50IGVycm9yXCIsIF8pLCBnKFwiYXBwbGVfcGF5X3BheW1lbnRfZXJyb3JcIiwge1xuICAgICAgICAgIGVycm9yOiBfXG4gICAgICAgIH0pLCB0LmdldC5vbkNoZWNrb3V0RXJyb3IoXz8ubWVzc2FnZSA/PyBcIlVua25vd24gZXJyb3JcIik7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvY2Vzc29yOiBPLkVudW0uYXV0aG9yaXplX25ldCxcbiAgICAgIGlzQXZhaWxhYmxlOiAhMCxcbiAgICAgIGlzTG9hZGluZzogITEsXG4gICAgICBzdGFydEZsb3c6IGRcbiAgICB9O1xuICB9XG4pLCBqYyA9IHooXG4gIGFzeW5jICh7XG4gICAgY29udGV4dDogZSxcbiAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IHQsXG4gICAgbm9uQ2RlRm9ybUlucHV0czogcixcbiAgICBjdXN0b21QYXJhbXM6IG4sXG4gICAgZm9ybUNhbGxiYWNrczogb1xuICB9KSA9PiB7XG4gICAgY29uc3QgeyBpbml0aWFsUHJldmlldzogaSwgb3ZlcnJpZGVQYXltZW50UmVxdWVzdDogcyB9ID0gbiwgYyA9IHEoZS5jaGVja291dFBheW1lbnRNZXRob2RzLCBZbiksIGwgPSBlLmFueUNkZUNvbm5lY3Rpb24sIHUgPSBhd2FpdCBNKGwpLCBkID0gdS5tb2RlID09PSBcInNldHVwXCIsIGYgPSBwcih7XG4gICAgICBvdmVycmlkZVBheW1lbnRSZXF1ZXN0OiBzLFxuICAgICAgaW5pdGlhbFByZXZpZXc6IGksXG4gICAgICBwcmVmaWxsOiB1LFxuICAgICAgZGVmYXVsdExhYmVsOiBjPy5tZXRhZGF0YT8ucHJvY2Vzc29yX2FjY291bnRfbmFtZVxuICAgIH0pO1xuICAgIGcoXCJhcHBsZV9wYXlfZmxvd19zdGFydGVkXCIsIHtcbiAgICAgIHByb2Nlc3Nvcl9uYW1lOiB0LnByb2Nlc3Nvcl9uYW1lLFxuICAgICAgcHJlZmlsbDogdSxcbiAgICAgIG92ZXJyaWRlUGF5bWVudFJlcXVlc3Q6IHNcbiAgICB9KTtcbiAgICBjb25zdCBfID0gbmV3IEFwcGxlUGF5U2Vzc2lvbigzLCBmKSwgbSA9IHtcbiAgICAgIHNlc3Npb246IF8sXG4gICAgICBjb25uZWN0aW9uOiBlLmFueUNkZUNvbm5lY3Rpb24sXG4gICAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IHQsXG4gICAgICBub25DZGVGb3JtSW5wdXRzOiByLFxuICAgICAgcHJvY2Vzc29yQWNjb3VudDogdC5tZXRhZGF0YSxcbiAgICAgIHByZWZpbGw6IHUsXG4gICAgICBpc1NldHVwTW9kZTogZCxcbiAgICAgIGJhc2VVcmw6IGUuYmFzZVVybCxcbiAgICAgIGZvcm1DYWxsYmFja3M6IG9cbiAgICB9O1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgoeSwgaCkgPT4ge1xuICAgICAgXy5vbmNhbmNlbCA9ICgpID0+IHtcbiAgICAgICAgX3QoXCJQYXltZW50IGNhbmNlbGxlZCBieSB1c2VyXCIpLCBoKG5ldyBFcnJvcihcIlBheW1lbnQgY2FuY2VsbGVkIGJ5IHVzZXJcIikpO1xuICAgICAgfSwgXy5vbnZhbGlkYXRlbWVyY2hhbnQgPSBhc3luYyAodykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IERjKHcsIG0pO1xuICAgICAgICB9IGNhdGNoIChFKSB7XG4gICAgICAgICAgaChFKTtcbiAgICAgICAgfVxuICAgICAgfSwgXy5vbnBheW1lbnRtZXRob2RzZWxlY3RlZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdyA9IHtcbiAgICAgICAgICBuZXdUb3RhbDogZi50b3RhbFxuICAgICAgICB9O1xuICAgICAgICBfLmNvbXBsZXRlUGF5bWVudE1ldGhvZFNlbGVjdGlvbih3KTtcbiAgICAgIH0sIF8ub25wYXltZW50YXV0aG9yaXplZCA9IGFzeW5jICh3KSA9PiB7XG4gICAgICAgIGcoXCJhcHBsZV9wYXlfcGF5bWVudF9hdXRob3JpemVkXCIpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IEUgPSBhd2FpdCBPYyh3LCBtKTtcbiAgICAgICAgICB5KEUpO1xuICAgICAgICB9IGNhdGNoIChFKSB7XG4gICAgICAgICAgaChFKTtcbiAgICAgICAgfVxuICAgICAgfSwgXy5iZWdpbigpO1xuICAgIH0pLmNhdGNoKCh5KSA9PiB7XG4gICAgICB0aHJvdyBKbihcIkFwcGxlIFBheSBwYXltZW50IGVycm9yXCIsIHkpLCBnKFwiYXBwbGVfcGF5X3BheW1lbnRfZXJyb3JcIiwge1xuICAgICAgICBlcnJvcjogeVxuICAgICAgfSksIHk7XG4gICAgfSk7XG4gIH1cbiksIHsgbG9nX186IEVlLCBlcnJfXzogWWUgfSA9IEkoXCJhdXRobmV0LWdvb2dsZXBheVwiKSwgJGMgPSBtZShcbiAgYXN5bmMgKHsgY29udGV4dDogZSwgZm9ybUNhbGxiYWNrczogdCB9KSA9PiB7XG4gICAgRWUoXCJJbml0aWFsaXppbmcgQXV0aG5ldCBHb29nbGVQYXkgZmxvd1wiKTtcbiAgICBjb25zdCByID0ge1xuICAgICAgcHJvY2Vzc29yOiBPLkVudW0uYXV0aG9yaXplX25ldCxcbiAgICAgIGlzQXZhaWxhYmxlOiAhMSxcbiAgICAgIGlzTG9hZGluZzogITEsXG4gICAgICBzdGFydEZsb3c6IGFzeW5jICgpID0+IHtcbiAgICAgIH1cbiAgICB9LCBuID0gcShlLmNoZWNrb3V0UGF5bWVudE1ldGhvZHMsIFduKTtcbiAgICBpZiAoIW4pXG4gICAgICByZXR1cm4gcjtcbiAgICBFZShcIkdvb2dsZSBQYXkgQ1BNXCIsIG4pO1xuICAgIGNvbnN0IG8gPSBuLm1ldGFkYXRhO1xuICAgIGlmICghby5wcm9jZXNzb3JfYWNjb3VudF9pZClcbiAgICAgIHJldHVybiBZZShcIk5vIGdhdGV3YXkgbWVyY2hhbnQgSUQgZm91bmQgaW4gcHJvY2Vzc29yIGFjY291bnRcIiksIHI7XG4gICAgaWYgKEVlKFwiTG9hZGluZyBHb29nbGUgUGF5IHNjcmlwdFwiKSwgYXdhaXQgaXIoKSwgIXdpbmRvdy5nb29nbGU/LnBheW1lbnRzPy5hcGkpXG4gICAgICByZXR1cm4gWWUoXCJHb29nbGUgUGF5IFNESyBub3QgbG9hZGVkIHByb3Blcmx5XCIpLCByO1xuICAgIEVlKFwiR29vZ2xlIFBheSBTREsgbG9hZGVkXCIsIHdpbmRvdy5nb29nbGUucGF5bWVudHMpO1xuICAgIGNvbnN0IGkgPSBlLmFueUNkZUNvbm5lY3Rpb24sIHMgPSBhd2FpdCBNKGkpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkID0gVWUoe1xuICAgICAgICBwcmVmaWxsOiBzLFxuICAgICAgICBnYXRld2F5OiBcImF1dGhvcml6ZW5ldFwiLFxuICAgICAgICBnYXRld2F5TWVyY2hhbnRJZDogby5wcm9jZXNzb3JfYWNjb3VudF9pZCxcbiAgICAgICAgbWVyY2hhbnROYW1lOiBvLnByb2Nlc3Nvcl9hY2NvdW50X25hbWUsXG4gICAgICAgIG1lcmNoYW50SWQ6IG8uZ29vZ2xlX3BheV9tZXJjaGFudF9pZCA/PyBcIlwiLFxuICAgICAgICAvLyBUaGlzIGlzIGZvciBpbml0aWFsIHBheW1lbnQgcmVxdWVzdCB0byBjaGVjayBhdmFpbGFiaWxpdHkuIEFjdHVhbCBgaW5pdGlhbFByZXZpZXdgIHdpbGwgYmUgdXNlZCB3aGVuIHRoZSBVSSBpcyBzaG93blxuICAgICAgICBpbml0aWFsUHJldmlldzoge1xuICAgICAgICAgIGFtb3VudEF0b206IDAsXG4gICAgICAgICAgY3VycmVuY3k6IFwiVVNEXCJcbiAgICAgICAgfVxuICAgICAgfSksIGYgPSBhd2FpdCBqZShlLmJhc2VVcmwsIGQpLCB7IHJlc3VsdDogXyB9ID0gYXdhaXQgZi5pc1JlYWR5VG9QYXkoZCk7XG4gICAgICBpZiAoIV8pXG4gICAgICAgIHJldHVybiBFZShcIkdvb2dsZSBQYXkgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyB1c2VyXCIpLCByO1xuICAgIH0gY2F0Y2ggKGQpIHtcbiAgICAgIHJldHVybiBZZShcIkVycm9yIGNoZWNraW5nIEdvb2dsZSBQYXkgYXZhaWxhYmlsaXR5XCIsIGQpLCByO1xuICAgIH1cbiAgICBjb25zdCBjID0gcy5tb2RlID09PSBcInNldHVwXCIsIGwgPSBhd2FpdCBfZShpLCBzLnRva2VuLCBjLCB2b2lkIDApLCB1ID0gYXN5bmMgKGQpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIEYuYXV0aG9yaXplTmV0R29vZ2xlUGF5LnJ1bih7XG4gICAgICAgICAgY29udGV4dDogZSxcbiAgICAgICAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IG4sXG4gICAgICAgICAgbm9uQ2RlRm9ybUlucHV0czogVShlLmZvcm1EaXYpLFxuICAgICAgICAgIGZvcm1DYWxsYmFja3M6IHQsXG4gICAgICAgICAgaW5pdFJlc3VsdDogdm9pZCAwLFxuICAgICAgICAgIGN1c3RvbVBhcmFtczoge1xuICAgICAgICAgICAgLi4uZCxcbiAgICAgICAgICAgIGluaXRpYWxQcmV2aWV3OiBsXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGYpIHtcbiAgICAgICAgWWUoXCJHb29nbGUgUGF5IHBheW1lbnQgZXJyb3JcIiwgZiksIGcoXCJnb29nbGVfcGF5X3BheW1lbnRfZXJyb3JcIiwge1xuICAgICAgICAgIGVycm9yOiBmXG4gICAgICAgIH0pLCB0LmdldC5vbkNoZWNrb3V0RXJyb3IoZj8ubWVzc2FnZSA/PyBcIlVua25vd24gZXJyb3JcIik7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvY2Vzc29yOiBPLkVudW0uYXV0aG9yaXplX25ldCxcbiAgICAgIGlzQXZhaWxhYmxlOiAhMCxcbiAgICAgIGlzTG9hZGluZzogITEsXG4gICAgICBzdGFydEZsb3c6IHVcbiAgICB9O1xuICB9XG4pLCBHYyA9IHooXG4gIGFzeW5jICh7XG4gICAgY29udGV4dDogZSxcbiAgICBub25DZGVGb3JtSW5wdXRzOiB0LFxuICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogcixcbiAgICBmb3JtQ2FsbGJhY2tzOiBuLFxuICAgIGN1c3RvbVBhcmFtczogb1xuICB9KSA9PiB7XG4gICAgY29uc3QgeyBpbml0aWFsUHJldmlldzogaSwgb3ZlcnJpZGVQYXltZW50UmVxdWVzdDogcyB9ID0gbywgbCA9IHEoZS5jaGVja291dFBheW1lbnRNZXRob2RzLCBXbikubWV0YWRhdGEsIHUgPSBlLmFueUNkZUNvbm5lY3Rpb24sIGQgPSBhd2FpdCBNKHUpLCBmID0gVWUoe1xuICAgICAgcHJlZmlsbDogZCxcbiAgICAgIGdhdGV3YXk6IFwiYXV0aG9yaXplbmV0XCIsXG4gICAgICBnYXRld2F5TWVyY2hhbnRJZDogbC5wcm9jZXNzb3JfYWNjb3VudF9pZCxcbiAgICAgIG1lcmNoYW50TmFtZTogbC5wcm9jZXNzb3JfYWNjb3VudF9uYW1lLFxuICAgICAgbWVyY2hhbnRJZDogbC5nb29nbGVfcGF5X21lcmNoYW50X2lkID8/IFwiXCIsXG4gICAgICBpbml0aWFsUHJldmlldzogaSxcbiAgICAgIG92ZXJyaWRlUGF5bWVudFJlcXVlc3Q6IHNcbiAgICB9KTtcbiAgICBnKFwiZ29vZ2xlX3BheV9mbG93X3N0YXJ0ZWRcIiwge1xuICAgICAgcHJvY2Vzc29yX25hbWU6IHIucHJvY2Vzc29yX25hbWUsXG4gICAgICBwcmVmaWxsOiBkLFxuICAgICAgb3ZlcnJpZGVQYXltZW50UmVxdWVzdDogc1xuICAgIH0pO1xuICAgIGNvbnN0IF8gPSBhd2FpdCBqZShlLmJhc2VVcmwsIGYpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtID0gYXdhaXQgXy5sb2FkUGF5bWVudERhdGEoZik7XG4gICAgICBFZShcIkdvb2dsZSBQYXkgUGF5bWVudCBkYXRhXCIsIG0pO1xuICAgICAgY29uc3QgeSA9IGNyKHQsIG0pLCBoID0gVih5LCBuLmdldC5vblZhbGlkYXRpb25FcnJvcik7XG4gICAgICBnKFwiYmlsbGluZ19kZXRhaWxzX3JlY2VpdmVkXCIsIHtcbiAgICAgICAgLi4uaFxuICAgICAgfSk7XG4gICAgICBjb25zdCB3ID0gbS5wYXltZW50TWV0aG9kRGF0YT8udG9rZW5pemF0aW9uRGF0YT8udG9rZW47XG4gICAgICBpZiAoIXcpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHBheW1lbnQgdG9rZW4gcmVjZWl2ZWQgZnJvbSBHb29nbGUgUGF5XCIpO1xuICAgICAgY29uc3QgRSA9IGF3YWl0IFgodSwge1xuICAgICAgICBwYXltZW50X3Byb3ZpZGVyOiByLnByb3ZpZGVyLFxuICAgICAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogcixcbiAgICAgICAgLi4uVyhoLCBkLmNoZWNrb3V0X3NldHRpbmdzKSxcbiAgICAgICAgY3VzdG9tZXJfbGFuZ3VhZ2U6IG9lKClcbiAgICAgIH0pO1xuICAgICAgRWUoXCJTdGFydCBwYXltZW50IGZsb3cgcmVzcG9uc2VcIiwgRSk7XG4gICAgICBjb25zdCB2ID0gYXdhaXQgRCh1LCB7XG4gICAgICAgIHNlY3VyZV90b2tlbjogZC50b2tlbixcbiAgICAgICAgcHJvY2Vzc29yX3NwZWNpZmljX21ldGFkYXRhOiB7XG4gICAgICAgICAgcGF5bWVudF9wcm92aWRlcjogci5wcm92aWRlcixcbiAgICAgICAgICBtb2JpbGVfd2FsbGV0X3BheW1lbnRfZGF0YToge1xuICAgICAgICAgICAgZGF0YURlc2NyaXB0b3I6IFwiQ09NTU9OLkdPT0dMRS5JTkFQUC5QQVlNRU5UXCIsXG4gICAgICAgICAgICBkYXRhVmFsdWU6IHdpbmRvdy5idG9hKHcpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmICghdi5wYXltZW50X21ldGhvZHM/LlswXT8uaWQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIFBNIElEIGZvdW5kXCIpO1xuICAgICAgcmV0dXJuIGFlKHtcbiAgICAgICAgbG9nUHJlZml4OiBcImF1dGhuZXQtZ29vZ2xlcGF5XCIsXG4gICAgICAgIGFueUNkZUNvbm5lY3Rpb246IHUsXG4gICAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogcixcbiAgICAgICAgcmVxdWlyZWRGb3JtRmllbGRzOiBoLFxuICAgICAgICBjb25maXJtUmVzdWx0OiB2LFxuICAgICAgICB1c2VQYXlGaXJzdEZsb3c6ICExXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChtKSB7XG4gICAgICB0aHJvdyBZZShcIkdvb2dsZSBQYXkgcGF5bWVudCBlcnJvclwiLCBtKSwgZyhcImdvb2dsZV9wYXlfcGF5bWVudF9lcnJvclwiLCB7XG4gICAgICAgIGVycm9yOiBtXG4gICAgICB9KSwgbmV3IEVycm9yKG0/Lm1lc3NhZ2UgPz8gXCJVbmtub3duIGVycm9yXCIpO1xuICAgIH1cbiAgfVxuKSwgeyBsb2dfXzogdXQsIGVycl9fOiBWYyB9ID0gSShcImN5YnMtZnJhbWVcIiksIHFjID0gKGUsIHQpID0+IHtcbiAgY29uc3QgciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG4gIHIubmFtZSA9IFwiY2FyZGluYWxfY29sbGVjdGlvbl9pZnJhbWVcIiwgci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCIsIHIuc3R5bGUud2lkdGggPSBcIjEwcHhcIiwgci5zdHlsZS5oZWlnaHQgPSBcIjEwcHhcIjtcbiAgY29uc3QgbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJmb3JtXCIpO1xuICBuLmFjdGlvbiA9IGUsIG4ubWV0aG9kID0gXCJQT1NUXCIsIG4udGFyZ2V0ID0gci5uYW1lO1xuICBjb25zdCBvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICByZXR1cm4gby50eXBlID0gXCJoaWRkZW5cIiwgby5uYW1lID0gXCJKV1RcIiwgby52YWx1ZSA9IHQsIG4uYXBwZW5kQ2hpbGQobyksIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQociksIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobiksIHsgZm9ybTogbiwgZGV0YWNoOiAoKSA9PiB7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChyKSwgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChuKTtcbiAgfSB9O1xufSwgemMgPSBhc3luYyAoZSkgPT4gbmV3IFByb21pc2UoKHQsIHIpID0+IHtcbiAgY29uc3QgeyBwb3N0VXJsOiBuLCBhY2Nlc3NUb2tlbjogbyB9ID0gZSwgaSA9IG5ldyBVUkwobikub3JpZ2luLCB7IGZvcm06IHMsIGRldGFjaDogYyB9ID0gcWMobiwgbyk7XG4gIHV0KFwiQXR0YWNoZWQgZGV2aWNlIGRhdGEgY29sbGVjdG9yXCIpO1xuICBjb25zdCBsID0gKGQpID0+IHtcbiAgICBpZiAoZC5vcmlnaW4gIT09IGkpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgZiA9IEpTT04ucGFyc2UoZC5kYXRhKTtcbiAgICBpZiAodXQoXCJSZWNlaXZlZCBldmVudCBmcm9tIGRldmljZSBkYXRhIGNvbGxlY3RvcjpcIiwgZiksIGYuTWVzc2FnZVR5cGUgPT09IFwicHJvZmlsZS5jb21wbGV0ZWRcIikge1xuICAgICAgdChmKSwgdSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSwgdSA9ICgpID0+IHtcbiAgICBjKCksIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBsKTtcbiAgfTtcbiAgdHJ5IHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgbCksIHV0KFwiQXR0YWNoZWQgbGlzdGVuZXIgdG8gd2luZG93XCIpLCBzLnN1Ym1pdCgpLCB1dChcIlN1Ym1pdHRlZCBmb3JtXCIpO1xuICB9IGNhdGNoIChkKSB7XG4gICAgVmMoXCJFcnJvciBzdWJtaXR0aW5nIGZvcm06XCIsIGQpLCB1KCksIHIoZCk7XG4gIH1cbn0pLCBCYyA9IChlKSA9PiB7XG4gIGNvbnN0IHsgc3RlcFVwVXJsOiB0LCBhY2Nlc3NUb2tlbjogciwgbWVyY2hhbnREYXRhOiBuLCBpZnJhbWU6IG8sIGhvc3Q6IGkgfSA9IGUsIHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiKTtcbiAgcy5hY3Rpb24gPSB0LCBzLm1ldGhvZCA9IFwiUE9TVFwiLCBzLnRhcmdldCA9IG8ubmFtZTtcbiAgY29uc3QgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgYy50eXBlID0gXCJoaWRkZW5cIiwgYy5uYW1lID0gXCJKV1RcIiwgYy52YWx1ZSA9IHI7XG4gIGNvbnN0IGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gIHJldHVybiBsLnR5cGUgPSBcImhpZGRlblwiLCBsLm5hbWUgPSBcIk1EXCIsIGwudmFsdWUgPSBuLCBzLmFwcGVuZENoaWxkKGMpLCBzLmFwcGVuZENoaWxkKGwpLCBpLmFwcGVuZENoaWxkKHMpLCBzO1xufSwgeyBsb2dfXzogTmUsIGVycl9fOiBabiB9ID0gSShcImN5YnNcIiksIEtuID0geiQxLm9iamVjdCh7XG4gIHN0ZXBfdXBfdXJsOiB6JDEuc3RyaW5nKCksXG4gIGFjY2Vzc190b2tlbjogeiQxLnN0cmluZygpLFxuICBkZF91cmw6IHgoeiQxLnN0cmluZygpKSxcbiAgZGRfdG9rZW46IHgoeiQxLnN0cmluZygpKSxcbiAgbWVyY2hhbnRfZGF0YTogeiQxLnN0cmluZygpXG59KSwgSGMgPSBcIlVuYWJsZSB0byBwcm9jZXNzIHlvdXIgY3JlZGl0IGNhcmQuIFBsZWFzZSBjb250YWN0IHN1cHBvcnQgZm9yIGFzc2lzdGFuY2UuXCIsIFljID0gKGUpID0+IHtcbiAgY29uc3QgdCA9IEtuLnNhZmVQYXJzZShlKTtcbiAgaWYgKCF0LnN1Y2Nlc3MpXG4gICAgdGhyb3cgWm4oYEN5YmVyc291cmNlIDNEUyBpcyByZXF1aXJlZCBidXQgdXNlciBhY3Rpb24gaXMgbWFsZm9ybWVkLiBHb3Q6ICR7SlNPTi5zdHJpbmdpZnkoZSl9YCksIG5ldyBFcnJvcihIYyk7XG4gIHJldHVybiB0LmRhdGE7XG59LCBXYyA9IChlKSA9PiBlLnR5cGUgPT09IFwiY3liZXJzb3VyY2VfcGF5ZXJfYXV0aFwiLCBKYyA9IGFzeW5jIChlKSA9PiB7XG4gIGNvbnN0IHsgc3RlcFVwVXJsOiB0LCBhY2Nlc3NUb2tlbjogciwgbWVyY2hhbnREYXRhOiBuLCBpZnJhbWU6IG8sIGhvc3Q6IGksIGNhbmNlbEJ1dHRvbjogcyB9ID0gZSwgYyA9IG5ldyBVUkwodCkub3JpZ2luO1xuICByZXR1cm4gbmV3IFByb21pc2UoKGwpID0+IHtcbiAgICBjb25zdCB1ID0gKCkgPT4ge1xuICAgICAgTmUoXCJDbGVhbmluZyB1cCBDeWJlcnNvdXJjZSAzRFMgZmxvd1wiKSwgcy5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZCksIGkucmVtb3ZlKCk7XG4gICAgfSwgZCA9ICgpID0+IHtcbiAgICAgIE5lKFwiQ3liZXJzb3VyY2UgM0RTIGNhbmNlbGxlZFwiKSwgbCh7IHN0YXR1czogTi5DQU5DRUxMRUQsIGNsZWFudXA6IHUgfSk7XG4gICAgfSwgXyA9IGFyKG8sIChoKSA9PiB7XG4gICAgICBOZShcIkN5YmVyc291cmNlIDNEUyBjb21wbGV0ZWQgd2l0aCBzdGF0dXM6XCIsIGgpLCBsKHsgc3RhdHVzOiBoLnN0YXR1cywgY2xlYW51cDogdSB9KSwgbSgpO1xuICAgIH0sIGMsIFwicGluZy0zZHMtc3RhdHVzXCIsIEhyKSwgbSA9IFRuKHtcbiAgICAgIGVsZW1lbnRzOiB7IGhvc3Q6IGksIGNhbmNlbEJ1dHRvbjogcyB9LFxuICAgICAgcG9sbGluZ0ludGVydmFsOiBfLFxuICAgICAgcmVzb2x2ZTogKGgpID0+IHtcbiAgICAgICAgbCh7IHN0YXR1czogaC5zdGF0dXMsIGNsZWFudXA6IHUgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZCksIEJjKHtcbiAgICAgIHN0ZXBVcFVybDogdCxcbiAgICAgIGFjY2Vzc1Rva2VuOiByLFxuICAgICAgbWVyY2hhbnREYXRhOiBuLFxuICAgICAgaWZyYW1lOiBvLFxuICAgICAgaG9zdDogaVxuICAgIH0pLnN1Ym1pdCgpO1xuICB9KTtcbn0sIFFuID0gYXN5bmMgKGUpID0+IHtcbiAgY29uc3QgdCA9IFljKGUpLCB7IHN0ZXBfdXBfdXJsOiByLCBhY2Nlc3NfdG9rZW46IG4sIGRkX3VybDogbywgZGRfdG9rZW46IGksIG1lcmNoYW50X2RhdGE6IHMgfSA9IHQ7XG4gIGlmIChvICYmIGkpIHtcbiAgICBjb25zdCBmID0gYXdhaXQgemMoe1xuICAgICAgcG9zdFVybDogbyxcbiAgICAgIGFjY2Vzc1Rva2VuOiBpXG4gICAgfSk7XG4gICAgTmUoXCJEZXZpY2UgZGF0YSBjb2xsZWN0aW9uIGNvbXBsZXRlZCB3aXRoIHN0YXR1czpcIiwgZi5TdGF0dXMpO1xuICB9IGVsc2VcbiAgICBabihcIk5vIGRldmljZSBkYXRhIGNvbGxlY3Rpb24gVVJMIG9yIHRva2VuIHByb3ZpZGVkXCIpO1xuICBjb25zdCB7IGhvc3Q6IGMsIGlmcmFtZTogbCwgY2FuY2VsQnV0dG9uOiB1IH0gPSBGdChcIlwiLCB7IG5hbWU6IFwiY2FyZGluYWxfYXV0aF9pZnJhbWVcIiB9KTtcbiAgTmUoXCJSdW5uaW5nIEN5YmVyc291cmNlIDNEUyBmbG93XCIpO1xuICBjb25zdCBkID0gYXdhaXQgSmMoe1xuICAgIHN0ZXBVcFVybDogcixcbiAgICBhY2Nlc3NUb2tlbjogbixcbiAgICBtZXJjaGFudERhdGE6IHMsXG4gICAgaWZyYW1lOiBsLFxuICAgIGhvc3Q6IGMsXG4gICAgY2FuY2VsQnV0dG9uOiB1XG4gIH0pO1xuICBpZiAoZC5jbGVhbnVwKCksIGQuc3RhdHVzID09PSBOLkZBSUxVUkUpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiM0RTIHZlcmlmaWNhdGlvbiBmYWlsZWRcIik7XG4gIGlmIChkLnN0YXR1cyA9PT0gTi5DQU5DRUxMRUQpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiM0RTIHZlcmlmaWNhdGlvbiBjYW5jZWxsZWRcIik7XG4gIGlmIChkLnN0YXR1cyA9PT0gTi5TVUNDRVNTKSB7XG4gICAgTmUoXCIzRFMgdmVyaWZpY2F0aW9uIHN1Y2NlZWRlZFwiKTtcbiAgICByZXR1cm47XG4gIH0gZWxzZVxuICAgIG50KGQuc3RhdHVzKTtcbn0sIHsgbG9nX186IFpjLCBlcnJfXzogWG4gfSA9IEkoXCJwb2NreXQtY2NcIiksIEtjID0geiQxLm9iamVjdCh7XG4gIFwib3AtcG9ja3l0LTNkcy11cmxcIjogeiQxLnN0cmluZygpLFxuICBcIm9wLXBvY2t5dC10eG4tbm9cIjogeiQxLnN0cmluZygpLFxuICBcIm9wLXBvY2t5dC1yZWYtbm9cIjogeiQxLnN0cmluZygpXG59KSwgUWMgPSAoZSkgPT4ge1xuICBjb25zdCB0ID0gS2Muc2FmZVBhcnNlKGUpO1xuICBpZiAoIXQuc3VjY2Vzcykge1xuICAgIGNvbnN0IHIgPSBcIlVuYWJsZSB0byBwcm9jZXNzIHlvdXIgY3JlZGl0IGNhcmQuIFBsZWFzZSBjb250YWN0IHN1cHBvcnQgZm9yIGFzc2lzdGFuY2UuXCIsIG4gPSBgUG9ja3l0IDNEUyBpcyByZXF1aXJlZCBidXQgaGVhZGVycyBhcmUgbWFsZm9ybWVkLiBHb3Q6ICR7SlNPTi5zdHJpbmdpZnkoZSl9YDtcbiAgICB0aHJvdyBYbihuKSwgbmV3IEVycm9yKHIpO1xuICB9XG4gIHJldHVybiB0LmRhdGE7XG59LCBlbyA9IChlKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdCA9IG5ldyBVUkwoZSA/PyBcIlwiKS5zZWFyY2hQYXJhbXMuZ2V0KFwidmF1bHRJZFwiKTtcbiAgICBpZiAoIXQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyB2YXVsdCBJRCBmb3VuZCBpbiAzRFMgdmVyaWZpY2F0aW9uIHJlc3VsdFwiKTtcbiAgICByZXR1cm4gWmMoYDNEUyB2ZXJpZmljYXRpb24gc3VjY2Vzcy4gW1ZhdWx0IElEOiAke3R9XWApLCB0O1xuICB9IGNhdGNoICh0KSB7XG4gICAgY29uc3QgciA9IFwiRXJyb3IgdmVyaWZ5aW5nIDNEUyB2ZXJpZmljYXRpb24gcmVzdWx0LlwiO1xuICAgIHRocm93IFhuKHIsIGBSZXN1bHRpbmcgVVJMOiAke2V9LlxuRXJyb3I6ICR7Syh0KX1gKSwgbmV3IEVycm9yKHIpO1xuICB9XG59LCBZdCA9IChlLCB0KSA9PiBuZXcgVVJMKGUpLnNlYXJjaFBhcmFtcy5nZXQodCksIFhjID0gKGUpID0+IGU/LltcIm9wLXBvY2t5dC0zZHMtdXJsXCJdICE9PSB2b2lkIDAsIGVsID0gYXN5bmMgKGUsIHQpID0+IHtcbiAgY29uc3QgciA9IFFjKHQpLCBuID0gYXdhaXQgTm4oeyB1cmw6IHJbXCJvcC1wb2NreXQtM2RzLXVybFwiXSwgYmFzZVVybDogZSB9KTtcbiAgcmV0dXJuIHtcbiAgICBleGlzdGluZ19jYzoge1xuICAgICAgdmF1bHRfaWQ6IGVvKG4uaHJlZiA/PyBcIlwiKSxcbiAgICAgIHRyYW5zYWN0aW9uX25vOiByW1wib3AtcG9ja3l0LXR4bi1ub1wiXSxcbiAgICAgIHJlZmVyZW5jZV9ubzogcltcIm9wLXBvY2t5dC1yZWYtbm9cIl1cbiAgICB9XG4gIH07XG59LCB7IGxvZ19fOiBSciB9ID0gSShcInN0cmlwZS1jY1wiKSwgdGwgPSB6JDEub2JqZWN0KHtcbiAgc3RyaXBlX3BrOiB6JDEuc3RyaW5nKCksXG4gIGNsaWVudF9zZWNyZXQ6IHokMS5zdHJpbmcoKSxcbiAgc3RyaXBlX3BtX2lkOiB6JDEuc3RyaW5nKClcbn0pLCB0byA9IGFzeW5jIChlKSA9PiB7XG4gIGcoXCIzZHNfc3RyaXBlX3JlZGlyZWN0XCIsIHtcbiAgICAuLi5lXG4gIH0pLCBScihg4pScIFVzaW5nIHN0cmlwZSAzRFMgZmxvdyBbQ2xpZW50IFNlY3JldDogJHtlLmNsaWVudF9zZWNyZXQuc3Vic3RyaW5nKDAsIDgpfS4uLl1gKSwgYXdhaXQgVWkoZSksIGcoXCIzZHNfc3RyaXBlX2NvbXBsZXRlXCIpLCBScihcIuKVsCBTdHJpcGUgM0RTIGZsb3cgY29tcGxldGVkIHN1Y2Nlc3NmdWxseVwiKTtcbn0sIHJsID0gKGUpID0+IHtcbiAgY29uc3QgdCA9IHRsLnNhZmVQYXJzZShlKTtcbiAgaWYgKCF0LnN1Y2Nlc3MpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBTdHJpcGUgM0RTIG1ldGFkYXRhIGhhcyB1bmV4cGVjdGVkIGZvcm1hdDogJHtKU09OLnN0cmluZ2lmeSh0LmVycm9yLmVycm9ycyl9YCk7XG4gIHJldHVybiB7XG4gICAgc3RyaXBlX3BrOiB0LmRhdGEuc3RyaXBlX3BrLFxuICAgIGNsaWVudF9zZWNyZXQ6IHQuZGF0YS5jbGllbnRfc2VjcmV0LFxuICAgIHN0cmlwZV9wbV9pZDogdC5kYXRhLnN0cmlwZV9wbV9pZFxuICB9O1xufSwgbmwgPSA0LCB7IGxvZ19fOiBrZSwgZXJyX186IFB0IH0gPSBJKFwidW5pZmllZC1jY1wiKSwgb2wgPSBhc3luYyAoe1xuICBjb250ZXh0OiBlLFxuICBjaGVja291dFBheW1lbnRNZXRob2Q6IHQsXG4gIG5vbkNkZUZvcm1JbnB1dHM6IHIsXG4gIGZvcm1DYWxsYmFja3M6IG4sXG4gIGN1c3RvbVBhcmFtczogb1xufSkgPT4ge1xuICBrZShcIuKUnCBSdW5uaW5nIHVuaWZpZWQgQ0MgZmxvdy4uLlwiLCB7IGNoZWNrb3V0UGF5bWVudE1ldGhvZDogdCB9KTtcbiAgY29uc3QgaSA9IGUuYW55Q2RlQ29ubmVjdGlvbiwgcyA9IGF3YWl0IE0oaSk7XG4gIGtlKGDilJwgVmFsaWRhdGluZyBub24tQ0RFIGZvcm0gZmllbGRzIFtNb2RlOiAke3MubW9kZX1dYCk7XG4gIGNvbnN0IGMgPSBWKHIsIG4uZ2V0Lm9uVmFsaWRhdGlvbkVycm9yKSwgbCA9IHtcbiAgICBzZXNzaW9uX2lkOiBlLmVsZW1lbnRzU2Vzc2lvbklkLFxuICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiB0LFxuICAgIG5vbl9jZGVfZm9ybV9maWVsZHM6IGMsXG4gICAgZXh0cmFfbWV0YWRhdGE6IHtcbiAgICAgIG9yaWdpbjogd2luZG93LmxvY2F0aW9uLm9yaWdpbixcbiAgICAgIC8vIEZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgaW4gdGhlIGNoZWNrb3V0IGF0dGVtcHQgbG9nc1xuICAgICAgZGV2aWNlVG9rZW46IEluKClcbiAgICB9LFxuICAgIHVzZV91bmlmaWVkX2NjX2Zsb3c6IHRydWUsXG4gICAgcGF5X2ZpcnN0X2Zsb3dfY2FydF9pbmZvOiB7XG4gICAgICBsaW5lX2l0ZW1zOiBzLmxpbmVfaXRlbXMsXG4gICAgICBkaXNwbGF5ZWRfdG90YWxfYW1vdW50X2F0b206IHMuYW1vdW50X3RvdGFsX2F0b21cbiAgICB9LFxuICAgIHBheW1lbnRfcm91dGVfaWQ6IG8ucGF5bWVudFJvdXRlSWRcbiAgfTtcbiAgUHQobywgbCksIGtlKGDilJwgVG9rZW5pemluZyBjYXJkIGluZm8gaW4gUGFydGlhbCBQTXMgW1Nlc3Npb246ICR7ZS5lbGVtZW50c1Nlc3Npb25JZH1dYCk7XG4gIGNvbnN0IHUgPSBhd2FpdCBibihvLmN1cnJlbnRDZGVDb25uZWN0aW9ucywge1xuICAgIHNlc3Npb25faWQ6IGUuZWxlbWVudHNTZXNzaW9uSWRcbiAgfSk7XG4gIExuKHUsIG4uZ2V0Lm9uVmFsaWRhdGlvbkVycm9yKTtcbiAgY29uc3QgZCA9IGF3YWl0IHZuKGksIGwpO1xuICBpZiAoa2UoXCLilJwgc3RhcnRQZiByZXN1bHRcIiwgZCksIGQuY2hlY2tvdXRfc3VjY2Vzc19yZXNwb25zZSlcbiAgICByZXR1cm4gcm8ocy5tb2RlLCBkKTtcbiAgaWYgKCFkLmNoZWNrb3V0X2F0dGVtcHRfaWQpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzdGF0ZTogbm8gY2hlY2tvdXQgYXR0ZW1wdCBJRCBmcm9tIFBGIHJlc3VsdFwiKTtcbiAgcmV0dXJuIGFsKHtcbiAgICBjb250ZXh0OiBlLFxuICAgIHByZWZpbGw6IHMsXG4gICAgbm9uQ2RlRm9ybUlucHV0czogcixcbiAgICBjb21tb25DaGVja291dFBhcmFtczogbCxcbiAgICBhbnlDZGVDb25uZWN0aW9uOiBpLFxuICAgIHN0YXJ0UGZSZXN1bHQ6IGQsXG4gICAgY2hlY2tvdXRBdHRlbXB0SWQ6IGQuY2hlY2tvdXRfYXR0ZW1wdF9pZFxuICB9KTtcbn0sIGFsID0gYXN5bmMgKGUpID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbnRleHQ6IHQsXG4gICAgcHJlZmlsbDogcixcbiAgICBub25DZGVGb3JtSW5wdXRzOiBuLFxuICAgIGNvbW1vbkNoZWNrb3V0UGFyYW1zOiBvLFxuICAgIGFueUNkZUNvbm5lY3Rpb246IGksXG4gICAgc3RhcnRQZlJlc3VsdDogcyxcbiAgICBjaGVja291dEF0dGVtcHRJZDogY1xuICB9ID0gZTtcbiAgbGV0IGwgPSBzO1xuICBmb3IgKGxldCB1ID0gMDsgdSA8IG5sOyB1KyspIHtcbiAgICBrZShg4pScIFJ1bm5pbmcgY29uZmlybSBsb29wIGl0ZXJhdGlvbiAke3V9YCksIGcoXCJ1bmlmaWVkX2NjX2NvbmZpcm1fbG9vcF9pdGVyYXRpb25cIiwgeyBpdGVyYXRpb246IHUgfSk7XG4gICAgY29uc3QgeyB1c2VyQWN0aW9uOiBkIH0gPSBjbChsKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZiA9IGF3YWl0IGlsKHQuYmFzZVVybCwgZCwgciwgbik7XG4gICAgICBvLmV4dHJhX21ldGFkYXRhID0ge1xuICAgICAgICAuLi5vLmV4dHJhX21ldGFkYXRhLFxuICAgICAgICAuLi5mLm1ldGFkYXRhRm9yQ29uZmlybVN0ZXBcbiAgICAgIH0sIGtlKFwi4pScIE5ldyBleHRyYSBtZXRhZGF0YVwiLCBvLmV4dHJhX21ldGFkYXRhKTtcbiAgICB9IGNhdGNoIChmKSB7XG4gICAgICBjb25zdCBfID0gSyhmKTtcbiAgICAgIFB0KGDilJwgRXJyb3IgaW4gcnVubmluZyB1c2VyIGFjdGlvbiBpbiBpdGVyYXRpb24gJHt1fS4gQ29udGludWluZyB0byBjb25maXJtIHN0ZXAuLi5gLCBfKSwgZyhcInVuaWZpZWRfY2NfdXNlcl9hY3Rpb25fZXJyb3JcIiwgeyBlcnJvcl9tZXNzYWdlOiBfLCBpdGVyYXRpb246IHUgfSk7XG4gICAgfVxuICAgIGlmIChsID0gYXdhaXQgRChpLCB7XG4gICAgICBzZWN1cmVfdG9rZW46IHIudG9rZW4sXG4gICAgICBjaGVja291dF9hdHRlbXB0X2lkOiBjLFxuICAgICAgcHJvY2Vzc29yX3NwZWNpZmljX21ldGFkYXRhOiBvLmV4dHJhX21ldGFkYXRhXG4gICAgfSksIGtlKGDilJwgY29uZmlybVBmIHJlc3VsdCAoaXRlcmF0aW9uICR7dX0pYCwgbCksIGwuY2hlY2tvdXRfc3VjY2Vzc19yZXNwb25zZSlcbiAgICAgIHJldHVybiBybyhyLm1vZGUsIGwpO1xuICB9XG4gIHRocm93IGcoXCJ1bmlmaWVkX2NjX3VuZXhwZWN0ZWRfYnJhbmNoXCIsIHtcbiAgICBzZWN1cmVfdG9rZW46IHIudG9rZW4sXG4gICAgY2hlY2tvdXRfYXR0ZW1wdF9pZDogbC5jaGVja291dF9hdHRlbXB0X2lkLFxuICAgIGNvbmZpcm1QRlJlc3VsdDogbFxuICB9KSwgbmV3IEVycm9yKFwiQ2hlY2tvdXQgZXJyb3IsIHBsZWFzZSB0cnkgYW5vdGhlciBwYXltZW50IG1ldGhvZFwiKTtcbn0sIGlsID0gYXN5bmMgKGUsIHQsIHIsIG4pID0+IHtcbiAgaWYgKHQuX3VuaWZpZWRfY2NfYWN0aW9uX25hbWUgPT09IFwiM0RTX1JFUVVJUkVEXCIpIHtcbiAgICBpZiAodC50eXBlID09PSBcInN0cmlwZV8zZHNcIilcbiAgICAgIHJldHVybiBhd2FpdCB0byhybCh0KSksIHsgbWV0YWRhdGFGb3JDb25maXJtU3RlcDoge30gfTtcbiAgICBpZiAoRG4odCkpXG4gICAgICByZXR1cm4geyBtZXRhZGF0YUZvckNvbmZpcm1TdGVwOiB7IGFpcndhbGxleDogYXdhaXQgT24oZSwgdCkgfSB9O1xuICAgIGlmIChHbih0KSlcbiAgICAgIHJldHVybiB7IG1ldGFkYXRhRm9yQ29uZmlybVN0ZXA6IHsgYWR5ZW46IGF3YWl0IFZuKFxuICAgICAgICBuW3AuQ09VTlRSWV0sXG4gICAgICAgIHQsXG4gICAgICAgIHIubG9jYWxlXG4gICAgICApIH0gfTtcbiAgICBpZiAoV2ModCkpXG4gICAgICByZXR1cm4gYXdhaXQgUW4odCksIHsgbWV0YWRhdGFGb3JDb25maXJtU3RlcDoge30gfTtcbiAgICBpZiAoc2wodCkpXG4gICAgICByZXR1cm4gYXdhaXQgb28oeyByZXF1aXJlZF91c2VyX2FjdGlvbnM6IFt0XSB9LCBlKSwgeyBtZXRhZGF0YUZvckNvbmZpcm1TdGVwOiB7fSB9O1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIDNEUyB1c2VyIGFjdGlvbjogJHtKU09OLnN0cmluZ2lmeSh0KX1gKTtcbiAgfSBlbHNlXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHJlcXVpcmVkIHVzZXIgYWN0aW9uOiAke0pTT04uc3RyaW5naWZ5KHQpfWApO1xufSwgc2wgPSAoZSkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBubyhbZV0pLCAhMDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59LCBjbCA9IChlKSA9PiB7XG4gIGlmIChlLnJlcXVpcmVkX3VzZXJfYWN0aW9ucykge1xuICAgIGlmIChlLnJlcXVpcmVkX3VzZXJfYWN0aW9ucy5sZW5ndGggPT09IDApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHN0YXRlOiBubyByZXF1aXJlZCB1c2VyIGFjdGlvbnNcIik7XG4gICAgaWYgKGUucmVxdWlyZWRfdXNlcl9hY3Rpb25zLmxlbmd0aCA+IDEpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHN0YXRlOiBtdWx0aXBsZSByZXF1aXJlZCB1c2VyIGFjdGlvbnNcIik7XG4gIH0gZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHN0YXRlOiBubyByZXF1aXJlZCB1c2VyIGFjdGlvbnNcIik7XG4gIGNvbnN0IHQgPSBmYS5zYWZlUGFyc2UoZS5yZXF1aXJlZF91c2VyX2FjdGlvbnNbMF0pO1xuICBpZiAoIXQuc3VjY2VzcylcbiAgICB0aHJvdyBQdChcIlVzZXIgYWN0aW9uIHJhdyBwYXlsb2FkXCIsIGUucmVxdWlyZWRfdXNlcl9hY3Rpb25zWzBdKSwgUHQoXCJQYXJzaW5nIGVycm9yXCIsIHQuZXJyb3IpLCBuZXcgRXJyb3IoXCJJbnZhbGlkIHN0YXRlOiBzY2hlbWEgb2YgdXNlciBhY3Rpb24gcGF5bG9hZCBpcyBub3QgdmFsaWRcIik7XG4gIHJldHVybiB7XG4gICAgdXNlckFjdGlvbjogdC5kYXRhXG4gIH07XG59LCBybyA9IChlLCB0KSA9PiB7XG4gIGlmIChlID09PSBcInNldHVwXCIpIHtcbiAgICBjb25zdCByID0gdC5jY19wbV9pZCA/PyB0LnBheW1lbnRfbWV0aG9kcz8uWzBdLmlkO1xuICAgIGlmICghcilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc3RhdGU6IG5vIENDIFBNIElEIG9yIHBheW1lbnRfbWV0aG9kcyBmb3VuZCBpbiBQRiByZXN1bHRcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGU6IFwic2V0dXBcIixcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICBwYXltZW50X21ldGhvZF9pZDogclxuICAgICAgfVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgaWYgKCF0LmNoZWNrb3V0X3N1Y2Nlc3NfcmVzcG9uc2UpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHN0YXRlOiBubyBjaGVja291dCBzdWNjZXNzIHJlc3BvbnNlIGZyb20gc3RhcnRQRlwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZTogXCJjaGVja291dFwiLFxuICAgICAgcmVzdWx0OiB0LmNoZWNrb3V0X3N1Y2Nlc3NfcmVzcG9uc2VcbiAgICB9O1xuICB9XG59LCB7IGxvZ19fOiBMLCBlcnJfXzogVHIgfSA9IEkoXCJjb21tb24tY2NcIik7XG56JDEuYXJyYXkoXG4gIHokMS5vYmplY3Qoe1xuICAgIG91cl9leGlzdGluZ19wbV9pZDogeiQxLnN0cmluZygpXG4gIH0pXG4pLmxlbmd0aCgxKTtcbmNvbnN0IGxsID0geihcbiAgYXN5bmMgKHtcbiAgICBjb250ZXh0OiBlLFxuICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogdCxcbiAgICBub25DZGVGb3JtSW5wdXRzOiByLFxuICAgIGZvcm1DYWxsYmFja3M6IG4sXG4gICAgY3VzdG9tUGFyYW1zOiBvXG4gIH0pID0+IHtcbiAgICBMKFwi4pScIFJ1bm5pbmcgY29tbW9uIENDIGZsb3cuLi5cIiwgeyBjaGVja291dFBheW1lbnRNZXRob2Q6IHQgfSk7XG4gICAgY29uc3QgaSA9IGUuYW55Q2RlQ29ubmVjdGlvbiwgcyA9IGF3YWl0IE0oaSk7XG4gICAgZyhcImNvbW1vbl9jY19mbG93X3N0YXJ0ZWRcIiwge1xuICAgICAgLi4udCxcbiAgICAgIHByZWZpbGw6IHNcbiAgICB9KTtcbiAgICBjb25zdCBjID0gcy5maW5hbF9mZWF0dXJlX3JvbGxvdXRfc2V0dGluZ3M/LnVuaWZpZWRfY2MgPz8gMDtcbiAgICBMKGDilJwgVW5pZmllZCBDQyByb2xsb3V0OiAke01hdGgucm91bmQoYyAqIDEwMCl9JWApO1xuICAgIGNvbnN0IGwgPSBNYXRoLnJhbmRvbSgpLCB1ID0gbCA8IGMsIGQgPSB7XG4gICAgICByb2xsOiBsLFxuICAgICAgdW5pZmllZENDUm9sbG91dFJhdGlvOiBjLFxuICAgICAgdXNlVW5pZmllZENDRmxvdzogdVxuICAgIH07XG4gICAgaWYgKHUpXG4gICAgICByZXR1cm4gTChg4pScIFBpY2tlZCB1bmlmaWVkIENDIGZsb3cgKCR7bH0gdnMgJHtjfSlgKSwgZyhcInVuaWZpZWRfY2NfZmxvd19waWNrZWRcIiwgZCksIG9sKHtcbiAgICAgICAgY29udGV4dDogZSxcbiAgICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiB0LFxuICAgICAgICBub25DZGVGb3JtSW5wdXRzOiByLFxuICAgICAgICBmb3JtQ2FsbGJhY2tzOiBuLFxuICAgICAgICBjdXN0b21QYXJhbXM6IG8sXG4gICAgICAgIGluaXRSZXN1bHQ6IHZvaWQgMFxuICAgICAgfSk7XG4gICAgTChg4pScIFBpY2tlZCBsZWdhY3kgQ0MgZmxvdyAoJHtsfSB2cyAke2N9KWApLCBnKFwibGVnYWN5X2NjX2Zsb3dfcGlja2VkXCIsIGQpLCBMKGDilJwgVmFsaWRhdGluZyBub24tQ0RFIGZvcm0gZmllbGRzIFtNb2RlOiAke3MubW9kZX1dYCk7XG4gICAgY29uc3QgZiA9IFYoXG4gICAgICByLFxuICAgICAgbi5nZXQub25WYWxpZGF0aW9uRXJyb3IsXG4gICAgICBzLmNoZWNrb3V0X3NldHRpbmdzXG4gICAgKTtcbiAgICBnKFwiYmlsbGluZ19kZXRhaWxzX3JlY2VpdmVkXCIsIHtcbiAgICAgIC4uLmZcbiAgICB9KTtcbiAgICBjb25zdCBfID0ge1xuICAgICAgc2Vzc2lvbl9pZDogZS5lbGVtZW50c1Nlc3Npb25JZCxcbiAgICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiB0LFxuICAgICAgbm9uX2NkZV9mb3JtX2ZpZWxkczogZixcbiAgICAgIGV4dHJhX21ldGFkYXRhOiB7XG4gICAgICAgIG9yaWdpbjogd2luZG93LmxvY2F0aW9uLm9yaWdpblxuICAgICAgfSxcbiAgICAgIHVzZV91bmlmaWVkX2NjX2Zsb3c6ICExLFxuICAgICAgcGF5bWVudF9yb3V0ZV9pZDogby5wYXltZW50Um91dGVJZCxcbiAgICAgIGN1c3RvbWVyX2xhbmd1YWdlOiBvZSgpLFxuICAgICAgLi4uVyhmLCBzLmNoZWNrb3V0X3NldHRpbmdzKVxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIEwoYOKUnCBUb2tlbml6aW5nIGNhcmQgaW5mbyBpbiBDREUgW1Nlc3Npb246ICR7ZS5lbGVtZW50c1Nlc3Npb25JZH1dYCk7XG4gICAgICBjb25zdCBtID0gYXdhaXQgYm4oby5jdXJyZW50Q2RlQ29ubmVjdGlvbnMsIHtcbiAgICAgICAgc2Vzc2lvbl9pZDogZS5lbGVtZW50c1Nlc3Npb25JZFxuICAgICAgfSk7XG4gICAgICBpZiAoTG4obSwgbi5nZXQub25WYWxpZGF0aW9uRXJyb3IpLCBzLm1vZGUgPT09IFwic2V0dXBcIikge1xuICAgICAgICBMKGDilJwgU2V0dGluZyB1cCBwYXltZW50IG1ldGhvZCBpbiBDREUgW1Rva2VuOiAke3MudG9rZW59XWApO1xuICAgICAgICBjb25zdCB5ID0gYXdhaXQgSXMoaSwgXyk7XG4gICAgICAgIHJldHVybiBMKGDilbAgU2V0dXAgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBbUE0gSUQ6ICR7eS5wYXltZW50X21ldGhvZF9pZH1dYCksIHsgbW9kZTogXCJzZXR1cFwiLCByZXN1bHQ6IHkgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEwoYOKUnCBJbml0aWFsIGNoZWNrb3V0IGZsb3cuIENoZWNraW5nIG91dCBjYXJkIGluZm8gaW4gQ0RFIFtTZXNzaW9uOiAke2UuZWxlbWVudHNTZXNzaW9uSWR9XWApO1xuICAgICAgICBjb25zdCB5ID0gYXdhaXQga3IoaSwgXyk7XG4gICAgICAgIHJldHVybiBMKFwi4pWwIENoZWNrb3V0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuXCIpLCB7IG1vZGU6IFwiY2hlY2tvdXRcIiwgcmVzdWx0OiB5IH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAobSkge1xuICAgICAgaWYgKG0gaW5zdGFuY2VvZiB3biAmJiBtLm9yaWdpbmFsRXJyb3JNZXNzYWdlLmluY2x1ZGVzKFwiM0RTX1JFUVVJUkVEXCIpKSB7XG4gICAgICAgIEwoXCLilJwgQ2FyZCByZXF1aXJlcyAzRFMsIHN0YXJ0aW5nIG5vbi1sZWdhY3kgcGF5bWVudCBmbG93XCIpLCBMKFwiUmVjZWl2ZWQgM0RTIGVycm9yIHJlc3BvbnNlIGhlYWRlcnM6XCIsIG0ucmVzcG9uc2UuaGVhZGVycyksIGcoXCIzZHNfcmVxdWlyZWRcIiwge1xuICAgICAgICAgIC4uLnQsXG4gICAgICAgICAgLi4ubS5yZXNwb25zZS5oZWFkZXJzXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB5ID0gbS5yZXNwb25zZS5oZWFkZXJzID8/IHt9O1xuICAgICAgICBcIm9wLWV4aXN0aW5nLWNjLXBtLWlkXCIgaW4geSAmJiAoXy5leGlzdGluZ19jY19wbV9pZCA9IHlbXCJvcC1leGlzdGluZy1jYy1wbS1pZFwiXSwgTChg4pScIEV4aXN0aW5nIENDIFBNIElEOiAke18uZXhpc3RpbmdfY2NfcG1faWR9YCkpO1xuICAgICAgICBjb25zdCBoID0gWGMobS5yZXNwb25zZS5oZWFkZXJzKTtcbiAgICAgICAgaWYgKGgpIHtcbiAgICAgICAgICBMKFwi4pScIFBvY2t5dCAzRFMgY2FzZSBkZXRlY3RlZC4gR29pbmcgdGhyb3VnaCBQb2NreXQgM0RTIGZsb3cuXCIpO1xuICAgICAgICAgIGNvbnN0IGsgPSBhd2FpdCBlbChlLmJhc2VVcmwsIG0ucmVzcG9uc2UuaGVhZGVycyk7XG4gICAgICAgICAgXy5leHRyYV9tZXRhZGF0YS5wb2NreXQgPSBrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChEbihtLnJlc3BvbnNlLmhlYWRlcnMpKSB7XG4gICAgICAgICAgTChcIuKUnCBBaXJ3YWxsZXggM0RTIGNhc2UgZGV0ZWN0ZWQuIEdvaW5nIHRocm91Z2ggQWlyd2FsbGV4IDNEUyBmbG93LlwiKTtcbiAgICAgICAgICBjb25zdCBrID0gYXdhaXQgT24oZS5iYXNlVXJsLCBtLnJlc3BvbnNlLmhlYWRlcnMpO1xuICAgICAgICAgIF8uZXh0cmFfbWV0YWRhdGEuYWlyd2FsbGV4ID0gaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoR24obS5yZXNwb25zZS5oZWFkZXJzKSkge1xuICAgICAgICAgIEwoXCLilJwgQWR5ZW4gM0RTIGNhc2UgZGV0ZWN0ZWQuIEdvaW5nIHRocm91Z2ggQWR5ZW4gM0RTIGZsb3cuXCIpO1xuICAgICAgICAgIGNvbnN0IGsgPSBhd2FpdCBWbihcbiAgICAgICAgICAgIHJbcC5DT1VOVFJZXSxcbiAgICAgICAgICAgIG0ucmVzcG9uc2UuaGVhZGVycyxcbiAgICAgICAgICAgIHMubG9jYWxlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBfLmV4dHJhX21ldGFkYXRhLmFkeWVuID0gaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2ID0gYXdhaXQgdm4oaSwgXyk7XG4gICAgICAgIEwoXCLilJwgU3RhcnQgcGF5bWVudCBmbG93IHJlc3VsdDpcIiwgdik7XG4gICAgICAgIGNvbnN0IEMgPSB2LnJlcXVpcmVkX3VzZXJfYWN0aW9ucy5maW5kKFxuICAgICAgICAgIChrKSA9PiBrLnR5cGUgPT09IFwiY3liZXJzb3VyY2VfcGF5ZXJfYXV0aFwiXG4gICAgICAgICk7XG4gICAgICAgIGlmIChDKSB7XG4gICAgICAgICAgTChcIuKUnCBDeWJlcnNvdXJjZSAzRFMgY2FzZSBkZXRlY3RlZC4gR29pbmcgdGhyb3VnaCBDeWJlcnNvdXJjZSAzRFMgZmxvdy5cIik7XG4gICAgICAgICAgY29uc3QgayA9IEtuLnBhcnNlKEMpLCB5ZSA9IGF3YWl0IFFuKHtcbiAgICAgICAgICAgIC4uLmssXG4gICAgICAgICAgICBfdW5pZmllZF9jY19hY3Rpb25fbmFtZTogXCJcIixcbiAgICAgICAgICAgIF91bmlmaWVkX2NjX3BjY3NfaWQ6IFwiXCJcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfLmV4dHJhX21ldGFkYXRhLmN5YmVyc291cmNlID0geWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgUyA9IG0ucmVzcG9uc2UuaGVhZGVycz8uW1wib3Atc2hvdWxkLXVzZS1uZXctZmxvd1wiXSAhPT0gXCJ0cnVlXCI7XG4gICAgICAgICFoICYmICFDID8gUyA/IChMKFwi4pScIFVzaW5nIHN0cmlwZSAzRFMgZmxvd1wiKSwgYXdhaXQgdG8odWwodikpKSA6IChMKFwi4pScIFVzaW5nIGNvbW1vbiAzRFMgZmxvd1wiKSwgYXdhaXQgb28odiwgZS5iYXNlVXJsKSkgOiBMKFwi4pScIFByZS1zdGFydCAzRFMgaXMgc3VjY2Vzc2Z1bCwgb3RoZXIgM0RTIGZsb3dzIHdpbGwgYmUgc2tpcHBlZC5cIik7XG4gICAgICAgIGNvbnN0IFIgPSB2LmNjX3BtX2lkO1xuICAgICAgICBpZiAocy5tb2RlID09PSBcInNldHVwXCIpIHtcbiAgICAgICAgICBMKGDilJwgQ29uZmlybWluZyBwYXltZW50IGZsb3cgW2NjX3BtX2lkOiAke1J9XWApO1xuICAgICAgICAgIGNvbnN0IGsgPSBhd2FpdCBEKGksIHtcbiAgICAgICAgICAgIHNlY3VyZV90b2tlbjogcy50b2tlbixcbiAgICAgICAgICAgIGV4aXN0aW5nX2NjX3BtX2lkOiBSXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgTChcIuKUnCBDb25maXJtIHBheW1lbnQgZmxvdyByZXN1bHQgcmVjZWl2ZWQgUmVzdWx0OlwiLCBrKTtcbiAgICAgICAgICBjb25zdCB5ZSA9IGF0KGspO1xuICAgICAgICAgIHJldHVybiBMKGDilbAgU2V0dXAgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBbUE0gSUQ6ICR7eWUucGF5bWVudF9tZXRob2RfaWR9XWApLCB7IG1vZGU6IFwic2V0dXBcIiwgcmVzdWx0OiB5ZSB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIEwoYOKUnCBDaGVja2luZyBvdXQgYWZ0ZXIgM0RTIGZsb3cgW0Zsb3c6ICR7UyA/IFwibGVnYWN5XCIgOiBcIm5ld1wifV1gKTtcbiAgICAgICAgICBjb25zdCBrID0gYXdhaXQga3IoaSwge1xuICAgICAgICAgICAgLi4uXyxcbiAgICAgICAgICAgIGV4aXN0aW5nX2NjX3BtX2lkOiBSLFxuICAgICAgICAgICAgZG9fbm90X3VzZV9sZWdhY3lfY2NfZmxvdzogU1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBMKFwi4pWwIENoZWNrb3V0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuXCIpLCB7IG1vZGU6IFwiY2hlY2tvdXRcIiwgcmVzdWx0OiBrIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IFRyKFwi4pWwIEVycm9yIGNoZWNraW5nIG91dCBjYXJkIGluZm8gaW4gQ0RFXCIpLCBUcihtKSwgbTtcbiAgICB9XG4gIH1cbiksIHVsID0gKGUpID0+IHtcbiAgY29uc3QgdCA9IGUucmVxdWlyZWRfdXNlcl9hY3Rpb25zLmZpbmQoKHIpID0+IHIudHlwZSA9PT0gXCJzdHJpcGVfM2RzXCIpO1xuICBpZiAoIXQpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gc3RyaXBlIDNEUyBhY3Rpb24gZm91bmRcIik7XG4gIHJldHVybiBOaS5wYXJzZSh0KTtcbn0sIGRsID0gW1wiYWlyd2FsbGV4X3BheW1lbnRfY29uc2VudFwiLCBcImFkeWVuXCJdLCBubyA9IChlKSA9PiB7XG4gIGNvbnN0IHQgPSBlLmZpbmQoKHIpID0+IGRsLmluY2x1ZGVzKHIudHlwZSkpO1xuICBpZiAoIXQpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29tbW9uIDNEUyBhY3Rpb24gZm91bmRcIik7XG4gIHJldHVybiBqby5wYXJzZSh0KTtcbn0sIG9vID0gYXN5bmMgKGUsIHQpID0+IHtcbiAgY29uc3QgciA9IG5vKGUucmVxdWlyZWRfdXNlcl9hY3Rpb25zKTtcbiAgaWYgKHIucmVkaXJlY3RfdXJsID09PSBcIjNEU19DT01QTEVURVwiKSB7XG4gICAgTChcIuKUnCAzRFMgZmxvdyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XCIpLCBnKFwiM2RzX2NvbXBsZXRlXCIpO1xuICAgIHJldHVybjtcbiAgfVxuICBMKGDilJwgVXNpbmcgY29tbW9uIDNEUyBmbG93IFtVUkw6ICR7ci5yZWRpcmVjdF91cmx9XWApLCBnKFwiM2RzX3JlZGlyZWN0XCIsIHtcbiAgICAuLi5yXG4gIH0pO1xuICBjb25zdCB7IHN0YXR1czogbiB9ID0gYXdhaXQgZmUoeyB1cmw6IHIucmVkaXJlY3RfdXJsLCBiYXNlVXJsOiB0IH0pO1xuICBpZiAoTChg4pWwIDNEUyB2ZXJpZmljYXRpb24gY29tcGxldGVkIFtTdGF0dXM6ICR7bn1dYCksIG4gPT09IE4uQ0FOQ0VMTEVEKVxuICAgIHRocm93IGcoXCIzZHNfY2FuY2VsbGVkXCIpLCBuZXcgRXJyb3IoXCIzRFMgdmVyaWZpY2F0aW9uIGNhbmNlbGxlZFwiKTtcbiAgaWYgKG4gPT09IE4uRkFJTFVSRSlcbiAgICB0aHJvdyBnKFwiM2RzX2ZhaWx1cmVcIiksIG5ldyBFcnJvcihcIjNEUyB2ZXJpZmljYXRpb24gZmFpbGVkXCIpO1xuICBnKFwiY29tbW9uXzNkc19jb21wbGV0ZWRcIik7XG59LCBwbCA9IHokMS5vYmplY3Qoe1xuICBwcm9jZXNzb3JfbmFtZTogeiQxLmxpdGVyYWwoXCJsb29wXCIpLFxuICBwcm92aWRlcjogeiQxLmxpdGVyYWwoXCJjcnlwdG9cIiksXG4gIG1ldGFkYXRhOiB6JDEub2JqZWN0KHtcbiAgICBtZXJjaGFudF9pZDogeiQxLnN0cmluZygpLFxuICAgIGVudGl0eV9pZDogeiQxLnN0cmluZygpLFxuICAgIGFwaV90b2tlbjogeiQxLnN0cmluZygpLFxuICAgIHN1cHBvcnRlZF9jdXJyZW5jaWVzOiB6JDEuYXJyYXkoeiQxLnN0cmluZygpKSxcbiAgICBlbnZpcm9ubWVudDogeiQxLnN0cmluZygpXG4gIH0pXG59KSwgeyBsb2dfXzogSCwgZXJyX186IG1sIH0gPSBJKFwibG9vcC1jcnlwdG9cIiksIF9sID0gbWUoXG4gIGFzeW5jICh7IGNvbnRleHQ6IGUgfSkgPT4ge1xuICAgIEgoXCJDaGVja2luZyBpZiB0aGVyZSBhcmUgYW55IENQTXMgZm9yIExvb3AgQ3J5cHRvLi4uXCIpO1xuICAgIGNvbnN0IHQgPSBxKGUuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgcGwpO1xuICAgIEgoYGNoZWNrb3V0UGF5bWVudE1ldGhvZDogJHtKU09OLnN0cmluZ2lmeSh0KX1gKSwgSChcIlN0YXJ0aW5nIExvb3AgQ3J5cHRvIGZsb3cuLi5cIik7XG4gICAgY29uc3QgciA9IGF3YWl0IE0oZS5hbnlDZGVDb25uZWN0aW9uKSwgbiA9IHIubW9kZSA9PT0gXCJzZXR1cFwiLCBvID0gYXdhaXQgUnQoZS5hbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogdFxuICAgIH0pLCBpID0gYXdhaXQgX2UoXG4gICAgICBlLmFueUNkZUNvbm5lY3Rpb24sXG4gICAgICByLnRva2VuLFxuICAgICAgbixcbiAgICAgIHZvaWQgMFxuICAgICk7XG4gICAgaWYgKCFuICYmICF0Lm1ldGFkYXRhLnN1cHBvcnRlZF9jdXJyZW5jaWVzLmluY2x1ZGVzKHIuY3VycmVuY3kpKVxuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBDdXJyZW5jeSAke3IuY3VycmVuY3l9IG5vdCBlbmFibGVkIGZvciBMb29wLiBFbmFibGVkIGN1cnJlbmNpZXM6ICR7dC5tZXRhZGF0YS5zdXBwb3J0ZWRfY3VycmVuY2llc31gXG4gICAgICApO1xuICAgIGlmICghbyB8fCAhby5uZXh0X2FjdGlvbl9tZXRhZGF0YSlcbiAgICAgIHRocm93IEVycm9yKFwiRmFpbGVkIHRvIGZldGNoIG5lY2Vzc2FyeSBzZXR1cCBkYXRhIGZvciBMb29wXCIpO1xuICAgIGNvbnN0IHMgPSBvLm5leHRfYWN0aW9uX21ldGFkYXRhO1xuICAgIGxldCBjID0gcy5hdXRob3JpemF0aW9uX2Ftb3VudCwgbCA9IHMubWluX2F1dGhvcml6YXRpb25fYW1vdW50O1xuICAgIGNvbnN0IHUgPSBzLmFsbG93X2N1c3RvbWVyX3RvX2Nob29zZV9hdXRoO1xuICAgIGxldCBkO1xuICAgIG4gPyAoZCA9IDAsIGMgPSBNYXRoLm1heChjLCBsKSkgOiAoZCA9IChpID8gaS5hbW91bnRBdG9tIDogci5hbW91bnRfdG90YWxfYXRvbSkgKiBzLnRva2VuX3ByaWNlLCBsID0gTWF0aC5tYXgobCwgZCksIGMgPSBNYXRoLm1heChjLCBsKSk7XG4gICAgY29uc3QgZiA9IGQsIF8gPSB2NCgpLCBtID0ge1xuICAgICAgcGF5bWVudFVzZEFtb3VudDogZixcbiAgICAgIHN1Z2dlc3RlZEF1dGhvcml6YXRpb25Vc2RBbW91bnQ6IGMsXG4gICAgICBjdXN0b21lclJlZklkOiBfLFxuICAgICAgbWluQXV0aG9yaXphdGlvblVzZEFtb3VudDogbCxcbiAgICAgIGFsbG93Q3VzdG9tZXJUb0Nob29zZUF1dGg6IHVcbiAgICB9LCB5ID0ge1xuICAgICAgYXBpVG9rZW46IHQubWV0YWRhdGEuYXBpX3Rva2VuLFxuICAgICAgZW50aXR5SWQ6IHQubWV0YWRhdGEuZW50aXR5X2lkLFxuICAgICAgbWVyY2hhbnRJZDogdC5tZXRhZGF0YS5tZXJjaGFudF9pZCxcbiAgICAgIGVudmlyb25tZW50OiB0Lm1ldGFkYXRhLmVudmlyb25tZW50XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgaXNBdmFpbGFibGU6ICEwLFxuICAgICAgd2lkZ2V0UHJvcHM6IG0sXG4gICAgICBpbml0TG9vcENvbm5lY3RQcm9wczogeVxuICAgIH07XG4gIH1cbiksIGZsID0geihcbiAgYXN5bmMgKHtcbiAgICBjb250ZXh0OiBlLFxuICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogdCxcbiAgICBub25DZGVGb3JtSW5wdXRzOiByLFxuICAgIGZvcm1DYWxsYmFja3M6IG4sXG4gICAgY3VzdG9tUGFyYW1zOiBvXG4gIH0pID0+IHtcbiAgICBIKFwiUnVubmluZyBMb29wIGZsb3cuLi5cIiksIEgoXCJjb250ZXh0XCIsIGUpLCBIKFwiY2hlY2tvdXRQYXltZW50TWV0aG9kXCIsIHQpLCBIKFwibm9uQ2RlRm9ybUlucHV0c1wiLCByKSwgSChcImZsb3dDYWxsYmFja3NcIiwgbiksIEgoXCJjdXN0b21QYXJhbXNcIiwgbyk7XG4gICAgY29uc3QgaSA9IGF3YWl0IE0oZS5hbnlDZGVDb25uZWN0aW9uKTtcbiAgICBIKGDilJwgVmFsaWRhdGluZyBub24tQ0RFIGZvcm0gZmllbGRzIFtNb2RlOiAke2kubW9kZX1dYCk7XG4gICAgY29uc3QgcyA9IFYoXG4gICAgICByLFxuICAgICAgbi5nZXQub25WYWxpZGF0aW9uRXJyb3IsXG4gICAgICBpLmNoZWNrb3V0X3NldHRpbmdzXG4gICAgKSwgYyA9IGUuYW55Q2RlQ29ubmVjdGlvbiwgbCA9IGkubW9kZSAhPT0gXCJzZXR1cFwiLCB1ID0gVyhzLCBpLmNoZWNrb3V0X3NldHRpbmdzKTtcbiAgICBpZiAoIW8pXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDaGVja291dCBmYWlsZWQuIEZhaWxlZCB0byBwcm9wZXJseSBzdWJtaXQgZm9ybSBkYXRhLlwiKTtcbiAgICBpZiAoIW8uc3VjY2VzcylcbiAgICAgIHRocm93IGcoXCJsb29wX3BheV9mbG93X2ZhaWx1cmVcIiwgbyksIG5ldyBFcnJvcihcIkNoZWNrb3V0IGZhaWxlZC4gU3VjY2VzcyBpcyBub3QgdHJ1ZS5cIik7XG4gICAgY29uc3QgZCA9IGF3YWl0IFgoZS5hbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogdCxcbiAgICAgIHBheW1lbnRfcHJvdmlkZXI6IHQucHJvdmlkZXIsXG4gICAgICAuLi51LFxuICAgICAgdXNlX3BheV9maXJzdF9mbG93OiBsLFxuICAgICAgcGF5X2ZpcnN0X2Zsb3dfY2FydF9pbmZvOiBsID8ge1xuICAgICAgICAvLyBUT0RPIGFkZCBjb3Vwb24gYW5kIGNhcnQgYWRqdXN0ZWQgbGluZSBpdGVtcyBsYXRlclxuICAgICAgICBsaW5lX2l0ZW1zOiBpLmxpbmVfaXRlbXMsXG4gICAgICAgIGRpc3BsYXllZF90b3RhbF9hbW91bnRfYXRvbTogaS5hbW91bnRfdG90YWxfYXRvbSxcbiAgICAgICAgcHJvbW90aW9uX2NvZGU6IHNbcC5QUk9NT1RJT05fQ09ERV1cbiAgICAgIH0gOiB2b2lkIDAsXG4gICAgICBjdXN0b21lcl9sYW5ndWFnZTogb2UoKVxuICAgIH0pLCBmID0gYXdhaXQgRChjLCB7XG4gICAgICBzZWN1cmVfdG9rZW46IGkudG9rZW4sXG4gICAgICB0aGVpcl9wbV9pZDogby5wYXltZW50TWV0aG9kLnBheW1lbnRNZXRob2RJZCxcbiAgICAgIC8vIE5PVEU6IHdlIGRvIGhhdmUgdGhlIGNoZWNrb3V0IGF0dGVtcHQgaWQgaGVyZSBldmVuIGlmIGl0cyBhIHNldHVwLCBidXQgZm9yIG5vdyB3ZSBkb24ndCBpbmNsdWRlIGl0XG4gICAgICAvLyBiZWNhdXNlIHdlIGRvbid0IGhhdmUgY2hlY2tvdXQgYXR0ZW1wdCBzdXBwb3J0IGZvciBzZXR1cCBpbnRlbnRzLlxuICAgICAgY2hlY2tvdXRfYXR0ZW1wdF9pZDogbCA/IGQuY2hlY2tvdXRfYXR0ZW1wdF9pZCA6IHZvaWQgMCxcbiAgICAgIHByb2Nlc3Nvcl9zcGVjaWZpY19tZXRhZGF0YToge1xuICAgICAgICBsb29wX2N1c3RvbWVyOiBvLmN1c3RvbWVyLFxuICAgICAgICBsb29wX3BheW1lbnRfbWV0aG9kOiBvLnBheW1lbnRNZXRob2QsXG4gICAgICAgIGxvb3Bfc3VjY2Vzczogby5zdWNjZXNzXG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKEgoYENvbmZpcm0gcmVzdWx0OiAke2Z9YCksIGkubW9kZSA9PT0gXCJzZXR1cFwiKSB7XG4gICAgICBIKFwiRG9pbmcgcGF5bWVudCBzZXR1cC4uLlwiKSwgSChcIuKUnCBDb25maXJtIHBheW1lbnQgZmxvdyByZXN1bHQgcmVjZWl2ZWQgUmVzdWx0OlwiLCBmKTtcbiAgICAgIGNvbnN0IF8gPSBhdChmKTtcbiAgICAgIHJldHVybiBIKGDilbAgU2V0dXAgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBbUE0gSUQ6ICR7Xy5wYXltZW50X21ldGhvZF9pZH1dYCksIHsgbW9kZTogXCJzZXR1cFwiLCByZXN1bHQ6IF8gfTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEgoXCJEb2luZyBjaGVja291dC4uLlwiKSwgIWYucGF5X2ZpcnN0X3N1Y2Nlc3NfcmVzcG9uc2UpXG4gICAgICAgIHRocm93IG1sKFwiQ2hlY2tvdXQgZmFpbGVkLCBubyBwYXktZmlyc3Qgc3VjY2VzcyByZXNwb25zZTpcIiwgZiksIG5ldyBFcnJvcihcIkNoZWNrb3V0IGZhaWxlZCwgcGxlYXNlIHRyeSBhZ2FpbiB3aXRoIGFub3RoZXIgcGF5bWVudCBtZXRob2QuXCIpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbW9kZTogXCJjaGVja291dFwiLFxuICAgICAgICByZXN1bHQ6IGYucGF5X2ZpcnN0X3N1Y2Nlc3NfcmVzcG9uc2VcbiAgICAgIH07XG4gICAgfVxuICB9XG4pLCB7IGxvZ19fOiBiZSwgZXJyX186IHlsIH0gPSBJKFwicGF5cGFsXCIpLCBhbyA9IHokMS5vYmplY3Qoe1xuICBwcm92aWRlcjogeiQxLmxpdGVyYWwoXCJwYXlwYWxcIiksXG4gIG1ldGFkYXRhOiB6JDEub2JqZWN0KHsgY2xpZW50X2lkOiB6JDEuc3RyaW5nKCkgfSksXG4gIHByb2Nlc3Nvcl9uYW1lOiB6JDEubGl0ZXJhbChcInBheXBhbFwiKVxufSksIGhsID0gYXN5bmMgKHsgY29udGV4dDogZSwgZm9ybUNhbGxiYWNrczogdCB9KSA9PiB7XG4gIGNvbnN0IHIgPSBxKGUuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgYW8pO1xuICBpZiAoIXIpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiUGF5UGFsIENQTSBub3QgZm91bmQgaW4gYXZhaWxhYmxlIHBheW1lbnQgbWV0aG9kc1wiKTtcbiAgcmV0dXJuIHtcbiAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgIGlzQXZhaWxhYmxlOiB0cnVlLFxuICAgIHN0YXJ0RmxvdzogKCkgPT4gRi5wYXlwYWwucnVuKHtcbiAgICAgIGNvbnRleHQ6IGUsXG4gICAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IHIsXG4gICAgICBub25DZGVGb3JtSW5wdXRzOiBVKGUuZm9ybURpdiksXG4gICAgICBmb3JtQ2FsbGJhY2tzOiB0LFxuICAgICAgaW5pdFJlc3VsdDogdm9pZCAwLFxuICAgICAgY3VzdG9tUGFyYW1zOiB7IHNldHRpbmdzOiB7fSB9XG4gICAgfSlcbiAgfTtcbn0sIGdsID0geihcbiAgYXN5bmMgKHtcbiAgICBjb250ZXh0OiBlLFxuICAgIG5vbkNkZUZvcm1JbnB1dHM6IHQsXG4gICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiByLFxuICAgIGZvcm1DYWxsYmFja3M6IG4sXG4gICAgY3VzdG9tUGFyYW1zOiBvXG4gIH0pID0+IHtcbiAgICB0cnkge1xuICAgICAgYmUoXCJSdW5uaW5nIFBheVBhbCBmbG93Li4uXCIpO1xuICAgICAgY29uc3QgaSA9IGUuYW55Q2RlQ29ubmVjdGlvbiwgcyA9IGF3YWl0IE0oaSksIHsgaXNBbm9ueW1vdXM6IGMsIHVzZVJlZGlyZWN0RmxvdzogbCB9ID0gby5zZXR0aW5ncyA/PyB7fTtcbiAgICAgIGJlKFwiVmVyaWZ5aW5nIENQTS4uLlwiKTtcbiAgICAgIGNvbnN0IHUgPSBhby5wYXJzZShyKTtcbiAgICAgIGJlKFwi4pScIFZhbGlkYXRpbmcgbm9uLUNERSBmb3JtIGZpZWxkc1wiKTtcbiAgICAgIGNvbnN0IGQgPSBWKHQsIG4uZ2V0Lm9uVmFsaWRhdGlvbkVycm9yLCB7XG4gICAgICAgIC4uLmMgPyB6cygpIDogdm9pZCAwLFxuICAgICAgICAuLi5zLmNoZWNrb3V0X3NldHRpbmdzXG4gICAgICB9KSwgZiA9IFcoZCwgcy5jaGVja291dF9zZXR0aW5ncyk7XG4gICAgICBiZShgU3RhcnRpbmcgcGF5bWVudCBmbG93Li4uIE1vZGU6ICR7cy5tb2RlfWApO1xuICAgICAgY29uc3QgXyA9IHY0KCksIG0gPSAhMSwgeSA9IHtcbiAgICAgICAgcGF5bWVudF9wcm92aWRlcjogdS5wcm92aWRlcixcbiAgICAgICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IHUsXG4gICAgICAgIHVzZV9wYXlfZmlyc3RfZmxvdzogbSxcbiAgICAgICAgcGF5X2ZpcnN0X2Zsb3dfY2FydF9pbmZvOiBtID8ge1xuICAgICAgICAgIGxpbmVfaXRlbXM6IHMubGluZV9pdGVtcyxcbiAgICAgICAgICBkaXNwbGF5ZWRfdG90YWxfYW1vdW50X2F0b206IHMuYW1vdW50X3RvdGFsX2F0b21cbiAgICAgICAgfSA6IHZvaWQgMCxcbiAgICAgICAgcHJvY2Vzc29yX3NwZWNpZmljX21ldGFkYXRhOiB7XG4gICAgICAgICAgdXNlX3BheXBhbF9yZWRpcmVjdF9mbG93OiBsLFxuICAgICAgICAgIGZyb250ZW5kX3Rva2VuX2Zvcl9yZWRpcmVjdF9mbG93OiBfXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmZcbiAgICAgIH0sIGggPSBuZXcgVVJMKFwiL2FwcC9wcmUtYWN0aW9uL3N0YXJ0L1wiLCBlLmJhc2VVcmwpLnRvU3RyaW5nKCksIHcgPSBidG9hKEpTT04uc3RyaW5naWZ5KHkpKSwgRSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICBzdDogcy50b2tlbixcbiAgICAgICAgcjogd1xuICAgICAgfSksIHYgPSBgJHtofT8ke0UudG9TdHJpbmcoKX1gO1xuICAgICAgaWYgKGwpXG4gICAgICAgIHRocm93IGJlKFwiU3RhcnRpbmcgcmVkaXJlY3QgbW9kZSBmb3IgUGF5UGFsLi4uXCIpLCB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHYsIGF3YWl0IEl0KDIwICogMWUzKSwgbmV3IEVycm9yKFwiUGF5cGFsIGZsb3cgdGltZWQgb3V0LCBwbGVhc2UgdHJ5IGFnYWluIHdpdGggYW5vdGhlciBwYXltZW50IG1ldGhvZC5cIik7XG4gICAgICBjb25zdCBDID0gYXdhaXQgRm4oXG4gICAgICAgIFwiUGF5UGFsXCIsXG4gICAgICAgIGksXG4gICAgICAgIF8sXG4gICAgICAgIHZcbiAgICAgICk7XG4gICAgICBiZShcIlBheXBhbCBmbG93IHJlc3VsdFwiLCBDKTtcbiAgICAgIGNvbnN0IFMgPSBZdChDLmhyZWYsIFwiY2F0dFwiKSwgUiA9IFl0KEMuaHJlZiwgXCJhcHByb3ZhbF9zZXNzaW9uX2lkXCIpLCBrID0gYXdhaXQgRChpLCB7XG4gICAgICAgIHNlY3VyZV90b2tlbjogcy50b2tlbixcbiAgICAgICAgY2hlY2tvdXRfYXR0ZW1wdF9pZDogbSA/IFMgOiB2b2lkIDAsXG4gICAgICAgIHRoZWlyX3BtX2lkOiBtID8gUiA6IHZvaWQgMFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYmUoXCJDb25maXJtIHBheW1lbnQgZmxvdyByZXN1bHRcIiwgayksIGFlKHtcbiAgICAgICAgbG9nUHJlZml4OiBcInBheXBhbFwiLFxuICAgICAgICBhbnlDZGVDb25uZWN0aW9uOiBpLFxuICAgICAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IHUsXG4gICAgICAgIHJlcXVpcmVkRm9ybUZpZWxkczogZCxcbiAgICAgICAgY29uZmlybVJlc3VsdDogayxcbiAgICAgICAgdXNlUGF5Rmlyc3RGbG93OiBtXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChpKSB7XG4gICAgICB0aHJvdyB5bChcIlBheVBhbCBwYXltZW50IGVycm9yXCIsIGkpLCBnKFwiY2hlY2tvdXRfZXJyb3JcIiwgeyBwYXltZW50X21ldGhvZDogXCJwYXlwYWxcIiwgZXJyb3I6IGkgfSksIG5ldyBFcnJvcihpPy5tZXNzYWdlID8/IFwiVW5rbm93biBlcnJvclwiKTtcbiAgICB9XG4gIH1cbiksIHsgbG9nX186IGllLCBlcnJfXzogTnIgfSA9IEkoXCJwb2NreXQtcGF5cGFsXCIpLCBpbyA9IHokMS5vYmplY3Qoe1xuICBwcm9jZXNzb3JfbmFtZTogeiQxLmxpdGVyYWwoXCJwb2NreXRcIiksXG4gIHByb3ZpZGVyOiB6JDEubGl0ZXJhbChcInBheXBhbFwiKVxufSk7XG56JDEuYXJyYXkoXG4gIHokMS5vYmplY3Qoe1xuICAgIHBheXBhbF9pZnJhbWVfdXJsOiB6JDEuc3RyaW5nKCksXG4gICAgdmVyaWZ5X3Rva2VuOiB6JDEuc3RyaW5nKClcbiAgfSlcbikubGVuZ3RoKDEpO1xuY29uc3Qgd2wgPSBhc3luYyAoeyBjb250ZXh0OiBlLCBmb3JtQ2FsbGJhY2tzOiB0IH0pID0+IHtcbiAgY29uc3QgciA9IHEoZS5jaGVja291dFBheW1lbnRNZXRob2RzLCBpbyk7XG4gIGlmICghcilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJQb2NreXQgUGF5UGFsIENQTSBub3QgZm91bmQgaW4gYXZhaWxhYmxlIHBheW1lbnQgbWV0aG9kc1wiKTtcbiAgcmV0dXJuIHtcbiAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgIGlzQXZhaWxhYmxlOiB0cnVlLFxuICAgIHN0YXJ0RmxvdzogKCkgPT4gRi5wb2NreXRQYXlwYWwucnVuKHtcbiAgICAgIGNvbnRleHQ6IGUsXG4gICAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IHIsXG4gICAgICBub25DZGVGb3JtSW5wdXRzOiBVKGUuZm9ybURpdiksXG4gICAgICBmb3JtQ2FsbGJhY2tzOiB0LFxuICAgICAgaW5pdFJlc3VsdDogdm9pZCAwLFxuICAgICAgY3VzdG9tUGFyYW1zOiB7IHNldHRpbmdzOiB7fSB9XG4gICAgfSlcbiAgfTtcbn0sIHZsID0geihcbiAgYXN5bmMgKHtcbiAgICBjb250ZXh0OiBlLFxuICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogdCxcbiAgICBub25DZGVGb3JtSW5wdXRzOiByLFxuICAgIGZvcm1DYWxsYmFja3M6IG4sXG4gICAgY3VzdG9tUGFyYW1zOiBvXG4gIH0pID0+IHtcbiAgICBpZShcIlJ1bm5pbmcgUG9ja3l0IFBheXBhbCBmbG93Li4uXCIpO1xuICAgIGNvbnN0IGkgPSBlLmFueUNkZUNvbm5lY3Rpb24sIHMgPSBhd2FpdCBNKGkpO1xuICAgIGllKFwiVmVyaWZ5aW5nIENQTS4uLlwiKTtcbiAgICBjb25zdCBjID0gaW8ucGFyc2UodCk7XG4gICAgaWUoXCLilJwgVmFsaWRhdGluZyBub24tQ0RFIGZvcm0gZmllbGRzXCIpO1xuICAgIGNvbnN0IGwgPSBvPy5zZXR0aW5ncywgdSA9IFYoXG4gICAgICByLFxuICAgICAgbi5nZXQub25WYWxpZGF0aW9uRXJyb3IsXG4gICAgICBsPy5kZWZhdWx0RmllbGRWYWx1ZXNcbiAgICApLCBkID0gVyh1LCBzLmNoZWNrb3V0X3NldHRpbmdzKTtcbiAgICBpZShgU3RhcnRpbmcgcGF5bWVudCBmbG93Li4uIE1vZGU6ICR7cy5tb2RlfWApO1xuICAgIGNvbnN0IGYgPSB2NCgpLCBfID0gcy5tb2RlICE9PSBcInNldHVwXCIsIG0gPSB7XG4gICAgICBwYXltZW50X3Byb3ZpZGVyOiBjLnByb3ZpZGVyLFxuICAgICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IGMsXG4gICAgICB1c2VfcGF5X2ZpcnN0X2Zsb3c6IF8sXG4gICAgICBwYXlfZmlyc3RfZmxvd19jYXJ0X2luZm86IF8gPyB7XG4gICAgICAgIC8vIFRPRE8gYWRkIGNvdXBvbiBhbmQgY2FydCBhZGp1c3RlZCBsaW5lIGl0ZW1zIGxhdGVyXG4gICAgICAgIGxpbmVfaXRlbXM6IHMubGluZV9pdGVtcyxcbiAgICAgICAgZGlzcGxheWVkX3RvdGFsX2Ftb3VudF9hdG9tOiBzLmFtb3VudF90b3RhbF9hdG9tXG4gICAgICB9IDogdm9pZCAwLFxuICAgICAgcHJvY2Vzc29yX3NwZWNpZmljX21ldGFkYXRhOiB7XG4gICAgICAgIHVzZV9wYXlwYWxfcmVkaXJlY3RfZmxvdzogISFvPy5zZXR0aW5ncz8udXNlUmVkaXJlY3RGbG93LFxuICAgICAgICBmcm9udGVuZF90b2tlbl9mb3JfcmVkaXJlY3RfZmxvdzogZlxuICAgICAgfSxcbiAgICAgIC4uLmRcbiAgICB9LCB5ID0gbmV3IFVSTChcIi9hcHAvcHJlLWFjdGlvbi9zdGFydC9cIiwgZS5iYXNlVXJsKS50b1N0cmluZygpLCBoID0gYnRvYShKU09OLnN0cmluZ2lmeShtKSksIHcgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgIHN0OiBzLnRva2VuLFxuICAgICAgcjogaFxuICAgIH0pLCBFID0gYCR7eX0/JHt3LnRvU3RyaW5nKCl9YDtcbiAgICBpZiAobz8uc2V0dGluZ3M/LnVzZVJlZGlyZWN0RmxvdylcbiAgICAgIHRocm93IGllKFwiU3RhcnRpbmcgcmVkaXJlY3QgbW9kZSBmb3IgUGF5UGFsLi4uXCIpLCB3aW5kb3cubG9jYXRpb24uaHJlZiA9IEUsIGF3YWl0IEl0KDIwICogMWUzKSwgbmV3IEVycm9yKFwiUGF5cGFsIGZsb3cgdGltZWQgb3V0LCBwbGVhc2UgdHJ5IGFnYWluIHdpdGggYW5vdGhlciBwYXltZW50IG1ldGhvZC5cIik7XG4gICAgaWUoXCJTdGFydGluZyBwb3B1cCBtb2RlIGZvciBQYXlQYWwuLi5cIiksIGllKFwiT3BlbmluZyBwYXlwYWwgaWZyYW1lLi4uXCIpO1xuICAgIGNvbnN0IHYgPSBhd2FpdCBGbihcbiAgICAgIFwiUGF5UGFsXCIsXG4gICAgICBpLFxuICAgICAgZixcbiAgICAgIEVcbiAgICApO1xuICAgIGllKFwiUGF5cGFsIGZsb3cgcmVzdWx0XCIsIHYpO1xuICAgIGNvbnN0IEMgPSBlbyh2LmhyZWYpLCBTID0gWXQodi5ocmVmLCBcImNhdHRcIik7XG4gICAgaWYgKCFTKVxuICAgICAgdGhyb3cgTnIoXCJDaGVja291dCBhdHRlbXB0IElEIG5vdCBmb3VuZCBpbiByZWRpcmVjdCBVUkw6XCIsIHYuaHJlZiksIG5ldyBFcnJvcihcIkNoZWNrb3V0IGF0dGVtcHQgSUQgbm90IGZvdW5kIGluIHJlZGlyZWN0IFVSTFwiKTtcbiAgICBpZShgQ29uZmlybWluZyBwYXltZW50IGZsb3cgdXNpbmcgdmF1bHQgSUQgJHtDfWApO1xuICAgIGNvbnN0IFIgPSBhd2FpdCBEKGksIHtcbiAgICAgIHNlY3VyZV90b2tlbjogcy50b2tlbixcbiAgICAgIHRoZWlyX3BtX2lkOiBDLFxuICAgICAgY2hlY2tvdXRfYXR0ZW1wdF9pZDogXyA/IFMgOiB2b2lkIDBcbiAgICB9KTtcbiAgICBpZiAoaWUoXCJDb25maXJtIHBheW1lbnQgZmxvdyByZXN1bHRcIiwgUiksIHMubW9kZSA9PT0gXCJzZXR1cFwiKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbW9kZTogXCJzZXR1cFwiLFxuICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICBwYXltZW50X21ldGhvZF9pZDogUi5wYXltZW50X21ldGhvZHNbMF0uaWRcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICBpZiAoIVIucGF5X2ZpcnN0X3N1Y2Nlc3NfcmVzcG9uc2UpXG4gICAgICB0aHJvdyBOcihcIkNoZWNrb3V0IGZhaWxlZCwgbm8gcGF5LWZpcnN0IHN1Y2Nlc3MgcmVzcG9uc2U6XCIsIFIpLCBuZXcgRXJyb3IoXCJDaGVja291dCBmYWlsZWQsIHBsZWFzZSB0cnkgYWdhaW4gd2l0aCBhbm90aGVyIHBheW1lbnQgbWV0aG9kLlwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZTogXCJjaGVja291dFwiLFxuICAgICAgcmVzdWx0OiBSLnBheV9maXJzdF9zdWNjZXNzX3Jlc3BvbnNlXG4gICAgfTtcbiAgfVxuKSwgZHQgPSBcIm9qcy1zdHJpcGUtbGluay1idG5cIiwgeyBsb2dfXzogaiwgZXJyX186IEZyIH0gPSBJKFwic3RyaXBlLWxpbmtcIiksIGJsID0geiQxLm9iamVjdCh7XG4gIHByb3ZpZGVyOiB6JDEubGl0ZXJhbChcInN0cmlwZV9saW5rXCIpLFxuICBwcm9jZXNzb3JfbmFtZTogeiQxLmxpdGVyYWwoXCJzdHJpcGVcIiksXG4gIG1ldGFkYXRhOiB6JDEub2JqZWN0KHtcbiAgICBzdHJpcGVfcGs6IHokMS5zdHJpbmcoKVxuICB9KVxufSksIFBsID0geiQxLmFycmF5KFxuICB6JDEub2JqZWN0KHtcbiAgICBvdXJfZXhpc3RpbmdfcG1faWQ6IHokMS5zdHJpbmcoKVxuICB9KVxuKS5sZW5ndGgoMSksIEVsID0gbWUoXG4gIGFzeW5jICh7IGNvbnRleHQ6IGUsIGZvcm1DYWxsYmFja3M6IHQgfSkgPT4ge1xuICAgIGNvbnN0IHIgPSBlLmN1c3RvbUluaXRQYXJhbXMuc3RyaXBlTGluaztcbiAgICBqKFwiQ2hlY2tpbmcgaWYgdGhlcmUgYXJlIGFueSBDUE1zIGZvciBTdHJpcGUgTGluay4uLlwiKTtcbiAgICBjb25zdCBuID0gcShlLmNoZWNrb3V0UGF5bWVudE1ldGhvZHMsIGJsKTtcbiAgICBqKFwiU3RhcnRpbmcgc3RyaXBlIGxpbmsgZmxvdy4uLlwiKTtcbiAgICBjb25zdCBvID0gZS5hbnlDZGVDb25uZWN0aW9uLCBpID0gYXdhaXQgTShvKSwgcyA9IGkubW9kZSA9PT0gXCJzZXR1cFwiO1xuICAgIGooXCJDcmVhdGluZyBzdHJpcGUgZWxlbWVudHMuLi5cIik7XG4gICAgY29uc3QgYyA9IGF3YWl0IF9lKG8sIGkudG9rZW4sIHMsIHZvaWQgMCksIHsgZWxlbWVudHM6IGwsIHN0cmlwZTogdSB9ID0gYXdhaXQgTWkobi5tZXRhZGF0YS5zdHJpcGVfcGssIHtcbiAgICAgIG1vZGU6IFwic2V0dXBcIixcbiAgICAgIGN1cnJlbmN5OiBjLmN1cnJlbmN5LFxuICAgICAgc2V0dXBfZnV0dXJlX3VzYWdlOiBcIm9mZl9zZXNzaW9uXCIsXG4gICAgICBwYXltZW50TWV0aG9kQ3JlYXRpb246IFwibWFudWFsXCJcbiAgICB9KSwgZCA9IGwuY3JlYXRlKFwibGlua0F1dGhlbnRpY2F0aW9uXCIpO1xuICAgIGooXCJDcmVhdGluZyBleHByZXNzIGNoZWNrb3V0Li4uXCIpO1xuICAgIGNvbnN0IGYgPSBsLmNyZWF0ZShcImV4cHJlc3NDaGVja291dFwiLCB7XG4gICAgICBidXR0b25IZWlnaHQ6IHI/LmJ1dHRvbkhlaWdodCxcbiAgICAgIHBheW1lbnRNZXRob2RzOiB7XG4gICAgICAgIGFtYXpvblBheTogXCJuZXZlclwiLFxuICAgICAgICBhcHBsZVBheTogXCJuZXZlclwiLFxuICAgICAgICBnb29nbGVQYXk6IFwibmV2ZXJcIixcbiAgICAgICAgcGF5cGFsOiBcIm5ldmVyXCJcbiAgICAgIH1cbiAgICB9KSwgXyA9IChoLCB3KSA9PiB7XG4gICAgICBsZXQgRSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaCk7XG4gICAgICBFIHx8IChGcihgUmVjb21tYW5kZWQgdG8gcmVuZGVyIGEgY29udGFpbmVyIHdpdGggJHtofSB0byBhdm9pZCByZW5kZXJpbmcgaW4gdGhlIGJvZHlgKSwgRSA9IGRvY3VtZW50LmJvZHkpO1xuICAgICAgY29uc3QgdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBFPy5hcHBlbmRDaGlsZCh2KSwgZC5tb3VudCh2KTtcbiAgICAgIGxldCBDID0gITEsIFMgPSAhMTtcbiAgICAgIGlmIChkLm9uY2UoXCJyZWFkeVwiLCAoKSA9PiB7XG4gICAgICAgIFMgPSAhMCwgcj8ub25BdXRoZW50aWNhdGlvbkVsZW1lbnRSZWFkeT8uKCk7XG4gICAgICB9KSwgdykge1xuICAgICAgICB2LnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiLCB2LnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiLCB2LnN0eWxlLnRvcCA9IFwiLTEwMDBweFwiLCB2LnN0eWxlLmxlZnQgPSBcIi0xMDAwcHhcIiwgdi5zdHlsZS56SW5kZXggPSBcIi0xXCIsIGQub24oXCJjaGFuZ2VcIiwgKGspID0+IHtcbiAgICAgICAgICBDID0gay5jb21wbGV0ZSB8fCAhIWsudmFsdWUuZW1haWwsIFMgJiYgcj8ub25BdXRoZW50aWNhdGlvblN0YXR1c0NoYW5nZT8uKEMpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgUiA9IHYucXVlcnlTZWxlY3RvcihcImlmcmFtZVwiKTtcbiAgICAgICAgUiAmJiBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgTXQgPSBSLm9mZnNldEhlaWdodCA+IDE2MDtcbiAgICAgICAgICBTICYmIHI/Lm9uQXV0aGVudGljYXRpb25TdGF0dXNDaGFuZ2U/LihDIHx8IE10KTtcbiAgICAgICAgfSkub2JzZXJ2ZShSLCB7IGF0dHJpYnV0ZXM6ICEwLCBhdHRyaWJ1dGVGaWx0ZXI6IFtcInN0eWxlXCJdIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGQ7XG4gICAgfSwgbSA9IChoKSA9PiB7XG4gICAgICBmLm1vdW50KGggfHwgYCMke2R0fWApO1xuICAgIH0sIHkgPSAoKSA9PiB7XG4gICAgICBmLnVubW91bnQoKTtcbiAgICB9O1xuICAgIHJldHVybiByPy5kb05vdE1vdW50T25Jbml0ID8gaihcIk5PVCBtb3VudGluZyBzdHJpcGUgbGluayBidXR0b24gKGRvTm90TW91bnRPbkluaXQgaXMgdHJ1ZSlcIikgOiAoaihcIk1vdW50aW5nIHN0cmlwZSBsaW5rIGJ1dHRvbi4uLlwiKSwgbSgpKSwgcj8uc2lsZW50bHlDaGVja0F1dGhlbnRpY2F0aW9uICYmIChqKGBTaWxlbnRseSBtb3VudGluZyBsaW5rIGF1dGhlbnRpY2F0aW9uIGVsZW1lbnQgYXQgIyR7ZHR9Li4uYCksIF8oYCMke2R0fWAsICEwKSksIGYub24oXCJjbGlja1wiLCBhc3luYyAoaCkgPT4ge1xuICAgICAgaWYgKGooXCJTdHJpcGUgTGluayBidXR0b24gY2xpY2tlZFwiKSwgcj8ub3ZlcnJpZGVMaW5rU3VibWl0ICYmICFhd2FpdCByLm92ZXJyaWRlTGlua1N1Ym1pdCgpKSB7XG4gICAgICAgIGooXCJTdHJpcGUgTGluayBzdWJtaXQgYWJvcnRlZCBieSBvdmVycmlkZUxpbmtTdWJtaXRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGgucmVzb2x2ZSgpO1xuICAgIH0pLCBmLm9uKFwiY29uZmlybVwiLCBhc3luYyAoaCkgPT4ge1xuICAgICAgaihcIlN0cmlwZSBMaW5rIHdpbmRvdyBjb25maXJtZWRcIiwgaCk7XG4gICAgICBjb25zdCB3ID0gYXdhaXQgdS5jcmVhdGVQYXltZW50TWV0aG9kKHtcbiAgICAgICAgZWxlbWVudHM6IGwsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGJpbGxpbmdfZGV0YWlsczogaC5iaWxsaW5nRGV0YWlsc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHcuZXJyb3IgPyAoRnIoXCJlcnJvclwiLCB3LmVycm9yKSwgdC5nZXQub25DaGVja291dEVycm9yKHcuZXJyb3IubWVzc2FnZSA/PyBcIlN0cmlwZSBMaW5rIHVua25vd24gZXJyb3JcIikpIDogKGooXCJwYXltZW50TWV0aG9kXCIsIHcucGF5bWVudE1ldGhvZCksIEYuc3RyaXBlTGluay5ydW4oe1xuICAgICAgICBjb250ZXh0OiBlLFxuICAgICAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IG4sXG4gICAgICAgIG5vbkNkZUZvcm1JbnB1dHM6IFUoZS5mb3JtRGl2KSxcbiAgICAgICAgZm9ybUNhbGxiYWNrczogdCxcbiAgICAgICAgY3VzdG9tUGFyYW1zOiB7IHN0cmlwZVBNOiB3LnBheW1lbnRNZXRob2QgfSxcbiAgICAgICAgaW5pdFJlc3VsdDogeyBpc0F2YWlsYWJsZTogITAgfVxuICAgICAgfSkpO1xuICAgIH0pLCB7XG4gICAgICBpc0F2YWlsYWJsZTogITAsXG4gICAgICBjb250cm9sbGVyOiB7XG4gICAgICAgIG1vdW50QnV0dG9uOiBtLFxuICAgICAgICBkaXNtb3VudEJ1dHRvbjogeSxcbiAgICAgICAgbW91bnRMaW5rQXV0aGVudGljYXRpb25FbGVtZW50OiAoaCkgPT4gXyhoLCAhMSksXG4gICAgICAgIHdhaXRGb3JCdXR0b25Ub01vdW50OiBhc3luYyAoKSA9PiBhd2FpdCBrbChkdClcbiAgICAgIH1cbiAgICB9O1xuICB9XG4pLCBDbCA9IHooXG4gIGFzeW5jICh7XG4gICAgY29udGV4dDogZSxcbiAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IHQsXG4gICAgbm9uQ2RlRm9ybUlucHV0czogcixcbiAgICBmb3JtQ2FsbGJhY2tzOiBuLFxuICAgIGN1c3RvbVBhcmFtczogb1xuICB9KSA9PiB7XG4gICAgaihcIlJ1bm5pbmcgU3RyaXBlIExpbmsgZmxvdy4uLlwiKTtcbiAgICBjb25zdCBpID0gZS5hbnlDZGVDb25uZWN0aW9uLCBzID0gYXdhaXQgTShpKTtcbiAgICBqKFwiTWVyZ2luZyBQTSBmaWVsZHMgd2l0aCBmb3JtIGZpZWxkcy4uLlwiKTtcbiAgICBjb25zdCBjID0gU2wociwgby5zdHJpcGVQTSksIGwgPSBWKGMsIG4uZ2V0Lm9uVmFsaWRhdGlvbkVycm9yKTtcbiAgICBnKFwiYmlsbGluZ19kZXRhaWxzX3JlY2VpdmVkXCIsIHtcbiAgICAgIC4uLmxcbiAgICB9KSwgaihcIlN0YXJ0aW5nIHBheW1lbnQgZmxvdy4uLlwiKTtcbiAgICBjb25zdCB1ID0gYXdhaXQgWChpLCB7XG4gICAgICBwYXltZW50X3Byb3ZpZGVyOiB0LnByb3ZpZGVyLFxuICAgICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IHQsXG4gICAgICB0aGVpcl9leGlzdGluZ19wbV9pZDogby5zdHJpcGVQTS5pZCxcbiAgICAgIC4uLlcobCwgcy5jaGVja291dF9zZXR0aW5ncyksXG4gICAgICBjdXN0b21lcl9sYW5ndWFnZTogb2UoKVxuICAgIH0pO1xuICAgIGooXCJTdGFydCBwYXltZW50IGZsb3cgcmVzcG9uc2VcIiwgdSk7XG4gICAgY29uc3QgZiA9IFBsLnBhcnNlKHUucmVxdWlyZWRfdXNlcl9hY3Rpb25zKVswXS5vdXJfZXhpc3RpbmdfcG1faWQ7XG4gICAgaWYgKHMubW9kZSA9PT0gXCJzZXR1cFwiKSB7XG4gICAgICBqKFwiRG9pbmcgcGF5bWVudCBzZXR1cC4uLlwiKTtcbiAgICAgIGNvbnN0IF8gPSBhd2FpdCBEKGksIHtcbiAgICAgICAgc2VjdXJlX3Rva2VuOiBzLnRva2VuLFxuICAgICAgICBleGlzdGluZ19jY19wbV9pZDogZlxuICAgICAgfSk7XG4gICAgICByZXR1cm4geyBtb2RlOiBcInNldHVwXCIsIHJlc3VsdDogYXQoXykgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgaihcIkRvaW5nIGNoZWNrb3V0Li4uXCIpO1xuICAgICAgY29uc3QgXyA9IHtcbiAgICAgICAgc2VjdXJlX3Rva2VuOiBzLnRva2VuLFxuICAgICAgICBwYXltZW50X2lucHV0OiB7XG4gICAgICAgICAgcHJvdmlkZXJfdHlwZTogdC5wcm92aWRlclxuICAgICAgICB9LFxuICAgICAgICBjdXN0b21lcl9lbWFpbDogbFtwLkVNQUlMXSxcbiAgICAgICAgY3VzdG9tZXJfZmlyc3RfbmFtZTogbFtwLkZJUlNUX05BTUVdLFxuICAgICAgICBjdXN0b21lcl9sYXN0X25hbWU6IGxbcC5MQVNUX05BTUVdLFxuICAgICAgICBjdXN0b21lcl9hZGRyZXNzOiBvdChsKSxcbiAgICAgICAgY3VzdG9tZXJfc2hpcHBpbmdfYWRkcmVzczogVHQobCwgcy5jaGVja291dF9zZXR0aW5ncyksXG4gICAgICAgIHByb21vdGlvbl9jb2RlOiBsW3AuUFJPTU9USU9OX0NPREVdLFxuICAgICAgICBsaW5lX2l0ZW1zOiBzLmxpbmVfaXRlbXMsXG4gICAgICAgIHRvdGFsX2Ftb3VudF9hdG9tOiBzLmFtb3VudF90b3RhbF9hdG9tLFxuICAgICAgICBjYW5jZWxfYXRfZW5kOiAhMSxcbiAgICAgICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IHRcbiAgICAgIH07XG4gICAgICByZXR1cm4geyBtb2RlOiBcImNoZWNrb3V0XCIsIHJlc3VsdDogYXdhaXQgb3IoaSwgXykgfTtcbiAgICB9XG4gIH1cbiksIFNsID0gKGUsIHQpID0+IHtcbiAgY29uc3QgciA9IHsgLi4uZSB9LCBbbiwgLi4ub10gPSB0LmJpbGxpbmdfZGV0YWlscy5uYW1lPy50cmltKCk/LnNwbGl0KC9cXHMrLykgPz8gW10sIGkgPSBvLmpvaW4oXCIgXCIpIHx8IHZvaWQgMDtcbiAgcltwLkVNQUlMXSA9IHJbcC5FTUFJTF0gfHwgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgdC5saW5rPy5lbWFpbCB8fCB0LmJpbGxpbmdfZGV0YWlscy5lbWFpbCB8fCBcIm9wX3VuZmlsbGVkQGdldG9wZW5wYXkuY29tXCIsIHJbcC5aSVBfQ09ERV0gPSByW3AuWklQX0NPREVdIHx8IHQuYmlsbGluZ19kZXRhaWxzLmFkZHJlc3M/LnBvc3RhbF9jb2RlIHx8IFwiMDAwMDBcIiwgcltwLkNPVU5UUlldID0gcltwLkNPVU5UUlldIHx8IHQuYmlsbGluZ19kZXRhaWxzLmFkZHJlc3M/LmNvdW50cnkgfHwgXCJVU1wiO1xuICBjb25zdCBzID0gcltwLkZJUlNUX05BTUVdIHx8IG4gfHwgXCJcIiwgYyA9IHJbcC5MQVNUX05BTUVdIHx8IGkgfHwgXCJcIjtcbiAgcmV0dXJuIHMgfHwgYyA/IChyW3AuRklSU1RfTkFNRV0gPSBzLCByW3AuTEFTVF9OQU1FXSA9IGMpIDogKHJbcC5GSVJTVF9OQU1FXSA9IFwiX09QX1VOS05PV05cIiwgcltwLkxBU1RfTkFNRV0gPSBcIlwiKSwgaihcIkZpbmFsIGZvcm0gaW5wdXRzOlwiLCByKSwgcjtcbn0sIGtsID0gKGUpID0+IG5ldyBQcm9taXNlKCh0KSA9PiB7XG4gIGNvbnN0IHIgPSAoKSA9PiB7XG4gICAgY29uc3QgbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpO1xuICAgIG4gPyB0KG4pIDogcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHIpO1xuICB9O1xuICByKCk7XG59KSwgeyBsb2dfXzogWSwgZXJyX186IEFsIH0gPSBJKFwic3RyaXBlLXByXCIpLCBJbCA9IHokMS5vYmplY3Qoe1xuICBwcm92aWRlcjogeiQxLnVuaW9uKFt6JDEubGl0ZXJhbChcImFwcGxlX3BheVwiKSwgeiQxLmxpdGVyYWwoXCJnb29nbGVfcGF5XCIpXSksXG4gIHByb2Nlc3Nvcl9uYW1lOiB6JDEubGl0ZXJhbChcInN0cmlwZVwiKSxcbiAgbWV0YWRhdGE6IHokMS5vYmplY3Qoe1xuICAgIHN0cmlwZV9wazogeiQxLnN0cmluZygpXG4gIH0pXG59KSwgUmwgPSBtZShcbiAgYXN5bmMgKHsgY29udGV4dDogZSwgZm9ybUNhbGxiYWNrczogdCB9KSA9PiB7XG4gICAgWShcIkNoZWNraW5nIGlmIHRoZXJlIGFyZSBhbnkgQ1BNcyBmb3IgU3RyaXBlIFBSLi4uXCIpO1xuICAgIGNvbnN0IHIgPSBxKGUuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgSWwpO1xuICAgIFkoXCJJbml0aWFsaXppbmcgU3RyaXBlIFBSIGZsb3cuLi5cIik7XG4gICAgY29uc3QgbiA9IGUuYW55Q2RlQ29ubmVjdGlvbiwgbyA9IGF3YWl0IE0obiksIGkgPSBvLm1vZGUgPT09IFwic2V0dXBcIjtcbiAgICBZKFwiR2V0dGluZyBpbml0aWFsIHByZXZpZXcgYW1vdW50XCIpO1xuICAgIGNvbnN0IHMgPSBhd2FpdCBfZShuLCBvLnRva2VuLCBpLCB2b2lkIDApLCBjID0gYXdhaXQgeGkoXG4gICAgICByLm1ldGFkYXRhLnN0cmlwZV9wayxcbiAgICAgIHMuYW1vdW50QXRvbSxcbiAgICAgIHMuY3VycmVuY3ksXG4gICAgICBpXG4gICAgKTtcbiAgICBZKFwiQ2hlY2tpbmcgaWYgY2FuIG1ha2UgcGF5bWVudFwiKTtcbiAgICBjb25zdCBsID0gYXdhaXQgYy5jYW5NYWtlUGF5bWVudCgpO1xuICAgIGlmIChsID09PSBudWxsKVxuICAgICAgcmV0dXJuIEFsKFwiY2FuTWFrZVBheW1lbnQgcmV0dXJuZWQgbnVsbFwiKSwgeyBpc0F2YWlsYWJsZTogITEsIHJlYXNvbjogXCJjYW5NYWtlUGF5bWVudCByZXR1cm5lZCBudWxsXCIgfTtcbiAgICBZKFwiU3RyaXBlIFBSIGZsb3cgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5LiBDYW4gbWFrZSBwYXltZW50XCIsIGwpO1xuICAgIGNvbnN0IHUgPSAoZCwgZikgPT4gRi5zdHJpcGVQUi5ydW4oe1xuICAgICAgY29udGV4dDogZSxcbiAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogY2UoZS5jaGVja291dFBheW1lbnRNZXRob2RzLCBkKSxcbiAgICAgIG5vbkNkZUZvcm1JbnB1dHM6IFUoZS5mb3JtRGl2KSxcbiAgICAgIGZvcm1DYWxsYmFja3M6IHQsXG4gICAgICBjdXN0b21QYXJhbXM6IHsgcHJvdmlkZXI6IGQsIG92ZXJyaWRlUGF5bWVudFJlcXVlc3Q6IGY/Lm92ZXJyaWRlUGF5bWVudFJlcXVlc3QgfSxcbiAgICAgIGluaXRSZXN1bHQ6IHtcbiAgICAgICAgcHJvY2Vzc29yOiBPLkVudW0uc3RyaXBlLFxuICAgICAgICBwcjogYyxcbiAgICAgICAgaXNBdmFpbGFibGU6ICEwLFxuICAgICAgICBhdmFpbGFibGVQcm92aWRlcnM6IHsgYXBwbGVQYXk6IGwuYXBwbGVQYXksIGdvb2dsZVBheTogbC5nb29nbGVQYXkgfSxcbiAgICAgICAgc3RhcnRGbG93OiB1XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb2Nlc3NvcjogTy5FbnVtLnN0cmlwZSxcbiAgICAgIGlzQXZhaWxhYmxlOiAhMCxcbiAgICAgIHByOiBjLFxuICAgICAgYXZhaWxhYmxlUHJvdmlkZXJzOiB7XG4gICAgICAgIGFwcGxlUGF5OiBsLmFwcGxlUGF5LFxuICAgICAgICBnb29nbGVQYXk6IGwuZ29vZ2xlUGF5XG4gICAgICB9LFxuICAgICAgc3RhcnRGbG93OiB1XG4gICAgfTtcbiAgfVxuKSwgVGwgPSB6KFxuICBhc3luYyAoe1xuICAgIGNvbnRleHQ6IGUsXG4gICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiB0LFxuICAgIG5vbkNkZUZvcm1JbnB1dHM6IHIsXG4gICAgZm9ybUNhbGxiYWNrczogbixcbiAgICBjdXN0b21QYXJhbXM6IG8sXG4gICAgaW5pdFJlc3VsdDogaVxuICB9KSA9PiB7XG4gICAgaWYgKFkoXCJSdW5uaW5nIFN0cmlwZSBQUiBmbG93Li4uXCIpLCBvLnByb3ZpZGVyICE9PSB0LnByb3ZpZGVyKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm92aWRlciBtaXNtYXRjaC4gRXhwZWN0ZWQgJHtvLnByb3ZpZGVyfSwgZ290ICR7dC5wcm92aWRlcn1gKTtcbiAgICBjb25zdCBzID0gZS5hbnlDZGVDb25uZWN0aW9uLCBjID0gaS5wcjtcbiAgICBpZiAobz8ub3ZlcnJpZGVQYXltZW50UmVxdWVzdCkge1xuICAgICAgY29uc3QgeSA9IG8ub3ZlcnJpZGVQYXltZW50UmVxdWVzdDtcbiAgICAgIFkoXCJPdmVycmlkaW5nIFBSIGFtb3VudCB3aXRoXCIsIHkpO1xuICAgICAgY29uc3QgaCA9IHR5cGVvZiB5LmFwcGxlUGF5UGF5bWVudFJlcXVlc3QgPT0gXCJmdW5jdGlvblwiID8geS5hcHBsZVBheVBheW1lbnRSZXF1ZXN0KHt9KSA6IHkuYXBwbGVQYXlQYXltZW50UmVxdWVzdDtcbiAgICAgIEZsKGMsIHkuYW1vdW50LCB5LnBlbmRpbmcsIGgsIHkubGFiZWwpO1xuICAgIH1cbiAgICBZKFwiU2hvd2luZyBQUiBkaWFsb2cuLi5cIiksIGMuc2hvdygpO1xuICAgIGNvbnN0IGwgPSBhd2FpdCBEaShjKTtcbiAgICBZKFwiU3RyaXBlIFBNIGFkZGVkIGV2ZW50OlwiLCBsKSwgWShcIk1lcmdpbmcgUE0gZmllbGRzIHdpdGggZm9ybSBmaWVsZHMuLi5cIik7XG4gICAgY29uc3QgdSA9IE5sKHIsIGwpLCBkID0gVih1LCBuLmdldC5vblZhbGlkYXRpb25FcnJvcik7XG4gICAgZyhcImJpbGxpbmdfZGV0YWlsc19yZWNlaXZlZFwiLCB7XG4gICAgICAuLi5kXG4gICAgfSksIFkoXCJQUiBkaWFsb2cgZmluaXNoZWQuIFN0YXJ0aW5nIHBheW1lbnQgZmxvdy4uLlwiLCBkKTtcbiAgICBjb25zdCBmID0gYXdhaXQgQ3Mocywge1xuICAgICAgZmllbGRzOiBkLFxuICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiB0XG4gICAgfSksIF8gPSBMbChmKTtcbiAgICBZKFwiQ29uZmlybWluZyBQUiB3aXRoIFN0cmlwZS4uLlwiKSwgYXdhaXQgT2koXywgbCk7XG4gICAgY29uc3QgbSA9IGF3YWl0IE0ocyk7XG4gICAgaWYgKG0ubW9kZSA9PT0gXCJzZXR1cFwiKSB7XG4gICAgICBZKFwiQ29uZmlybWluZyBwYXltZW50IGZsb3cgZm9yIHNldHVwLi4uXCIpO1xuICAgICAgY29uc3QgeSA9IGF3YWl0IEQocywge1xuICAgICAgICBzZWN1cmVfdG9rZW46IG0udG9rZW5cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgbW9kZTogXCJzZXR1cFwiLCByZXN1bHQ6IGF0KHkpIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIFkoXCJQZXJmb3JtaW5nIGNoZWNrb3V0Li4uXCIpO1xuICAgICAgY29uc3QgeSA9IHtcbiAgICAgICAgc2VjdXJlX3Rva2VuOiBtLnRva2VuLFxuICAgICAgICBwYXltZW50X2lucHV0OiB7XG4gICAgICAgICAgcHJvdmlkZXJfdHlwZTogdC5wcm92aWRlclxuICAgICAgICB9LFxuICAgICAgICBjdXN0b21lcl9maXJzdF9uYW1lOiBkW3AuRklSU1RfTkFNRV0sXG4gICAgICAgIGN1c3RvbWVyX2xhc3RfbmFtZTogZFtwLkxBU1RfTkFNRV0sXG4gICAgICAgIGN1c3RvbWVyX2VtYWlsOiBkW3AuRU1BSUxdLFxuICAgICAgICBjdXN0b21lcl9hZGRyZXNzOiBvdChkKSxcbiAgICAgICAgY3VzdG9tZXJfc2hpcHBpbmdfYWRkcmVzczogVHQoZCwgbS5jaGVja291dF9zZXR0aW5ncyksXG4gICAgICAgIHByb21vdGlvbl9jb2RlOiBkW3AuUFJPTU9USU9OX0NPREVdLFxuICAgICAgICBsaW5lX2l0ZW1zOiBtLmxpbmVfaXRlbXMsXG4gICAgICAgIHRvdGFsX2Ftb3VudF9hdG9tOiBtLmFtb3VudF90b3RhbF9hdG9tLFxuICAgICAgICBjYW5jZWxfYXRfZW5kOiAhMSxcbiAgICAgICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IHRcbiAgICAgIH07XG4gICAgICByZXR1cm4geyBtb2RlOiBcImNoZWNrb3V0XCIsIHJlc3VsdDogYXdhaXQgb3IocywgeSkgfTtcbiAgICB9XG4gIH1cbiksIE5sID0gKGUsIHQpID0+IHtcbiAgY29uc3QgciA9IHsgLi4uZSB9LCBbbiwgLi4ub10gPSB0LnBheWVyTmFtZT8udHJpbSgpPy5zcGxpdCgvXFxzKy8pID8/IFtdLCBpID0gby5qb2luKFwiIFwiKSB8fCB2b2lkIDAsIHMgPSB0LnBheW1lbnRNZXRob2Q/LmJpbGxpbmdfZGV0YWlscz8uYWRkcmVzcywgYyA9IHQuc2hpcHBpbmdBZGRyZXNzO1xuICByW3AuRU1BSUxdID0gcltwLkVNQUlMXSB8fCB0LnBheWVyRW1haWwgfHwgXCJvcF91bmZpbGxlZEBnZXRvcGVucGF5LmNvbVwiLCByW3AuWklQX0NPREVdID0gcltwLlpJUF9DT0RFXSB8fCBzPy5wb3N0YWxfY29kZSB8fCBjPy5wb3N0YWxDb2RlIHx8IFwiMDAwMDBcIiwgcltwLkNPVU5UUlldID0gcltwLkNPVU5UUlldIHx8IHM/LmNvdW50cnkgfHwgYz8uY291bnRyeSB8fCBcIlVTXCI7XG4gIGNvbnN0IGwgPSByW3AuRklSU1RfTkFNRV0gfHwgbiB8fCBcIlwiLCB1ID0gcltwLkxBU1RfTkFNRV0gfHwgaSB8fCBcIlwiO1xuICByZXR1cm4gbCB8fCB1ID8gKHJbcC5GSVJTVF9OQU1FXSA9IGwsIHJbcC5MQVNUX05BTUVdID0gdSkgOiAocltwLkZJUlNUX05BTUVdID0gXCJfT1BfVU5LTk9XTlwiLCByW3AuTEFTVF9OQU1FXSA9IFwiXCIpLCBZKFwiRmluYWwgZm9ybSBpbnB1dHM6XCIsIHIpLCByO1xufSwgRmwgPSAoZSwgdCwgciwgbiwgbykgPT4ge1xuICBlLnVwZGF0ZSh7XG4gICAgdG90YWw6IHQgPyB7XG4gICAgICBhbW91bnQ6IHQuYW1vdW50QXRvbSxcbiAgICAgIGxhYmVsOiBvID8/IFwiVG90YWxcIixcbiAgICAgIHBlbmRpbmc6IHJcbiAgICB9IDogdm9pZCAwLFxuICAgIGN1cnJlbmN5OiB0Py5jdXJyZW5jeSxcbiAgICAvLyBTdHJpcGUncyBhcHBsZVBheSBvcHRpb24gb25seSBzdXBwb3J0cyAncmVjdXJyaW5nUGF5bWVudFJlcXVlc3QnIHwgJ2RlZmVycmVkUGF5bWVudFJlcXVlc3QnIHwgJ2F1dG9tYXRpY1JlbG9hZFBheW1lbnRSZXF1ZXN0JyBvZiBuYXRpdmUgQXBwbGVQYXkgcGF5bWVudCByZXF1ZXN0XG4gICAgLy8gV2UncmUgYWNjZXB0aW5nIG5hdGl2ZSBQYXltZW50IFJlcXVlc3QgaGVyZSBmb3IgbW9yZSBjb21tb24gdHlwaW5nLlxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBzdHJpcGUgZG8gbm90IGV4cGVjdCBhZGRpdGlvbmFsIGZpZWxkc1xuICAgIGFwcGxlUGF5OiBuXG4gIH0pO1xufSwgTGwgPSAoZSkgPT4ge1xuICBpZiAoZS5yZXF1aXJlZF91c2VyX2FjdGlvbnMubGVuZ3RoICE9PSAxKVxuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igb2NjdXJyZWQuXG5EZXRhaWxzOiBnb3QgJHtlLnJlcXVpcmVkX3VzZXJfYWN0aW9ucy5sZW5ndGh9IHJlcXVpcmVkIHVzZXIgYWN0aW9uc2ApO1xuICByZXR1cm4gRmkucGFyc2UoZS5yZXF1aXJlZF91c2VyX2FjdGlvbnNbMF0pO1xufSwgY2UgPSAoZSwgdCwgcikgPT4ge1xuICBjb25zdCBuID0gZS5maWx0ZXIoKG8pID0+IHtcbiAgICBjb25zdCBpID0gciA9PT0gdm9pZCAwID8gdHJ1ZSA6IG8ucHJvY2Vzc29yX25hbWUgPT09IHIsIHMgPSBvLnByb3ZpZGVyID09PSB0O1xuICAgIHJldHVybiBpICYmIHM7XG4gIH0pO1xuICBpZiAobi5sZW5ndGggPT09IDApXG4gICAgdGhyb3cgY29uc29sZS53YXJuKFwiQ1BNcyBsaXN0XCIsIGUpLCBuZXcgRXJyb3IoYE5vIENQTXMgZm91bmQgd2l0aCBwcm92aWRlciAnJHt0fScgYW5kIHByb2Nlc3NvciAnJHtyfSdgKTtcbiAgcmV0dXJuIG4ubGVuZ3RoICE9PSAxICYmIChjb25zb2xlLndhcm4oXCJDUE1zIGxpc3RcIiwgZSksIGNvbnNvbGUud2FybihgTW9yZSB0aGFuIG9uZSBDUE0gZm91bmQgd2l0aCBwcm92aWRlciAnJHt0fScgYW5kIHByb2Nlc3NvciAnJHtyfSdgKSwgZyhcIm1vcmVfdGhhbl9vbmVfY3BtX2ZvdW5kXCIsIHtcbiAgICBwcm92aWRlcjogdCxcbiAgICBwcm9jZXNzb3I6IHIsXG4gICAgY3BtczogZVxuICB9KSksIG5bMF07XG59LCBGID0ge1xuICAvLyDinIsgTm90ZTogRm9yIGZsb3dzIHRoYXQgcmVxdWlyZSBpbml0aWFsaXphdGlvbiwgcGxlYXNlIGFkZCB0aGVtIHRvIGBpbml0LWZsb3dzLnRzYFxuICAvLyBDb21tb25cbiAgY29tbW9uQ0M6IHtcbiAgICBpbml0OiBhc3luYyAoKSA9PiB7XG4gICAgfSxcbiAgICBydW46IGxsXG4gIH0sXG4gIC8vIFN0cmlwZVxuICBzdHJpcGVQUjoge1xuICAgIGluaXQ6IFJsLFxuICAgIHJ1bjogVGxcbiAgfSxcbiAgc3RyaXBlTGluazoge1xuICAgIGluaXQ6IEVsLFxuICAgIHJ1bjogQ2xcbiAgfSxcbiAgLy8gUG9ja3l0XG4gIHBvY2t5dFBheXBhbDoge1xuICAgIGluaXQ6IHdsLFxuICAgIHJ1bjogdmxcbiAgfSxcbiAgLy8gUGF5UGFsXG4gIHBheXBhbDoge1xuICAgIGluaXQ6IGhsLFxuICAgIHJ1bjogZ2xcbiAgfSxcbiAgLy8gQWlyd2FsbGV4XG4gIGFpcndhbGxleEdvb2dsZVBheToge1xuICAgIGluaXQ6IE1jLFxuICAgIHJ1bjogeGNcbiAgfSxcbiAgYWlyd2FsbGV4QXBwbGVQYXk6IHtcbiAgICBpbml0OiBGYyxcbiAgICBydW46IExjXG4gIH0sXG4gIGFpcndhbGxleEFDSDoge1xuICAgIGluaXQ6IGFzeW5jICgpID0+IHtcbiAgICB9LFxuICAgIHJ1bjogSWNcbiAgfSxcbiAgYWlyd2FsbGV4RUZUOiB7XG4gICAgaW5pdDogYXN5bmMgKCkgPT4ge1xuICAgIH0sXG4gICAgcnVuOiBuY1xuICB9LFxuICBhaXJ3YWxsZXhCQUNTOiB7XG4gICAgaW5pdDogYXN5bmMgKCkgPT4ge1xuICAgIH0sXG4gICAgcnVuOiB0Y1xuICB9LFxuICBhaXJ3YWxsZXhTRVBBOiB7XG4gICAgaW5pdDogYXN5bmMgKCkgPT4ge1xuICAgIH0sXG4gICAgcnVuOiBhY1xuICB9LFxuICAvLyBMb29wXG4gIGxvb3BDcnlwdG86IHtcbiAgICBpbml0OiBfbCxcbiAgICBydW46IGZsXG4gIH0sXG4gIGF1dGhvcml6ZU5ldEFwcGxlUGF5OiB7XG4gICAgaW5pdDogVWMsXG4gICAgcnVuOiBqY1xuICB9LFxuICBhdXRob3JpemVOZXRHb29nbGVQYXk6IHtcbiAgICBpbml0OiAkYyxcbiAgICBydW46IEdjXG4gIH0sXG4gIGFkeWVuR29vZ2xlUGF5OiB7XG4gICAgaW5pdDogU2MsXG4gICAgcnVuOiBrY1xuICB9LFxuICBhZHllbkFwcGxlUGF5OiB7XG4gICAgaW5pdDogRWMsXG4gICAgcnVuOiBDY1xuICB9XG4gIC8vIPCfkYkgQWRkIG1vcmUgZmxvd3MgaGVyZVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxufSwgeyBsb2dfXzogTWwsIGVycl9fOiB4bCB9ID0gSShcImluaXQtZmxvd3NcIiksIGVlID0gKGUsIHQpID0+IHtcbiAgY29uc3QgciA9IG5ldyBXZSgpO1xuICByZXR1cm4ge1xuICAgIHB1Ymxpc2hlcjogcixcbiAgICBpbml0aWFsaXplOiBhc3luYyAobikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHIuY3VycmVudC5pc1N1Y2Nlc3MpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBmbG93IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuXCIpO1xuICAgICAgICBjb25zdCBvID0gYXdhaXQgdChuKTtcbiAgICAgICAgTWwoYOKclCAke2V9IGZsb3cgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5LiBSZXN1bHQ6YCwgbyksIHIuc2V0KG8pO1xuICAgICAgfSBjYXRjaCAobykge1xuICAgICAgICB4bChg8J2ZrSAke2V9IGZsb3cgaW5pdGlhbGl6YXRpb24gZmFpbGVkLiBFcnJvcjpgLCBLKG8pLCBcIkRldGFpbHM6XCIsIG8pLCByLnRocm93KG8sIEsobykpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn0sIERsID0gYXN5bmMgKGUsIHQsIHIpID0+IHtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoT2JqZWN0LnZhbHVlcyhlKS5tYXAoKG4pID0+IG4uaW5pdGlhbGl6ZSh7IGNvbnRleHQ6IHQsIGZvcm1DYWxsYmFja3M6IHIgfSkpKTtcbn0sIE9sID0gKCkgPT4gKHtcbiAgLy8g8J+SoSBBZGQgbmV3IGluaXQgZmxvd3MgaGVyZVxuICAvLyBTdHJpcGUgUFJcbiAgc3RyaXBlUFI6IGVlKFwiU3RyaXBlIFBSXCIsIEYuc3RyaXBlUFIuaW5pdCksXG4gIC8vIFN0cmlwZSBMaW5rXG4gIHN0cmlwZUxpbms6IGVlKFwiU3RyaXBlIExpbmtcIiwgRi5zdHJpcGVMaW5rLmluaXQpLFxuICAvLyBBaXJ3YWxsZXggR29vZ2xlUGF5XG4gIGFpcndhbGxleEdvb2dsZVBheTogZWUoXCJBaXJ3YWxsZXggR29vZ2xlUGF5XCIsIEYuYWlyd2FsbGV4R29vZ2xlUGF5LmluaXQpLFxuICAvLyBBaXJ3YWxsZXggQXBwbGVQYXlcbiAgYWlyd2FsbGV4QXBwbGVQYXk6IGVlKFwiQWlyd2FsbGV4IEFwcGxlUGF5XCIsIEYuYWlyd2FsbGV4QXBwbGVQYXkuaW5pdCksXG4gIC8vIExvb3BcbiAgbG9vcDogZWUoXCJMb29wXCIsIEYubG9vcENyeXB0by5pbml0KSxcbiAgLy8gUGF5UGFsXG4gIHBheXBhbDogZWUoXCJQYXlQYWxcIiwgRi5wYXlwYWwuaW5pdCksXG4gIC8vIFBvY2t5dCBQYXlQYWxcbiAgcG9ja3l0UGF5cGFsOiBlZShcIlBvY2t5dCBQYXlQYWxcIiwgRi5wb2NreXRQYXlwYWwuaW5pdCksXG4gIC8vIEF1dGhuZXQgR29vZ2xlUGF5XG4gIGF1dGhvcml6ZU5ldEdvb2dsZVBheTogZWUoXCJBdXRobmV0IEdvb2dsZVBheVwiLCBGLmF1dGhvcml6ZU5ldEdvb2dsZVBheS5pbml0KSxcbiAgLy8gQXV0aG5ldCBBcHBsZVBheVxuICBhdXRob3JpemVOZXRBcHBsZVBheTogZWUoXCJBdXRobmV0IEFwcGxlUGF5XCIsIEYuYXV0aG9yaXplTmV0QXBwbGVQYXkuaW5pdCksXG4gIC8vIEFkeWVuIEdvb2dsZVBheVxuICBhZHllbkdvb2dsZVBheTogZWUoXCJBZHllbiBHb29nbGVQYXlcIiwgRi5hZHllbkdvb2dsZVBheS5pbml0KSxcbiAgLy8gQWR5ZW4gQXBwbGVQYXlcbiAgYWR5ZW5BcHBsZVBheTogZWUoXCJBZHllbiBBcHBsZVBheVwiLCBGLmFkeWVuQXBwbGVQYXkuaW5pdClcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbn0pLCB7IGVycl9fOiBVbCB9ID0gSShcImZvcm0tY2FsbGJhY2tzXCIpLCB0ZSA9IHokMS5mdW5jdGlvbigpLm9wdGlvbmFsKCksIExyID0geiQxLm9iamVjdCh7XG4gIG9uRm9jdXM6IHRlLFxuICBvbkJsdXI6IHRlLFxuICBvbkNoYW5nZTogdGUsXG4gIG9uTG9hZDogdGUsXG4gIG9uTG9hZEVycm9yOiB0ZSxcbiAgb25WYWxpZGF0aW9uRXJyb3I6IHRlLFxuICBvbkNoZWNrb3V0U3RhcnRlZDogdGUsXG4gIG9uQ2hlY2tvdXRTdWNjZXNzOiB0ZSxcbiAgb25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzOiB0ZSxcbiAgb25DaGVja291dEVycm9yOiB0ZSxcbiAgb25QYXltZW50UmVxdWVzdExvYWQ6IHRlXG59KSwgbGUgPSBjbGFzcyBsZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc2V0Q2FsbGJhY2tzID0gKHQpID0+IHtcbiAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IGxlLmNyZWF0ZUVtcHR5Q2FsbGJhY2tzKCksIE9iamVjdC5lbnRyaWVzKHQpLmZvckVhY2goKFtyLCBuXSkgPT4ge1xuICAgICAgICBjb25zdCBvID0gQ2EociwgbiA/PyBsZS5OT09QLCBVbCk7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrc1tyXSA9IG87XG4gICAgICB9KTtcbiAgICB9LCB0aGlzLl9jYWxsYmFja3MgPSBsZS5jcmVhdGVFbXB0eUNhbGxiYWNrcygpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmVhZC1vbmx5IHZlcnNpb24gb2YgdGhlIGNhbGxiYWNrcyBvYmplY3QuXG4gICAqL1xuICBnZXQgZ2V0KCkge1xuICAgIHJldHVybiB7IC4uLnRoaXMuX2NhbGxiYWNrcyB9O1xuICB9XG59O1xubGUuTk9PUCA9ICgpID0+IHtcbn0sIGxlLmNyZWF0ZUVtcHR5Q2FsbGJhY2tzID0gKCkgPT4ge1xuICBjb25zdCB0ID0ge307XG4gIHJldHVybiBPYmplY3Qua2V5cyhMci5rZXlvZigpLmVudW0pLmZvckVhY2goKHIpID0+IHtcbiAgICB0W3JdID0gbGUuTk9PUDtcbiAgfSksIHQ7XG59LCBsZS5mcm9tT2JqZWN0ID0gKHQpID0+IHtcbiAgY29uc3QgciA9IG5ldyBsZSgpO1xuICByZXR1cm4gci5zZXRDYWxsYmFja3MoTHIucGFyc2UodCkpLCByO1xufTtcbmxldCBXdCA9IGxlO1xuZnVuY3Rpb24gamwoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgZSA9ICQoKSwgdCA9IGU7XG4gICAgaWYgKHQ/Lm5leHQgfHwgdD8uX19ORVhUX0RBVEFfXyB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI19fbmV4dFwiKSlcbiAgICAgIHJldHVybiBcIm5leHRqc1wiO1xuICAgIGlmIChlPy5fX05VWFRfXyB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI19fbnV4dFwiKSlcbiAgICAgIHJldHVybiBcIm51eHRcIjtcbiAgICBpZiAoT2JqZWN0LmtleXMoZG9jdW1lbnQpLmZpbmQoKG8pID0+IG8uaW5jbHVkZXMoXCJyZWFjdFwiKSkgfHwgQXJyYXkuZnJvbShkb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoXCJib2R5ID4gKlwiKSkuZmluZChcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBfcmVhY3RSb290Q29udGFpbmVyIGRvZXNuJ3QgZXhpc3RcbiAgICAgIChvKSA9PiBvLl9yZWFjdFJvb3RDb250YWluZXJcbiAgICApKVxuICAgICAgcmV0dXJuIFwicmVhY3RcIjtcbiAgICBjb25zdCBuID0gZTtcbiAgICByZXR1cm4gbj8uVnVlIHx8IG4/Ll9fVlVFX18gPyBcInZ1ZVwiIDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIltuZy12ZXJzaW9uXVwiKSA/IFwiYW5ndWxhclwiIDogXCJ2YW5pbGxhXCI7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBcInVua25vd25cIjtcbiAgfVxufVxuZnVuY3Rpb24gJGwoZSkge1xuICB0cnkge1xuICAgIHN3aXRjaCAoZSkge1xuICAgICAgY2FzZSBcInJlYWN0XCI6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgY2FzZSBcIm5leHRqc1wiOiB7XG4gICAgICAgIGNvbnN0IHIgPSAkKCk7XG4gICAgICAgIHJldHVybiByPy5uZXh0Py52ZXJzaW9uIHx8IHI/Ll9fTkVYVF9EQVRBX18/LmJ1aWxkSWQgfHwgbnVsbDtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJudXh0XCI6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgY2FzZSBcInZ1ZVwiOlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIGNhc2UgXCJhbmd1bGFyXCI6IHtcbiAgICAgICAgY29uc3QgciA9ICQoKT8uZG9jdW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXCJbbmctdmVyc2lvbl1cIik7XG4gICAgICAgIHJldHVybiByID8gci5nZXRBdHRyaWJ1dGUoXCJuZy12ZXJzaW9uXCIpIDogbnVsbDtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIEdsKCkge1xuICBjb25zdCBlID0gamwoKSwgdCA9ICRsKGUpO1xuICByZXR1cm4geyBmcmFtZXdvcms6IGUsIHZlcnNpb246IHQgfTtcbn1cbmNvbnN0IHNvID0gKCkgPT4ge1xuICBjb25zdCBlID0gd2luZG93ICYmIHdpbmRvdy5zY3JlZW4gPyB3aW5kb3cuc2NyZWVuLmhlaWdodCA6IG51bGwsIHQgPSB3aW5kb3cgJiYgd2luZG93LnNjcmVlbiA/IHdpbmRvdy5zY3JlZW4ud2lkdGggOiBudWxsLCByID0gd2luZG93ICYmIHdpbmRvdy5zY3JlZW4gPyB3aW5kb3cuc2NyZWVuLmNvbG9yRGVwdGggOiBudWxsLCBuID0gd2luZG93ICYmIHdpbmRvdy5uYXZpZ2F0b3IgPyB3aW5kb3cubmF2aWdhdG9yLmphdmFFbmFibGVkKCkgOiBmYWxzZSwgbyA9IHdpbmRvdyAmJiB3aW5kb3cubmF2aWdhdG9yID8gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQgOiBudWxsLCBpID0gXCJ0ZXh0L2h0bWwsYXBwbGljYXRpb24veGh0bWwreG1sLGFwcGxpY2F0aW9uL3htbDtxPTAuOSxpbWFnZS93ZWJwLGltYWdlL2FwbmcsKi8qO3E9MC44XCI7XG4gIGxldCBzID0gbnVsbDtcbiAgd2luZG93ICYmIHdpbmRvdy5uYXZpZ2F0b3IgJiYgKHMgPSB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlID8gd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZSA6IHdpbmRvdy5uYXZpZ2F0b3IuYnJvd3Nlckxhbmd1YWdlKTtcbiAgY29uc3QgYyA9ICgvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgcmV0dXJuIHtcbiAgICBjb2xvcl9kZXB0aDogcixcbiAgICBqYXZhX2VuYWJsZWQ6IG4sXG4gICAgamF2YXNjcmlwdF9lbmFibGVkOiB0cnVlLFxuICAgIGxhbmd1YWdlOiBzLFxuICAgIHNjcmVlbl9oZWlnaHQ6IGUsXG4gICAgc2NyZWVuX3dpZHRoOiB0LFxuICAgIHRpbWVfem9uZV9vZmZzZXQ6IGMsXG4gICAgdXNlcl9hZ2VudDogbyxcbiAgICBhY2NlcHRfaGVhZGVyOiBpXG4gIH07XG59O1xudmFyIFQgPSAvKiBAX19QVVJFX18gKi8gKChlKSA9PiAoZS5jYXJkID0gXCJjYXJkXCIsIGUucG9ja3l0UGF5cGFsID0gXCJwb2NreXQtcGF5cGFsXCIsIGUuYXBwbGVQYXkgPSBcImFwcGxlLXBheVwiLCBlLmdvb2dsZVBheSA9IFwiZ29vZ2xlLXBheVwiLCBlLmxvb3BDcnlwdG8gPSBcImxvb3AtY3J5cHRvXCIsIGUucGF5cGFsID0gXCJwYXlwYWxcIiwgZS5zdHJpcGVMaW5rID0gXCJzdHJpcGUtbGlua1wiLCBlLmFpcndhbGxleEdvb2dsZVBheSA9IFwiYWlyd2FsbGV4LWdvb2dsZS1wYXlcIiwgZS5haXJ3YWxsZXhBcHBsZVBheSA9IFwiYWlyd2FsbGV4LWFwcGxlLXBheVwiLCBlLmF1dGhvcml6ZW5ldEdvb2dsZVBheSA9IFwiYXV0aG9yaXplbmV0LWdvb2dsZS1wYXlcIiwgZS5hdXRob3JpemVuZXRBcHBsZVBheSA9IFwiYXV0aG9yaXplbmV0LWFwcGxlLXBheVwiLCBlLmFkeWVuR29vZ2xlUGF5ID0gXCJhZHllbi1nb29nbGUtcGF5XCIsIGUuYWR5ZW5BcHBsZVBheSA9IFwiYWR5ZW4tYXBwbGUtcGF5XCIsIGUuYWlyd2FsbGV4QUNIID0gXCJhaXJ3YWxsZXgtYWNoXCIsIGUuYWlyd2FsbGV4RUZUID0gXCJhaXJ3YWxsZXgtZWZ0XCIsIGUuYWlyd2FsbGV4QkFDUyA9IFwiYWlyd2FsbGV4LWJhY3NcIiwgZS5haXJ3YWxsZXhTRVBBID0gXCJhaXJ3YWxsZXgtc2VwYVwiLCBlKSkoVCB8fCB7fSk7XG56JDEubmF0aXZlRW51bShUKTtcbnZhciBQZSA9IC8qIEBfX1BVUkVfXyAqLyAoKGUpID0+IChlLkFDSCA9IFwiYWNoXCIsIGUuRUZUID0gXCJlZnRcIiwgZS5CQUNTID0gXCJiYWNzXCIsIGUuU0VQQSA9IFwic2VwYVwiLCBlLkFQUExFX1BBWSA9IFwiYXBwbGVfcGF5XCIsIGUuQ1JFRElUX0NBUkQgPSBcImNyZWRpdF9jYXJkXCIsIGUuR09PR0xFX1BBWSA9IFwiZ29vZ2xlX3BheVwiLCBlLlNUUklQRV9MSU5LID0gXCJzdHJpcGVfbGlua1wiLCBlLkNSWVBUTyA9IFwiY3J5cHRvXCIsIGUuUEFZUEFMID0gXCJwYXlwYWxcIiwgZSkpKFBlIHx8IHt9KTtcbmNvbnN0IE1yID0gKGUpID0+IHtcbiAgY29uc3QgdCA9IFtlLmFpcndhbGxleEFwcGxlUGF5LCBlLmF1dGhvcml6ZU5ldEFwcGxlUGF5LCBlLmFkeWVuQXBwbGVQYXldLCByID0gW107XG4gIHQuZm9yRWFjaCgobykgPT4ge1xuICAgIGNvbnN0IGkgPSBvLnB1Ymxpc2hlci5nZXRWYWx1ZUlmTG9hZGVkRWxzZShudWxsKTtcbiAgICBpPy5pc0F2YWlsYWJsZSAmJiByLnB1c2goaSk7XG4gIH0pO1xuICBjb25zdCBuID0gZS5zdHJpcGVQUi5wdWJsaXNoZXIuZ2V0VmFsdWVJZkxvYWRlZEVsc2UobnVsbCk7XG4gIHJldHVybiBuPy5pc0F2YWlsYWJsZSAmJiBuLmF2YWlsYWJsZVByb3ZpZGVycy5hcHBsZVBheSAmJiByLnB1c2goe1xuICAgIGlzQXZhaWxhYmxlOiB0cnVlLFxuICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgcHJvY2Vzc29yOiBPLkVudW0uc3RyaXBlLFxuICAgIHN0YXJ0RmxvdzogKGkpID0+IG4uc3RhcnRGbG93KFwiYXBwbGVfcGF5XCIsIHtcbiAgICAgIG92ZXJyaWRlUGF5bWVudFJlcXVlc3Q6IGk/Lm92ZXJyaWRlUGF5bWVudFJlcXVlc3RcbiAgICB9KVxuICB9KSwge1xuICAgIHByb2Nlc3NvcnM6IHIubWFwKChvKSA9PiBvLnByb2Nlc3NvciksXG4gICAgaXNBdmFpbGFibGU6IHIubGVuZ3RoID4gMCxcbiAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgIHN0YXJ0RmxvdzogKG8pID0+IFZsKHIsIG8pXG4gIH07XG59LCB4ciA9IChlKSA9PiB7XG4gIGNvbnN0IHQgPSBbZS5haXJ3YWxsZXhHb29nbGVQYXksIGUuYXV0aG9yaXplTmV0R29vZ2xlUGF5LCBlLmFkeWVuR29vZ2xlUGF5XSwgciA9IFtdO1xuICB0LmZvckVhY2goKG8pID0+IHtcbiAgICBjb25zdCBpID0gby5wdWJsaXNoZXIuZ2V0VmFsdWVJZkxvYWRlZEVsc2UobnVsbCk7XG4gICAgaT8uaXNBdmFpbGFibGUgJiYgci5wdXNoKGkpO1xuICB9KTtcbiAgY29uc3QgbiA9IGUuc3RyaXBlUFIucHVibGlzaGVyLmdldFZhbHVlSWZMb2FkZWRFbHNlKG51bGwpO1xuICByZXR1cm4gbj8uaXNBdmFpbGFibGUgJiYgbi5hdmFpbGFibGVQcm92aWRlcnMuZ29vZ2xlUGF5ICYmIHIucHVzaCh7XG4gICAgaXNBdmFpbGFibGU6IHRydWUsXG4gICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICBwcm9jZXNzb3I6IE8uRW51bS5zdHJpcGUsXG4gICAgc3RhcnRGbG93OiAoaSkgPT4gbi5zdGFydEZsb3coXCJnb29nbGVfcGF5XCIsIHtcbiAgICAgIG92ZXJyaWRlUGF5bWVudFJlcXVlc3Q6IGk/Lm92ZXJyaWRlUGF5bWVudFJlcXVlc3RcbiAgICB9KVxuICB9KSwge1xuICAgIHByb2Nlc3NvcnM6IHIubWFwKChvKSA9PiBvLnByb2Nlc3NvciksXG4gICAgaXNBdmFpbGFibGU6IHIubGVuZ3RoID4gMCxcbiAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgIHN0YXJ0RmxvdzogKG8pID0+IHFsKHIsIG8pXG4gIH07XG59LCBWbCA9IChlLCB0KSA9PiB7XG4gIGlmICh0Py5wcm9jZXNzb3IpIHtcbiAgICBjb25zdCBuID0gZS5maW5kKChvKSA9PiBvLnByb2Nlc3NvciA9PT0gdC5wcm9jZXNzb3IpO1xuICAgIGlmIChuPy5pc0F2YWlsYWJsZSlcbiAgICAgIHJldHVybiBuLnN0YXJ0Rmxvdyh0KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNwZWNpZmllZCBBcHBsZSBQYXkgcHJvY2Vzc29yICR7dC5wcm9jZXNzb3J9IGlzIG5vdCBhdmFpbGFibGVgKTtcbiAgfVxuICBjb25zdCByID0gZS5maW5kKChuKSA9PiBuLmlzQXZhaWxhYmxlKTtcbiAgaWYgKHIpXG4gICAgcmV0dXJuIHIuc3RhcnRGbG93KHQpO1xuICB0aHJvdyBuZXcgRXJyb3IoXCJObyBhdmFpbGFibGUgQXBwbGUgUGF5IHByb2Nlc3NvciBmb3VuZFwiKTtcbn0sIHFsID0gKGUsIHQpID0+IHtcbiAgaWYgKHQ/LnByb2Nlc3Nvcikge1xuICAgIGNvbnN0IG4gPSBlLmZpbmQoKG8pID0+IG8ucHJvY2Vzc29yID09PSB0LnByb2Nlc3Nvcik7XG4gICAgaWYgKG4/LmlzQXZhaWxhYmxlKVxuICAgICAgcmV0dXJuIG4uc3RhcnRGbG93KHQpO1xuICAgIHRocm93IG5ldyBFcnJvcihgU3BlY2lmaWVkIEdvb2dsZSBQYXkgcHJvY2Vzc29yICR7dC5wcm9jZXNzb3J9IGlzIG5vdCBhdmFpbGFibGVgKTtcbiAgfVxuICBjb25zdCByID0gZS5maW5kKChuKSA9PiBuLmlzQXZhaWxhYmxlKTtcbiAgaWYgKHIpXG4gICAgcmV0dXJuIHIuc3RhcnRGbG93KHQpO1xuICB0aHJvdyBuZXcgRXJyb3IoXCJObyBhdmFpbGFibGUgR29vZ2xlIFBheSBwcm9jZXNzb3IgZm91bmRcIik7XG59LCB6bCA9IChlKSA9PiBKU09OLnN0cmluZ2lmeShlKSwgeyBsb2dfXzogR3QsIGVycl9fOiBCbCB9ID0gSShcInRyYWNlclwiKSwgSGwgPSAoZSwgdCkgPT4ge1xuICB0cnkge1xuICAgIFlsKGUsIHQpO1xuICB9IGNhdGNoIChyKSB7XG4gICAgQmwoYEVycm9yIGluaXRpYWxpemluZyB0cmFjZXI6ICR7cn1gKTtcbiAgfVxufTtcbmxldCBEcjtcbmNvbnN0IFlsID0gYXN5bmMgKGUsIHQpID0+IHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPiBcInVcIilcbiAgICByZXR1cm47XG4gIGNvbnN0IHIgPSBhd2FpdCBpbXBvcnQoJy4vaW5kZXgtQ0Q1WnpKMEUtIX57MDA2fX4uanMnKSwgeyBDb25zb2xlU3BhbkV4cG9ydGVyOiBuLCBTaW1wbGVTcGFuUHJvY2Vzc29yOiBvLCBXZWJUcmFjZXJQcm92aWRlcjogaSB9ID0gciwgcyA9IGF3YWl0IGltcG9ydCgnLi9pbmRleC1CWHlvVGJyUy0hfnswMDl9fi5qcycpLCB7IEZldGNoSW5zdHJ1bWVudGF0aW9uOiBjIH0gPSBzLCBsID0gYXdhaXQgaW1wb3J0KCcuL2luZGV4LTFzR2VGLVM4LSF+ezAwZH1+LmpzJyksIHsgWm9uZUNvbnRleHRNYW5hZ2VyOiB1IH0gPSBsLCBkID0gYXdhaXQgaW1wb3J0KCcuL2luZGV4LTkyNUJKNkpvLSF+ezAwZX1+LmpzJyksIHsgcmVnaXN0ZXJJbnN0cnVtZW50YXRpb25zOiBmIH0gPSBkLCBfID0gYXdhaXQgaW1wb3J0KCcuL2luZGV4LUJFOW1fSDM4LSF+ezAwMX1+LmpzJyksIHsgUmVzb3VyY2U6IG0gfSA9IF8sIHkgPSBhd2FpdCBpbXBvcnQoJy4vZGV0ZWN0LXJlc291cmNlcy1DaGhYREF4cS0hfnswMGd9fi5qcycpLnRoZW4oKGxvKSA9PiBsby5kKSwgeyBkZXRlY3RSZXNvdXJjZXNTeW5jOiBoIH0gPSB5LCB3ID0gYXdhaXQgaW1wb3J0KCcuL2luZGV4LUNmbUkzbVNzLSF+ezAwa31+LmpzJyksIHsgT1RMUFRyYWNlRXhwb3J0ZXI6IEUgfSA9IHcsIHYgPSBhd2FpdCBpbXBvcnQoJy4vaW5kZXgtREhLeVpQZTUtIX57MDBtfX4uanMnKSwgeyBCM1Byb3BhZ2F0b3I6IEMsIEIzSW5qZWN0RW5jb2Rpbmc6IFMgfSA9IHYsIFIgPSBhd2FpdCBpbXBvcnQoJy4vaW5kZXgtQzNONWp0a1EtIX57MDAzfX4uanMnKSwgeyBCYXRjaFNwYW5Qcm9jZXNzb3I6IGsgfSA9IFI7XG4gIEd0KGBJbml0aWFsaXppbmcgdHJhY2VyIHdpdGggdmVyc2lvbiAke2V9IGFuZCBiYXNlVXJsICR7dH1gKTtcbiAgY29uc3QgeWUgPSBXbCh0KTtcbiAgR3QoYFVzaW5nIGNvbGxlY3RvciBVUkwgJHt5ZX1gKTtcbiAgY29uc3QgTXQgPSBuZXcgRSh7IHVybDogeWUgfSksIGNvID0ge1xuICAgIFwic2VydmljZS52ZXJzaW9uXCI6IGUsXG4gICAgXCJzZXJ2aWNlLm5hbWVcIjogXCJvanNcIlxuICB9O1xuICByZXR1cm4gbmV3IGkoe1xuICAgIHJlc291cmNlOiBuZXcgbShjbykubWVyZ2UoaCgpKSxcbiAgICBzcGFuUHJvY2Vzc29yczogW1xuICAgICAgbmV3IG8obmV3IG4oKSksXG4gICAgICBuZXcgayhNdCwge1xuICAgICAgICBzY2hlZHVsZWREZWxheU1pbGxpczogNTAwXG4gICAgICB9KVxuICAgIF1cbiAgfSkucmVnaXN0ZXIoe1xuICAgIGNvbnRleHRNYW5hZ2VyOiBuZXcgdSgpLFxuICAgIHByb3BhZ2F0b3I6IG5ldyBDKHsgaW5qZWN0RW5jb2Rpbmc6IFMuTVVMVElfSEVBREVSIH0pXG4gIH0pLCBmKHtcbiAgICBpbnN0cnVtZW50YXRpb25zOiBbXG4gICAgICBuZXcgYyh7XG4gICAgICAgIHByb3BhZ2F0ZVRyYWNlSGVhZGVyQ29yc1VybHM6IFsvLiovXSxcbiAgICAgICAgLy8gUHJvcGFnYXRlIHRvIGFsbCBVUkxzXG4gICAgICAgIC8vIEV4Y2x1ZGUgQWR5ZW4gVVJMcyAtIHRoZXkgZG8gbm90IGFsbG93IE9QVElPTlMgcmVxdWVzdHNcbiAgICAgICAgLy8gQWxzbyBleGNsdWRlIGxvb3BjcnlwdG8ueHl6XG4gICAgICAgIGlnbm9yZVVybHM6IFsvXmh0dHBzOlxcL1xcLyguKlxcLik/YWR5ZW5cXC5jb20vLCAvXmh0dHBzOlxcL1xcLyguKlxcLik/bG9vcGNyeXB0b1xcLnh5ei9dXG4gICAgICB9KVxuICAgIF1cbiAgfSksIERyID0gTWUuZ2V0VHJhY2VyKFwib3BlbnBheS1qc1wiKSwgR3QoXCJUcmFjZXIgaW5pdGlhbGl6ZWRcIiksIERyO1xufSwgV2wgPSAoZSkgPT4ge1xuICBjb25zdCB0ID0gbmV3IFVSTChlKS5ob3N0bmFtZTtcbiAgcmV0dXJuIHQgPT09IFwiY2RlLm9wZW5wYXlzdGFnaW5nLmNvbVwiID8gXCJodHRwczovL290ZWwub3BlbnBheXNhbmRib3guY29tL3YxL3RyYWNlc1wiIDogdCA9PT0gXCJjZGUuZ2V0b3BlbnBheS5jb21cIiA/IFwiaHR0cHM6Ly9vdGVsLmdldG9wZW5wYXkuY29tL3YxL3RyYWNlc1wiIDogXCJodHRwOi8vbG9jYWxob3N0OjQzMTkvdjEvdHJhY2VzXCI7XG59O1xuY2xhc3MgSmwge1xuICBjb25zdHJ1Y3Rvcih0LCByLCBuLCBvKSB7XG4gICAgdGhpcy5oYW5kbGVNZXNzYWdlID0gKGkpID0+IHtcbiAgICAgIGlmICghaS5zb3VyY2UpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiW09KU10gTm8gc291cmNlIGZvdW5kXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoT3IoaS5vcmlnaW4pICE9PSBPcih0aGlzLmJhc2VVcmwpIHx8IHR5cGVvZiBpLmRhdGEgPT0gXCJvYmplY3RcIiAmJiBpLmRhdGEucGVucGFsIHx8IHR5cGVvZiBpLmRhdGEgPT0gXCJvYmplY3RcIiAmJiBpLmRhdGEuc291cmNlICYmIGkuZGF0YS5zb3VyY2UgPT09IFwicmVhY3QtZGV2dG9vbHMtYnJpZGdlXCIpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGxldCBzID0gbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHMgPSBxcyhKU09OLnBhcnNlKGkuZGF0YSkpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy52YWxpZGF0ZUV2ZW50KHMpKSByZXR1cm47XG4gICAgICBjb25zdCB7IGVsZW1lbnRJZDogbCwgcGF5bG9hZDogdSB9ID0gcywgZCA9IHUudHlwZTtcbiAgICAgIHN3aXRjaCAoZCkge1xuICAgICAgICBjYXNlIFwiTEFZT1VUXCI6XG4gICAgICAgICAgdGhpcy5pbnRlcm5hbENhbGxiYWNrcy5zZXRGb3JtSGVpZ2h0KHUuaGVpZ2h0ID8gYCR7dS5oZWlnaHR9cHhgIDogXCIxMDAlXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiRk9DVVNcIjpcbiAgICAgICAgICB0aGlzLmZvcm1DYWxsYmFja3MuZ2V0Lm9uRm9jdXMobCwgdS5lbGVtZW50VHlwZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJCTFVSXCI6XG4gICAgICAgICAgdGhpcy5mb3JtQ2FsbGJhY2tzLmdldC5vbkJsdXIobCwgdS5lbGVtZW50VHlwZSwge1xuICAgICAgICAgICAgb2JmdXNjYXRlZFZhbHVlOiB1Lm9iZnVzY2F0ZWRWYWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiQ0hBTkdFXCI6XG4gICAgICAgICAgdGhpcy5mb3JtQ2FsbGJhY2tzLmdldC5vbkNoYW5nZShsLCB1LmVsZW1lbnRUeXBlLCB1LmVycm9ycyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJMT0FERURcIjpcbiAgICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0c1tsXSA9IGkuc291cmNlLCB0aGlzLmludGVybmFsQ2FsbGJhY2tzLm9uQ2RlTG9hZGVkKHUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTE9BRF9FUlJPUlwiOlxuICAgICAgICAgIHRoaXMuaW50ZXJuYWxDYWxsYmFja3Mub25DZGVMb2FkRXJyb3IodS5tZXNzYWdlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlZBTElEQVRJT05fRVJST1JcIjpcbiAgICAgICAgICB0aGlzLmZvcm1DYWxsYmFja3MuZ2V0Lm9uVmFsaWRhdGlvbkVycm9yKHUuZWxlbWVudFR5cGUsIHUuZXJyb3JzLCBsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLndhcm4oXCJbZm9ybV0gVW5oYW5kbGVkIGV2ZW50IHR5cGU6XCIsIGQpO1xuICAgICAgfVxuICAgIH0sIHRoaXMudmFsaWRhdGVFdmVudCA9IChpKSA9PiBpLmZvcm1JZCAhPT0gdGhpcy5mb3JtSWQgfHwgIWkuZWxlbWVudElkID8gKGNvbnNvbGUubG9nKFwiW09KU10gZm9ybUlkXCIsIHRoaXMuZm9ybUlkLCBpLmZvcm1JZCksIGNvbnNvbGUud2FybihcIltmb3JtXSBJZ25vcmluZyB1bmtub3duIGV2ZW50OlwiLCBpKSwgZmFsc2UpIDogdGhpcy5ub25jZXMuaGFzKGkubm9uY2UpID8gKGNvbnNvbGUud2FybihcIltmb3JtXSBJZ25vcmluZyBkdXBsaWNhdGUgZXZlbnQ6XCIsIGkpLCBmYWxzZSkgOiAodGhpcy5ub25jZXMuYWRkKGkubm9uY2UpLCB0cnVlKSwgdGhpcy5ldmVudFRhcmdldHMgPSB7fSwgdGhpcy5ub25jZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLCB0aGlzLmZvcm1JZCA9IHQsIHRoaXMuYmFzZVVybCA9IHIsIHRoaXMuZm9ybUNhbGxiYWNrcyA9IG4sIHRoaXMuaW50ZXJuYWxDYWxsYmFja3MgPSBvO1xuICB9XG59XG5jb25zdCBPciA9IChlKSA9PiBuZXcgVVJMKGUpLm9yaWdpbjtcbmFzeW5jIGZ1bmN0aW9uIFpsKGUsIHQpIHtcbiAgY29uc3QgbiA9IGF3YWl0IGNvbm5lY3RUb0NoaWxkKHtcbiAgICBpZnJhbWU6IGUsXG4gICAgZGVidWc6IGZhbHNlLFxuICAgIGNoaWxkT3JpZ2luOiB0XG4gIH0pLnByb21pc2UsIG8gPSBhd2FpdCBOcyhuKTtcbiAgaWYgKCFGcyhuLCBvKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJHb3QgaW52YWxpZCBDREUgY29ubmVjdGlvbiBvYmplY3RcIik7XG4gIHJldHVybiBuO1xufVxuY2xhc3MgS2wge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgfVxuICBhZGRDb25uZWN0aW9uKHQsIHIpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25zLnNldCh0LCByKTtcbiAgfVxuICBnZXRDb25uZWN0aW9uKCkge1xuICAgIGNvbnN0IHQgPSB0aGlzLmNvbm5lY3Rpb25zLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcbiAgICBpZiAoIXQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb25uZWN0aW9uIG5vdCBmb3VuZFwiKTtcbiAgICByZXR1cm4gdDtcbiAgfVxuICBnZXRBbGxDb25uZWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9ucztcbiAgfVxufVxuY29uc3QgUWwgPSAoZSwgdCwgcikgPT4ge1xuICBjb25zdCB7IHN0cmlwZVBSOiBuIH0gPSBlO1xuICBuLnB1Ymxpc2hlci5zdWJzY3JpYmUoKG8pID0+IHtcbiAgICBpZiAoby5pc1N1Y2Nlc3MpIHtcbiAgICAgIGNvbnN0IGkgPSBvLmxvYWRlZFZhbHVlLCBzID0gaS5pc0F2YWlsYWJsZSAmJiBpLmF2YWlsYWJsZVByb3ZpZGVycy5hcHBsZVBheSwgYyA9IGkuaXNBdmFpbGFibGUgJiYgaS5hdmFpbGFibGVQcm92aWRlcnMuZ29vZ2xlUGF5LCBsID0ge1xuICAgICAgICBhcHBsZV9wYXk6IHtcbiAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGlzQXZhaWxhYmxlOiBzLFxuICAgICAgICAgIHN0YXJ0RmxvdzogYXN5bmMgKHUpID0+IHtcbiAgICAgICAgICAgIHMgJiYgVXIoXCJhcHBsZV9wYXlcIiwgaSwgdCwgciwgdSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnb29nbGVfcGF5OiB7XG4gICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0F2YWlsYWJsZTogYyxcbiAgICAgICAgICBzdGFydEZsb3c6IGFzeW5jICh1KSA9PiB7XG4gICAgICAgICAgICBjICYmIFVyKFwiZ29vZ2xlX3BheVwiLCBpLCB0LCByLCB1KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByLmdldC5vblBheW1lbnRSZXF1ZXN0TG9hZChsKTtcbiAgICB9XG4gIH0pO1xufSwgVXIgPSAoZSwgdCwgciwgbiwgbykgPT4gRi5zdHJpcGVQUi5ydW4oe1xuICBjb250ZXh0OiByLFxuICBjaGVja291dFBheW1lbnRNZXRob2Q6IGNlKHIuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgZSksXG4gIG5vbkNkZUZvcm1JbnB1dHM6IFUoci5mb3JtRGl2KSxcbiAgZm9ybUNhbGxiYWNrczogbixcbiAgY3VzdG9tUGFyYW1zOiB7IHByb3ZpZGVyOiBlLCBvdmVycmlkZVBheW1lbnRSZXF1ZXN0OiBvPy5vdmVycmlkZVBheW1lbnRSZXF1ZXN0IH0sXG4gIGluaXRSZXN1bHQ6IHRcbn0pLCBqciA9IFwiVGhlIHNlY3VyZSBmb3JtIGZhaWxlZCB0byBsb2FkIHByb3Blcmx5LiBQbGVhc2UgY2hlY2sgeW91ciBpbnRlcm5ldCBjb25uZWN0aW9uLCBvciB0cnkgYWdhaW4gbGF0ZXIuXCIsIHsgbG9nX186IHNlLCBlcnJfXzogSiB9ID0gSShcIm9wLWZvcm1cIiksIHVlID0gY2xhc3MgdWUge1xuICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgdGhpcy5pc0Rlc3Ryb3llZCA9IGZhbHNlLCB0aGlzLmNkZUxvYWRFdmVudCA9IG5ldyBXZSgpLCB0aGlzLmFueUNkZUNvbm4gPSBuZXcgV2UoKSwgdGhpcy5jb250ZXh0ID0gbmV3IFdlKCksIHRoaXMuaW5pdEZsb3dzID0gT2woKSwgdGhpcy5pc1N1Ym1pdHRpbmcgPSBmYWxzZSwgdGhpcy5zdGFydEZvcm1Jbml0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbyA9IE1lLmdldFRyYWNlcihcIm9wZW5wYXktanNcIiksIGkgPSBvLnN0YXJ0U3BhbihcImZvcm0uaW5pdGlhbGl6ZVwiLCB7XG4gICAgICAgIGtpbmQ6IGV0LkNMSUVOVCxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgIFwib2pzLmNoZWNrb3V0U2VjdXJlVG9rZW5cIjogdGhpcy5jb25maWcuY2hlY2tvdXRTZWN1cmVUb2tlbixcbiAgICAgICAgICBcIm9qcy5kZXZpY2VUb2tlblwiOiB0aGlzLmRldmljZVRva2VuLFxuICAgICAgICAgIFwib2pzLmZvcm1JZFwiOiB0aGlzLmZvcm1JZCxcbiAgICAgICAgICBcIm9qcy52ZXJzaW9uXCI6IHRoaXMub2pzVmVyc2lvbixcbiAgICAgICAgICBcIm9qcy5yZWxlYXNlX3ZlcnNpb25cIjogdGhpcy5vanNSZWxlYXNlVmVyc2lvbixcbiAgICAgICAgICBcIm9qcy5iYXNlX3VybFwiOiB0aGlzLmJhc2VVcmwsXG4gICAgICAgICAgXCJvanMucmVmZXJyZXJcIjogdGhpcy5yZWZlcnJlclxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBUZS53aXRoKE1lLnNldFNwYW4oVGUuYWN0aXZlKCksIGkpLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcyA9IHRoaXMuY3JlYXRlRWxlbWVudChkZS5DREVfQlJJREdFKTtcbiAgICAgICAgICBzLm5vZGUuaWQgPSBcIl9fb3BfaW50ZXJuYWxfY2RlX2JyaWRnZVwiLCBzLm5vZGUuYXJpYUhpZGRlbiA9IFwidHJ1ZVwiLCBPYmplY3QuYXNzaWduKHMubm9kZS5zdHlsZSwge1xuICAgICAgICAgICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICAgICAgICAgIG1hcmdpbjogXCIwcHhcIixcbiAgICAgICAgICAgIHBhZGRpbmc6IFwiMHB4XCIsXG4gICAgICAgICAgICB3aWR0aDogXCIxcHhcIixcbiAgICAgICAgICAgIGhlaWdodDogXCIxcHhcIixcbiAgICAgICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgICAgICAgICAgdmlzaWJpbGl0eTogXCJoaWRkZW5cIixcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImZpeGVkXCIsXG4gICAgICAgICAgICBwb2ludGVyRXZlbnRzOiBcIm5vbmVcIixcbiAgICAgICAgICAgIHVzZXJTZWxlY3Q6IFwibm9uZVwiXG4gICAgICAgICAgfSksIHMubW91bnQoXCJib2R5XCIpLCBzZShcIkNERSBicmlkZ2UgZWxlbWVudCBtb3VudGVkXCIpLCBzZShcIkluaXRpYWxpemluZyBPcGVuUGF5IGZvcm06XCIpLCBzZShcIuKUnCBXYWl0aW5nIGZvciBDREUgbG9hZCBldmVudC4uLlwiKTtcbiAgICAgICAgICBjb25zdCBjID0gYXdhaXQgdGhpcy5jZGVMb2FkRXZlbnQud2FpdEZvckxvYWQoe1xuICAgICAgICAgICAgdGltZW91dFNlYzogMTIwLFxuICAgICAgICAgICAgdGltZW91dEVyck1zZzoganJcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzZShcIuKUnCBDREUgbG9hZCBldmVudCByZWNlaXZlZFwiKSwgaT8uYWRkRXZlbnQoXCJ3YWl0aW5nX2Zvcl9jZGVfY29ubmVjdGlvblwiKSwgc2UoXCLilJwgV2FpdGluZyBmb3IgQ0RFIGNvbm5lY3Rpb24uLi5cIik7XG4gICAgICAgICAgY29uc3QgbCA9IG8/LnN0YXJ0U3BhbihcImNkZS5jb25uZWN0XCIsIHZvaWQgMCwgVGUuYWN0aXZlKCkpLCB1ID0gYXdhaXQgdGhpcy5hbnlDZGVDb25uLndhaXRGb3JMb2FkKHtcbiAgICAgICAgICAgIHRpbWVvdXRTZWM6IDEyMCxcbiAgICAgICAgICAgIHRpbWVvdXRFcnJNc2c6IGpyXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbD8uZW5kKCksIGk/LmFkZEV2ZW50KFwiY2RlX2Nvbm5lY3RlZFwiKSwgc2UoXCLilJwgQ0RFIGNvbm5lY3Rpb24gcmVjZWl2ZWRcIiksIGF3YWl0IFRzKHUsIHRoaXMuZGV2aWNlVG9rZW4pLCBzZShcIuKUnCBDcmVhdGluZyBPSlMgY29udGV4dCwgc2V0dGluZyB1cCBoYW5kbGVycy4uLlwiKTtcbiAgICAgICAgICBjb25zdCBkID0gdWUuYnVpbGRPanNGbG93Q29udGV4dChcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgICAgICAgYyxcbiAgICAgICAgICAgIHUsXG4gICAgICAgICAgICB0aGlzLmdldEZvcm1EaXYoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jb250ZXh0LnNldChkKSwgUWwodGhpcy5pbml0Rmxvd3MsIGQsIHRoaXMuZm9ybUNhbGxiYWNrcyksIHNlKFwi4pScIFN0YXJ0aW5nIE9KUyBpbml0IGZsb3dzLi4uXCIpLCBhd2FpdCBEbCh0aGlzLmluaXRGbG93cywgZCwgdGhpcy5mb3JtQ2FsbGJhY2tzKSwgdGhpcy5mb3JtQ2FsbGJhY2tzLmdldC5vbkxvYWQoYy50b3RhbEFtb3VudEF0b21zLCBjLmN1cnJlbmN5KSwgc2UoXCLilbAgRG9uZSBpbml0aWFsaXppbmcgT0pTIGZsb3dzLlwiKSwgaT8uc2V0U3RhdHVzKHsgY29kZTogd2UuT0sgfSksIGcoXCJmb3JtX2xvYWRlZFwiKTtcbiAgICAgICAgfSBjYXRjaCAocykge1xuICAgICAgICAgIGNvbnN0IGMgPSBLKHMpO1xuICAgICAgICAgIGk/LnNldFN0YXR1cyh7XG4gICAgICAgICAgICBjb2RlOiB3ZS5FUlJPUixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGNcbiAgICAgICAgICB9KSwgSihcIuKVsCBFcnJvciBpbml0aWFsaXppbmcgT1AgZm9ybTpcIiwgYyksIGcoXCJmb3JtX2luaXRfZXJyb3JcIiwge1xuICAgICAgICAgICAgZXJyb3I6IGNcbiAgICAgICAgICB9KSwgdGhpcy5mb3JtQ2FsbGJhY2tzLmdldC5vbkxvYWRFcnJvcihjKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpPy5lbmQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSwgdGhpcy5zZXRGb3JtSGVpZ2h0ID0gKG8pID0+IHtcbiAgICAgIHRoaXMuZm9ybVByb3BlcnRpZXMuaGVpZ2h0ID0gbywgdGhpcy5yZWdpc3RlcmVkRWxlbWVudHMgJiYgT2JqZWN0LnZhbHVlcyh0aGlzLnJlZ2lzdGVyZWRFbGVtZW50cykuZm9yRWFjaCgoaSkgPT4ge1xuICAgICAgICAhaSB8fCBpLnR5cGUgPT09IGRlLkNERV9CUklER0UgfHwgKGkubm9kZS5zdHlsZS5oZWlnaHQgPSBvKTtcbiAgICAgIH0pO1xuICAgIH0sIHRoaXMub25DZGVMb2FkZWQgPSAobykgPT4ge1xuICAgICAgdGhpcy5jZGVMb2FkRXZlbnQuY3VycmVudC5pc1N1Y2Nlc3MgfHwgKHRoaXMuY2RlTG9hZEV2ZW50LnNldChvKSwgZyhcImNkZV9sb2FkZWRcIikpO1xuICAgIH0sIHRoaXMub25DZGVMb2FkRXJyb3IgPSAobykgPT4ge1xuICAgICAgdGhpcy5jZGVMb2FkRXZlbnQuY3VycmVudC5pc1N1Y2Nlc3MgfHwgKHRoaXMuY2RlTG9hZEV2ZW50LnRocm93KG5ldyBFcnJvcihvKSwgbyksIGcoXCJjZGVfbG9hZF9lcnJvclwiLCB7XG4gICAgICAgIGVycm9yOiBvXG4gICAgICB9KSk7XG4gICAgfSwgdGhpcy5jcmVhdGVFbGVtZW50ID0gKG8sIGkgPSB7fSkgPT4ge1xuICAgICAgaWYgKHRoaXMuY2hlY2tWYWxpZEZvcm1JbnN0YW5jZShcImNyZWF0ZUVsZW1lbnRcIiksICF0aGlzLmNvbmZpZykgdGhyb3cgbmV3IEVycm9yKFwiT3BlblBheSBmb3JtIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICAgIGNvbnN0IHMgPSBmby5wYXJzZShvKSwgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIiksIGwgPSB0aGlzLmJ1aWxkUXVlcnlTdHJpbmcoaSk7XG4gICAgICBjLm5hbWUgPSBgJHtzfS1lbGVtZW50YDtcbiAgICAgIGNvbnN0IHUgPSBuZXcgVVJMKGAvYXBwL3YxLyR7Yy5uYW1lfS9gLCB0aGlzLmNvbmZpZy5iYXNlVXJsKTtcbiAgICAgIHJldHVybiB1LnNlYXJjaCA9IGwudG9TdHJpbmcoKSwgYy5zcmMgPSB1LmhyZWYsIGMuc3R5bGUuYm9yZGVyID0gXCJub25lXCIsIGMuc3R5bGUud2lkdGggPSBcIjEwMCVcIiwgdGhpcy5yZWdpc3RlcklmcmFtZShzLCBjKTtcbiAgICB9LCB0aGlzLnJlZ2lzdGVySWZyYW1lID0gKG8sIGkpID0+IHtcbiAgICAgIGNvbnN0IHMgPSB7XG4gICAgICAgIHR5cGU6IG8sXG4gICAgICAgIG5vZGU6IGksXG4gICAgICAgIG1vdW50OiAoYykgPT4ge1xuICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYyk/LmFwcGVuZENoaWxkKGkpLCBnKFwiZWxlbWVudF9tb3VudGVkXCIsIHtcbiAgICAgICAgICAgIGVsZW1lbnRfdHlwZTogb1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdFRvRWxlbWVudCh7IHR5cGU6IHMudHlwZSwgbm9kZTogcy5ub2RlIH0pLCB0aGlzLnJlZ2lzdGVyZWRFbGVtZW50cyB8fCAodGhpcy5yZWdpc3RlcmVkRWxlbWVudHMgPSB7XG4gICAgICAgIFtkZS5DQVJEXTogdm9pZCAwLFxuICAgICAgICBbZGUuQ0FSRF9OVU1CRVJdOiB2b2lkIDAsXG4gICAgICAgIFtkZS5DQVJEX0VYUElSWV06IHZvaWQgMCxcbiAgICAgICAgW2RlLkNBUkRfQ1ZDXTogdm9pZCAwLFxuICAgICAgICBbZGUuQ0RFX0JSSURHRV06IHZvaWQgMFxuICAgICAgfSksIHRoaXMucmVnaXN0ZXJlZEVsZW1lbnRzW29dID0gcywgcztcbiAgICB9LCB0aGlzLmJ1aWxkUXVlcnlTdHJpbmcgPSAobykgPT4ge1xuICAgICAgY29uc3QgaSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgIHJldHVybiBpLmFwcGVuZChcInJlZmVyZXJcIiwgdGhpcy5yZWZlcnJlciksIGkuYXBwZW5kKFwiZm9ybUlkXCIsIHRoaXMuZm9ybUlkKSwgby5zdHlsZXMgJiYgaS5hcHBlbmQoXCJzdHlsZXNcIiwgemwoby5zdHlsZXMpKSwgaS5hcHBlbmQoXCJzZWN1cmVUb2tlblwiLCB0aGlzLmNvbmZpZy5jaGVja291dFNlY3VyZVRva2VuKSwgaTtcbiAgICB9LCB0aGlzLmNvbm5lY3RUb0VsZW1lbnQgPSAobykgPT4gbHQoXG4gICAgICB7XG4gICAgICAgIHNwYW5OYW1lOiBcImNvbm5lY3RfdG9fZWxlbWVudFwiLFxuICAgICAgICBjaGVja291dFNlY3VyZVRva2VuOiB0aGlzLmNvbmZpZy5jaGVja291dFNlY3VyZVRva2VuLFxuICAgICAgICBkZXZpY2VUb2tlbjogdGhpcy5kZXZpY2VUb2tlbixcbiAgICAgICAgZm9ybUlkOiB0aGlzLmZvcm1JZCxcbiAgICAgICAgdmVyc2lvbjogdGhpcy5vanNWZXJzaW9uLFxuICAgICAgICByZWxlYXNlVmVyc2lvbjogdGhpcy5vanNSZWxlYXNlVmVyc2lvbixcbiAgICAgICAgYmFzZVVybDogdGhpcy5iYXNlVXJsLFxuICAgICAgICByZWZlcnJlcjogdGhpcy5yZWZlcnJlclxuICAgICAgfSxcbiAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgaSA9IGF3YWl0IFpsKG8ubm9kZSk7XG4gICAgICAgIGkudHJhY2luZ0NvbnRleHQgPSB7XG4gICAgICAgICAgY2hlY2tvdXRTZWN1cmVUb2tlbjogdGhpcy5jb25maWcuY2hlY2tvdXRTZWN1cmVUb2tlbixcbiAgICAgICAgICBkZXZpY2VUb2tlbjogdGhpcy5kZXZpY2VUb2tlbixcbiAgICAgICAgICBmb3JtSWQ6IHRoaXMuZm9ybUlkLFxuICAgICAgICAgIHZlcnNpb246IHRoaXMub2pzVmVyc2lvbixcbiAgICAgICAgICByZWxlYXNlVmVyc2lvbjogdGhpcy5vanNSZWxlYXNlVmVyc2lvbixcbiAgICAgICAgICBiYXNlVXJsOiB0aGlzLmJhc2VVcmwsXG4gICAgICAgICAgcmVmZXJyZXI6IHRoaXMucmVmZXJyZXJcbiAgICAgICAgfSwgdGhpcy5jb25uZWN0aW9uTWFuYWdlci5hZGRDb25uZWN0aW9uKG8udHlwZSwgaSksICF0aGlzLmFueUNkZUNvbm4uY3VycmVudC5pc1N1Y2Nlc3MgJiYgby50eXBlID09PSBkZS5DREVfQlJJREdFICYmIHRoaXMuYW55Q2RlQ29ubi5zZXQoaSk7XG4gICAgICB9XG4gICAgKS5jYXRjaCgoaSkgPT4gSihcIltGT1JNXSBFcnJvciBjb25uZWN0aW5nIHRvIENERSBpZnJhbWVcIiwgaSkpLCB0aGlzLmdldEZvcm1EaXYgPSAoKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZm9ybVRhcmdldCkgPz8gZG9jdW1lbnQuYm9keSwgdGhpcy5zdWJtaXRDYXJkID0gYXN5bmMgKG8pID0+IHtcbiAgICAgIGlmICh0aGlzLmlzU3VibWl0dGluZykge1xuICAgICAgICBKKFwiRm9ybSBpcyBhbHJlYWR5IHN1Ym1pdHRpbmcuIFBsZWFzZSB3YWl0IGZvciB0aGUgc3VibWlzc2lvbiB0byBmaW5pc2ggYmVmb3JlIHN1Ym1pdHRpbmcgYWdhaW4uXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmlzU3VibWl0dGluZyA9IHRydWU7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpID0gYXdhaXQgbHQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3Bhbk5hbWU6IFwic3VibWl0X2NhcmRcIixcbiAgICAgICAgICAgIGNoZWNrb3V0U2VjdXJlVG9rZW46IHRoaXMuY29uZmlnLmNoZWNrb3V0U2VjdXJlVG9rZW4sXG4gICAgICAgICAgICBkZXZpY2VUb2tlbjogdGhpcy5kZXZpY2VUb2tlbixcbiAgICAgICAgICAgIGZvcm1JZDogdGhpcy5mb3JtSWQsXG4gICAgICAgICAgICB2ZXJzaW9uOiB0aGlzLm9qc1ZlcnNpb24sXG4gICAgICAgICAgICByZWxlYXNlVmVyc2lvbjogdGhpcy5vanNSZWxlYXNlVmVyc2lvbixcbiAgICAgICAgICAgIGJhc2VVcmw6IHRoaXMuYmFzZVVybCxcbiAgICAgICAgICAgIHJlZmVycmVyOiB0aGlzLnJlZmVycmVyLFxuICAgICAgICAgICAgcGF5bWVudFJvdXRlSWQ6IG8/LnBheW1lbnRSb3V0ZUlkXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBnKFwic3VibWl0X2NhcmRcIiwgeyAuLi5vIH0pLCB0aGlzLmNoZWNrVmFsaWRGb3JtSW5zdGFuY2UoXCJzdWJtaXRDYXJkXCIpO1xuICAgICAgICAgICAgY29uc3QgcyA9IHRoaXMuY29udGV4dC5nZXRWYWx1ZUlmTG9hZGVkRWxzZShudWxsKTtcbiAgICAgICAgICAgIGlmICghcylcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGxlYXNlIHdhaXQgZm9yIHRoZSBmb3JtIHRvIGZpbmlzaCBsb2FkaW5nIGJlZm9yZSBzdWJtaXR0aW5nLlwiKTtcbiAgICAgICAgICAgIGF3YWl0IEYuY29tbW9uQ0MucnVuKHtcbiAgICAgICAgICAgICAgY29udGV4dDogcyxcbiAgICAgICAgICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBjZShzLmNoZWNrb3V0UGF5bWVudE1ldGhvZHMsIFwiY3JlZGl0X2NhcmRcIiksXG4gICAgICAgICAgICAgIG5vbkNkZUZvcm1JbnB1dHM6IFUocy5mb3JtRGl2KSxcbiAgICAgICAgICAgICAgZm9ybUNhbGxiYWNrczogdGhpcy5mb3JtQ2FsbGJhY2tzLFxuICAgICAgICAgICAgICBjdXN0b21QYXJhbXM6IHtcbiAgICAgICAgICAgICAgICBjdXJyZW50Q2RlQ29ubmVjdGlvbnM6IHRoaXMuY29ubmVjdGlvbk1hbmFnZXIuZ2V0QWxsQ29ubmVjdGlvbnMoKSxcbiAgICAgICAgICAgICAgICBwYXltZW50Um91dGVJZDogbz8ucGF5bWVudFJvdXRlSWRcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgaW5pdFJlc3VsdDogdm9pZCAwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU3VibWl0dGluZyA9ICExLCBpO1xuICAgICAgfSBjYXRjaCAoaSkge1xuICAgICAgICB0aHJvdyB0aGlzLmlzU3VibWl0dGluZyA9IGZhbHNlLCBpO1xuICAgICAgfVxuICAgIH0sIHRoaXMuZ2V0QXZhaWxhYmxlUGF5bWVudE1ldGhvZHMgPSAoKSA9PiBsdChcbiAgICAgIHtcbiAgICAgICAgc3Bhbk5hbWU6IFwiZ2V0X2F2YWlsYWJsZV9wYXltZW50X21ldGhvZHNcIixcbiAgICAgICAgY2hlY2tvdXRTZWN1cmVUb2tlbjogdGhpcy5jb25maWcuY2hlY2tvdXRTZWN1cmVUb2tlbixcbiAgICAgICAgZGV2aWNlVG9rZW46IHRoaXMuZGV2aWNlVG9rZW4sXG4gICAgICAgIGZvcm1JZDogdGhpcy5mb3JtSWQsXG4gICAgICAgIHZlcnNpb246IHRoaXMub2pzVmVyc2lvbixcbiAgICAgICAgcmVsZWFzZVZlcnNpb246IHRoaXMub2pzUmVsZWFzZVZlcnNpb24sXG4gICAgICAgIGJhc2VVcmw6IHRoaXMuYmFzZVVybCxcbiAgICAgICAgcmVmZXJyZXI6IHRoaXMucmVmZXJyZXJcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZEZvcm1JbnN0YW5jZShcImdldEF2YWlsYWJsZVBheW1lbnRNZXRob2RzXCIpO1xuICAgICAgICBjb25zdCBvID0gdGhpcy5jb250ZXh0LmdldFZhbHVlSWZMb2FkZWRFbHNlKG51bGwpO1xuICAgICAgICBpZiAoIW8pXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGxlYXNlIHdhaXQgZm9yIHRoZSBmb3JtIHRvIGZpbmlzaCBsb2FkaW5nIGJlZm9yZSBnZXR0aW5nIGF2YWlsYWJsZSBwYXltZW50IG1ldGhvZHMuXCIpO1xuICAgICAgICBjb25zdCB7IHByb2Nlc3NvcnM6IGksIGlzQXZhaWxhYmxlOiBzIH0gPSBNcihcbiAgICAgICAgICB0aGlzLmluaXRGbG93c1xuICAgICAgICApLCB7IHByb2Nlc3NvcnM6IGMsIGlzQXZhaWxhYmxlOiBsIH0gPSB4cihcbiAgICAgICAgICB0aGlzLmluaXRGbG93c1xuICAgICAgICApLCBkID0gdGhpcy5pbml0Rmxvd3MucGF5cGFsLnB1Ymxpc2hlci5nZXRWYWx1ZUlmTG9hZGVkRWxzZShudWxsKT8uaXNBdmFpbGFibGUgPz8gITEsIGYgPSBvLmNoZWNrb3V0UGF5bWVudE1ldGhvZHMuc29tZShcbiAgICAgICAgICAoQykgPT4gQy5wcm9jZXNzb3JfbmFtZSA9PT0gXCJwb2NreXRcIiAmJiBDLnByb3ZpZGVyID09PSBcInBheXBhbFwiXG4gICAgICAgICksIG0gPSB0aGlzLmluaXRGbG93cy5sb29wLnB1Ymxpc2hlci5nZXRWYWx1ZUlmTG9hZGVkRWxzZShudWxsKT8uaXNBdmFpbGFibGUgPz8gITEsIHkgPSB0aGlzLmluaXRGbG93cy5zdHJpcGVMaW5rLnB1Ymxpc2hlci5nZXRWYWx1ZUlmTG9hZGVkRWxzZShudWxsKSwgaCA9IHk/LmlzQXZhaWxhYmxlID8/ICExLCB3ID0gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFQuY2FyZCxcbiAgICAgICAgICAgIHByb2Nlc3NvcnM6IFtdLFxuICAgICAgICAgICAgaXNBdmFpbGFibGU6ICEwXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBULmFwcGxlUGF5LFxuICAgICAgICAgICAgcHJvY2Vzc29yczogaSxcbiAgICAgICAgICAgIGlzQXZhaWxhYmxlOiBzXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBULmdvb2dsZVBheSxcbiAgICAgICAgICAgIHByb2Nlc3NvcnM6IGMsXG4gICAgICAgICAgICBpc0F2YWlsYWJsZTogbFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogVC5wYXlwYWwsXG4gICAgICAgICAgICBwcm9jZXNzb3JzOiBkID8gW08uRW51bS5wYXlwYWxdIDogW10sXG4gICAgICAgICAgICBpc0F2YWlsYWJsZTogZFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogVC5wb2NreXRQYXlwYWwsXG4gICAgICAgICAgICBwcm9jZXNzb3JzOiBmID8gW08uRW51bS5wb2NreXRdIDogW10sXG4gICAgICAgICAgICBpc0F2YWlsYWJsZTogZlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogVC5sb29wQ3J5cHRvLFxuICAgICAgICAgICAgcHJvY2Vzc29yczogbSA/IFtPLkVudW0ubG9vcF0gOiBbXSxcbiAgICAgICAgICAgIGlzQXZhaWxhYmxlOiBtXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBULnN0cmlwZUxpbmssXG4gICAgICAgICAgICBwcm9jZXNzb3JzOiBbTy5FbnVtLnN0cmlwZV0sXG4gICAgICAgICAgICBpc0F2YWlsYWJsZTogaCxcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IHk/LmlzQXZhaWxhYmxlID8geS5jb250cm9sbGVyIDogdm9pZCAwXG4gICAgICAgICAgfVxuICAgICAgICBdLCBFID0ge1xuICAgICAgICAgIHBheXBhbDogVC5wYXlwYWwsXG4gICAgICAgICAgYWlyd2FsbGV4R29vZ2xlUGF5OiBULmFpcndhbGxleEdvb2dsZVBheSxcbiAgICAgICAgICBhaXJ3YWxsZXhBcHBsZVBheTogVC5haXJ3YWxsZXhBcHBsZVBheSxcbiAgICAgICAgICBhdXRob3JpemVOZXRHb29nbGVQYXk6IFQuYXV0aG9yaXplbmV0R29vZ2xlUGF5LFxuICAgICAgICAgIGF1dGhvcml6ZU5ldEFwcGxlUGF5OiBULmF1dGhvcml6ZW5ldEFwcGxlUGF5LFxuICAgICAgICAgIGFkeWVuR29vZ2xlUGF5OiBULmFkeWVuR29vZ2xlUGF5LFxuICAgICAgICAgIGFkeWVuQXBwbGVQYXk6IFQuYWR5ZW5BcHBsZVBheVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gWy4uLk9iamVjdC5lbnRyaWVzKHRoaXMuaW5pdEZsb3dzKS5tYXAoKFtDLCBTXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IFIgPSBTLnB1Ymxpc2hlci5nZXRWYWx1ZUlmTG9hZGVkRWxzZShudWxsKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogRVtDXSA/PyBDLFxuICAgICAgICAgICAgcHJvY2Vzc29yczogW10sXG4gICAgICAgICAgICBpc0F2YWlsYWJsZTogUj8uaXNBdmFpbGFibGUgPz8gITFcbiAgICAgICAgICB9O1xuICAgICAgICB9KSwgLi4ud107XG4gICAgICB9XG4gICAgKSwgdGhpcy5nZW5lcmFsU3VibWl0ID0gYXN5bmMgKG8sIGkpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzU3VibWl0dGluZykge1xuICAgICAgICBKKFwiRm9ybSBpcyBhbHJlYWR5IHN1Ym1pdHRpbmcuIFBsZWFzZSB3YWl0IGZvciB0aGUgc3VibWlzc2lvbiB0byBmaW5pc2ggYmVmb3JlIHN1Ym1pdHRpbmcgYWdhaW4uXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmlzU3VibWl0dGluZyA9IHRydWU7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzID0gYXdhaXQgbHQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3Bhbk5hbWU6IFwiZ2VuZXJhbF9mb3JtX3N1Ym1pdFwiLFxuICAgICAgICAgICAgY2hlY2tvdXRTZWN1cmVUb2tlbjogdGhpcy5jb25maWcuY2hlY2tvdXRTZWN1cmVUb2tlbixcbiAgICAgICAgICAgIGRldmljZVRva2VuOiB0aGlzLmRldmljZVRva2VuLFxuICAgICAgICAgICAgZm9ybUlkOiB0aGlzLmZvcm1JZCxcbiAgICAgICAgICAgIHZlcnNpb246IHRoaXMub2pzVmVyc2lvbixcbiAgICAgICAgICAgIHJlbGVhc2VWZXJzaW9uOiB0aGlzLm9qc1JlbGVhc2VWZXJzaW9uLFxuICAgICAgICAgICAgYmFzZVVybDogdGhpcy5iYXNlVXJsLFxuICAgICAgICAgICAgcmVmZXJyZXI6IHRoaXMucmVmZXJyZXJcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGcoXCJnZW5lcmFsX2Zvcm1fc3VibWl0XCIsIHsgbWV0aG9kOiBvLCBzZXR0aW5nczogaSB9KSwgdGhpcy5jaGVja1ZhbGlkRm9ybUluc3RhbmNlKFwiZ2VuZXJhbFN1Ym1pdFwiKTtcbiAgICAgICAgICAgIGNvbnN0IGMgPSB0aGlzLmNvbnRleHQuZ2V0VmFsdWVJZkxvYWRlZEVsc2UobnVsbCk7XG4gICAgICAgICAgICBpZiAoIWMpXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBsZWFzZSB3YWl0IGZvciB0aGUgZm9ybSB0byBmaW5pc2ggbG9hZGluZyBiZWZvcmUgc3VibWl0dGluZy5cIik7XG4gICAgICAgICAgICBzd2l0Y2ggKG8pIHtcbiAgICAgICAgICAgICAgY2FzZSBULmNhcmQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3VibWl0Q2FyZChpKTtcbiAgICAgICAgICAgICAgY2FzZSBULnBvY2t5dFBheXBhbDpcbiAgICAgICAgICAgICAgICByZXR1cm4gRi5wb2NreXRQYXlwYWwucnVuKHtcbiAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGMsXG4gICAgICAgICAgICAgICAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IGNlKFxuICAgICAgICAgICAgICAgICAgICBjLmNoZWNrb3V0UGF5bWVudE1ldGhvZHMsXG4gICAgICAgICAgICAgICAgICAgIFBlLlBBWVBBTCxcbiAgICAgICAgICAgICAgICAgICAgXCJwb2NreXRcIlxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIG5vbkNkZUZvcm1JbnB1dHM6IFUoYy5mb3JtRGl2KSxcbiAgICAgICAgICAgICAgICAgIGZvcm1DYWxsYmFja3M6IHRoaXMuZm9ybUNhbGxiYWNrcyxcbiAgICAgICAgICAgICAgICAgIGN1c3RvbVBhcmFtczogeyBzZXR0aW5nczogaSB9LFxuICAgICAgICAgICAgICAgICAgaW5pdFJlc3VsdDogdm9pZCAwXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGNhc2UgVC5wYXlwYWw6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEYucGF5cGFsLnJ1bih7XG4gICAgICAgICAgICAgICAgICBjb250ZXh0OiBjLFxuICAgICAgICAgICAgICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBjZShcbiAgICAgICAgICAgICAgICAgICAgYy5jaGVja291dFBheW1lbnRNZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICBQZS5QQVlQQUwsXG4gICAgICAgICAgICAgICAgICAgIFwicGF5cGFsXCJcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBub25DZGVGb3JtSW5wdXRzOiBVKGMuZm9ybURpdiksXG4gICAgICAgICAgICAgICAgICBpbml0UmVzdWx0OiB2b2lkIDAsXG4gICAgICAgICAgICAgICAgICBjdXN0b21QYXJhbXM6IHsgc2V0dGluZ3M6IGkgfSxcbiAgICAgICAgICAgICAgICAgIGZvcm1DYWxsYmFja3M6IHRoaXMuZm9ybUNhbGxiYWNrc1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBjYXNlIFQubG9vcENyeXB0bzpcbiAgICAgICAgICAgICAgICByZXR1cm4gRi5sb29wQ3J5cHRvLnJ1bih7XG4gICAgICAgICAgICAgICAgICBjb250ZXh0OiBjLFxuICAgICAgICAgICAgICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBjZShcbiAgICAgICAgICAgICAgICAgICAgYy5jaGVja291dFBheW1lbnRNZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICBcImNyeXB0b1wiLFxuICAgICAgICAgICAgICAgICAgICBcImxvb3BcIlxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIG5vbkNkZUZvcm1JbnB1dHM6IFUoYy5mb3JtRGl2KSxcbiAgICAgICAgICAgICAgICAgIGZvcm1DYWxsYmFja3M6IHRoaXMuZm9ybUNhbGxiYWNrcyxcbiAgICAgICAgICAgICAgICAgIGN1c3RvbVBhcmFtczogaSxcbiAgICAgICAgICAgICAgICAgIGluaXRSZXN1bHQ6IHZvaWQgMFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBjYXNlIFQuYXBwbGVQYXk6IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHN0YXJ0RmxvdzogbCB9ID0gTXIodGhpcy5pbml0Rmxvd3MpO1xuICAgICAgICAgICAgICAgIHJldHVybiBsKGkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgVC5nb29nbGVQYXk6IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHN0YXJ0RmxvdzogbCB9ID0geHIodGhpcy5pbml0Rmxvd3MpO1xuICAgICAgICAgICAgICAgIHJldHVybiBsKGkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIEtlZXBpbmcgZXhpc3RpbmcgY29tbWVudGVkIGNvZGUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgaW4gdGhlIGZ1dHVyZSB2ZXJzaW9uXG4gICAgICAgICAgICAgIGNhc2UgVC5haXJ3YWxsZXhHb29nbGVQYXk6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBsID0gdGhpcy5pbml0Rmxvd3MuYWlyd2FsbGV4R29vZ2xlUGF5LnB1Ymxpc2hlci5nZXRWYWx1ZUlmTG9hZGVkRWxzZShudWxsKTtcbiAgICAgICAgICAgICAgICBpZiAoIWwpIHtcbiAgICAgICAgICAgICAgICAgIEooXG4gICAgICAgICAgICAgICAgICAgIFwiYWlyd2FsbGV4LWdvb2dsZS1wYXkgaXMgbm90IGF2YWlsYWJsZS4gUGxlYXNlIGNoZWNrIHRoZSBhdmFpbGFiaWxpdHkgdXNpbmcgJ2dldEF2YWlsYWJsZVBheW1lbnRNZXRob2RzKCknXCJcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBsLnN0YXJ0RmxvdyhpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlIFQuYWlyd2FsbGV4QXBwbGVQYXk6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBsID0gdGhpcy5pbml0Rmxvd3MuYWlyd2FsbGV4QXBwbGVQYXkucHVibGlzaGVyLmdldFZhbHVlSWZMb2FkZWRFbHNlKG51bGwpO1xuICAgICAgICAgICAgICAgIGlmICghbCkge1xuICAgICAgICAgICAgICAgICAgSihcbiAgICAgICAgICAgICAgICAgICAgXCJhaXJ3YWxsZXgtYXBwbGUtcGF5IGlzIG5vdCBhdmFpbGFibGUuIFBsZWFzZSBjaGVjayB0aGUgYXZhaWxhYmlsaXR5IHVzaW5nICdnZXRBdmFpbGFibGVQYXltZW50TWV0aG9kcygpJ1wiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbC5zdGFydEZsb3coaSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSBULmF1dGhvcml6ZW5ldEdvb2dsZVBheToge1xuICAgICAgICAgICAgICAgIGNvbnN0IGwgPSB0aGlzLmluaXRGbG93cy5hdXRob3JpemVOZXRHb29nbGVQYXkucHVibGlzaGVyLmdldFZhbHVlSWZMb2FkZWRFbHNlKG51bGwpO1xuICAgICAgICAgICAgICAgIGlmICghbCkge1xuICAgICAgICAgICAgICAgICAgSihcbiAgICAgICAgICAgICAgICAgICAgXCJhdXRob3JpemUtbmV0LWdvb2dsZS1wYXkgaXMgbm90IGF2YWlsYWJsZS4gUGxlYXNlIGNoZWNrIHRoZSBhdmFpbGFiaWxpdHkgdXNpbmcgJ2dldEF2YWlsYWJsZVBheW1lbnRNZXRob2RzKCknXCJcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBsLnN0YXJ0RmxvdyhpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlIFQuYXV0aG9yaXplbmV0QXBwbGVQYXk6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBsID0gdGhpcy5pbml0Rmxvd3MuYXV0aG9yaXplTmV0QXBwbGVQYXkucHVibGlzaGVyLmdldFZhbHVlSWZMb2FkZWRFbHNlKG51bGwpO1xuICAgICAgICAgICAgICAgIGlmICghbCkge1xuICAgICAgICAgICAgICAgICAgSihcbiAgICAgICAgICAgICAgICAgICAgXCJhdXRob3JpemUtbmV0LWFwcGxlLXBheSBpcyBub3QgYXZhaWxhYmxlLiBQbGVhc2UgY2hlY2sgdGhlIGF2YWlsYWJpbGl0eSB1c2luZyAnZ2V0QXZhaWxhYmxlUGF5bWVudE1ldGhvZHMoKSdcIlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGwuc3RhcnRGbG93KGkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgVC5hZHllbkdvb2dsZVBheToge1xuICAgICAgICAgICAgICAgIGNvbnN0IGwgPSB0aGlzLmluaXRGbG93cy5hZHllbkdvb2dsZVBheS5wdWJsaXNoZXIuZ2V0VmFsdWVJZkxvYWRlZEVsc2UobnVsbCk7XG4gICAgICAgICAgICAgICAgaWYgKCFsKSB7XG4gICAgICAgICAgICAgICAgICBKKFxuICAgICAgICAgICAgICAgICAgICBcImFkeWVuLWdvb2dsZS1wYXkgaXMgbm90IGF2YWlsYWJsZS4gUGxlYXNlIGNoZWNrIHRoZSBhdmFpbGFiaWxpdHkgdXNpbmcgJ2dldEF2YWlsYWJsZVBheW1lbnRNZXRob2RzKCknXCJcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBsLnN0YXJ0RmxvdyhpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlIFQuYWR5ZW5BcHBsZVBheToge1xuICAgICAgICAgICAgICAgIGNvbnN0IGwgPSB0aGlzLmluaXRGbG93cy5hZHllbkFwcGxlUGF5LnB1Ymxpc2hlci5nZXRWYWx1ZUlmTG9hZGVkRWxzZShudWxsKTtcbiAgICAgICAgICAgICAgICBpZiAoIWwpIHtcbiAgICAgICAgICAgICAgICAgIEooXG4gICAgICAgICAgICAgICAgICAgIFwiYWR5ZW4tYXBwbGUtcGF5IGlzIG5vdCBhdmFpbGFibGUuIFBsZWFzZSBjaGVjayB0aGUgYXZhaWxhYmlsaXR5IHVzaW5nICdnZXRBdmFpbGFibGVQYXltZW50TWV0aG9kcygpJ1wiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbC5zdGFydEZsb3coaSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSBULmFpcndhbGxleEFDSDpcbiAgICAgICAgICAgICAgICByZXR1cm4gRi5haXJ3YWxsZXhBQ0gucnVuKHtcbiAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGMsXG4gICAgICAgICAgICAgICAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IGNlKFxuICAgICAgICAgICAgICAgICAgICBjLmNoZWNrb3V0UGF5bWVudE1ldGhvZHMsXG4gICAgICAgICAgICAgICAgICAgIFBlLkFDSCxcbiAgICAgICAgICAgICAgICAgICAgXCJhaXJ3YWxsZXhcIlxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIG5vbkNkZUZvcm1JbnB1dHM6IFUoYy5mb3JtRGl2KSxcbiAgICAgICAgICAgICAgICAgIGZvcm1DYWxsYmFja3M6IHRoaXMuZm9ybUNhbGxiYWNrcyxcbiAgICAgICAgICAgICAgICAgIGN1c3RvbVBhcmFtczogaSxcbiAgICAgICAgICAgICAgICAgIGluaXRSZXN1bHQ6IHZvaWQgMFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBjYXNlIFQuYWlyd2FsbGV4RUZUOlxuICAgICAgICAgICAgICAgIHJldHVybiBGLmFpcndhbGxleEVGVC5ydW4oe1xuICAgICAgICAgICAgICAgICAgY29udGV4dDogYyxcbiAgICAgICAgICAgICAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogY2UoXG4gICAgICAgICAgICAgICAgICAgIGMuY2hlY2tvdXRQYXltZW50TWV0aG9kcyxcbiAgICAgICAgICAgICAgICAgICAgUGUuRUZULFxuICAgICAgICAgICAgICAgICAgICBcImFpcndhbGxleFwiXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgbm9uQ2RlRm9ybUlucHV0czogVShjLmZvcm1EaXYpLFxuICAgICAgICAgICAgICAgICAgZm9ybUNhbGxiYWNrczogdGhpcy5mb3JtQ2FsbGJhY2tzLFxuICAgICAgICAgICAgICAgICAgY3VzdG9tUGFyYW1zOiBpLFxuICAgICAgICAgICAgICAgICAgaW5pdFJlc3VsdDogdm9pZCAwXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGNhc2UgVC5haXJ3YWxsZXhCQUNTOlxuICAgICAgICAgICAgICAgIHJldHVybiBGLmFpcndhbGxleEJBQ1MucnVuKHtcbiAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGMsXG4gICAgICAgICAgICAgICAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IGNlKFxuICAgICAgICAgICAgICAgICAgICBjLmNoZWNrb3V0UGF5bWVudE1ldGhvZHMsXG4gICAgICAgICAgICAgICAgICAgIFBlLkJBQ1MsXG4gICAgICAgICAgICAgICAgICAgIFwiYWlyd2FsbGV4XCJcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBub25DZGVGb3JtSW5wdXRzOiBVKGMuZm9ybURpdiksXG4gICAgICAgICAgICAgICAgICBmb3JtQ2FsbGJhY2tzOiB0aGlzLmZvcm1DYWxsYmFja3MsXG4gICAgICAgICAgICAgICAgICBjdXN0b21QYXJhbXM6IGksXG4gICAgICAgICAgICAgICAgICBpbml0UmVzdWx0OiB2b2lkIDBcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgY2FzZSBULmFpcndhbGxleFNFUEE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEYuYWlyd2FsbGV4U0VQQS5ydW4oe1xuICAgICAgICAgICAgICAgICAgY29udGV4dDogYyxcbiAgICAgICAgICAgICAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogY2UoXG4gICAgICAgICAgICAgICAgICAgIGMuY2hlY2tvdXRQYXltZW50TWV0aG9kcyxcbiAgICAgICAgICAgICAgICAgICAgUGUuU0VQQSxcbiAgICAgICAgICAgICAgICAgICAgXCJhaXJ3YWxsZXhcIlxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIG5vbkNkZUZvcm1JbnB1dHM6IFUoYy5mb3JtRGl2KSxcbiAgICAgICAgICAgICAgICAgIGZvcm1DYWxsYmFja3M6IHRoaXMuZm9ybUNhbGxiYWNrcyxcbiAgICAgICAgICAgICAgICAgIGN1c3RvbVBhcmFtczogaSxcbiAgICAgICAgICAgICAgICAgIGluaXRSZXN1bHQ6IHZvaWQgMFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBjYXNlIFQuc3RyaXBlTGluazoge1xuICAgICAgICAgICAgICAgIEooXG4gICAgICAgICAgICAgICAgICBcIlN0cmlwZUxpbmsgY2Fubm90IGJlIHN1Ym1pdHRlZCBtYW51YWxseS4gUGxlYXNlIG1vdW50IHRoZSBidXR0b24gcHJvcGVybHkgYW5kIGlmIHVzZXIgY29tcGxldGVkIHRoZSBwYXltZW50IGZsb3cgdmlhIFN0cmlwZUxpbmsgYnV0dG9uLCB0aGUgcGF5bWVudCB3aWxsIGJlIHN1Ym1pdHRlZCBhdXRvbWF0aWNhbGx5LlwiXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBudChvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU3VibWl0dGluZyA9ICExLCBzO1xuICAgICAgfSBjYXRjaCAocykge1xuICAgICAgICB0aHJvdyB0aGlzLmlzU3VibWl0dGluZyA9IGZhbHNlLCBzO1xuICAgICAgfVxuICAgIH0sIHRoaXMuc3VibWl0V2l0aCA9IHRoaXMuZ2VuZXJhbFN1Ym1pdCwgdGhpcy5zdWJtaXQgPSB0aGlzLnN1Ym1pdENhcmQsIHRoaXMuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgIHNlKFwiRGVzdHJveWluZyBPcGVuUGF5IGZvcm0uLi5cIiksIHRoaXMuY2hlY2tWYWxpZEZvcm1JbnN0YW5jZShcImRlc3Ryb3lcIiksIHRoaXMuaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgZm9yIChjb25zdCBvIG9mIE9iamVjdC52YWx1ZXModGhpcy5yZWdpc3RlcmVkRWxlbWVudHMgPz8ge30pKVxuICAgICAgICBvICYmIG8ubm9kZS5yZW1vdmUoKTtcbiAgICAgICQoKT8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5ldmVudEhhbmRsZXIuaGFuZGxlTWVzc2FnZS5iaW5kKHRoaXMuZXZlbnRIYW5kbGVyKSksIFRpKCksIHRoaXMucmVnaXN0ZXJlZEVsZW1lbnRzID0gbnVsbCwgZGVsZXRlIHdpbmRvdy5vanMsIGcoXCJmb3JtX2Rlc3Ryb3llZFwiKTtcbiAgICB9LCB0aGlzLnVwZGF0ZUNhbGxiYWNrcyA9IChvKSA9PiB7XG4gICAgICB0aGlzLmZvcm1DYWxsYmFja3Muc2V0Q2FsbGJhY2tzKG8pO1xuICAgIH0sIHVlLmFzc2lnbkFzU2luZ2xldG9uKHRoaXMpLCB0aGlzLm9qc1ZlcnNpb24gPSBcIjAuNS4xN1wiLCB0aGlzLm9qc1JlbGVhc2VWZXJzaW9uID0gXCJsb2NhbF9idWlsZFwiLCB0aGlzLmJhc2VVcmwgPSB0LmJhc2VVcmwgPz8gXCJodHRwczovL2NkZS5nZXRvcGVucGF5LmNvbVwiLCB0aGlzLmNvbmZpZyA9IHsgLi4udCwgYmFzZVVybDogdGhpcy5iYXNlVXJsIH0sIHRoaXMuZm9ybUNhbGxiYWNrcyA9IFd0LmZyb21PYmplY3QodCksIHRoaXMucmVnaXN0ZXJlZEVsZW1lbnRzID0gbnVsbCwgdGhpcy5mb3JtSWQgPSBgb3Bqcy1mb3JtLSR7djQoKX1gLCB0aGlzLnJlZmVycmVyID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiwgdGhpcy5mb3JtVGFyZ2V0ID0gdC5mb3JtVGFyZ2V0ID8/IFwiYm9keVwiLCB0aGlzLmZvcm1Qcm9wZXJ0aWVzID0geyBoZWlnaHQ6IFwiMXB4XCIgfSwgdGhpcy5jb25uZWN0aW9uTWFuYWdlciA9IG5ldyBLbCgpLCB0aGlzLmRldmljZVRva2VuID0gSW4oKSwgUmkoKTtcbiAgICBjb25zdCB7IGZyYW1ld29yazogciwgdmVyc2lvbjogbiB9ID0gR2woKTtcbiAgICB1bih0aGlzLmJhc2VVcmwpLnRoZW4oKG8pID0+IHtcbiAgICAgIGlmICghQnQuY3VycmVudC5pc1N1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3QgaSA9IHtcbiAgICAgICAgICBjaGVja291dFNlY3VyZVRva2VuOiB0aGlzLmNvbmZpZy5jaGVja291dFNlY3VyZVRva2VuLFxuICAgICAgICAgIGRldmljZVRva2VuOiB0aGlzLmRldmljZVRva2VuLFxuICAgICAgICAgIGVudmlyb25tZW50OiBvLFxuICAgICAgICAgIGZyYW1ld29yazogcixcbiAgICAgICAgICBmcmFtZXdvcmtWZXJzaW9uOiBuLFxuICAgICAgICAgIG9qc1ZlcnNpb246IHRoaXMub2pzVmVyc2lvbixcbiAgICAgICAgICBvanNSZWxlYXNlVmVyc2lvbjogdGhpcy5vanNSZWxlYXNlVmVyc2lvbixcbiAgICAgICAgICByZWZlcnJlcjogdGhpcy5yZWZlcnJlcixcbiAgICAgICAgICBiYXNlVXJsOiB0aGlzLmJhc2VVcmxcbiAgICAgICAgfTtcbiAgICAgICAgQnQuc2V0KGkpO1xuICAgICAgfVxuICAgIH0pLCBnKFwiZm9ybV9pbml0XCIpLCBjb25zb2xlLmxvZyhcIk9KUyBWRVJTSU9OXCIsIHRoaXMub2pzVmVyc2lvbiksIHQuYWxsb3dUcmFjaW5nID09PSB0cnVlICYmIEhsKHRoaXMub2pzVmVyc2lvbiwgdGhpcy5iYXNlVXJsKSwgdGhpcy5ldmVudEhhbmRsZXIgPSBuZXcgSmwodGhpcy5mb3JtSWQsIHRoaXMuYmFzZVVybCwgdGhpcy5mb3JtQ2FsbGJhY2tzLCB7XG4gICAgICBzZXRGb3JtSGVpZ2h0OiB0aGlzLnNldEZvcm1IZWlnaHQsXG4gICAgICBvbkNkZUxvYWRlZDogdGhpcy5vbkNkZUxvYWRlZCxcbiAgICAgIG9uQ2RlTG9hZEVycm9yOiB0aGlzLm9uQ2RlTG9hZEVycm9yXG4gICAgfSksICQoKT8uYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5ldmVudEhhbmRsZXIuaGFuZGxlTWVzc2FnZS5iaW5kKHRoaXMuZXZlbnRIYW5kbGVyKSksIHRoaXMuc3RhcnRGb3JtSW5pdCgpO1xuICB9XG4gIGdldCBjaGVja291dFNlY3VyZVRva2VuKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5jaGVja291dFNlY3VyZVRva2VuO1xuICB9XG4gIGNoZWNrVmFsaWRGb3JtSW5zdGFuY2UodCA9IFwidW5rbm93blwiKSB7XG4gICAgY29uc3QgciA9IHVlLmdldEluc3RhbmNlKCksIG4gPSB7XG4gICAgICB0aGlzRm9ybUlkOiB0aGlzLmZvcm1JZCxcbiAgICAgIGN1cnJlbnRGb3JtSWQ6IHI/LmZvcm1JZCB8fCBcIm5vLWN1cnJlbnQtaW5zdGFuY2VcIixcbiAgICAgIGlzRGVzdHJveWVkOiB0aGlzLmlzRGVzdHJveWVkLFxuICAgICAgY2hlY2tvdXRUb2tlbjogdGhpcy5jb25maWcuY2hlY2tvdXRTZWN1cmVUb2tlbi5zdWJzdHJpbmcoMCwgMTApICsgXCIuLi5cIlxuICAgIH0sIG8gPSBgXG4gICAgICBbV2FybmluZ10gSW52YWxpZCBmb3JtIGluc3RhbmNlIGRldGVjdGVkLlxuICAgICAgSXQgbG9va3MgbGlrZSB5b3UgYXJlIHN0aWxsIHVzaW5nIGFuIG9sZCBpbnN0YW5jZSB0aGF0IGhhcyBiZWVuIGRlc3Ryb3llZC5cbiAgICAgIFBsZWFzZSBtYWtlIHN1cmUgeW91IGFyZSB1c2luZyB0aGUgbGF0ZXN0IGluc3RhbmNlIG9mIHRoZSBmb3JtIGFuZCBjbGVhbnVwIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgICAgRGVidWcgSW5mbzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgLSBjYWxsZXI6ICR7dH1cbiAgICAgIC0gY2FsbGVyX2Zvcm1faWQ6ICR7bi50aGlzRm9ybUlkfVxuICAgICAgLSBjdXJyZW50X2FjdGl2ZV9mb3JtX2lkOiAke24uY3VycmVudEZvcm1JZH1cbiAgICAgIC0gaXNfZGVzdHJveWVkOiAke24uaXNEZXN0cm95ZWR9XG4gICAgICAtIGNoZWNrb3V0X3Rva2VuOiAke24uY2hlY2tvdXRUb2tlbn1cbiAgICBgO1xuICAgIHJldHVybiB0aGlzLmlzRGVzdHJveWVkID8gKEoobyksIGcoXCJvdXRkYXRlZF9mb3JtX2luc3RhbmNlXCIsIHsgZXJyb3I6IG8gfSksIGZhbHNlKSA6ICFyIHx8IHIuZm9ybUlkICE9PSB0aGlzLmZvcm1JZCA/IChKKG8pLCBnKFwib3V0ZGF0ZWRfZm9ybV9pbnN0YW5jZVwiLCB7IGVycm9yOiBvIH0pLCBmYWxzZSkgOiB0cnVlO1xuICB9XG59O1xudWUub2pzRmxvd3MgPSBGLCB1ZS5hc3NpZ25Bc1NpbmdsZXRvbiA9ICh0KSA9PiB7XG4gIGlmICh1ZS5nZXRJbnN0YW5jZSgpKVxuICAgIHRocm93IG5ldyBFcnJvcihcIk9wZW5QYXkgaW5zdGFuY2UgYWxyZWFkeSBleGlzdHMuIE9ubHkgb25lIGluc3RhbmNlIGlzIGFsbG93ZWQuXCIpO1xuICB3aW5kb3cub2pzID0gdDtcbn0sIHVlLmdldEluc3RhbmNlID0gKCkgPT4gd2luZG93Lm9qcyA/PyBudWxsLCB1ZS5idWlsZE9qc0Zsb3dDb250ZXh0ID0gKHQsIHIsIG4sIG8pID0+ICh7XG4gIGNoZWNrb3V0U2VjdXJlVG9rZW46IHQuY2hlY2tvdXRTZWN1cmVUb2tlbixcbiAgYmFzZVVybDogbmV3IFVSTCh0LmJhc2VVcmwgPz8gQ24pLm9yaWdpbixcbiAgZm9ybURpdjogbyxcbiAgZWxlbWVudHNTZXNzaW9uSWQ6IHIuc2Vzc2lvbklkLFxuICBjaGVja291dFBheW1lbnRNZXRob2RzOiByLmNoZWNrb3V0UGF5bWVudE1ldGhvZHMsXG4gIGFueUNkZUNvbm5lY3Rpb246IG4sXG4gIGN1c3RvbUluaXRQYXJhbXM6IHQuY3VzdG9tSW5pdFBhcmFtcyA/PyB7fSxcbiAgcHJldmVudE5hdmlnYXRpb25EdXJpbmdTdWJtaXNzaW9uOiB0LnByZXZlbnROYXZpZ2F0aW9uRHVyaW5nU3VibWlzc2lvblxufSk7XG5sZXQgJHIgPSB1ZTtcblxuY29uc3QgdXNlUmVhY3RpdmVGb3JtQ2FsbGJhY2tzID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IGZvcm1DYWxsYmFja3MgPSBGb3JtQ2FsbGJhY2tzLmZyb21PYmplY3Qoe1xuICAgIG9uRm9jdXM6IHByb3BzLm9uRm9jdXMsXG4gICAgb25CbHVyOiBwcm9wcy5vbkJsdXIsXG4gICAgb25DaGFuZ2U6IHByb3BzLm9uQ2hhbmdlLFxuICAgIG9uTG9hZDogcHJvcHMub25Mb2FkLFxuICAgIG9uTG9hZEVycm9yOiBwcm9wcy5vbkxvYWRFcnJvcixcbiAgICBvblZhbGlkYXRpb25FcnJvcjogcHJvcHMub25WYWxpZGF0aW9uRXJyb3IsXG4gICAgb25DaGVja291dFN0YXJ0ZWQ6IHByb3BzLm9uQ2hlY2tvdXRTdGFydGVkLFxuICAgIG9uQ2hlY2tvdXRTdWNjZXNzOiBwcm9wcy5vbkNoZWNrb3V0U3VjY2VzcyxcbiAgICBvblNldHVwUGF5bWVudE1ldGhvZFN1Y2Nlc3M6IHByb3BzLm9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2VzcyxcbiAgICBvbkNoZWNrb3V0RXJyb3I6IHByb3BzLm9uQ2hlY2tvdXRFcnJvcixcbiAgICBvblBheW1lbnRSZXF1ZXN0TG9hZDogcHJvcHMub25QYXltZW50UmVxdWVzdExvYWRcbiAgfSk7XG4gIGlmICgkci5nZXRJbnN0YW5jZSgpKSB7XG4gICAgJHIuZ2V0SW5zdGFuY2UoKT8udXBkYXRlQ2FsbGJhY2tzKGZvcm1DYWxsYmFja3MuZ2V0KTtcbiAgfVxuICByZXR1cm4gZm9ybUNhbGxiYWNrcy5nZXQ7XG59O1xuXG5jb25zdCBGT1JNX1RBUkdFVCA9IFwib3Bfb2pzX2Zvcm1cIjtcbmNvbnN0IEVsZW1lbnRzRm9ybSA9IChwcm9wcykgPT4ge1xuICBjb25zdCBbb3BGb3JtLCBzZXRPcEZvcm1dID0gdXNlU3RhdGUoKTtcbiAgY29uc3QgW2VsZW1lbnRzQ29udGV4dFZhbHVlLCBzZXRFbGVtZW50c0NvbnRleHRWYWx1ZV0gPSB1c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgW2xvYWRlZCwgc2V0TG9hZGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2FwcGxlUGF5UmVzdWx0LCBzZXRBcHBsZVBheVJlc3VsdF0gPSB1c2VTdGF0ZShNT0JJTEVfV0FMTEVUX0xPQURJTkdfU1RBVEUpO1xuICBjb25zdCBbZ29vZ2xlUGF5UmVzdWx0LCBzZXRHb29nbGVQYXlSZXN1bHRdID0gdXNlU3RhdGUoTU9CSUxFX1dBTExFVF9MT0FESU5HX1NUQVRFKTtcbiAgY29uc3QgW3N0cmlwZUxpbmtDdHJsLCBzZXRTdHJpcGVMaW5rQ3RybF0gPSB1c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgW2xvb3BDb25maWcsIHNldExvb3BDb25maWddID0gdXNlU3RhdGUoTE9PUF9MT0FESU5HKTtcbiAgY29uc3QgW2FpcndhbGxleCwgc2V0QWlyd2FsbGV4XSA9IHVzZVN0YXRlKHtcbiAgICBnb29nbGVQYXk6IEFXWF9MT0FESU5HLFxuICAgIGFwcGxlUGF5OiBBV1hfTE9BRElOR1xuICB9KTtcbiAgY29uc3QgZm9ybUNhbGxiYWNrcyA9IHVzZVJlYWN0aXZlRm9ybUNhbGxiYWNrcyh7XG4gICAgLi4ucHJvcHMsXG4gICAgb25Mb2FkOiAodG90YWxBbW91bnRBdG9tcywgY3VycmVuY3kpID0+IHtcbiAgICAgIHNldExvYWRlZCh0cnVlKTtcbiAgICAgIHByb3BzLm9uTG9hZD8uKHRvdGFsQW1vdW50QXRvbXMsIGN1cnJlbmN5KTtcbiAgICAgIGlmIChvcEZvcm0pIHtcbiAgICAgICAgY29uc3QgYXBwbGVQYXlSZXN1bHQyID0gZ2V0QXBwbGVQYXlQcm9jZXNzb3JzKG9wRm9ybS5pbml0Rmxvd3MpO1xuICAgICAgICBzZXRBcHBsZVBheVJlc3VsdChhcHBsZVBheVJlc3VsdDIpO1xuICAgICAgICBjb25zdCBnb29nbGVQYXlSZXN1bHQyID0gZ2V0R29vZ2xlUGF5UHJvY2Vzc29ycyhvcEZvcm0uaW5pdEZsb3dzKTtcbiAgICAgICAgc2V0R29vZ2xlUGF5UmVzdWx0KGdvb2dsZVBheVJlc3VsdDIpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKG9wRm9ybSkgcmV0dXJuO1xuICAgIGNvbnN0IGZvcm0gPSAkci5nZXRJbnN0YW5jZSgpID8/IG5ldyAkcih7XG4gICAgICBjaGVja291dFNlY3VyZVRva2VuOiBwcm9wcy5jaGVja291dFNlY3VyZVRva2VuLFxuICAgICAgZm9ybVRhcmdldDogYCMke0ZPUk1fVEFSR0VUfWAsXG4gICAgICBiYXNlVXJsOiBwcm9wcy5iYXNlVXJsLFxuICAgICAgY3VzdG9tSW5pdFBhcmFtczogcHJvcHMuY3VzdG9tSW5pdFBhcmFtcyxcbiAgICAgIGFsbG93VHJhY2luZzogcHJvcHMuYWxsb3dUcmFjaW5nID8/IGZhbHNlLFxuICAgICAgcHJldmVudE5hdmlnYXRpb25EdXJpbmdTdWJtaXNzaW9uOiBwcm9wcy5wcmV2ZW50TmF2aWdhdGlvbkR1cmluZ1N1Ym1pc3Npb24sXG4gICAgICAuLi5mb3JtQ2FsbGJhY2tzXG4gICAgfSk7XG4gICAgc2V0T3BGb3JtKGZvcm0pO1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0RWxlbWVudHNDb250ZXh0VmFsdWUoZm9ybSk7XG4gICAgc2V0RWxlbWVudHNDb250ZXh0VmFsdWUodmFsdWUpO1xuICAgIGZvcm0uaW5pdEZsb3dzLnN0cmlwZUxpbmsucHVibGlzaGVyLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcyAmJiByZXN1bHQubG9hZGVkVmFsdWUuaXNBdmFpbGFibGUpIHtcbiAgICAgICAgc2V0U3RyaXBlTGlua0N0cmwocmVzdWx0LmxvYWRlZFZhbHVlLmNvbnRyb2xsZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGZvcm0uaW5pdEZsb3dzLmxvb3AucHVibGlzaGVyLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcyAmJiByZXN1bHQubG9hZGVkVmFsdWUuaXNBdmFpbGFibGUpIHtcbiAgICAgICAgc2V0TG9vcENvbmZpZyh7XG4gICAgICAgICAgaXNBdmFpbGFibGU6IHRydWUsXG4gICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICB3aWRnZXQ6IHJlc3VsdC5sb2FkZWRWYWx1ZS53aWRnZXRQcm9wcyxcbiAgICAgICAgICBjb25maWc6IHJlc3VsdC5sb2FkZWRWYWx1ZS5pbml0TG9vcENvbm5lY3RQcm9wc1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0LmlzU3VjY2VzcyAmJiAhcmVzdWx0LmxvYWRlZFZhbHVlLmlzQXZhaWxhYmxlKSB7XG4gICAgICAgIHNldExvb3BDb25maWcoe1xuICAgICAgICAgIGlzQXZhaWxhYmxlOiBmYWxzZSxcbiAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIHdpZGdldDogbnVsbCxcbiAgICAgICAgICBjb25maWc6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZm9ybS5pbml0Rmxvd3MuYWlyd2FsbGV4R29vZ2xlUGF5LnB1Ymxpc2hlci5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MgJiYgcmVzdWx0LmxvYWRlZFZhbHVlKSB7XG4gICAgICAgIHNldEFpcndhbGxleCgocHJldikgPT4gKHtcbiAgICAgICAgICBhcHBsZVBheTogcHJldi5hcHBsZVBheSxcbiAgICAgICAgICBnb29nbGVQYXk6IHJlc3VsdC5sb2FkZWRWYWx1ZVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZm9ybS5pbml0Rmxvd3MuYWlyd2FsbGV4QXBwbGVQYXkucHVibGlzaGVyLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcyAmJiByZXN1bHQubG9hZGVkVmFsdWUpIHtcbiAgICAgICAgc2V0QWlyd2FsbGV4KChwcmV2KSA9PiAoe1xuICAgICAgICAgIGdvb2dsZVBheTogcHJldi5nb29nbGVQYXksXG4gICAgICAgICAgYXBwbGVQYXk6IHJlc3VsdC5sb2FkZWRWYWx1ZVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGZvcm0uZGVzdHJveSgpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgaWYgKCFvcEZvcm0pIHtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChGcmFnbWVudCwge30pO1xuICB9XG4gIGNvbnN0IGNoaWxkcmVuUHJvcHMgPSB7XG4gICAgc3VibWl0OiBvcEZvcm0uc3VibWl0Q2FyZCxcbiAgICBzdWJtaXRXaXRoOiBvcEZvcm0uZ2VuZXJhbFN1Ym1pdCxcbiAgICBhcHBsZVBheTogYXBwbGVQYXlSZXN1bHQsXG4gICAgZ29vZ2xlUGF5OiBnb29nbGVQYXlSZXN1bHQsXG4gICAgbG9hZGVkLFxuICAgIC8vIERpc2FibGUgZHluYW1pYyBwcmV2aWV3cyBmZWF0dXJlIGZvciBub3dcbiAgICBwcmV2aWV3OiB7XG4gICAgICBhbW91bnQ6IG51bGwsXG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgZXJyb3I6IG51bGxcbiAgICB9LFxuICAgIHN0cmlwZUxpbms6IHN0cmlwZUxpbmtDdHJsLFxuICAgIGFpcndhbGxleCxcbiAgICBsb29wOiBsb29wQ29uZmlnXG4gIH07XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KEZyYWdtZW50LCB7IGNoaWxkcmVuOiBlbGVtZW50c0NvbnRleHRWYWx1ZSA/IC8qIEBfX1BVUkVfXyAqLyBqc3goRWxlbWVudHNDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiBlbGVtZW50c0NvbnRleHRWYWx1ZSwgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXCJkaXZcIiwgeyBpZDogRk9STV9UQVJHRVQsIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lLCBjaGlsZHJlbjogcHJvcHMuY2hpbGRyZW4oY2hpbGRyZW5Qcm9wcykgfSkgfSkgOiAvKiBAX19QVVJFX18gKi8ganN4KEZyYWdtZW50LCB7fSkgfSk7XG59O1xuY29uc3QgZ2V0RWxlbWVudHNDb250ZXh0VmFsdWUgPSAob3BGb3JtKSA9PiB7XG4gIHJldHVybiB7XG4gICAgZm9ybUlkOiBvcEZvcm0uZm9ybUlkLFxuICAgIGZvcm1IZWlnaHQ6IG9wRm9ybS5mb3JtUHJvcGVydGllcy5oZWlnaHQsXG4gICAgcmVmZXJyZXI6IG9wRm9ybS5yZWZlcnJlcixcbiAgICBjaGVja291dFNlY3VyZVRva2VuOiBvcEZvcm0uY2hlY2tvdXRTZWN1cmVUb2tlbixcbiAgICByZWdpc3RlcklmcmFtZTogb3BGb3JtLnJlZ2lzdGVySWZyYW1lLFxuICAgIGJhc2VVcmw6IG9wRm9ybS5iYXNlVXJsXG4gIH07XG59O1xuXG5leHBvcnQgeyBDYXJkQ3ZjRWxlbWVudCBhcyBDLCBFbGVtZW50c0Zvcm0gYXMgRSwgRmllbGROYW1lIGFzIEYsIEh0IGFzIEgsIE1lIGFzIE0sIFBheUluRmFpbGVkIGFzIFAsIFFpIGFzIFEsIFNyIGFzIFMsIFRlIGFzIFQsIFhlIGFzIFgsIFppIGFzIFosIF9uIGFzIF8sIGFzIGFzIGEsIFogYXMgYiwgUXQgYXMgYywgZHMgYXMgZCwgZXQgYXMgZSwgZm4gYXMgZiwgWHQgYXMgZywgaG4gYXMgaCwgZXIgYXMgaSwgQ2FyZEVsZW1lbnQgYXMgaiwgQ2FyZEV4cGlyeUVsZW1lbnQgYXMgaywgQ2FyZE51bWJlckVsZW1lbnQgYXMgbCwgRW52aXJvbm1lbnQgYXMgbSwgUGF5SW5TdGF0ZSBhcyBuLCBTdWJtaXRNZXRob2RzIGFzIG8sIHBzIGFzIHAsIHZhbGlkYXRlTm9uQ2RlRm9ybUZpZWxkcyBhcyBxLCB1c2VPcGVuUGF5RWxlbWVudHMgYXMgdSwgdnQgYXMgdiwgd2UgYXMgdywgeXMgYXMgeSB9OyJdLAogICJtYXBwaW5ncyI6ICJBQUFBLFNBQVMsa0JBQUFBLFVBQXNCO0FBQy9CLFNBQVMsS0FBS0MsU0FBVztBQUN6QixPQUFPQyxR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RSxJQUFJK2tCLElBQWEsV0FBV25tQixFQUFNLFdBQVcsVUFBVUEsRUFBTSxTQUFTNG5CLENBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFvQixnQkFBQXhtQixHQUFJdW1CLElBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUM5VCxHQUNNRCxLQUEwQixDQUFDckIsT0FDeEI7QUFBQSxFQUNMLFFBQVFBLEVBQU87QUFBQSxFQUNmLFlBQVlBLEVBQU8sZUFBZTtBQUFBLEVBQ2xDLFVBQVVBLEVBQU87QUFBQSxFQUNqQixxQkFBcUJBLEVBQU87QUFBQSxFQUM1QixnQkFBZ0JBLEVBQU87QUFBQSxFQUN2QixTQUFTQSxFQUFPO0FBQ2xCOyIsCiAgIm5hbWVzIjogWyJjb25uZWN0VG9DaGlsZCIsICJ6JDEiLCAiY2hhbGsiLCAidjQiLCAianN4IiwgIkZyYWdtZW50IiwgImNyZWF0ZUNvbnRleHQiLCAidXNlQ29udGV4dCIsICJ1c2VTdGF0ZSIsICJ1c2VSZWYiLCAidXNlTWVtbyIsICJ1c2VFZmZlY3QiLCAiZml4UHJvdG8iLCAidGFyZ2V0IiwgInByb3RvdHlwZSIsICJzZXRQcm90b3R5cGVPZiIsICJmaXhTdGFjayIsICJmbiIsICJjYXB0dXJlU3RhY2tUcmFjZSIsICJfX2V4dGVuZHMkMSIsICJfZXh0ZW5kU3RhdGljcyIsICJkIiwgImIiLCAicCIsICJfXyIsICJfc3VwZXIiLCAiQ3VzdG9tRXJyb3IiLCAibWVzc2FnZSIsICJvcHRpb25zIiwgIl9uZXdUYXJnZXQiLCAiX3RoaXMiLCAiUmVxdWlyZWRTdHJpbmciLCAiT3B0aW9uYWxTdHJpbmciLCAibnVsbE9yVW5kZWZPciQxIiwgInpUeXBlIiwgIkZpZWxkTmFtZSIsICJGaWVsZE5hbWUyIiwgIkZpZWxkTmFtZUVudW0iLCAiUHJpdmF0ZUZpZWxkTmFtZSIsICJQcml2YXRlRmllbGROYW1lMiIsICJQcml2YXRlRmllbGROYW1lRW51bSIsICJBbGxGaWVsZE5hbWVzIiwgIkVsZW1lbnRUeXBlRW51bSIsICJFbGVtZW50VHlwZUVudW0yIiwgIkNoZWNrb3V0UGF5bWVudE1ldGhvZCQxIiwgIlBheW1lbnRNZXRob2RNaW5pbWFsIiwgIkJhc2VFbGVtZW50c1N0eWxlIiwgIkV2ZW50VHlwZSIsICJHZW5lcmljRXZlbnRUeXBlIiwgIkdlbmVyaWNFdmVudFBheWxvYWQiLCAiSW5wdXRFdmVudFR5cGUiLCAiSW5wdXRFdmVudFBheWxvYWQiLCAiRXJyb3JFdmVudFR5cGUiLCAiRXJyb3JFdmVudFBheWxvYWQiLCAiVmFsaWRhdGlvbkVycm9yRXZlbnRUeXBlIiwgIlZhbGlkYXRpb25FcnJvckV2ZW50UGF5bG9hZCIsICJMYXlvdXRFdmVudFBheWxvYWQiLCAiTG9hZGVkRXZlbnRQYXlsb2FkIiwgIlBheW1lbnRGbG93U3RhcnRlZEV2ZW50UGF5bG9hZCIsICJTZXR1cENoZWNrb3V0U3VjY2Vzc0V2ZW50UGF5bG9hZCIsICJSZXF1aXJlZEZvcm1GaWVsZHMiLCAiUFJGb3JtRmllbGRzIiwgIlN1Ym1pdEV2ZW50VHlwZSIsICJTdWJtaXRFdmVudFBheWxvYWQiLCAiVG9rZW5pemVTdWNjZXNzRXZlbnRQYXlsb2FkIiwgIkNoZWNrb3V0U3VjY2Vzc0V2ZW50UGF5bG9hZCIsICJFdmVudFBheWxvYWQiLCAiQ2hlY2tvdXRTdWNjZXNzUmVzcG9uc2UiLCAiRmllbGRWYWxpZGF0aW9uRXJyb3IiLCAiVG9rZW5pemVDYXJkRXJyb3JSZXNwb25zZSIsICJBV1hCYW5rIiwgIkNvbW1vbk5leHRBY3Rpb25NZXRhZGF0YSIsICJFRlRGb3JtRGF0YSIsICJCQUNTRm9ybURhdGEiLCAiU0VQQUZvcm1EYXRhIiwgIkFDSE1pY3JvRGVwb3NpdEZvcm1EYXRhIiwgIkVGVE1pY3JvRGVwb3NpdEZvcm1EYXRhIiwgIkJBQ1NNaWNyb0RlcG9zaXRGb3JtRGF0YSIsICJTRVBBTWljcm9EZXBvc2l0Rm9ybURhdGEiLCAibnVsbE9yVW5kZWZPciIsICJDb3Vwb25NaW5pbWFsIiwgIkxpbmVJdGVtIiwgIkJyYW5kU2V0dGluZ3MiLCAiQnJhbmQiLCAiQ2hlY2tvdXRQYXltZW50TWV0aG9kIiwgIlN1YnNjcmlwdGlvbkl0ZW1NaW5pbWFsIiwgIlN1YnNjcmlwdGlvbk1pbmltYWwiLCAiSW52b2ljZUl0ZW1EaXNjb3VudEFtb3VudHNNaW5pbWFsIiwgIkludm9pY2VMaW5lSXRlbU1pbmltYWwiLCAiRGlzY291bnRNaW5pbWFsIiwgIkludm9pY2VNaW5pbWFsIiwgIkNyZWF0ZVN1YnNjcmlwdGlvblJlc3BvbnNlTWluaW1hbCIsICJQcmV2aWV3Q2hlY2tvdXRSZXNwb25zZSIsICJfUGF5bWVudEZvcm1QcmVmaWxsQ29tbW9uIiwgIlBheW1lbnRGb3JtUHJlZmlsbCIsICJDb21wbGV0ZWRGb3JtUHJlZmlsbCIsICJFeHBpcmVkRm9ybVByZWZpbGwiLCAiQ29tcGxldGVBZGRyZXNzIiwgIlB5ZGFudGljVmFsaWRhdGlvbkVycm9yJDEiLCAiTmV3Q3VzdG9tZXJGaWVsZHMiLCAiUHJpY2VRdHkiLCAiQ2FydEluZm8iLCAiUHJvY2Vzc29yU3BlY2lmaWNNZXRhZGF0YSIsICJQeWRhbnRpY1ZhbGlkYXRpb25FcnJvciIsICJab2RGaWVsZEVycm9yIiwgIm1ha2VDYWxsYmFja1NhZmUiLCAiY2FsbGJhY2tOYW1lIiwgImVycm9yTG9nZ2VyIiwgImFyZ3MiLCAiZXJyb3IiLCAiY3JlYXRlT2pzRmxvd0xvZ2dlcnMiLCAicHJlZml4IiwgImxvZyIsICJlcnIiLCAiZXh0ZW5kU3RhdGljcyIsICJfX2V4dGVuZHMiLCAiX19hd2FpdGVyIiwgInRoaXNBcmciLCAiX2FyZ3VtZW50cyIsICJQIiwgImdlbmVyYXRvciIsICJhZG9wdCIsICJ2YWx1ZSIsICJyZXNvbHZlIiwgInJlamVjdCIsICJmdWxmaWxsZWQiLCAic3RlcCIsICJlIiwgInJlamVjdGVkIiwgInJlc3VsdCIsICJfX2dlbmVyYXRvciIsICJib2R5IiwgIl8iLCAidCIsICJmIiwgInkiLCAiZyIsICJ2ZXJiIiwgIm4iLCAidiIsICJvcCIsICJfX3ZhbHVlcyIsICJvIiwgInMiLCAibSIsICJpIiwgIl9fcmVhZCIsICJyIiwgImFyIiwgIl9fc3ByZWFkQXJyYXkiLCAidG8iLCAiZnJvbSIsICJwYWNrIiwgImwiLCAiX19hd2FpdCIsICJfX2FzeW5jR2VuZXJhdG9yIiwgInEiLCAiYXdhaXRSZXR1cm4iLCAiYSIsICJyZXN1bWUiLCAic2V0dGxlIiwgImZ1bGZpbGwiLCAiX19hc3luY1ZhbHVlcyIsICJpc0Z1bmN0aW9uIiwgInZhbHVlIiwgImNyZWF0ZUVycm9yQ2xhc3MiLCAiY3JlYXRlSW1wbCIsICJfc3VwZXIiLCAiaW5zdGFuY2UiLCAiY3RvckZ1bmMiLCAiVW5zdWJzY3JpcHRpb25FcnJvciIsICJlcnJvcnMiLCAiZXJyIiwgImFyclJlbW92ZSIsICJhcnIiLCAiaXRlbSIsICJpbmRleCIsICJTdWJzY3JpcHRpb24iLCAiaW5pdGlhbFRlYXJkb3duIiwgImVfMSIsICJfYSIsICJlXzIiLCAiX2IiLCAiX3BhcmVudGFnZSIsICJfcGFyZW50YWdlXzEiLCAiX192YWx1ZXMiLCAiX3BhcmVudGFnZV8xXzEiLCAicGFyZW50XzEiLCAiZV8xXzEiLCAiaW5pdGlhbEZpbmFsaXplciIsICJlIiwgIl9maW5hbGl6ZXJzIiwgIl9maW5hbGl6ZXJzXzEiLCAiX2ZpbmFsaXplcnNfMV8xIiwgImZpbmFsaXplciIsICJleGVjRmluYWxpemVyIiwgIl9fc3ByZWFkQXJyYXkiLCAiX19yZWFkIiwgImVfMl8xIiwgInRlYXJkb3duIiwgInBhcmVudCIsICJlbXB0eSIsICJFTVBUWV9TVUJTQ1JJUFRJT04iLCAiaXNTdWJzY3JpcHRpb24iLCAiY29uZmlnIiwgInRpbWVvdXRQcm92aWRlciIsICJoYW5kbGVyIiwgInRpbWVvdXQiLCAiYXJncyIsICJfaSIsICJoYW5kbGUiLCAicmVwb3J0VW5oYW5kbGVkRXJyb3IiLCAibm9vcCIsICJlcnJvckNvbnRleHQiLCAiY2IiLCAiU3Vic2NyaWJlciIsICJfX2V4dGVuZHMiLCAiZGVzdGluYXRpb24iLCAiX3RoaXMiLCAiRU1QVFlfT0JTRVJWRVIiLCAibmV4dCIsICJlcnJvciIsICJjb21wbGV0ZSIsICJTYWZlU3Vic2NyaWJlciIsICJDb25zdW1lck9ic2VydmVyIiwgInBhcnRpYWxPYnNlcnZlciIsICJoYW5kbGVVbmhhbmRsZWRFcnJvciIsICJvYnNlcnZlck9yTmV4dCIsICJkZWZhdWx0RXJyb3JIYW5kbGVyIiwgIm9ic2VydmFibGUiLCAiaWRlbnRpdHkiLCAieCIsICJwaXBlRnJvbUFycmF5IiwgImZucyIsICJpbnB1dCIsICJwcmV2IiwgImZuIiwgIk9ic2VydmFibGUiLCAic3Vic2NyaWJlIiwgIm9wZXJhdG9yIiwgInN1YnNjcmliZXIiLCAiaXNTdWJzY3JpYmVyIiwgInNvdXJjZSIsICJzaW5rIiwgInByb21pc2VDdG9yIiwgImdldFByb21pc2VDdG9yIiwgInJlc29sdmUiLCAicmVqZWN0IiwgIm9wZXJhdGlvbnMiLCAiaXNPYnNlcnZlciIsICJoYXNMaWZ0IiwgIm9wZXJhdGUiLCAiaW5pdCIsICJsaWZ0ZWRTb3VyY2UiLCAiY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyIiwgIm9uTmV4dCIsICJvbkNvbXBsZXRlIiwgIm9uRXJyb3IiLCAib25GaW5hbGl6ZSIsICJPcGVyYXRvclN1YnNjcmliZXIiLCAic2hvdWxkVW5zdWJzY3JpYmUiLCAiY2xvc2VkXzEiLCAiT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IiLCAiU3ViamVjdCIsICJzdWJqZWN0IiwgIkFub255bW91c1N1YmplY3QiLCAiX2MiLCAib2JzZXJ2ZXIiLCAib2JzZXJ2ZXJzIiwgImhhc0Vycm9yIiwgImlzU3RvcHBlZCIsICJ0aHJvd25FcnJvciIsICJkYXRlVGltZXN0YW1wUHJvdmlkZXIiLCAiQWN0aW9uIiwgInNjaGVkdWxlciIsICJ3b3JrIiwgInN0YXRlIiwgImRlbGF5IiwgImludGVydmFsUHJvdmlkZXIiLCAiQXN5bmNBY3Rpb24iLCAiaWQiLCAiX2lkIiwgIl9zY2hlZHVsZXIiLCAiX2RlbGF5IiwgImVycm9yZWQiLCAiZXJyb3JWYWx1ZSIsICJhY3Rpb25zIiwgIlNjaGVkdWxlciIsICJzY2hlZHVsZXJBY3Rpb25DdG9yIiwgIm5vdyIsICJBc3luY1NjaGVkdWxlciIsICJTY2hlZHVsZXJBY3Rpb24iLCAiYWN0aW9uIiwgImFzeW5jU2NoZWR1bGVyIiwgImlzQXJyYXlMaWtlIiwgImlzUHJvbWlzZSIsICJpc0ludGVyb3BPYnNlcnZhYmxlIiwgImlzQXN5bmNJdGVyYWJsZSIsICJvYmoiLCAiY3JlYXRlSW52YWxpZE9ic2VydmFibGVUeXBlRXJyb3IiLCAiZ2V0U3ltYm9sSXRlcmF0b3IiLCAiaXRlcmF0b3IiLCAiaXNJdGVyYWJsZSIsICJyZWFkYWJsZVN0cmVhbUxpa2VUb0FzeW5jR2VuZXJhdG9yIiwgInJlYWRhYmxlU3RyZWFtIiwgIl9fYXN5bmNHZW5lcmF0b3IiLCAicmVhZGVyIiwgImRvbmUiLCAiX19nZW5lcmF0b3IiLCAiX19hd2FpdCIsICJpc1JlYWRhYmxlU3RyZWFtTGlrZSIsICJpbm5lckZyb20iLCAiZnJvbUludGVyb3BPYnNlcnZhYmxlIiwgImZyb21BcnJheUxpa2UiLCAiZnJvbVByb21pc2UiLCAiZnJvbUFzeW5jSXRlcmFibGUiLCAiZnJvbUl0ZXJhYmxlIiwgImZyb21SZWFkYWJsZVN0cmVhbUxpa2UiLCAib2JzIiwgImFycmF5IiwgImkiLCAicHJvbWlzZSIsICJpdGVyYWJsZSIsICJpdGVyYWJsZV8xIiwgIml0ZXJhYmxlXzFfMSIsICJhc3luY0l0ZXJhYmxlIiwgInByb2Nlc3MiLCAiYXN5bmNJdGVyYWJsZV8xIiwgImFzeW5jSXRlcmFibGVfMV8xIiwgIl9fYXdhaXRlciIsICJfX2FzeW5jVmFsdWVzIiwgImV4ZWN1dGVTY2hlZHVsZSIsICJwYXJlbnRTdWJzY3JpcHRpb24iLCAicmVwZWF0IiwgInNjaGVkdWxlU3Vic2NyaXB0aW9uIiwgInRocm93RXJyb3IiLCAiZXJyb3JPckVycm9yRmFjdG9yeSIsICJlcnJvckZhY3RvcnkiLCAiRW1wdHlFcnJvciIsICJsYXN0VmFsdWVGcm9tIiwgIl9oYXNWYWx1ZSIsICJfdmFsdWUiLCAiaXNWYWxpZERhdGUiLCAiVGltZW91dEVycm9yIiwgImluZm8iLCAic2NoZWR1bGVyQXJnIiwgImZpcnN0IiwgImVhY2giLCAiX3dpdGgiLCAidGltZW91dEVycm9yRmFjdG9yeSIsICJfZCIsICJtZXRhIiwgIm9yaWdpbmFsU291cmNlU3Vic2NyaXB0aW9uIiwgInRpbWVyU3Vic2NyaXB0aW9uIiwgImxhc3RWYWx1ZSIsICJzZWVuIiwgInN0YXJ0VGltZXIiLCAiTG9hZGVkT25jZVB1Ymxpc2hlciIsICJlcnJNc2ciLCAidmFsdWVJZk5vdExvYWRlZCIsICJzdWJzY3JpcHRpb24iLCAidGltZW91dENvbmZpZyIsICJhc3NlcnROZXZlciIsICJ0aW1lb3V0UGFyYW1zIiwgInokMSIsICJjb25udG9CYXNlVXJscyIsICJnZXRDb25udG9VcmwiLCAiZW52IiwgImdldFdpbmRvd1NhZmUiLCAibWV0cmljc1B1Ymxpc2hlciIsICJNRVRSSUNTX1FVRVVFX0tFWSIsICJNQVhfUkVUUllfQVRURU1QVFMiLCAiQkFUQ0hfU0laRSIsICJCQVRDSF9JTlRFUlZBTF9NUyIsICJsb2dfXyQxIiwgImNyZWF0ZU9qc0Zsb3dMb2dnZXJzIiwgIk1ldHJpY3NRdWV1ZSIsICJldmVudE5hbWUiLCAicHJvcGVydGllcyIsICJjb250ZXh0UHJvcGVydGllcyIsICJldmVudCIsICJ2NCIsICJzdG9yZWRRdWV1ZSIsICJzYWZlV2luZG93IiwgImNvbnRleHQiLCAiYmF0Y2giLCAiYmF0Y2hQYXlsb2FkIiwgImNvbm50b1VybCIsICJtZXRyaWNzUm91dGVyIiwgImV2ZW50c1RvS2VlcCIsICJleHRyYWN0SXNzdWVzUGVyRmllbGQiLCAiaXNzdWVzUGVyRmllbGQiLCAia2V5IiwgImZpZWxkTmFtZSIsICJGaWVsZE5hbWVFbnVtIiwgImxvZ19fIiwgImVycl9fJDEiLCAiY3JlYXRlRHluYW1pY1ZhbGlkYXRpb25TY2hlbWEiLCAicmVxdWlyZV96aXBfY29kZSIsICJyZXF1aXJlX2Z1bGxfYmlsbGluZ19hZGRyZXNzIiwgInJlcXVpcmVfZnVsbF9zaGlwcGluZ19hZGRyZXNzIiwgInBheW1lbnRfbWV0aG9kIiwgImNvbmRpdGlvbmFsRmllbGRzIiwgIkZpZWxkTmFtZSIsICJSZXF1aXJlZFN0cmluZyIsICJSZXF1aXJlZEZvcm1GaWVsZHMiLCAidmFsaWRhdGVOb25DZGVGb3JtRmllbGRzIiwgIm5vbkNkZUZvcm1JbnB1dHMiLCAib25WYWxpZGF0aW9uRXJyb3IiLCAiZGVmYXVsdEZpZWxkVmFsdWVzIiwgImtleXMiLCAicmVzdWx0IiwgImZvcm1hdHRlZCIsICJpc3N1ZXMiLCAiaXNzdWVLZXlzIiwgIlBheW1lbnRQcm9jZXNzb3IiLCAiQVdYX0xPQURJTkciLCAiQWR5ZW5FbnZpcm9ubWVudCIsICJudWxsT3JVbmRlZk9yJDEiLCAiRW52aXJvbm1lbnQiLCAiRW52aXJvbm1lbnQyIiwgIlBheUluRmFpbGVkIiwgIlBheUluRmFpbGVkMiIsICJQYXlJblN0YXRlIiwgIlBheUluU3RhdGUyIiwgIkxPT1BfTE9BRElORyIsICJlcnJfXyIsICJPcHRpb25hbEZuIiwgIlpvZEZvcm1DYWxsYmFja3MiLCAiX0Zvcm1DYWxsYmFja3MiLCAicmF3Q2FsbGJhY2tzIiwgInJhd0NhbGxiYWNrIiwgInNhZmVDYWxsYmFjayIsICJtYWtlQ2FsbGJhY2tTYWZlIiwgIkZvcm1DYWxsYmFja3MiLCAiU3VibWl0TWV0aG9kcyIsICJTdWJtaXRNZXRob2RzMiIsICJNT0JJTEVfV0FMTEVUX0xPQURJTkdfU1RBVEUiLCAiZ2V0QXBwbGVQYXlQcm9jZXNzb3JzIiwgImluaXRGbG93cyIsICJhcHBsZVBheUluaXRGbG93cyIsICJhcHBsZVBheUluaXRSZXN1bHRzIiwgImZsb3ciLCAiZmxvd1ZhbHVlIiwgInN0cmlwZVBSRmxvd1Jlc3VsdCIsICJjdXN0b21QYXJhbXMiLCAic3RhcnRBcHBsZVBheUZsb3ciLCAiZ2V0R29vZ2xlUGF5UHJvY2Vzc29ycyIsICJnb29nbGVQYXlJbml0Rmxvd3MiLCAiZ29vZ2xlUGF5SW5pdFJlc3VsdHMiLCAic3RhcnRHb29nbGVQYXlGbG93IiwgImluaXRSZXN1bHRzIiwgImF2YWlsYWJsZUZsb3ciLCAiY29udmVydFN0eWxlc1RvUXVlcnlTdHJpbmciLCAic3R5bGVzIiwgIkVsZW1lbnRzQ29udGV4dCIsICJjcmVhdGVDb250ZXh0IiwgInVzZU9wZW5QYXlFbGVtZW50cyIsICJ1c2VDb250ZXh0IiwgIkVsZW1lbnRGcmFtZSIsICJwcm9wcyIsICJlbGVtZW50VHlwZSIsICJmb3JtSWQiLCAicmVmZXJyZXIiLCAiZm9ybUhlaWdodCIsICJjaGVja291dFNlY3VyZVRva2VuIiwgInJlZ2lzdGVySWZyYW1lIiwgImJhc2VVcmwiLCAic3ViUGF0aCIsICJoYXNMb2FkZWQiLCAic2V0SGFzTG9hZGVkIiwgInVzZVN0YXRlIiwgImlmcmFtZVJlZiIsICJ1c2VSZWYiLCAiZWxlbWVudFN0eWxlIiwgInVzZU1lbW8iLCAiZnJhbWVTdHlsZSIsICJxdWVyeVN0cmluZyIsICJwYXJhbXMiLCAidXNlRWZmZWN0IiwgImpzeCIsICJ1cmwiLCAiQ2FyZEVsZW1lbnQiLCAiRWxlbWVudFR5cGVFbnVtIiwgIkNhcmRDdmNFbGVtZW50IiwgIkNhcmRFeHBpcnlFbGVtZW50IiwgIkNhcmROdW1iZXJFbGVtZW50IiwgInVvIiwgInQiLCAiciIsICJwbyIsICJtbyIsICJuIiwgInMiLCAiX28iLCAibyIsICJBIiwgImIiLCAicCIsICJWciIsICJxciIsICJ6ciIsICJCciIsICJkZSIsICJmbyIsICJFdCIsICJ5byIsICJDdCIsICJuZSIsICJobyIsICJnbyIsICJ3byIsICJ2byIsICJibyIsICJQbyIsICJFbyIsICJDbyIsICJTbyIsICJrbyIsICJBbyIsICJJbyIsICJGZSIsICJSbyIsICJUbyIsICJObyIsICJGbyIsICJMbyIsICJNbyIsICJ4byIsICJaZSIsICJEbyIsICJPbyIsICJVbyIsICJOIiwgIkhyIiwgImpvIiwgIiRvIiwgIllyIiwgIkdvIiwgIlZvIiwgInFvIiwgInpvIiwgIkJvIiwgIkhvIiwgIllvIiwgIldvIiwgIkpvIiwgIlpvIiwgIlAiLCAiS28iLCAiV3IiLCAiSnIiLCAiUW8iLCAiWG8iLCAiT2UiLCAiZWEiLCAidGEiLCAiWnIiLCAicmEiLCAibmEiLCAib2EiLCAibXIiLCAiS3IiLCAiX3IiLCAiUXIiLCAiYWEiLCAiaWEiLCAiZnQiLCAiWHIiLCAic2EiLCAiY2EiLCAibGEiLCAiZW4iLCAidWEiLCAidG4iLCAiZGEiLCAicGEiLCAibWEiLCAiZmEiLCAieWEiLCAiaGEiLCAiZ2EiLCAid2EiLCAidmEiLCAiVnQiLCAiYmEiLCAiUGEiLCAiRWEiLCAiSyIsICJDYSIsICJTYSIsICJybiIsICJrYSIsICJBYSIsICJ6IiwgImciLCAiQWkiLCAiRW4iLCAibWUiLCAiSSIsICJjaGFsayIsICJxdCIsICJ2ZSIsICJJYSIsICJmIiwgIm5uIiwgIkxlIiwgInl0IiwgImh0IiwgIlJlIiwgIlJhIiwgIm0iLCAieSIsICJoIiwgInciLCAiRSIsICJfIiwgIlRhIiwgIkciLCAiU3QiLCAieHQiLCAiZ3QiLCAicnQiLCAiZnIiLCAib24iLCAiYW4iLCAiTmEiLCAiRmEiLCAic24iLCAieXIiLCAicHQiLCAiSnQiLCAieGEiLCAienQiLCAiTGEiLCAic3QiLCAiTWEiLCAiWnQiLCAiRGEiLCAiT2EiLCAicGUiLCAiamEiLCAiaHIiLCAiVWEiLCAiJGEiLCAiR2EiLCAiVmEiLCAicWEiLCAiemEiLCAiY24iLCAiZ3IiLCAiQmEiLCAiSGEiLCAid3IiLCAiWWEiLCAidnIiLCAiV2EiLCAiSmEiLCAiWmEiLCAiS2EiLCAiUWEiLCAiWGEiLCAiZWkiLCAidGkiLCAicmkiLCAibmkiLCAib2kiLCAiYWkiLCAiaWkiLCAic2kiLCAiY2kiLCAibGkiLCAibG4iLCAidWkiLCAiZGkiLCAicGkiLCAibWkiLCAiZmkiLCAieWkiLCAiaGkiLCAiZ2kiLCAid2kiLCAidmkiLCAidiIsICJDIiwgIldlIiwgIm50IiwgImJyIiwgImJpIiwgIlBpIiwgIkR0IiwgInVuIiwgImt0IiwgIiQiLCAiQnQiLCAiUHIiLCAiRWkiLCAiQ2kiLCAiU2kiLCAiY3QiLCAia2kiLCAiYyIsICJLdCIsICJkbiIsICJwbiIsICJ3dCIsICJJaSIsICJtbiIsICJSaSIsICJUaSIsICJOaSIsICJGaSIsICJMaSIsICJBdCIsICJFciIsICJJdCIsICJNaSIsICJ4aSIsICJEaSIsICJPaSIsICJVaSIsICJqaSIsICJDZSIsICJDciIsICIkaSIsICJsIiwgInUiLCAiZCIsICJHaSIsICJWaSIsICJLZSIsICJRZSIsICJRdCIsICJYZSIsICJYdCIsICJxaSIsICJ6aSIsICJCaSIsICJHZSIsICJaIiwgIkhpIiwgIllpIiwgIldpIiwgIkppIiwgInZ0IiwgIlppIiwgIktpIiwgIlFpIiwgIlhpIiwgImVzIiwgInRzIiwgInJzIiwgIm5zIiwgIk90IiwgIm9zIiwgImVyIiwgIkh0IiwgIl9uIiwgImFzIiwgIkplIiwgInRyIiwgInJyIiwgImlzIiwgIm5yIiwgInNzIiwgImNzIiwgInluIiwgImxzIiwgInVzIiwgImRzIiwgInBzIiwgImhuIiwgIm1zIiwgIlV0IiwgImduIiwgIl9zIiwgImZzIiwgInlzIiwgImhzIiwgImdzIiwgIlNyIiwgImV0IiwgIndlIiwgIlRlIiwgImp0IiwgIndzIiwgIk1lIiwgInZzIiwgImx0IiwgInduIiwgIkIiLCAiUHMiLCAiYnMiLCAiRXMiLCAiTSIsICJYIiwgInZuIiwgIkNzIiwgIkQiLCAiU3MiLCAia3MiLCAiQXMiLCAiX2UiLCAiYm4iLCAia3IiLCAiSXMiLCAib3IiLCAiUG4iLCAiUnMiLCAiY29ubmVjdFRvQ2hpbGQiLCAiUnQiLCAiVHMiLCAiTnMiLCAiRnMiLCAiQ24iLCAiU24iLCAiYnQiLCAiTHMiLCAia24iLCAiQXIiLCAiU2UiLCAiemUiLCAiTXMiLCAieHMiLCAiRHMiLCAianMiLCAiT3MiLCAiVXMiLCAiJHMiLCAiQW4iLCAiSW4iLCAiR3MiLCAiVnMiLCAiVSIsICJxcyIsICJ6cyIsICJvdCIsICJUdCIsICJOdCIsICJCcyIsICJIcyIsICJGdCIsICJSbiIsICJMdCIsICJhciIsICJUbiIsICJmZSIsICJObiIsICJZcyIsICJGbiIsICJvZSIsICJXcyIsICJKcyIsICJacyIsICJLcyIsICJRcyIsICJYcyIsICJWIiwgIkxuIiwgIk1uIiwgImF0IiwgInEiLCAiVyIsICJhZSIsICJPIiwgInhuIiwgIlVlIiwgImlyIiwgIiR0IiwgInNyIiwgImplIiwgIiRlIiwgImNyIiwgImhlIiwgImVjIiwgInRjIiwgIlMiLCAiVmUiLCAicmMiLCAibmMiLCAiZ2UiLCAib2MiLCAiYWMiLCAiaWMiLCAibHIiLCAic2MiLCAiY2MiLCAiRG4iLCAibGMiLCAiT24iLCAiVW4iLCAiam4iLCAidXIiLCAiZHIiLCAidWMiLCAiZGMiLCAicHIiLCAicGMiLCAibWMiLCAieGUiLCAidHQiLCAiJG4iLCAiZmMiLCAieWMiLCAiSXIiLCAiaGMiLCAiZ2MiLCAid2MiLCAiR24iLCAiVm4iLCAicW4iLCAiem4iLCAidmMiLCAiYmMiLCAiUGMiLCAic28iLCAiQmUiLCAiQm4iLCAiRWMiLCAiRiIsICJDYyIsICJyZSIsICJBZSIsICJTYyIsICJrYyIsICJSIiwgImsiLCAicWUiLCAiQWMiLCAiSWMiLCAibXQiLCAiUmMiLCAiVGMiLCAiTmMiLCAiSGUiLCAiSG4iLCAiRmMiLCAiTGMiLCAiUSIsICJJZSIsICJNYyIsICJ4YyIsICJZbiIsICJXbiIsICJEYyIsICJPYyIsICJfdCIsICJKbiIsICJVYyIsICJqYyIsICJFZSIsICJZZSIsICIkYyIsICJHYyIsICJ1dCIsICJWYyIsICJxYyIsICJ6YyIsICJCYyIsICJOZSIsICJabiIsICJLbiIsICJIYyIsICJZYyIsICJXYyIsICJKYyIsICJRbiIsICJaYyIsICJYbiIsICJLYyIsICJRYyIsICJlbyIsICJZdCIsICJYYyIsICJlbCIsICJSciIsICJ0bCIsICJ0byIsICJybCIsICJubCIsICJrZSIsICJQdCIsICJvbCIsICJybyIsICJhbCIsICJjbCIsICJpbCIsICJzbCIsICJvbyIsICJubyIsICJMIiwgIlRyIiwgImxsIiwgInllIiwgInVsIiwgImRsIiwgInBsIiwgIkgiLCAibWwiLCAiX2wiLCAiZmwiLCAiYmUiLCAieWwiLCAiYW8iLCAiaGwiLCAiZ2wiLCAiaWUiLCAiTnIiLCAiaW8iLCAid2wiLCAidmwiLCAiZHQiLCAiaiIsICJGciIsICJibCIsICJQbCIsICJFbCIsICJNdCIsICJrbCIsICJDbCIsICJTbCIsICJZIiwgIkFsIiwgIklsIiwgIlJsIiwgImNlIiwgIlRsIiwgIkZsIiwgIk5sIiwgIkxsIiwgIk1sIiwgInhsIiwgImVlIiwgIkRsIiwgIk9sIiwgIlVsIiwgInRlIiwgIkxyIiwgImxlIiwgIld0IiwgImpsIiwgIiRsIiwgIkdsIiwgIlQiLCAiUGUiLCAiTXIiLCAiVmwiLCAieHIiLCAicWwiLCAiemwiLCAiR3QiLCAiQmwiLCAiSGwiLCAiWWwiLCAiRHIiLCAibG8iLCAiV2wiLCAiY28iLCAiSmwiLCAiT3IiLCAiWmwiLCAiS2wiLCAiUWwiLCAiVXIiLCAianIiLCAic2UiLCAiSiIsICJ1ZSIsICIkciIsICJ1c2VSZWFjdGl2ZUZvcm1DYWxsYmFja3MiLCAiZm9ybUNhbGxiYWNrcyIsICJGT1JNX1RBUkdFVCIsICJFbGVtZW50c0Zvcm0iLCAib3BGb3JtIiwgInNldE9wRm9ybSIsICJlbGVtZW50c0NvbnRleHRWYWx1ZSIsICJzZXRFbGVtZW50c0NvbnRleHRWYWx1ZSIsICJsb2FkZWQiLCAic2V0TG9hZGVkIiwgImFwcGxlUGF5UmVzdWx0IiwgInNldEFwcGxlUGF5UmVzdWx0IiwgImdvb2dsZVBheVJlc3VsdCIsICJzZXRHb29nbGVQYXlSZXN1bHQiLCAic3RyaXBlTGlua0N0cmwiLCAic2V0U3RyaXBlTGlua0N0cmwiLCAibG9vcENvbmZpZyIsICJzZXRMb29wQ29uZmlnIiwgImFpcndhbGxleCIsICJzZXRBaXJ3YWxsZXgiLCAidG90YWxBbW91bnRBdG9tcyIsICJjdXJyZW5jeSIsICJhcHBsZVBheVJlc3VsdDIiLCAiZ29vZ2xlUGF5UmVzdWx0MiIsICJmb3JtIiwgImdldEVsZW1lbnRzQ29udGV4dFZhbHVlIiwgIkZyYWdtZW50IiwgImNoaWxkcmVuUHJvcHMiXQp9Cg==