@xbstracts/medusa-coupons 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/.medusa/server/src/admin/index.js +3207 -0
  2. package/.medusa/server/src/admin/index.mjs +3253 -0
  3. package/.medusa/server/src/api/admin/coupon-products/[product_id]/entitlements/route.js +9 -0
  4. package/.medusa/server/src/api/admin/coupon-products/[product_id]/mirror-promotion/route.js +132 -0
  5. package/.medusa/server/src/api/admin/coupon-products/[product_id]/preview/route.js +28 -0
  6. package/.medusa/server/src/api/admin/coupon-products/[product_id]/route.js +18 -0
  7. package/.medusa/server/src/api/admin/coupon-products/[product_id]/variants/[variant_config_id]/route.js +14 -0
  8. package/.medusa/server/src/api/admin/coupon-products/[product_id]/variants/route.js +14 -0
  9. package/.medusa/server/src/api/admin/coupon-products/configs/[id]/route.js +53 -0
  10. package/.medusa/server/src/api/admin/coupon-products/configs/[id]/variants/[variant_config_id]/route.js +26 -0
  11. package/.medusa/server/src/api/admin/coupon-products/configs/[id]/variants/route.js +27 -0
  12. package/.medusa/server/src/api/admin/coupon-products/configs/route.js +36 -0
  13. package/.medusa/server/src/api/admin/coupon-products/entitlements/[id]/cancel/route.js +15 -0
  14. package/.medusa/server/src/api/admin/coupon-products/entitlements/[id]/redeem/route.js +15 -0
  15. package/.medusa/server/src/api/admin/coupon-products/entitlements/[id]/route.js +16 -0
  16. package/.medusa/server/src/api/admin/coupon-products/entitlements/route.js +22 -0
  17. package/.medusa/server/src/api/admin/coupon-products/options/route.js +9 -0
  18. package/.medusa/server/src/api/admin/coupon-products/products/route.js +16 -0
  19. package/.medusa/server/src/api/admin/coupon-products/route.js +13 -0
  20. package/.medusa/server/src/api/admin/coupon-products/uploads/route.js +7 -0
  21. package/.medusa/server/src/api/coupon-product-routes.js +546 -0
  22. package/.medusa/server/src/api/entitlement-utils.js +90 -0
  23. package/.medusa/server/src/api/media-upload.js +57 -0
  24. package/.medusa/server/src/api/middlewares.js +92 -0
  25. package/.medusa/server/src/api/product-utils.js +304 -0
  26. package/.medusa/server/src/api/promotion-code-resolver.js +225 -0
  27. package/.medusa/server/src/api/seller-utils.js +101 -0
  28. package/.medusa/server/src/api/utils.js +25 -0
  29. package/.medusa/server/src/api/validators.js +199 -0
  30. package/.medusa/server/src/api/vendor/coupon-products/[product_id]/entitlements/route.js +9 -0
  31. package/.medusa/server/src/api/vendor/coupon-products/[product_id]/route.js +18 -0
  32. package/.medusa/server/src/api/vendor/coupon-products/[product_id]/variants/[variant_config_id]/route.js +14 -0
  33. package/.medusa/server/src/api/vendor/coupon-products/[product_id]/variants/route.js +14 -0
  34. package/.medusa/server/src/api/vendor/coupon-products/configs/[id]/route.js +60 -0
  35. package/.medusa/server/src/api/vendor/coupon-products/configs/[id]/variants/[variant_config_id]/route.js +41 -0
  36. package/.medusa/server/src/api/vendor/coupon-products/configs/[id]/variants/route.js +45 -0
  37. package/.medusa/server/src/api/vendor/coupon-products/configs/route.js +51 -0
  38. package/.medusa/server/src/api/vendor/coupon-products/entitlements/[id]/route.js +25 -0
  39. package/.medusa/server/src/api/vendor/coupon-products/entitlements/route.js +45 -0
  40. package/.medusa/server/src/api/vendor/coupon-products/options/route.js +9 -0
  41. package/.medusa/server/src/api/vendor/coupon-products/products/route.js +19 -0
  42. package/.medusa/server/src/api/vendor/coupon-products/route.js +13 -0
  43. package/.medusa/server/src/api/vendor/coupon-products/uploads/route.js +7 -0
  44. package/.medusa/server/src/jobs/retry-coupon-media-deletes.js +14 -0
  45. package/.medusa/server/src/links/coupon-issuance-order-line-item.js +17 -0
  46. package/.medusa/server/src/links/coupon-issuance-order.js +15 -0
  47. package/.medusa/server/src/links/coupon-product-config-product.js +17 -0
  48. package/.medusa/server/src/links/coupon-product-variant-config-variant.js +17 -0
  49. package/.medusa/server/src/links/coupon-promotion-mirror-promotion.js +17 -0
  50. package/.medusa/server/src/links/customer-coupon-entitlement-customer.js +15 -0
  51. package/.medusa/server/src/modules/coupon/constants.js +46 -0
  52. package/.medusa/server/src/modules/coupon/index.js +16 -0
  53. package/.medusa/server/src/modules/coupon/loaders/reconcile-coupon-products.js +65 -0
  54. package/.medusa/server/src/modules/coupon/migrations/Migration20260709000000.js +40 -0
  55. package/.medusa/server/src/modules/coupon/migrations/Migration20260710000000.js +22 -0
  56. package/.medusa/server/src/modules/coupon/migrations/Migration20260711000000.js +25 -0
  57. package/.medusa/server/src/modules/coupon/migrations/Migration20260712000000.js +78 -0
  58. package/.medusa/server/src/modules/coupon/migrations/Migration20260719000000.js +19 -0
  59. package/.medusa/server/src/modules/coupon/migrations/Migration20260722000000.js +17 -0
  60. package/.medusa/server/src/modules/coupon/migrations/Migration20260723000000.js +18 -0
  61. package/.medusa/server/src/modules/coupon/models/coupon-entitlement-promotion.js +31 -0
  62. package/.medusa/server/src/modules/coupon/models/coupon-entitlement-seller.js +28 -0
  63. package/.medusa/server/src/modules/coupon/models/coupon-issuance.js +35 -0
  64. package/.medusa/server/src/modules/coupon/models/coupon-media-asset.js +41 -0
  65. package/.medusa/server/src/modules/coupon/models/coupon-product-config.js +45 -0
  66. package/.medusa/server/src/modules/coupon/models/coupon-product-variant-config.js +36 -0
  67. package/.medusa/server/src/modules/coupon/models/coupon-promotion-mirror.js +27 -0
  68. package/.medusa/server/src/modules/coupon/models/customer-coupon-entitlement.js +56 -0
  69. package/.medusa/server/src/modules/coupon/models/index.js +23 -0
  70. package/.medusa/server/src/modules/coupon/payment-order-utils.js +76 -0
  71. package/.medusa/server/src/modules/coupon/product-metadata.js +24 -0
  72. package/.medusa/server/src/modules/coupon/purchase-conditions.js +138 -0
  73. package/.medusa/server/src/modules/coupon/service.js +628 -0
  74. package/.medusa/server/src/modules/coupon/types.js +3 -0
  75. package/.medusa/server/src/modules/coupon/utils.js +302 -0
  76. package/.medusa/server/src/subscribers/issue-coupons-from-order.js +88 -0
  77. package/.medusa/server/src/vendor/index.mjs +3237 -0
  78. package/.medusa/server/src/workflows/hooks/validate-coupon-add-to-cart.js +13 -0
  79. package/.medusa/server/src/workflows/hooks/validate-coupon-complete-cart.js +8 -0
  80. package/.medusa/server/src/workflows/index.js +21 -0
  81. package/.medusa/server/src/workflows/steps.js +27 -0
  82. package/.medusa/server/src/workflows/validate-coupon-purchase.js +85 -0
  83. package/README.md +84 -0
  84. package/package.json +102 -0
@@ -0,0 +1,3237 @@
1
+ // src/vendor/i18n/en.json
2
+ var en_default = {
3
+ coupons: {
4
+ menu: "Coupons",
5
+ productsMenu: "Coupon Products"
6
+ }
7
+ };
8
+
9
+ // src/vendor/i18n/index.ts
10
+ var i18n_default = {
11
+ en: {
12
+ translation: en_default
13
+ }
14
+ };
15
+
16
+ // src/vendor/routes/coupons/page.tsx
17
+ import { ReceiptPercent } from "@medusajs/icons";
18
+
19
+ // src/dashboard/coupons/coupon-manager.tsx
20
+ import {
21
+ useCallback as useCallback2,
22
+ useEffect as useEffect2,
23
+ useMemo as useMemo2,
24
+ useState as useState2
25
+ } from "react";
26
+ import {
27
+ ArrowPath as ArrowPath2,
28
+ PencilSquare as PencilSquare2,
29
+ Plus as Plus2,
30
+ ShoppingCart,
31
+ Trash as Trash2,
32
+ TriangleRightMini
33
+ } from "@medusajs/icons";
34
+ import {
35
+ Button as Button2,
36
+ Container as Container2,
37
+ Copy,
38
+ CurrencyInput as CurrencyInput2,
39
+ FocusModal as FocusModal2,
40
+ Heading as Heading2,
41
+ Input as Input2,
42
+ Label as Label2,
43
+ ProgressTabs as ProgressTabs2,
44
+ Select as Select2,
45
+ StatusBadge as StatusBadge2,
46
+ Switch as Switch2,
47
+ Table as Table2,
48
+ Tabs,
49
+ Text as Text3,
50
+ Textarea as Textarea2,
51
+ toast as toast2,
52
+ usePrompt as usePrompt2
53
+ } from "@medusajs/ui";
54
+
55
+ // src/dashboard/coupons/coupon-products-page.tsx
56
+ import {
57
+ useCallback,
58
+ useEffect,
59
+ useMemo,
60
+ useRef,
61
+ useState
62
+ } from "react";
63
+ import {
64
+ Adjustments,
65
+ ArrowPath,
66
+ ArrowUpTray,
67
+ InformationCircle,
68
+ PencilSquare,
69
+ Plus,
70
+ TaxExclusive,
71
+ TaxInclusive,
72
+ Trash,
73
+ XMarkMini
74
+ } from "@medusajs/icons";
75
+ import {
76
+ Button,
77
+ Checkbox,
78
+ Container,
79
+ CurrencyInput,
80
+ Divider,
81
+ DropdownMenu,
82
+ Drawer,
83
+ FocusModal,
84
+ Heading,
85
+ Input,
86
+ Label,
87
+ ProgressTabs,
88
+ RadioGroup,
89
+ Select,
90
+ StatusBadge,
91
+ Switch,
92
+ Table,
93
+ Text as Text2,
94
+ Textarea,
95
+ Tooltip,
96
+ toast,
97
+ usePrompt
98
+ } from "@medusajs/ui";
99
+
100
+ // src/dashboard/coupons/empty-state.tsx
101
+ import { Text } from "@medusajs/ui";
102
+ import { jsx, jsxs } from "react/jsx-runtime";
103
+ function CouponEmptyState({
104
+ description,
105
+ title
106
+ }) {
107
+ return /* @__PURE__ */ jsx("div", { className: "flex w-full flex-1 flex-col overflow-hidden", children: /* @__PURE__ */ jsx("div", { className: "flex min-h-[250px] w-full flex-1 flex-col items-center justify-center px-6 py-4", children: /* @__PURE__ */ jsxs("div", { className: "flex size-full flex-col items-center justify-center gap-2 text-center", children: [
108
+ /* @__PURE__ */ jsx(Text, { weight: "plus", children: title }),
109
+ description ? /* @__PURE__ */ jsx(Text, { children: description }) : null
110
+ ] }) }) });
111
+ }
112
+
113
+ // src/dashboard/coupons/coupon-products-page.tsx
114
+ import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
115
+ var NONE = "__none__";
116
+ var allSteps = ["details", "organize", "campaign", "prices"];
117
+ var conditionAttributes = [
118
+ { value: "customer.groups.id", label: "Customer Group" },
119
+ { value: "region.id", label: "Region" },
120
+ { value: "shipping_address.country_code", label: "Country" },
121
+ { value: "sales_channel_id", label: "Sales Channel" },
122
+ { value: "currency_code", label: "Currency Code" }
123
+ ];
124
+ var conditionOperators = [
125
+ { value: "in", label: "In" },
126
+ { value: "eq", label: "Equals" },
127
+ { value: "ne", label: "Not In" }
128
+ ];
129
+ var typeChoices = [
130
+ {
131
+ value: "amount_off_products",
132
+ label: "Amount off products",
133
+ description: "Discount specific products or a collection of products"
134
+ },
135
+ {
136
+ value: "amount_off_order",
137
+ label: "Amount off order",
138
+ description: "Discount the total order amount"
139
+ },
140
+ {
141
+ value: "percentage_off_product",
142
+ label: "Percentage off product",
143
+ description: "Discount a percentage off selected products"
144
+ },
145
+ {
146
+ value: "percentage_off_order",
147
+ label: "Percentage off order",
148
+ description: "Discount a percentage off the total order amount"
149
+ },
150
+ {
151
+ value: "buy_x_get_y",
152
+ label: "Buy X Get Y",
153
+ description: "Issue a Buy X Get Y coupon entitlement"
154
+ },
155
+ {
156
+ value: "free_shipping",
157
+ label: "Free shipping",
158
+ description: "Apply a 100% discount to shipping fees"
159
+ }
160
+ ];
161
+ var statusChoices = [
162
+ {
163
+ value: "draft",
164
+ label: "Draft",
165
+ description: "Customers will not be able to use the code yet"
166
+ },
167
+ {
168
+ value: "active",
169
+ label: "Active",
170
+ description: "Customers will be able to use the code"
171
+ },
172
+ {
173
+ value: "inactive",
174
+ label: "Inactive",
175
+ description: "Keep the promotion unavailable until reactivated"
176
+ }
177
+ ];
178
+ function backendUrl() {
179
+ return typeof __BACKEND_URL__ === "string" ? __BACKEND_URL__.replace(/\/$/, "") : "";
180
+ }
181
+ function apiErrorMessage(payload, fallback) {
182
+ return [payload?.message, payload?.error?.message, payload?.error].find(
183
+ (candidate) => typeof candidate === "string" && candidate.trim()
184
+ ) || fallback || "Request failed";
185
+ }
186
+ async function apiFetch(path, options = {}) {
187
+ const response = await fetch(`${backendUrl()}${path}`, {
188
+ ...options,
189
+ credentials: "include",
190
+ headers: {
191
+ ...options.body ? { "Content-Type": "application/json" } : {},
192
+ ...options.headers
193
+ }
194
+ });
195
+ if (!response.ok) {
196
+ const payload = await response.json().catch(() => null);
197
+ throw new Error(apiErrorMessage(payload, response.statusText));
198
+ }
199
+ return response.json();
200
+ }
201
+ function optionLabel(option) {
202
+ return option.name || option.title || option.value || option.handle || option.id;
203
+ }
204
+ function numberOrNull(value) {
205
+ const parsed = Number(value);
206
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : null;
207
+ }
208
+ function nonNegativeNumberOrNull(value) {
209
+ if (!value.trim()) return null;
210
+ const parsed = Number(value);
211
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : null;
212
+ }
213
+ function toDateTimeLocal(value) {
214
+ if (!value) return "";
215
+ const date = new Date(value);
216
+ if (Number.isNaN(date.getTime())) return "";
217
+ const localDate = new Date(date.getTime() - date.getTimezoneOffset() * 6e4);
218
+ return localDate.toISOString().slice(0, 16);
219
+ }
220
+ function currencyDecimalDigits(code) {
221
+ try {
222
+ return new Intl.NumberFormat("en", {
223
+ style: "currency",
224
+ currency: code.toUpperCase()
225
+ }).resolvedOptions().maximumFractionDigits;
226
+ } catch {
227
+ return 2;
228
+ }
229
+ }
230
+ function currencySymbol(code) {
231
+ if (!code) return "";
232
+ try {
233
+ return new Intl.NumberFormat("en", {
234
+ style: "currency",
235
+ currency: code.toUpperCase(),
236
+ currencyDisplay: "narrowSymbol"
237
+ }).formatToParts(0).find((part) => part.type === "currency")?.value || code.toUpperCase();
238
+ } catch {
239
+ return code.toUpperCase();
240
+ }
241
+ }
242
+ function couponTypeFromConfig(config3) {
243
+ if (config3.benefit_type === "percentage") {
244
+ return config3.promotion_template?.application_method?.target_type === "order" ? "percentage_off_order" : "percentage_off_product";
245
+ }
246
+ if (config3.benefit_type === "buy_get") return "buy_x_get_y";
247
+ if (config3.benefit_type === "free_shipping") return "free_shipping";
248
+ return config3.promotion_template?.application_method?.target_type === "order" ? "amount_off_order" : "amount_off_products";
249
+ }
250
+ function benefitTypeFromCouponType(type) {
251
+ if (type === "percentage_off_product" || type === "percentage_off_order") return "percentage";
252
+ if (type === "buy_x_get_y") return "buy_get";
253
+ if (type === "free_shipping") return "free_shipping";
254
+ return "fixed_amount";
255
+ }
256
+ function couponTypeLabel(config3) {
257
+ return typeChoices.find(
258
+ (choice) => choice.value === couponTypeFromConfig(config3)
259
+ )?.label;
260
+ }
261
+ function couponStatusColor(status) {
262
+ if (status === "active") return "green";
263
+ if (status === "inactive") return "orange";
264
+ return "grey";
265
+ }
266
+ function productStatusFromCouponStatus(status) {
267
+ return status === "active" ? "published" : "draft";
268
+ }
269
+ function campaignLabel(config3) {
270
+ const name = config3.campaign_snapshot?.name;
271
+ return typeof name === "string" && name ? name : config3.campaign_id || "None";
272
+ }
273
+ function defaultCurrency(options) {
274
+ return options.currencies?.find((currency) => currency.is_default)?.code || options.currencies?.[0]?.code || "";
275
+ }
276
+ function conditionKey(prefix = "condition") {
277
+ return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
278
+ }
279
+ function isAmountCouponType(type) {
280
+ return type === "amount_off_products" || type === "amount_off_order";
281
+ }
282
+ function effectiveCouponCurrencies(conditions, currencies) {
283
+ const condition = conditions.find(
284
+ (item) => item.attribute === "currency_code"
285
+ );
286
+ if (!condition || !condition.operator) return [];
287
+ const selected = new Set(condition.values);
288
+ const supported = currencies.map((currency) => currency.code);
289
+ return condition.operator === "ne" ? supported.filter((code) => !selected.has(code)) : supported.filter((code) => selected.has(code));
290
+ }
291
+ function reconcileCouponAmounts(current, currencyCodes) {
292
+ const byCurrency = Object.fromEntries(
293
+ current.map((row) => [row.currency_code, row])
294
+ );
295
+ return currencyCodes.map((currencyCode) => ({
296
+ key: byCurrency[currencyCode]?.key || conditionKey("coupon-value"),
297
+ currency_code: currencyCode,
298
+ amount: byCurrency[currencyCode]?.amount || ""
299
+ }));
300
+ }
301
+ function defaultPurchaseConditions(options) {
302
+ const currencyCode = defaultCurrency(options);
303
+ return currencyCode ? [
304
+ {
305
+ key: conditionKey("currency"),
306
+ attribute: "currency_code",
307
+ operator: "eq",
308
+ values: [currencyCode]
309
+ }
310
+ ] : [];
311
+ }
312
+ function emptyProduct(options) {
313
+ return {
314
+ title: "",
315
+ subtitle: "",
316
+ handle: "",
317
+ description: "",
318
+ media: [],
319
+ sku: "",
320
+ price_amounts: Object.fromEntries(
321
+ (options.currencies || []).map((currency) => [currency.code, ""])
322
+ ),
323
+ status: "draft",
324
+ discountable: false,
325
+ seller_id: "",
326
+ type_id: "",
327
+ collection_id: "",
328
+ category_id: "",
329
+ tag_id: ""
330
+ };
331
+ }
332
+ function emptyCoupon(options) {
333
+ const currencyCode = defaultCurrency(options);
334
+ const purchaseConditions = defaultPurchaseConditions(options);
335
+ return {
336
+ enabled: true,
337
+ type: "amount_off_products",
338
+ purchase_conditions: purchaseConditions,
339
+ amounts: currencyCode ? [
340
+ {
341
+ key: "coupon-value-default",
342
+ currency_code: currencyCode,
343
+ amount: ""
344
+ }
345
+ ] : [],
346
+ percentage: "",
347
+ allocation: "each",
348
+ code_strategy: "unique_code",
349
+ code_prefix: "COUPON",
350
+ shared_code: "",
351
+ expiration_type: "duration",
352
+ expiration_days: "30",
353
+ expiration_date: "",
354
+ expiration_cap_by_campaign: true,
355
+ expiration_cap_at: "",
356
+ max_issuance_per_order_item: "1",
357
+ promotion_mirror_mode: "none",
358
+ promotion_status: "draft"
359
+ };
360
+ }
361
+ var emptyCampaign = {
362
+ mode: "none",
363
+ campaign_id: "",
364
+ name: "",
365
+ campaign_identifier: "",
366
+ starts_at: "",
367
+ ends_at: ""
368
+ };
369
+ function formsFromRow(row, options) {
370
+ const product = row.product;
371
+ const config3 = row.coupon_product_config;
372
+ const variant = product.variants?.[0];
373
+ const prices = Object.fromEntries(
374
+ (variant?.prices || []).filter((price) => price.currency_code).map((price) => [
375
+ String(price.currency_code).toLowerCase(),
376
+ price.amount == null ? "" : String(price.amount)
377
+ ])
378
+ );
379
+ const media = Array.from(
380
+ new Map(
381
+ [
382
+ ...product.thumbnail ? [
383
+ {
384
+ url: product.thumbnail,
385
+ asset_id: product.thumbnail_asset_id || void 0
386
+ }
387
+ ] : [],
388
+ ...(product.images || []).filter((image) => image.url).map((image) => ({
389
+ url: String(image.url),
390
+ asset_id: image.asset_id || void 0
391
+ }))
392
+ ].map((item) => [item.url, item])
393
+ ).values()
394
+ );
395
+ const configuredAmounts = Array.isArray(config3.amounts) && config3.amounts.length ? config3.amounts : config3.amount != null && config3.currency_code ? [{ amount: config3.amount, currency_code: config3.currency_code }] : [];
396
+ const configuredConditions = (config3.purchase_conditions || []).map(
397
+ (condition, index) => ({
398
+ key: `condition-${index}`,
399
+ attribute: condition.attribute,
400
+ operator: condition.operator,
401
+ values: condition.values.map(
402
+ (value) => condition.attribute === "currency_code" || condition.attribute === "shipping_address.country_code" ? value.toLowerCase() : value
403
+ )
404
+ })
405
+ );
406
+ if (!configuredConditions.some(
407
+ (condition) => condition.attribute === "currency_code"
408
+ ) && config3.benefit_type === "fixed_amount" && configuredAmounts.length) {
409
+ configuredConditions.push({
410
+ key: "condition-legacy-currency",
411
+ attribute: "currency_code",
412
+ operator: configuredAmounts.length === 1 ? "eq" : "in",
413
+ values: configuredAmounts.map(
414
+ (amount) => amount.currency_code.toLowerCase()
415
+ )
416
+ });
417
+ }
418
+ if (!configuredConditions.some(
419
+ (condition) => condition.attribute === "sales_channel_id"
420
+ ) && product.sales_channels?.length) {
421
+ configuredConditions.push({
422
+ key: "condition-legacy-sales-channel",
423
+ attribute: "sales_channel_id",
424
+ operator: product.sales_channels.length === 1 ? "eq" : "in",
425
+ values: product.sales_channels.map((channel) => channel.id)
426
+ });
427
+ }
428
+ const expirationPolicy = config3.expiration_policy;
429
+ const configuredAmountRows = configuredAmounts.map((row2, index) => ({
430
+ key: `coupon-value-${index}`,
431
+ amount: String(row2.amount),
432
+ currency_code: row2.currency_code.toLowerCase()
433
+ }));
434
+ const amountRows = config3.benefit_type === "fixed_amount" ? reconcileCouponAmounts(
435
+ configuredAmountRows,
436
+ effectiveCouponCurrencies(configuredConditions, options.currencies || [])
437
+ ) : configuredAmountRows;
438
+ return {
439
+ product: {
440
+ ...emptyProduct(options),
441
+ title: product.title || "",
442
+ subtitle: product.subtitle || "",
443
+ handle: product.handle || "",
444
+ description: product.description || "",
445
+ media,
446
+ sku: variant?.sku || "",
447
+ price_amounts: {
448
+ ...emptyProduct(options).price_amounts,
449
+ ...prices
450
+ },
451
+ status: product.status || "draft",
452
+ discountable: Boolean(product.discountable),
453
+ type_id: product.type_id || "",
454
+ collection_id: product.collection_id || "",
455
+ category_id: product.categories?.[0]?.id || "",
456
+ tag_id: product.tags?.[0]?.id || ""
457
+ },
458
+ coupon: {
459
+ ...emptyCoupon(options),
460
+ enabled: config3.enabled,
461
+ type: couponTypeFromConfig(config3),
462
+ purchase_conditions: configuredConditions,
463
+ amounts: config3.benefit_type === "fixed_amount" ? amountRows : amountRows.length ? amountRows : emptyCoupon(options).amounts,
464
+ percentage: config3.percentage == null ? "" : String(config3.percentage),
465
+ allocation: config3.promotion_template?.application_method?.allocation === "once" ? "once" : "each",
466
+ code_strategy: config3.code_strategy,
467
+ code_prefix: config3.code_prefix || "",
468
+ shared_code: config3.shared_code || "",
469
+ expiration_type: config3.expiration_policy?.type || "duration",
470
+ expiration_days: config3.expiration_policy?.type === "duration" ? String(config3.expiration_policy.duration_days) : "30",
471
+ expiration_date: config3.expiration_policy?.type === "fixed" ? toDateTimeLocal(config3.expiration_policy.expires_at) : "",
472
+ expiration_cap_by_campaign: expirationPolicy.type === "none" || expirationPolicy.cap_by_campaign !== false,
473
+ expiration_cap_at: expirationPolicy.type === "none" ? "" : toDateTimeLocal(expirationPolicy.cap_at),
474
+ max_issuance_per_order_item: String(
475
+ config3.max_issuance_per_order_item || 1
476
+ ),
477
+ promotion_mirror_mode: config3.promotion_mirror_mode || "none",
478
+ promotion_status: config3.promotion_status || "draft"
479
+ },
480
+ campaign: {
481
+ ...emptyCampaign,
482
+ mode: config3.campaign_id ? "existing" : "none",
483
+ campaign_id: config3.campaign_id || ""
484
+ }
485
+ };
486
+ }
487
+ var modalContentStyle = {
488
+ display: "flex",
489
+ flexDirection: "column",
490
+ overflow: "hidden"
491
+ };
492
+ var modalWizardStyle = {
493
+ display: "flex",
494
+ flex: "1 1 auto",
495
+ flexDirection: "column",
496
+ minHeight: 0,
497
+ overflow: "hidden"
498
+ };
499
+ var visuallyHiddenStyle = {
500
+ clip: "rect(0 0 0 0)",
501
+ clipPath: "inset(50%)",
502
+ height: 1,
503
+ overflow: "hidden",
504
+ position: "absolute",
505
+ whiteSpace: "nowrap",
506
+ width: 1
507
+ };
508
+ var modalBodyStyle = {
509
+ flex: "1 1 auto",
510
+ minHeight: 0,
511
+ padding: 0
512
+ };
513
+ var modalScrollStyle = {
514
+ height: "100%",
515
+ overflowY: "auto",
516
+ padding: "64px 24px 112px",
517
+ width: "100%"
518
+ };
519
+ var modalFormStyle = {
520
+ margin: "0 auto",
521
+ maxWidth: 720,
522
+ width: "min(720px, 100%)"
523
+ };
524
+ var stackStyle = {
525
+ display: "flex",
526
+ flexDirection: "column",
527
+ gap: 24
528
+ };
529
+ var twoColumnGridStyle = {
530
+ display: "grid",
531
+ gap: 16,
532
+ gridTemplateColumns: "repeat(auto-fit, minmax(260px, 1fr))"
533
+ };
534
+ var threeColumnGridStyle = {
535
+ display: "grid",
536
+ gap: 16,
537
+ gridTemplateColumns: "repeat(auto-fit, minmax(180px, 1fr))"
538
+ };
539
+ var panelStyle = {
540
+ border: "1px solid var(--border-base)",
541
+ borderRadius: 8,
542
+ padding: 16
543
+ };
544
+ function Field({
545
+ children,
546
+ label,
547
+ optional,
548
+ tooltip
549
+ }) {
550
+ return /* @__PURE__ */ jsxs2("div", { className: "flex flex-col gap-y-1", style: { minWidth: 0 }, children: [
551
+ /* @__PURE__ */ jsxs2("div", { className: "flex items-center gap-x-1", children: [
552
+ /* @__PURE__ */ jsx2(Label, { children: label }),
553
+ tooltip && /* @__PURE__ */ jsx2(Tooltip, { content: tooltip, children: /* @__PURE__ */ jsx2(
554
+ "button",
555
+ {
556
+ type: "button",
557
+ "aria-label": `${label} information`,
558
+ className: "text-ui-fg-muted",
559
+ children: /* @__PURE__ */ jsx2(InformationCircle, {})
560
+ }
561
+ ) }),
562
+ optional && /* @__PURE__ */ jsx2(Text2, { size: "small", className: "text-ui-fg-muted", children: "(Optional)" })
563
+ ] }),
564
+ children
565
+ ] });
566
+ }
567
+ function Section({
568
+ children,
569
+ description,
570
+ title
571
+ }) {
572
+ return /* @__PURE__ */ jsxs2("section", { className: "flex flex-col gap-y-4", children: [
573
+ /* @__PURE__ */ jsxs2("div", { children: [
574
+ /* @__PURE__ */ jsx2(Heading, { level: "h2", children: title }),
575
+ description && /* @__PURE__ */ jsx2(Text2, { size: "small", className: "text-ui-fg-muted", children: description })
576
+ ] }),
577
+ children
578
+ ] });
579
+ }
580
+ function OptionSelect({
581
+ onChange,
582
+ options,
583
+ value
584
+ }) {
585
+ return /* @__PURE__ */ jsxs2(
586
+ Select,
587
+ {
588
+ value: value || NONE,
589
+ onValueChange: (next) => onChange(next === NONE ? "" : next),
590
+ children: [
591
+ /* @__PURE__ */ jsx2(Select.Trigger, { children: /* @__PURE__ */ jsx2(Select.Value, {}) }),
592
+ /* @__PURE__ */ jsxs2(Select.Content, { children: [
593
+ /* @__PURE__ */ jsx2(Select.Item, { value: NONE, children: "None" }),
594
+ options.map((option) => /* @__PURE__ */ jsx2(Select.Item, { value: option.id, children: optionLabel(option) }, option.id))
595
+ ] })
596
+ ]
597
+ }
598
+ );
599
+ }
600
+ function CurrencyAmountField({
601
+ currencies,
602
+ currencyCode,
603
+ onChange,
604
+ value
605
+ }) {
606
+ const currency = currencies.find((item) => item.code === currencyCode);
607
+ const code = currencyCode.toUpperCase();
608
+ const decimals = currencyDecimalDigits(code || "USD");
609
+ return /* @__PURE__ */ jsx2(
610
+ CurrencyInput,
611
+ {
612
+ code: code || "USD",
613
+ symbol: currency?.symbol_native || currency?.symbol || currencySymbol(code || "USD"),
614
+ min: 0,
615
+ decimalScale: decimals,
616
+ decimalsLimit: decimals,
617
+ value,
618
+ disabled: !currencyCode,
619
+ onValueChange: (nextValue) => onChange(nextValue || "")
620
+ }
621
+ );
622
+ }
623
+ function PercentageInput({
624
+ onChange,
625
+ value
626
+ }) {
627
+ return /* @__PURE__ */ jsxs2("div", { className: "flex w-full items-stretch", style: { width: "100%" }, children: [
628
+ /* @__PURE__ */ jsx2(
629
+ "div",
630
+ {
631
+ className: "bg-ui-bg-field text-ui-fg-muted flex items-center border",
632
+ style: {
633
+ borderColor: "var(--border-base)",
634
+ borderRadius: "6px 0 0 6px",
635
+ borderRight: 0,
636
+ padding: "0 12px"
637
+ },
638
+ children: "%"
639
+ }
640
+ ),
641
+ /* @__PURE__ */ jsx2(
642
+ "div",
643
+ {
644
+ className: "min-w-0 flex-1",
645
+ style: { flex: "1 1 0%", minWidth: 0 },
646
+ children: /* @__PURE__ */ jsx2(
647
+ Input,
648
+ {
649
+ className: "w-full",
650
+ type: "number",
651
+ min: 1,
652
+ max: 100,
653
+ value,
654
+ style: {
655
+ borderRadius: "0 6px 6px 0",
656
+ width: "100%"
657
+ },
658
+ onChange: (event) => onChange(event.target.value)
659
+ }
660
+ )
661
+ }
662
+ )
663
+ ] });
664
+ }
665
+ function HandleInput({
666
+ onChange,
667
+ value
668
+ }) {
669
+ return /* @__PURE__ */ jsxs2("div", { className: "relative", children: [
670
+ /* @__PURE__ */ jsx2("div", { className: "text-ui-fg-muted pointer-events-none absolute inset-y-0 left-0 z-10 flex min-w-8 items-center justify-center border-r px-2.5", children: /* @__PURE__ */ jsx2("span", { className: "txt-compact-small font-medium", children: "/" }) }),
671
+ /* @__PURE__ */ jsx2(
672
+ Input,
673
+ {
674
+ value,
675
+ placeholder: "winter-jacket",
676
+ style: { paddingLeft: 34 },
677
+ onChange: (event) => onChange(event.target.value)
678
+ }
679
+ )
680
+ ] });
681
+ }
682
+ function MediaUpload({
683
+ isUploading,
684
+ media,
685
+ onRemove,
686
+ onUpload
687
+ }) {
688
+ const inputRef = useRef(null);
689
+ const accept = "image/jpeg,image/png,image/gif,image/webp,image/heic,image/svg+xml";
690
+ const handleFiles = (files) => {
691
+ if (!files?.length) return;
692
+ onUpload(Array.from(files));
693
+ };
694
+ const handleDrop = (event) => {
695
+ event.preventDefault();
696
+ handleFiles(event.dataTransfer.files);
697
+ };
698
+ return /* @__PURE__ */ jsxs2("div", { className: "flex flex-col gap-y-3", children: [
699
+ media.length > 0 && /* @__PURE__ */ jsx2(
700
+ "div",
701
+ {
702
+ className: "grid gap-3",
703
+ style: {
704
+ gridTemplateColumns: "repeat(auto-fill, minmax(120px, 1fr))"
705
+ },
706
+ children: media.map((item, index) => /* @__PURE__ */ jsxs2(
707
+ "div",
708
+ {
709
+ className: "relative overflow-hidden rounded-md border",
710
+ children: [
711
+ /* @__PURE__ */ jsx2(
712
+ "img",
713
+ {
714
+ src: item.url,
715
+ alt: "",
716
+ className: "h-32 w-full object-cover",
717
+ style: { height: 128 }
718
+ }
719
+ ),
720
+ /* @__PURE__ */ jsxs2("div", { className: "absolute inset-x-0 bottom-0 flex items-center justify-between bg-black/60 px-2 py-1", children: [
721
+ /* @__PURE__ */ jsx2(Text2, { size: "xsmall", style: { color: "white" }, children: index === 0 ? "Thumbnail" : `Image ${index + 1}` }),
722
+ /* @__PURE__ */ jsx2(
723
+ "button",
724
+ {
725
+ type: "button",
726
+ "aria-label": "Remove image",
727
+ style: { color: "white" },
728
+ onClick: () => onRemove(item),
729
+ children: /* @__PURE__ */ jsx2(XMarkMini, {})
730
+ }
731
+ )
732
+ ] })
733
+ ]
734
+ },
735
+ item.asset_id || item.url
736
+ ))
737
+ }
738
+ ),
739
+ /* @__PURE__ */ jsx2(
740
+ "input",
741
+ {
742
+ ref: inputRef,
743
+ type: "file",
744
+ hidden: true,
745
+ multiple: true,
746
+ accept,
747
+ onChange: (event) => {
748
+ handleFiles(event.target.files);
749
+ event.target.value = "";
750
+ }
751
+ }
752
+ ),
753
+ /* @__PURE__ */ jsxs2(
754
+ "button",
755
+ {
756
+ type: "button",
757
+ disabled: isUploading,
758
+ className: "text-ui-fg-muted flex w-full flex-col items-center justify-center gap-y-2 rounded-md border border-dashed p-8",
759
+ style: { minHeight: 148 },
760
+ onClick: () => inputRef.current?.click(),
761
+ onDragOver: (event) => event.preventDefault(),
762
+ onDrop: handleDrop,
763
+ children: [
764
+ /* @__PURE__ */ jsxs2("span", { className: "text-ui-fg-base flex items-center gap-x-2", children: [
765
+ /* @__PURE__ */ jsx2(ArrowUpTray, {}),
766
+ isUploading ? "Uploading images..." : "Upload images"
767
+ ] }),
768
+ /* @__PURE__ */ jsx2(Text2, { size: "small", className: "text-ui-fg-muted", children: "Drag and drop images here or click to upload." })
769
+ ]
770
+ }
771
+ )
772
+ ] });
773
+ }
774
+ function conditionValueOptions(attribute, options) {
775
+ if (attribute === "currency_code") {
776
+ return (options.currencies || []).map((currency) => ({
777
+ value: currency.code,
778
+ label: `${currency.name} (${currency.code.toUpperCase()})`
779
+ }));
780
+ }
781
+ if (attribute === "shipping_address.country_code") {
782
+ return (options.countries || []).map((country) => ({
783
+ value: String(country.iso_2 || country.id).toLowerCase(),
784
+ label: country.display_name || country.name || country.id
785
+ }));
786
+ }
787
+ const records = attribute === "customer.groups.id" ? options.customer_groups : attribute === "region.id" ? options.regions : attribute === "sales_channel_id" ? options.sales_channels : [];
788
+ return (records || []).map((record) => ({
789
+ value: record.id,
790
+ label: optionLabel(record)
791
+ }));
792
+ }
793
+ function MultiConditionValues({
794
+ attribute,
795
+ onChange,
796
+ options,
797
+ value
798
+ }) {
799
+ const [open, setOpen] = useState(false);
800
+ const [draft, setDraft] = useState(value);
801
+ const [search, setSearch] = useState("");
802
+ const labels = Object.fromEntries(options.map((option) => [option.value, option.label]));
803
+ const filtered = options.filter(
804
+ (option) => option.label.toLowerCase().includes(search.trim().toLowerCase())
805
+ );
806
+ return /* @__PURE__ */ jsxs2(Fragment, { children: [
807
+ /* @__PURE__ */ jsx2(
808
+ Button,
809
+ {
810
+ type: "button",
811
+ variant: "secondary",
812
+ className: "w-full justify-start",
813
+ onClick: () => {
814
+ setDraft(value);
815
+ setSearch("");
816
+ setOpen(true);
817
+ },
818
+ children: value.length ? value.length === 1 ? labels[value[0]] || value[0] : `${value.length} values selected` : "Select values"
819
+ }
820
+ ),
821
+ value.length > 0 && /* @__PURE__ */ jsx2("div", { className: "mt-2 flex flex-wrap gap-1", children: value.map((item) => /* @__PURE__ */ jsxs2(
822
+ "span",
823
+ {
824
+ className: "bg-ui-bg-component text-ui-fg-subtle flex items-center gap-x-1 rounded-md border px-2 py-1 text-xs",
825
+ children: [
826
+ labels[item] || item,
827
+ /* @__PURE__ */ jsx2(
828
+ "button",
829
+ {
830
+ type: "button",
831
+ "aria-label": `Remove ${labels[item] || item}`,
832
+ onClick: () => onChange(value.filter((entry) => entry !== item)),
833
+ children: /* @__PURE__ */ jsx2(XMarkMini, {})
834
+ }
835
+ )
836
+ ]
837
+ },
838
+ item
839
+ )) }),
840
+ /* @__PURE__ */ jsx2(Drawer, { open, onOpenChange: setOpen, children: /* @__PURE__ */ jsxs2(Drawer.Content, { children: [
841
+ /* @__PURE__ */ jsx2(Drawer.Header, { children: /* @__PURE__ */ jsxs2(Drawer.Title, { children: [
842
+ "Select ",
843
+ conditionAttributes.find((item) => item.value === attribute)?.label
844
+ ] }) }),
845
+ /* @__PURE__ */ jsxs2(Drawer.Body, { className: "flex flex-col gap-y-3 overflow-y-auto", children: [
846
+ /* @__PURE__ */ jsx2(
847
+ Input,
848
+ {
849
+ value: search,
850
+ placeholder: "Search values",
851
+ onChange: (event) => setSearch(event.target.value)
852
+ }
853
+ ),
854
+ filtered.length ? filtered.map((option) => /* @__PURE__ */ jsxs2(
855
+ "label",
856
+ {
857
+ className: "flex cursor-pointer items-center gap-x-3 rounded-md border p-3",
858
+ children: [
859
+ /* @__PURE__ */ jsx2(
860
+ Checkbox,
861
+ {
862
+ checked: draft.includes(option.value),
863
+ onCheckedChange: (checked) => setDraft(
864
+ (current) => checked ? Array.from(/* @__PURE__ */ new Set([...current, option.value])) : current.filter((value2) => value2 !== option.value)
865
+ )
866
+ }
867
+ ),
868
+ /* @__PURE__ */ jsx2(Text2, { children: option.label })
869
+ ]
870
+ },
871
+ option.value
872
+ )) : /* @__PURE__ */ jsx2(Text2, { className: "text-ui-fg-muted", children: "No matching values." })
873
+ ] }),
874
+ /* @__PURE__ */ jsxs2(Drawer.Footer, { children: [
875
+ /* @__PURE__ */ jsx2(Button, { type: "button", variant: "secondary", onClick: () => setOpen(false), children: "Cancel" }),
876
+ /* @__PURE__ */ jsx2(
877
+ Button,
878
+ {
879
+ type: "button",
880
+ disabled: !draft.length,
881
+ onClick: () => {
882
+ onChange(draft);
883
+ setOpen(false);
884
+ },
885
+ children: "Apply"
886
+ }
887
+ )
888
+ ] })
889
+ ] }) })
890
+ ] });
891
+ }
892
+ function PurchaseConditionsField({
893
+ fixedAmount,
894
+ onChange,
895
+ options,
896
+ value
897
+ }) {
898
+ const selectedAttributes = new Set(
899
+ value.map((condition) => condition.attribute).filter(Boolean)
900
+ );
901
+ const replace = (key, update) => onChange(
902
+ value.map(
903
+ (condition) => condition.key === key ? { ...condition, ...update } : condition
904
+ )
905
+ );
906
+ return /* @__PURE__ */ jsx2(
907
+ Section,
908
+ {
909
+ title: "Who can purchase this coupon?",
910
+ description: "Coupon products can be purchased by all customers when no conditions are configured. Conditions are combined with AND.",
911
+ children: /* @__PURE__ */ jsxs2("div", { className: "flex flex-col gap-y-3", children: [
912
+ value.map((condition, index) => {
913
+ const values = conditionValueOptions(condition.attribute, options);
914
+ const currencyRequired = fixedAmount && condition.attribute === "currency_code";
915
+ return /* @__PURE__ */ jsxs2("div", { children: [
916
+ index > 0 && /* @__PURE__ */ jsx2("div", { className: "text-ui-fg-muted flex h-8 items-center text-xs font-medium", children: "AND" }),
917
+ /* @__PURE__ */ jsxs2("div", { style: panelStyle, className: "relative flex flex-col gap-y-3", children: [
918
+ /* @__PURE__ */ jsxs2("div", { className: "flex items-start gap-x-2", children: [
919
+ /* @__PURE__ */ jsx2("div", { className: "flex-1", children: /* @__PURE__ */ jsxs2(
920
+ Select,
921
+ {
922
+ value: condition.attribute || void 0,
923
+ disabled: currencyRequired,
924
+ onValueChange: (attribute) => replace(condition.key, {
925
+ attribute,
926
+ operator: "",
927
+ values: []
928
+ }),
929
+ children: [
930
+ /* @__PURE__ */ jsx2(Select.Trigger, { children: /* @__PURE__ */ jsx2(Select.Value, { placeholder: "Select attribute" }) }),
931
+ /* @__PURE__ */ jsx2(Select.Content, { children: conditionAttributes.filter(
932
+ (attribute) => attribute.value === condition.attribute || !selectedAttributes.has(attribute.value)
933
+ ).map((attribute) => /* @__PURE__ */ jsx2(Select.Item, { value: attribute.value, children: attribute.label }, attribute.value)) })
934
+ ]
935
+ }
936
+ ) }),
937
+ /* @__PURE__ */ jsx2(
938
+ Button,
939
+ {
940
+ type: "button",
941
+ size: "small",
942
+ variant: "transparent",
943
+ disabled: currencyRequired,
944
+ "aria-label": "Remove condition",
945
+ onClick: () => onChange(value.filter((item) => item.key !== condition.key)),
946
+ children: /* @__PURE__ */ jsx2(XMarkMini, {})
947
+ }
948
+ )
949
+ ] }),
950
+ /* @__PURE__ */ jsxs2("div", { style: twoColumnGridStyle, children: [
951
+ /* @__PURE__ */ jsxs2(
952
+ Select,
953
+ {
954
+ value: condition.operator || void 0,
955
+ disabled: !condition.attribute,
956
+ onValueChange: (operator) => replace(condition.key, {
957
+ operator,
958
+ values: operator === "eq" ? condition.values.slice(0, 1) : condition.values
959
+ }),
960
+ children: [
961
+ /* @__PURE__ */ jsx2(Select.Trigger, { children: /* @__PURE__ */ jsx2(Select.Value, { placeholder: "Select operator" }) }),
962
+ /* @__PURE__ */ jsx2(Select.Content, { children: conditionOperators.map((operator) => /* @__PURE__ */ jsx2(Select.Item, { value: operator.value, children: operator.label }, operator.value)) })
963
+ ]
964
+ }
965
+ ),
966
+ condition.attribute && condition.operator === "eq" ? /* @__PURE__ */ jsxs2(
967
+ Select,
968
+ {
969
+ value: condition.values[0] || void 0,
970
+ onValueChange: (selected) => replace(condition.key, { values: [selected] }),
971
+ children: [
972
+ /* @__PURE__ */ jsx2(Select.Trigger, { children: /* @__PURE__ */ jsx2(Select.Value, { placeholder: "Select value" }) }),
973
+ /* @__PURE__ */ jsx2(Select.Content, { children: values.map((option) => /* @__PURE__ */ jsx2(Select.Item, { value: option.value, children: option.label }, option.value)) })
974
+ ]
975
+ }
976
+ ) : condition.attribute && condition.operator ? /* @__PURE__ */ jsx2(
977
+ MultiConditionValues,
978
+ {
979
+ attribute: condition.attribute,
980
+ options: values,
981
+ value: condition.values,
982
+ onChange: (values2) => replace(condition.key, { values: values2 })
983
+ }
984
+ ) : /* @__PURE__ */ jsx2(Button, { type: "button", variant: "secondary", disabled: true, className: "w-full", children: "Select values" })
985
+ ] })
986
+ ] })
987
+ ] }, condition.key);
988
+ }),
989
+ /* @__PURE__ */ jsxs2("div", { className: "flex items-center gap-x-2", children: [
990
+ /* @__PURE__ */ jsxs2(
991
+ Button,
992
+ {
993
+ type: "button",
994
+ variant: "secondary",
995
+ disabled: selectedAttributes.size >= conditionAttributes.length,
996
+ onClick: () => onChange([
997
+ ...value,
998
+ { key: conditionKey(), attribute: "", operator: "", values: [] }
999
+ ]),
1000
+ children: [
1001
+ /* @__PURE__ */ jsx2(Plus, {}),
1002
+ " Add condition"
1003
+ ]
1004
+ }
1005
+ ),
1006
+ /* @__PURE__ */ jsx2(
1007
+ Button,
1008
+ {
1009
+ type: "button",
1010
+ variant: "transparent",
1011
+ onClick: () => onChange(fixedAmount ? defaultPurchaseConditions(options) : []),
1012
+ children: "Clear all"
1013
+ }
1014
+ )
1015
+ ] })
1016
+ ] })
1017
+ }
1018
+ );
1019
+ }
1020
+ function ProductPricesTable({
1021
+ currencies,
1022
+ couponValue,
1023
+ onChange,
1024
+ prices
1025
+ }) {
1026
+ const [visibleCurrencies, setVisibleCurrencies] = useState(
1027
+ () => currencies.map((currency) => currency.code)
1028
+ );
1029
+ useEffect(() => {
1030
+ setVisibleCurrencies((current) => {
1031
+ const available = new Set(currencies.map((currency) => currency.code));
1032
+ const retained = current.filter((code) => available.has(code));
1033
+ const added = currencies.map((currency) => currency.code).filter((code) => !current.includes(code));
1034
+ return [...retained, ...added];
1035
+ });
1036
+ }, [currencies]);
1037
+ const shownCurrencies = currencies.filter(
1038
+ (currency) => visibleCurrencies.includes(currency.code)
1039
+ );
1040
+ return /* @__PURE__ */ jsx2("div", { className: "flex size-full flex-col divide-y overflow-hidden", children: /* @__PURE__ */ jsxs2("div", { className: "bg-ui-bg-subtle flex size-full flex-col", children: [
1041
+ /* @__PURE__ */ jsxs2("div", { className: "bg-ui-bg-base flex items-center justify-between border-b p-4", children: [
1042
+ /* @__PURE__ */ jsx2("div", { className: "flex items-center gap-x-2", children: /* @__PURE__ */ jsxs2(DropdownMenu, { children: [
1043
+ /* @__PURE__ */ jsx2(DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs2(Button, { type: "button", size: "small", variant: "secondary", children: [
1044
+ /* @__PURE__ */ jsx2(Adjustments, {}),
1045
+ "View"
1046
+ ] }) }),
1047
+ /* @__PURE__ */ jsx2(DropdownMenu.Content, { align: "start", children: currencies.map((currency) => /* @__PURE__ */ jsxs2(
1048
+ DropdownMenu.CheckboxItem,
1049
+ {
1050
+ checked: visibleCurrencies.includes(currency.code),
1051
+ onCheckedChange: (checked) => setVisibleCurrencies(
1052
+ (current) => checked ? Array.from(/* @__PURE__ */ new Set([...current, currency.code])) : current.filter((code) => code !== currency.code)
1053
+ ),
1054
+ children: [
1055
+ "Price ",
1056
+ currency.code.toUpperCase()
1057
+ ]
1058
+ },
1059
+ currency.code
1060
+ )) })
1061
+ ] }) }),
1062
+ /* @__PURE__ */ jsx2("div", { className: "flex items-center gap-x-2" })
1063
+ ] }),
1064
+ /* @__PURE__ */ jsxs2("div", { className: "size-full overflow-auto", children: [
1065
+ /* @__PURE__ */ jsxs2(
1066
+ Table,
1067
+ {
1068
+ style: {
1069
+ borderCollapse: "collapse",
1070
+ tableLayout: "fixed",
1071
+ width: "max-content"
1072
+ },
1073
+ children: [
1074
+ /* @__PURE__ */ jsx2(Table.Header, { style: { borderTop: "none" }, children: /* @__PURE__ */ jsxs2(Table.Row, { style: { height: 40 }, children: [
1075
+ /* @__PURE__ */ jsx2(
1076
+ Table.HeaderCell,
1077
+ {
1078
+ style: {
1079
+ background: "var(--bg-base)",
1080
+ borderBottom: "1px solid var(--border-base)",
1081
+ borderRight: "1px solid var(--border-base)",
1082
+ height: 40,
1083
+ left: 0,
1084
+ maxWidth: 200,
1085
+ minWidth: 200,
1086
+ padding: "0 16px",
1087
+ position: "sticky",
1088
+ width: 200,
1089
+ zIndex: 1
1090
+ },
1091
+ children: "Coupon Value"
1092
+ }
1093
+ ),
1094
+ shownCurrencies.map((currency) => /* @__PURE__ */ jsx2(
1095
+ Table.HeaderCell,
1096
+ {
1097
+ style: {
1098
+ background: "var(--bg-base)",
1099
+ borderBottom: "1px solid var(--border-base)",
1100
+ borderRight: "1px solid var(--border-base)",
1101
+ height: 40,
1102
+ maxWidth: 200,
1103
+ minWidth: 200,
1104
+ padding: "0 16px",
1105
+ width: 200
1106
+ },
1107
+ children: /* @__PURE__ */ jsxs2("div", { className: "flex w-full items-center justify-between gap-3", children: [
1108
+ /* @__PURE__ */ jsxs2("span", { className: "truncate", title: `Price ${currency.code.toUpperCase()}`, children: [
1109
+ "Price ",
1110
+ currency.code.toUpperCase()
1111
+ ] }),
1112
+ currency.is_tax_inclusive ? /* @__PURE__ */ jsx2(TaxInclusive, { className: "text-ui-fg-muted shrink-0" }) : /* @__PURE__ */ jsx2(TaxExclusive, { className: "text-ui-fg-muted shrink-0" })
1113
+ ] })
1114
+ },
1115
+ currency.code
1116
+ ))
1117
+ ] }) }),
1118
+ /* @__PURE__ */ jsx2(Table.Body, { children: /* @__PURE__ */ jsxs2(Table.Row, { className: "bg-ui-bg-subtle", style: { height: 40 }, children: [
1119
+ /* @__PURE__ */ jsx2(
1120
+ Table.Cell,
1121
+ {
1122
+ style: {
1123
+ background: "var(--bg-subtle)",
1124
+ borderBottom: "1px solid var(--border-base)",
1125
+ borderRight: "1px solid var(--border-base)",
1126
+ height: 40,
1127
+ left: 0,
1128
+ maxWidth: 200,
1129
+ minWidth: 200,
1130
+ padding: "0 16px",
1131
+ position: "sticky",
1132
+ width: 200,
1133
+ zIndex: 1
1134
+ },
1135
+ children: /* @__PURE__ */ jsx2("span", { className: "block truncate", children: couponValue })
1136
+ }
1137
+ ),
1138
+ shownCurrencies.map((currency) => /* @__PURE__ */ jsx2(
1139
+ Table.Cell,
1140
+ {
1141
+ style: {
1142
+ background: "var(--bg-base)",
1143
+ borderBottom: "1px solid var(--border-base)",
1144
+ borderRight: "1px solid var(--border-base)",
1145
+ height: 40,
1146
+ maxWidth: 200,
1147
+ minWidth: 200,
1148
+ padding: 0,
1149
+ width: 200
1150
+ },
1151
+ children: /* @__PURE__ */ jsx2(
1152
+ TablePriceInput,
1153
+ {
1154
+ currency,
1155
+ value: prices[currency.code] || "",
1156
+ onChange: (value) => onChange(currency.code, value)
1157
+ }
1158
+ )
1159
+ },
1160
+ currency.code
1161
+ ))
1162
+ ] }) })
1163
+ ]
1164
+ }
1165
+ ),
1166
+ !currencies.length && /* @__PURE__ */ jsx2("div", { className: "p-4", children: /* @__PURE__ */ jsx2(Text2, { className: "text-ui-fg-muted", children: "Add a supported currency to the store before setting prices." }) })
1167
+ ] })
1168
+ ] }) });
1169
+ }
1170
+ function formatCouponValue(coupon, currencies) {
1171
+ if (coupon.type === "amount_off_products" || coupon.type === "amount_off_order") {
1172
+ const defaultCode = currencies.find((currency) => currency.is_default)?.code || currencies[0]?.code;
1173
+ const primary = coupon.amounts.find((row) => row.currency_code === defaultCode) || coupon.amounts[0];
1174
+ const amount = numberOrNull(primary?.amount);
1175
+ if (amount == null) return "\u2014";
1176
+ const additional = Math.max(0, coupon.amounts.length - 1);
1177
+ const formatted = `${amount}${primary.currency_code.toUpperCase()}`;
1178
+ return additional ? `${formatted} +${additional}` : formatted;
1179
+ }
1180
+ if (coupon.type === "percentage_off_product" || coupon.type === "percentage_off_order") {
1181
+ const percentage = numberOrNull(coupon.percentage);
1182
+ if (percentage == null) return "\u2014";
1183
+ return coupon.type === "percentage_off_order" ? `${percentage}% off order` : `${percentage}% off products`;
1184
+ }
1185
+ return coupon.type === "free_shipping" ? "Free shipping" : "Buy X Get Y";
1186
+ }
1187
+ function TablePriceInput({
1188
+ currency,
1189
+ onChange,
1190
+ value
1191
+ }) {
1192
+ const symbol = currency.symbol_native || currency.symbol || currencySymbol(currency.code || "USD");
1193
+ return /* @__PURE__ */ jsxs2(
1194
+ "label",
1195
+ {
1196
+ className: "bg-ui-bg-base hover:bg-ui-bg-subtle focus-within:shadow-borders-interactive-with-active text-ui-fg-base",
1197
+ style: {
1198
+ alignItems: "center",
1199
+ borderRadius: 0,
1200
+ display: "flex",
1201
+ height: 40,
1202
+ margin: 0,
1203
+ overflow: "hidden",
1204
+ width: 200
1205
+ },
1206
+ children: [
1207
+ /* @__PURE__ */ jsx2(
1208
+ "span",
1209
+ {
1210
+ className: "text-ui-fg-muted",
1211
+ "aria-hidden": "true",
1212
+ style: { flex: "0 0 40px", paddingLeft: 16 },
1213
+ children: symbol
1214
+ }
1215
+ ),
1216
+ /* @__PURE__ */ jsx2(
1217
+ "input",
1218
+ {
1219
+ "aria-label": `Price ${currency.code.toUpperCase()}`,
1220
+ inputMode: "decimal",
1221
+ value,
1222
+ onChange: (event) => onChange(event.target.value),
1223
+ style: {
1224
+ appearance: "none",
1225
+ background: "transparent",
1226
+ border: 0,
1227
+ borderRadius: 0,
1228
+ flex: "1 1 auto",
1229
+ height: "100%",
1230
+ margin: 0,
1231
+ minWidth: 0,
1232
+ outline: "none",
1233
+ padding: "0 16px 0 0",
1234
+ textAlign: "right"
1235
+ },
1236
+ type: "text"
1237
+ }
1238
+ )
1239
+ ]
1240
+ }
1241
+ );
1242
+ }
1243
+ function CouponProductModal({
1244
+ allowPromotionMirror,
1245
+ apiBase,
1246
+ onOpenChange,
1247
+ onSaved,
1248
+ open,
1249
+ options,
1250
+ row
1251
+ }) {
1252
+ const [activeStep, setActiveStep] = useState("details");
1253
+ const [product, setProduct] = useState(
1254
+ () => emptyProduct(options)
1255
+ );
1256
+ const [coupon, setCoupon] = useState(
1257
+ () => emptyCoupon(options)
1258
+ );
1259
+ const [campaign, setCampaign] = useState(emptyCampaign);
1260
+ const [saving, setSaving] = useState(false);
1261
+ const [uploading, setUploading] = useState(false);
1262
+ const [furthestStepIndex, setFurthestStepIndex] = useState(0);
1263
+ const visibleSteps = useMemo(
1264
+ () => allowPromotionMirror ? allSteps : allSteps.filter((step) => step !== "campaign"),
1265
+ [allowPromotionMirror]
1266
+ );
1267
+ const currentStepIndex = visibleSteps.indexOf(activeStep);
1268
+ const currencies = options.currencies || [];
1269
+ const supportedCurrencyCodes = useMemo(
1270
+ () => new Set(currencies.map((currency) => currency.code)),
1271
+ [currencies]
1272
+ );
1273
+ const isAmountType = coupon.type === "amount_off_products" || coupon.type === "amount_off_order";
1274
+ const isPercentageType = coupon.type === "percentage_off_product" || coupon.type === "percentage_off_order";
1275
+ const isItemScopedDiscount = coupon.type === "amount_off_products" || coupon.type === "percentage_off_product";
1276
+ const effectiveCurrencies = useMemo(
1277
+ () => effectiveCouponCurrencies(coupon.purchase_conditions, currencies),
1278
+ [coupon.purchase_conditions, currencies]
1279
+ );
1280
+ const productPrices = currencies.flatMap((currency) => {
1281
+ const value = product.price_amounts[currency.code] || "";
1282
+ const amount = nonNegativeNumberOrNull(value);
1283
+ return amount == null ? [] : [{ currency_code: currency.code, amount }];
1284
+ });
1285
+ useEffect(() => {
1286
+ if (!open) return;
1287
+ const forms = row ? formsFromRow(row, options) : {
1288
+ product: emptyProduct(options),
1289
+ coupon: emptyCoupon(options),
1290
+ campaign: emptyCampaign
1291
+ };
1292
+ setProduct(forms.product);
1293
+ setCoupon(forms.coupon);
1294
+ setCampaign(forms.campaign);
1295
+ setActiveStep("details");
1296
+ setFurthestStepIndex(0);
1297
+ }, [open, row, options]);
1298
+ const updatePurchaseConditions = (purchaseConditions) => {
1299
+ setCoupon((current) => ({
1300
+ ...current,
1301
+ purchase_conditions: purchaseConditions,
1302
+ amounts: isAmountCouponType(current.type) ? reconcileCouponAmounts(
1303
+ current.amounts,
1304
+ effectiveCouponCurrencies(purchaseConditions, currencies)
1305
+ ) : current.amounts
1306
+ }));
1307
+ };
1308
+ const updateCouponType = (type) => {
1309
+ setCoupon((current) => {
1310
+ let purchaseConditions = current.purchase_conditions;
1311
+ if (isAmountCouponType(type) && !purchaseConditions.some(
1312
+ (condition) => condition.attribute === "currency_code"
1313
+ )) {
1314
+ purchaseConditions = [
1315
+ ...purchaseConditions,
1316
+ ...defaultPurchaseConditions(options)
1317
+ ];
1318
+ }
1319
+ return {
1320
+ ...current,
1321
+ type,
1322
+ purchase_conditions: purchaseConditions,
1323
+ amounts: isAmountCouponType(type) ? reconcileCouponAmounts(
1324
+ current.amounts,
1325
+ effectiveCouponCurrencies(purchaseConditions, currencies)
1326
+ ) : current.amounts,
1327
+ promotion_mirror_mode: type === "buy_x_get_y" ? "none" : current.promotion_mirror_mode
1328
+ };
1329
+ });
1330
+ };
1331
+ const uploadMedia = async (files) => {
1332
+ if (!files.length) return;
1333
+ const formData = new FormData();
1334
+ files.forEach((file) => formData.append("files", file));
1335
+ if (apiBase === "/admin" && product.seller_id) {
1336
+ formData.append("seller_id", product.seller_id);
1337
+ }
1338
+ setUploading(true);
1339
+ try {
1340
+ const response = await fetch(
1341
+ `${backendUrl()}${apiBase}/coupon-products/uploads`,
1342
+ {
1343
+ method: "POST",
1344
+ body: formData,
1345
+ credentials: "include"
1346
+ }
1347
+ );
1348
+ if (!response.ok) {
1349
+ const payload2 = await response.json().catch(() => null);
1350
+ throw new Error(apiErrorMessage(payload2, response.statusText));
1351
+ }
1352
+ const payload = await response.json();
1353
+ const uploaded = (payload.files || []).filter(
1354
+ (file) => Boolean(file.asset_id && file.url)
1355
+ ).map((file) => ({ asset_id: file.asset_id, url: file.url }));
1356
+ if (!uploaded.length)
1357
+ throw new Error("The upload did not return an image URL");
1358
+ setProduct((current) => ({
1359
+ ...current,
1360
+ media: Array.from(
1361
+ new Map(
1362
+ [...current.media, ...uploaded].map((item) => [item.url, item])
1363
+ ).values()
1364
+ )
1365
+ }));
1366
+ } catch (error) {
1367
+ toast.error(
1368
+ error instanceof Error ? error.message : "Image upload failed"
1369
+ );
1370
+ } finally {
1371
+ setUploading(false);
1372
+ }
1373
+ };
1374
+ const detailsComplete = useMemo(() => {
1375
+ if (!product.title.trim()) return false;
1376
+ if (!currencies.length) return false;
1377
+ const attributes = /* @__PURE__ */ new Set();
1378
+ for (const condition of coupon.purchase_conditions) {
1379
+ if (!condition.attribute || !condition.operator || !condition.values.length || condition.operator === "eq" && condition.values.length !== 1 || attributes.has(condition.attribute)) {
1380
+ return false;
1381
+ }
1382
+ attributes.add(condition.attribute);
1383
+ }
1384
+ if (isAmountType) {
1385
+ if (!attributes.has("currency_code")) return false;
1386
+ if (!coupon.amounts.length) return false;
1387
+ if (coupon.amounts.length !== effectiveCurrencies.length) return false;
1388
+ const seen = /* @__PURE__ */ new Set();
1389
+ for (const row2 of coupon.amounts) {
1390
+ if (!supportedCurrencyCodes.has(row2.currency_code)) return false;
1391
+ if (seen.has(row2.currency_code)) return false;
1392
+ if (numberOrNull(row2.amount) == null) return false;
1393
+ seen.add(row2.currency_code);
1394
+ }
1395
+ }
1396
+ if (isPercentageType) {
1397
+ const value = numberOrNull(coupon.percentage);
1398
+ if (value == null || value > 100) return false;
1399
+ }
1400
+ if (coupon.code_strategy === "shared_code" && !coupon.shared_code.trim()) {
1401
+ return false;
1402
+ }
1403
+ if (coupon.expiration_type === "duration") {
1404
+ const days = Number(coupon.expiration_days);
1405
+ if (!Number.isInteger(days) || days < 1) return false;
1406
+ } else if (coupon.expiration_type === "fixed") {
1407
+ const expiration = new Date(coupon.expiration_date);
1408
+ if (!coupon.expiration_date || Number.isNaN(expiration.getTime())) {
1409
+ return false;
1410
+ }
1411
+ }
1412
+ if (coupon.expiration_type !== "none" && coupon.expiration_cap_at) {
1413
+ const cap = new Date(coupon.expiration_cap_at);
1414
+ if (Number.isNaN(cap.getTime())) return false;
1415
+ }
1416
+ const maxIssuance = Number(coupon.max_issuance_per_order_item);
1417
+ return Number.isInteger(maxIssuance) && maxIssuance > 0;
1418
+ }, [
1419
+ coupon,
1420
+ currencies.length,
1421
+ effectiveCurrencies.length,
1422
+ isAmountType,
1423
+ isPercentageType,
1424
+ product.title,
1425
+ supportedCurrencyCodes
1426
+ ]);
1427
+ const campaignComplete = useMemo(() => {
1428
+ if (!allowPromotionMirror || campaign.mode === "none") return true;
1429
+ if (campaign.mode === "existing") return Boolean(campaign.campaign_id);
1430
+ if (!campaign.name.trim() || !campaign.campaign_identifier.trim()) {
1431
+ return false;
1432
+ }
1433
+ return [campaign.starts_at, campaign.ends_at].every((value) => {
1434
+ if (!value) return true;
1435
+ return !Number.isNaN(new Date(value).getTime());
1436
+ });
1437
+ }, [allowPromotionMirror, campaign]);
1438
+ const pricesComplete = useMemo(() => {
1439
+ if (!currencies.length || !productPrices.length) return false;
1440
+ return currencies.every((currency) => {
1441
+ const value = product.price_amounts[currency.code] || "";
1442
+ return !value.trim() || nonNegativeNumberOrNull(value) != null;
1443
+ });
1444
+ }, [currencies, product.price_amounts, productPrices.length]);
1445
+ const stepValidity = useMemo(
1446
+ () => ({
1447
+ details: detailsComplete,
1448
+ organize: true,
1449
+ campaign: campaignComplete,
1450
+ prices: pricesComplete
1451
+ }),
1452
+ [campaignComplete, detailsComplete, pricesComplete]
1453
+ );
1454
+ const activeStepComplete = stepValidity[activeStep];
1455
+ useEffect(() => {
1456
+ if (!open || !activeStepComplete) return;
1457
+ setFurthestStepIndex(
1458
+ (current) => Math.max(
1459
+ current,
1460
+ Math.min(currentStepIndex + 1, visibleSteps.length - 1)
1461
+ )
1462
+ );
1463
+ }, [activeStepComplete, currentStepIndex, open, visibleSteps.length]);
1464
+ const isStepDisabled = (index) => index > furthestStepIndex || visibleSteps.slice(0, index).some((previous) => !stepValidity[previous]);
1465
+ const validate = () => {
1466
+ if (!product.title.trim()) throw new Error("Product title is required");
1467
+ if (!currencies.length) {
1468
+ throw new Error("Add a supported currency to the store before continuing");
1469
+ }
1470
+ const invalidPrice = currencies.some((currency) => {
1471
+ const value = product.price_amounts[currency.code] || "";
1472
+ return value.trim() && nonNegativeNumberOrNull(value) == null;
1473
+ });
1474
+ if (invalidPrice) {
1475
+ throw new Error("Product prices must be 0 or more");
1476
+ }
1477
+ if (!productPrices.length) {
1478
+ throw new Error("Add at least one product price");
1479
+ }
1480
+ if (isAmountType) {
1481
+ if (!coupon.amounts.length) {
1482
+ throw new Error("Add at least one coupon value");
1483
+ }
1484
+ const seen = /* @__PURE__ */ new Set();
1485
+ const currencyCondition = coupon.purchase_conditions.find(
1486
+ (condition) => condition.attribute === "currency_code"
1487
+ );
1488
+ if (!currencyCondition) {
1489
+ throw new Error("Add a Currency Code purchase condition");
1490
+ }
1491
+ if (coupon.amounts.length !== effectiveCurrencies.length) {
1492
+ throw new Error(
1493
+ "Coupon values must match every effective currency condition value"
1494
+ );
1495
+ }
1496
+ for (const row2 of coupon.amounts) {
1497
+ if (!supportedCurrencyCodes.has(row2.currency_code)) {
1498
+ throw new Error("Select an available coupon currency");
1499
+ }
1500
+ if (seen.has(row2.currency_code)) {
1501
+ throw new Error("Coupon value currencies cannot be duplicated");
1502
+ }
1503
+ if (numberOrNull(row2.amount) == null) {
1504
+ throw new Error("Coupon values must be greater than 0");
1505
+ }
1506
+ seen.add(row2.currency_code);
1507
+ }
1508
+ }
1509
+ const seenAttributes = /* @__PURE__ */ new Set();
1510
+ for (const condition of coupon.purchase_conditions) {
1511
+ if (!condition.attribute || !condition.operator) {
1512
+ throw new Error("Complete every purchase condition");
1513
+ }
1514
+ if (!condition.values.length) {
1515
+ throw new Error("Select at least one value for every purchase condition");
1516
+ }
1517
+ if (condition.operator === "eq" && condition.values.length !== 1) {
1518
+ throw new Error("Equals conditions require exactly one value");
1519
+ }
1520
+ if (seenAttributes.has(condition.attribute)) {
1521
+ throw new Error("Purchase condition attributes cannot be duplicated");
1522
+ }
1523
+ seenAttributes.add(condition.attribute);
1524
+ }
1525
+ if (isPercentageType) {
1526
+ const value = numberOrNull(coupon.percentage);
1527
+ if (value == null || value > 100) {
1528
+ throw new Error("Coupon value must be between 1 and 100 percent");
1529
+ }
1530
+ }
1531
+ if (coupon.code_strategy === "shared_code" && !coupon.shared_code.trim()) {
1532
+ throw new Error("A shared coupon code is required");
1533
+ }
1534
+ if (coupon.expiration_type === "fixed") {
1535
+ const expiration = new Date(coupon.expiration_date);
1536
+ if (!coupon.expiration_date || Number.isNaN(expiration.getTime())) {
1537
+ throw new Error("A valid fixed expiration date is required");
1538
+ }
1539
+ }
1540
+ if (coupon.expiration_type !== "none" && coupon.expiration_cap_at) {
1541
+ const cap = new Date(coupon.expiration_cap_at);
1542
+ if (Number.isNaN(cap.getTime())) {
1543
+ throw new Error("A valid expiration cap date is required");
1544
+ }
1545
+ }
1546
+ if (campaign.mode === "existing" && !campaign.campaign_id) {
1547
+ throw new Error("Select an existing campaign");
1548
+ }
1549
+ if (campaign.mode === "new" && (!campaign.name.trim() || !campaign.campaign_identifier.trim())) {
1550
+ throw new Error("Campaign name and identifier are required");
1551
+ }
1552
+ };
1553
+ const save = async () => {
1554
+ setSaving(true);
1555
+ try {
1556
+ validate();
1557
+ const benefitType = benefitTypeFromCouponType(coupon.type);
1558
+ const targetType = coupon.type === "amount_off_order" || coupon.type === "percentage_off_order" ? "order" : "items";
1559
+ const payload = {
1560
+ product: {
1561
+ title: product.title.trim(),
1562
+ subtitle: product.subtitle.trim() || null,
1563
+ handle: product.handle.trim() || null,
1564
+ description: product.description.trim() || null,
1565
+ status: productStatusFromCouponStatus(coupon.promotion_status),
1566
+ thumbnail: product.media[0]?.url || null,
1567
+ thumbnail_asset_id: product.media[0]?.asset_id || null,
1568
+ images: product.media.slice(1).map((media) => ({
1569
+ url: media.url,
1570
+ ...media.asset_id ? { asset_id: media.asset_id } : {}
1571
+ })),
1572
+ discountable: product.discountable,
1573
+ type_id: product.type_id || null,
1574
+ collection_id: product.collection_id || null,
1575
+ categories: product.category_id ? [{ id: product.category_id }] : [],
1576
+ tags: product.tag_id ? [{ id: product.tag_id }] : [],
1577
+ variants: [
1578
+ {
1579
+ title: "Default",
1580
+ sku: product.sku.trim() || null,
1581
+ manage_inventory: false,
1582
+ allow_backorder: true,
1583
+ prices: productPrices
1584
+ }
1585
+ ]
1586
+ },
1587
+ coupon: {
1588
+ enabled: coupon.enabled,
1589
+ benefit_type: benefitType,
1590
+ purchase_conditions: coupon.purchase_conditions.map((condition) => ({
1591
+ attribute: condition.attribute,
1592
+ operator: condition.operator,
1593
+ values: condition.values
1594
+ })),
1595
+ amounts: isAmountType ? coupon.amounts.map((row2) => ({
1596
+ amount: numberOrNull(row2.amount),
1597
+ currency_code: row2.currency_code
1598
+ })) : null,
1599
+ amount: null,
1600
+ percentage: isPercentageType ? numberOrNull(coupon.percentage) : null,
1601
+ currency_code: null,
1602
+ code_strategy: coupon.code_strategy,
1603
+ code_prefix: coupon.code_strategy === "unique_code" ? coupon.code_prefix.trim() || "COUPON" : null,
1604
+ shared_code: coupon.code_strategy === "shared_code" ? coupon.shared_code.trim() : null,
1605
+ expiration_policy: coupon.expiration_type === "none" ? { type: "none" } : coupon.expiration_type === "fixed" ? {
1606
+ type: "fixed",
1607
+ expires_at: new Date(coupon.expiration_date).toISOString(),
1608
+ cap_by_campaign: coupon.expiration_cap_by_campaign,
1609
+ cap_at: coupon.expiration_cap_at ? new Date(coupon.expiration_cap_at).toISOString() : null
1610
+ } : {
1611
+ type: "duration",
1612
+ duration_days: Number(coupon.expiration_days) || 30,
1613
+ cap_by_campaign: coupon.expiration_cap_by_campaign,
1614
+ cap_at: coupon.expiration_cap_at ? new Date(coupon.expiration_cap_at).toISOString() : null
1615
+ },
1616
+ max_issuance_per_order_item: Number(coupon.max_issuance_per_order_item) || 1,
1617
+ promotion_template: benefitType === "fixed_amount" || benefitType === "percentage" ? {
1618
+ application_method: {
1619
+ target_type: targetType,
1620
+ allocation: targetType === "order" ? "across" : coupon.allocation
1621
+ }
1622
+ } : null,
1623
+ promotion_status: coupon.promotion_status,
1624
+ ...allowPromotionMirror ? {
1625
+ promotion_mirror_mode: benefitType === "buy_get" || benefitType === "fixed_amount" && coupon.amounts.length > 1 ? "none" : coupon.promotion_mirror_mode
1626
+ } : {}
1627
+ },
1628
+ campaign: allowPromotionMirror ? campaign.mode === "existing" ? { mode: "existing", campaign_id: campaign.campaign_id } : campaign.mode === "new" ? {
1629
+ mode: "new",
1630
+ campaign: {
1631
+ name: campaign.name,
1632
+ campaign_identifier: campaign.campaign_identifier,
1633
+ starts_at: campaign.starts_at ? new Date(campaign.starts_at).toISOString() : null,
1634
+ ends_at: campaign.ends_at ? new Date(campaign.ends_at).toISOString() : null
1635
+ }
1636
+ } : { mode: "none" } : void 0,
1637
+ seller_id: product.seller_id || null,
1638
+ variant_overrides: []
1639
+ };
1640
+ await apiFetch(
1641
+ row ? `${apiBase}/coupon-products/${row.product.id}` : `${apiBase}/coupon-products`,
1642
+ {
1643
+ method: row ? "PATCH" : "POST",
1644
+ body: JSON.stringify(payload)
1645
+ }
1646
+ );
1647
+ toast.success(row ? "Coupon product updated" : "Coupon product created");
1648
+ onOpenChange(false);
1649
+ await onSaved();
1650
+ } catch (error) {
1651
+ toast.error(
1652
+ error instanceof Error ? error.message : "Failed to save coupon product"
1653
+ );
1654
+ } finally {
1655
+ setSaving(false);
1656
+ }
1657
+ };
1658
+ const stepStatus = (step) => {
1659
+ const index = visibleSteps.indexOf(step);
1660
+ if (index < currentStepIndex && stepValidity[step]) {
1661
+ return "completed";
1662
+ }
1663
+ if (index === currentStepIndex) return "in-progress";
1664
+ return "not-started";
1665
+ };
1666
+ return /* @__PURE__ */ jsx2(FocusModal, { open, onOpenChange, children: /* @__PURE__ */ jsxs2(FocusModal.Content, { style: modalContentStyle, children: [
1667
+ /* @__PURE__ */ jsx2(FocusModal.Title, { style: visuallyHiddenStyle, children: row ? "Edit Coupon Product" : "Create Coupon Product" }),
1668
+ /* @__PURE__ */ jsxs2(
1669
+ ProgressTabs,
1670
+ {
1671
+ value: activeStep,
1672
+ onValueChange: (value) => {
1673
+ const step = value;
1674
+ const index = visibleSteps.indexOf(step);
1675
+ if (!isStepDisabled(index)) setActiveStep(step);
1676
+ },
1677
+ style: modalWizardStyle,
1678
+ children: [
1679
+ /* @__PURE__ */ jsx2(FocusModal.Header, { children: /* @__PURE__ */ jsx2("div", { className: "-my-2 w-full border-l", children: /* @__PURE__ */ jsx2(ProgressTabs.List, { className: "justify-start-start flex w-full items-center", children: visibleSteps.map((step, index) => /* @__PURE__ */ jsx2(
1680
+ ProgressTabs.Trigger,
1681
+ {
1682
+ value: step,
1683
+ status: stepStatus(step),
1684
+ disabled: isStepDisabled(index),
1685
+ className: "max-w-[200px] truncate",
1686
+ children: step[0].toUpperCase() + step.slice(1)
1687
+ },
1688
+ step
1689
+ )) }) }) }),
1690
+ /* @__PURE__ */ jsx2(FocusModal.Body, { className: "overflow-hidden p-0", style: modalBodyStyle, children: /* @__PURE__ */ jsx2(
1691
+ "div",
1692
+ {
1693
+ style: activeStep === "prices" ? { height: "100%", overflow: "hidden", width: "100%" } : modalScrollStyle,
1694
+ children: /* @__PURE__ */ jsxs2(
1695
+ "div",
1696
+ {
1697
+ style: activeStep === "prices" ? { height: "100%", width: "100%" } : modalFormStyle,
1698
+ children: [
1699
+ activeStep === "details" && /* @__PURE__ */ jsxs2(ProgressTabs.Content, { value: "details", style: stackStyle, children: [
1700
+ /* @__PURE__ */ jsx2(Heading, { level: "h1", children: row ? "Edit Coupon Product" : "Create Coupon Product" }),
1701
+ /* @__PURE__ */ jsx2(Divider, {}),
1702
+ /* @__PURE__ */ jsxs2(Section, { title: "General", children: [
1703
+ /* @__PURE__ */ jsxs2("div", { style: threeColumnGridStyle, children: [
1704
+ /* @__PURE__ */ jsx2(Field, { label: "Title", children: /* @__PURE__ */ jsx2(
1705
+ Input,
1706
+ {
1707
+ value: product.title,
1708
+ placeholder: "Winter jacket",
1709
+ onChange: (event) => setProduct((current) => ({
1710
+ ...current,
1711
+ title: event.target.value
1712
+ }))
1713
+ }
1714
+ ) }),
1715
+ /* @__PURE__ */ jsx2(Field, { label: "Subtitle", optional: true, children: /* @__PURE__ */ jsx2(
1716
+ Input,
1717
+ {
1718
+ value: product.subtitle,
1719
+ placeholder: "Warm and cozy",
1720
+ onChange: (event) => setProduct((current) => ({
1721
+ ...current,
1722
+ subtitle: event.target.value
1723
+ }))
1724
+ }
1725
+ ) }),
1726
+ /* @__PURE__ */ jsx2(
1727
+ Field,
1728
+ {
1729
+ label: "Handle",
1730
+ optional: true,
1731
+ tooltip: "The URL-friendly identifier for this product. If left empty, Medusa generates it from the title.",
1732
+ children: /* @__PURE__ */ jsx2(
1733
+ HandleInput,
1734
+ {
1735
+ value: product.handle,
1736
+ onChange: (handle) => setProduct((current) => ({ ...current, handle }))
1737
+ }
1738
+ )
1739
+ }
1740
+ )
1741
+ ] }),
1742
+ /* @__PURE__ */ jsx2(Field, { label: "Description", optional: true, children: /* @__PURE__ */ jsx2(
1743
+ Textarea,
1744
+ {
1745
+ value: product.description,
1746
+ placeholder: "A warm and cozy jacket",
1747
+ onChange: (event) => setProduct((current) => ({
1748
+ ...current,
1749
+ description: event.target.value
1750
+ }))
1751
+ }
1752
+ ) }),
1753
+ /* @__PURE__ */ jsx2(Field, { label: "Media", optional: true, children: /* @__PURE__ */ jsx2(
1754
+ MediaUpload,
1755
+ {
1756
+ isUploading: uploading,
1757
+ media: product.media,
1758
+ onUpload: (files) => void uploadMedia(files),
1759
+ onRemove: (media) => setProduct((current) => ({
1760
+ ...current,
1761
+ media: current.media.filter(
1762
+ (item) => media.asset_id && item.asset_id !== media.asset_id || !media.asset_id && item.url !== media.url
1763
+ )
1764
+ }))
1765
+ }
1766
+ ) }),
1767
+ /* @__PURE__ */ jsx2(Field, { label: "SKU", optional: true, children: /* @__PURE__ */ jsx2(
1768
+ Input,
1769
+ {
1770
+ value: product.sku,
1771
+ placeholder: "COUPON-001",
1772
+ onChange: (event) => setProduct((current) => ({
1773
+ ...current,
1774
+ sku: event.target.value
1775
+ }))
1776
+ }
1777
+ ) })
1778
+ ] }),
1779
+ /* @__PURE__ */ jsx2(Divider, {}),
1780
+ /* @__PURE__ */ jsx2(
1781
+ PurchaseConditionsField,
1782
+ {
1783
+ fixedAmount: isAmountType,
1784
+ options,
1785
+ value: coupon.purchase_conditions,
1786
+ onChange: updatePurchaseConditions
1787
+ }
1788
+ )
1789
+ ] }),
1790
+ activeStep === "organize" && /* @__PURE__ */ jsx2(ProgressTabs.Content, { value: "organize", style: stackStyle, children: /* @__PURE__ */ jsxs2(Section, { title: "Organize", children: [
1791
+ /* @__PURE__ */ jsx2("div", { style: panelStyle, children: /* @__PURE__ */ jsxs2("div", { className: "flex items-center justify-between gap-x-4", children: [
1792
+ /* @__PURE__ */ jsxs2("div", { children: [
1793
+ /* @__PURE__ */ jsx2(Text2, { weight: "plus", children: "Discountable" }),
1794
+ /* @__PURE__ */ jsx2(Text2, { size: "small", className: "text-ui-fg-muted", children: "Allow promotions to discount this product's sale price." })
1795
+ ] }),
1796
+ /* @__PURE__ */ jsx2(
1797
+ Switch,
1798
+ {
1799
+ checked: product.discountable,
1800
+ onCheckedChange: (discountable) => setProduct((current) => ({
1801
+ ...current,
1802
+ discountable: Boolean(discountable)
1803
+ }))
1804
+ }
1805
+ )
1806
+ ] }) }),
1807
+ /* @__PURE__ */ jsxs2("div", { style: twoColumnGridStyle, children: [
1808
+ allowPromotionMirror && /* @__PURE__ */ jsx2(Field, { label: "Seller", optional: true, children: /* @__PURE__ */ jsx2(
1809
+ OptionSelect,
1810
+ {
1811
+ value: product.seller_id,
1812
+ options: options.sellers || [],
1813
+ onChange: (seller_id) => setProduct((current) => ({ ...current, seller_id }))
1814
+ }
1815
+ ) }),
1816
+ /* @__PURE__ */ jsx2(Field, { label: "Type", optional: true, children: /* @__PURE__ */ jsx2(
1817
+ OptionSelect,
1818
+ {
1819
+ value: product.type_id,
1820
+ options: options.product_types || [],
1821
+ onChange: (type_id) => setProduct((current) => ({ ...current, type_id }))
1822
+ }
1823
+ ) }),
1824
+ /* @__PURE__ */ jsx2(Field, { label: "Collection", optional: true, children: /* @__PURE__ */ jsx2(
1825
+ OptionSelect,
1826
+ {
1827
+ value: product.collection_id,
1828
+ options: options.product_collections || [],
1829
+ onChange: (collection_id) => setProduct((current) => ({
1830
+ ...current,
1831
+ collection_id
1832
+ }))
1833
+ }
1834
+ ) }),
1835
+ /* @__PURE__ */ jsx2(Field, { label: "Category", optional: true, children: /* @__PURE__ */ jsx2(
1836
+ OptionSelect,
1837
+ {
1838
+ value: product.category_id,
1839
+ options: options.product_categories || [],
1840
+ onChange: (category_id) => setProduct((current) => ({ ...current, category_id }))
1841
+ }
1842
+ ) }),
1843
+ /* @__PURE__ */ jsx2(Field, { label: "Tag", optional: true, children: /* @__PURE__ */ jsx2(
1844
+ OptionSelect,
1845
+ {
1846
+ value: product.tag_id,
1847
+ options: options.product_tags || [],
1848
+ onChange: (tag_id) => setProduct((current) => ({ ...current, tag_id }))
1849
+ }
1850
+ ) })
1851
+ ] })
1852
+ ] }) }),
1853
+ activeStep === "details" && /* @__PURE__ */ jsxs2("div", { style: { ...stackStyle, marginTop: 24 }, children: [
1854
+ /* @__PURE__ */ jsx2(Divider, {}),
1855
+ /* @__PURE__ */ jsxs2(
1856
+ Section,
1857
+ {
1858
+ title: "Coupon",
1859
+ description: "Configure the coupon issued when this product is purchased.",
1860
+ children: [
1861
+ /* @__PURE__ */ jsx2("div", { style: panelStyle, children: /* @__PURE__ */ jsxs2("div", { className: "flex items-center justify-between gap-x-4", children: [
1862
+ /* @__PURE__ */ jsxs2("div", { children: [
1863
+ /* @__PURE__ */ jsx2(Text2, { weight: "plus", children: "Coupon issuance" }),
1864
+ /* @__PURE__ */ jsx2(Text2, { size: "small", className: "text-ui-fg-muted", children: "Issue coupons when customers purchase this product." })
1865
+ ] }),
1866
+ /* @__PURE__ */ jsx2(
1867
+ Switch,
1868
+ {
1869
+ checked: coupon.enabled,
1870
+ onCheckedChange: (enabled) => setCoupon((current) => ({
1871
+ ...current,
1872
+ enabled: Boolean(enabled)
1873
+ }))
1874
+ }
1875
+ )
1876
+ ] }) }),
1877
+ /* @__PURE__ */ jsx2(Section, { title: "Type", children: /* @__PURE__ */ jsx2(
1878
+ RadioGroup,
1879
+ {
1880
+ value: coupon.type,
1881
+ onValueChange: (type) => updateCouponType(type),
1882
+ className: "flex flex-col gap-y-3",
1883
+ children: typeChoices.map((choice) => /* @__PURE__ */ jsx2(
1884
+ RadioGroup.ChoiceBox,
1885
+ {
1886
+ value: choice.value,
1887
+ label: choice.label,
1888
+ description: choice.description
1889
+ },
1890
+ choice.value
1891
+ ))
1892
+ }
1893
+ ) }),
1894
+ /* @__PURE__ */ jsx2(Section, { title: "Status", children: /* @__PURE__ */ jsx2(
1895
+ RadioGroup,
1896
+ {
1897
+ value: coupon.promotion_status,
1898
+ onValueChange: (promotion_status) => setCoupon((current) => ({
1899
+ ...current,
1900
+ promotion_status
1901
+ })),
1902
+ style: twoColumnGridStyle,
1903
+ children: statusChoices.map((choice) => /* @__PURE__ */ jsx2(
1904
+ RadioGroup.ChoiceBox,
1905
+ {
1906
+ value: choice.value,
1907
+ label: choice.label,
1908
+ description: choice.description
1909
+ },
1910
+ choice.value
1911
+ ))
1912
+ }
1913
+ ) }),
1914
+ (isAmountType || isPercentageType) && /* @__PURE__ */ jsx2(Section, { title: isAmountType ? "Coupon Values" : "Value", children: isAmountType ? /* @__PURE__ */ jsxs2("div", { className: "flex flex-col gap-y-2", children: [
1915
+ coupon.amounts.map((row2, rowIndex) => {
1916
+ const currency = currencies.find(
1917
+ (item) => item.code === row2.currency_code
1918
+ );
1919
+ return /* @__PURE__ */ jsx2(
1920
+ "div",
1921
+ {
1922
+ className: "shadow-elevation-card-rest bg-ui-bg-component rounded-md px-4 py-3",
1923
+ children: /* @__PURE__ */ jsxs2("div", { className: "flex flex-col gap-y-2", children: [
1924
+ /* @__PURE__ */ jsxs2("div", { className: "flex items-center justify-between", children: [
1925
+ /* @__PURE__ */ jsxs2(Label, { children: [
1926
+ row2.currency_code.toUpperCase(),
1927
+ " Coupon Value"
1928
+ ] }),
1929
+ /* @__PURE__ */ jsx2(Text2, { size: "small", className: "text-ui-fg-muted", children: currency?.name || row2.currency_code.toUpperCase() })
1930
+ ] }),
1931
+ /* @__PURE__ */ jsx2("div", { children: /* @__PURE__ */ jsx2(
1932
+ CurrencyAmountField,
1933
+ {
1934
+ currencies,
1935
+ currencyCode: row2.currency_code,
1936
+ value: row2.amount,
1937
+ onChange: (amount) => setCoupon((current) => ({
1938
+ ...current,
1939
+ amounts: current.amounts.map(
1940
+ (item, index) => index === rowIndex ? { ...item, amount } : item
1941
+ )
1942
+ }))
1943
+ }
1944
+ ) })
1945
+ ] })
1946
+ },
1947
+ row2.key
1948
+ );
1949
+ }),
1950
+ !coupon.amounts.length && /* @__PURE__ */ jsx2(Text2, { className: "text-ui-fg-muted", children: "Select at least one effective Currency Code condition value." })
1951
+ ] }) : /* @__PURE__ */ jsx2(Field, { label: "Coupon Value", children: /* @__PURE__ */ jsx2(
1952
+ PercentageInput,
1953
+ {
1954
+ value: coupon.percentage,
1955
+ onChange: (percentage) => setCoupon((current) => ({
1956
+ ...current,
1957
+ percentage
1958
+ }))
1959
+ }
1960
+ ) }) }),
1961
+ isItemScopedDiscount && /* @__PURE__ */ jsx2(Section, { title: "Allocation", children: /* @__PURE__ */ jsxs2(
1962
+ RadioGroup,
1963
+ {
1964
+ value: coupon.allocation,
1965
+ onValueChange: (allocation) => setCoupon((current) => ({
1966
+ ...current,
1967
+ allocation
1968
+ })),
1969
+ style: twoColumnGridStyle,
1970
+ children: [
1971
+ /* @__PURE__ */ jsx2(
1972
+ RadioGroup.ChoiceBox,
1973
+ {
1974
+ value: "each",
1975
+ label: "Each",
1976
+ description: "Applies value on each item"
1977
+ }
1978
+ ),
1979
+ /* @__PURE__ */ jsx2(
1980
+ RadioGroup.ChoiceBox,
1981
+ {
1982
+ value: "once",
1983
+ label: "Once",
1984
+ description: "Limit discount to max quantity"
1985
+ }
1986
+ )
1987
+ ]
1988
+ }
1989
+ ) }),
1990
+ /* @__PURE__ */ jsx2(
1991
+ Section,
1992
+ {
1993
+ title: "Expiration",
1994
+ description: "Control when issued coupons expire.",
1995
+ children: /* @__PURE__ */ jsxs2("div", { style: twoColumnGridStyle, children: [
1996
+ /* @__PURE__ */ jsx2(Field, { label: "Expiration policy", children: /* @__PURE__ */ jsxs2(
1997
+ Select,
1998
+ {
1999
+ value: coupon.expiration_type,
2000
+ onValueChange: (expiration_type) => setCoupon((current) => ({
2001
+ ...current,
2002
+ expiration_type
2003
+ })),
2004
+ children: [
2005
+ /* @__PURE__ */ jsx2(Select.Trigger, { children: /* @__PURE__ */ jsx2(Select.Value, {}) }),
2006
+ /* @__PURE__ */ jsxs2(Select.Content, { children: [
2007
+ /* @__PURE__ */ jsx2(Select.Item, { value: "none", children: "None" }),
2008
+ /* @__PURE__ */ jsx2(Select.Item, { value: "duration", children: "Duration after issue" }),
2009
+ /* @__PURE__ */ jsx2(Select.Item, { value: "fixed", children: "Fixed date" })
2010
+ ] })
2011
+ ]
2012
+ }
2013
+ ) }),
2014
+ coupon.expiration_type === "duration" ? /* @__PURE__ */ jsx2(Field, { label: "Expiration days", children: /* @__PURE__ */ jsx2(
2015
+ Input,
2016
+ {
2017
+ type: "number",
2018
+ min: 1,
2019
+ value: coupon.expiration_days,
2020
+ onChange: (event) => setCoupon((current) => ({
2021
+ ...current,
2022
+ expiration_days: event.target.value
2023
+ }))
2024
+ }
2025
+ ) }) : coupon.expiration_type === "fixed" ? /* @__PURE__ */ jsx2(Field, { label: "Expires at", children: /* @__PURE__ */ jsx2(
2026
+ Input,
2027
+ {
2028
+ type: "datetime-local",
2029
+ value: coupon.expiration_date,
2030
+ onChange: (event) => setCoupon((current) => ({
2031
+ ...current,
2032
+ expiration_date: event.target.value
2033
+ }))
2034
+ }
2035
+ ) }) : null,
2036
+ coupon.expiration_type !== "none" && /* @__PURE__ */ jsxs2(Fragment, { children: [
2037
+ /* @__PURE__ */ jsx2(Field, { label: "Cap expiration", children: /* @__PURE__ */ jsxs2(
2038
+ "div",
2039
+ {
2040
+ className: "flex items-center justify-between gap-x-4",
2041
+ style: { ...panelStyle, padding: "8px 12px" },
2042
+ children: [
2043
+ /* @__PURE__ */ jsx2(Text2, { size: "small", className: "text-ui-fg-muted", children: "Campaign end or cap date" }),
2044
+ /* @__PURE__ */ jsx2(
2045
+ Switch,
2046
+ {
2047
+ checked: coupon.expiration_cap_by_campaign,
2048
+ onCheckedChange: (expiration_cap_by_campaign) => setCoupon((current) => ({
2049
+ ...current,
2050
+ expiration_cap_by_campaign: Boolean(
2051
+ expiration_cap_by_campaign
2052
+ )
2053
+ }))
2054
+ }
2055
+ )
2056
+ ]
2057
+ }
2058
+ ) }),
2059
+ /* @__PURE__ */ jsx2(Field, { label: "Expiration cap date", optional: true, children: /* @__PURE__ */ jsx2(
2060
+ Input,
2061
+ {
2062
+ type: "datetime-local",
2063
+ disabled: !coupon.expiration_cap_by_campaign,
2064
+ value: coupon.expiration_cap_at,
2065
+ onChange: (event) => setCoupon((current) => ({
2066
+ ...current,
2067
+ expiration_cap_at: event.target.value
2068
+ }))
2069
+ }
2070
+ ) })
2071
+ ] })
2072
+ ] })
2073
+ }
2074
+ ),
2075
+ /* @__PURE__ */ jsx2(
2076
+ Section,
2077
+ {
2078
+ title: "Code",
2079
+ description: "Choose whether every issued coupon is unique or shares one code.",
2080
+ children: /* @__PURE__ */ jsxs2("div", { style: twoColumnGridStyle, children: [
2081
+ /* @__PURE__ */ jsx2(Field, { label: "Code strategy", children: /* @__PURE__ */ jsxs2(
2082
+ Select,
2083
+ {
2084
+ value: coupon.code_strategy,
2085
+ onValueChange: (code_strategy) => setCoupon((current) => ({
2086
+ ...current,
2087
+ code_strategy
2088
+ })),
2089
+ children: [
2090
+ /* @__PURE__ */ jsx2(Select.Trigger, { children: /* @__PURE__ */ jsx2(Select.Value, {}) }),
2091
+ /* @__PURE__ */ jsxs2(Select.Content, { children: [
2092
+ /* @__PURE__ */ jsx2(Select.Item, { value: "unique_code", children: "Unique code" }),
2093
+ /* @__PURE__ */ jsx2(Select.Item, { value: "shared_code", children: "Shared code" })
2094
+ ] })
2095
+ ]
2096
+ }
2097
+ ) }),
2098
+ coupon.code_strategy === "unique_code" ? /* @__PURE__ */ jsx2(Field, { label: "Code prefix", optional: true, children: /* @__PURE__ */ jsx2(
2099
+ Input,
2100
+ {
2101
+ value: coupon.code_prefix,
2102
+ placeholder: "COUPON",
2103
+ onChange: (event) => setCoupon((current) => ({
2104
+ ...current,
2105
+ code_prefix: event.target.value
2106
+ }))
2107
+ }
2108
+ ) }) : /* @__PURE__ */ jsx2(Field, { label: "Shared code", children: /* @__PURE__ */ jsx2(
2109
+ Input,
2110
+ {
2111
+ value: coupon.shared_code,
2112
+ placeholder: "SUMMER15",
2113
+ onChange: (event) => setCoupon((current) => ({
2114
+ ...current,
2115
+ shared_code: event.target.value
2116
+ }))
2117
+ }
2118
+ ) })
2119
+ ] })
2120
+ }
2121
+ ),
2122
+ /* @__PURE__ */ jsx2(Section, { title: "Issuance", children: /* @__PURE__ */ jsxs2("div", { style: twoColumnGridStyle, children: [
2123
+ /* @__PURE__ */ jsx2(Field, { label: "Max issuance per item", children: /* @__PURE__ */ jsx2(
2124
+ Input,
2125
+ {
2126
+ type: "number",
2127
+ min: 1,
2128
+ value: coupon.max_issuance_per_order_item,
2129
+ onChange: (event) => setCoupon((current) => ({
2130
+ ...current,
2131
+ max_issuance_per_order_item: event.target.value
2132
+ }))
2133
+ }
2134
+ ) }),
2135
+ allowPromotionMirror && !(isAmountType && coupon.amounts.length > 1) && /* @__PURE__ */ jsx2(Field, { label: "Promotion mirror", children: /* @__PURE__ */ jsxs2(
2136
+ Select,
2137
+ {
2138
+ value: coupon.promotion_mirror_mode,
2139
+ disabled: coupon.type === "buy_x_get_y",
2140
+ onValueChange: (promotion_mirror_mode) => setCoupon((current) => ({
2141
+ ...current,
2142
+ promotion_mirror_mode
2143
+ })),
2144
+ children: [
2145
+ /* @__PURE__ */ jsx2(Select.Trigger, { children: /* @__PURE__ */ jsx2(Select.Value, {}) }),
2146
+ /* @__PURE__ */ jsxs2(Select.Content, { children: [
2147
+ /* @__PURE__ */ jsx2(Select.Item, { value: "none", children: "None" }),
2148
+ /* @__PURE__ */ jsx2(Select.Item, { value: "manual", children: "Manual" }),
2149
+ /* @__PURE__ */ jsx2(Select.Item, { value: "auto", children: "Auto" })
2150
+ ] })
2151
+ ]
2152
+ }
2153
+ ) })
2154
+ ] }) })
2155
+ ]
2156
+ }
2157
+ )
2158
+ ] }),
2159
+ allowPromotionMirror && activeStep === "campaign" && /* @__PURE__ */ jsx2(ProgressTabs.Content, { value: "campaign", style: stackStyle, children: /* @__PURE__ */ jsx2(Section, { title: "Campaign", children: /* @__PURE__ */ jsxs2("div", { style: twoColumnGridStyle, children: [
2160
+ /* @__PURE__ */ jsx2(Field, { label: "Campaign mode", children: /* @__PURE__ */ jsxs2(
2161
+ Select,
2162
+ {
2163
+ value: campaign.mode,
2164
+ onValueChange: (mode) => setCampaign((current) => ({
2165
+ ...current,
2166
+ mode
2167
+ })),
2168
+ children: [
2169
+ /* @__PURE__ */ jsx2(Select.Trigger, { children: /* @__PURE__ */ jsx2(Select.Value, {}) }),
2170
+ /* @__PURE__ */ jsxs2(Select.Content, { children: [
2171
+ /* @__PURE__ */ jsx2(Select.Item, { value: "none", children: "No campaign" }),
2172
+ /* @__PURE__ */ jsx2(Select.Item, { value: "existing", children: "Existing campaign" }),
2173
+ /* @__PURE__ */ jsx2(Select.Item, { value: "new", children: "New campaign" })
2174
+ ] })
2175
+ ]
2176
+ }
2177
+ ) }),
2178
+ campaign.mode === "existing" && /* @__PURE__ */ jsx2(Field, { label: "Existing campaign", children: /* @__PURE__ */ jsx2(
2179
+ OptionSelect,
2180
+ {
2181
+ value: campaign.campaign_id,
2182
+ options: options.campaigns || [],
2183
+ onChange: (campaign_id) => setCampaign((current) => ({
2184
+ ...current,
2185
+ campaign_id
2186
+ }))
2187
+ }
2188
+ ) }),
2189
+ campaign.mode === "new" && /* @__PURE__ */ jsxs2(Fragment, { children: [
2190
+ /* @__PURE__ */ jsx2(Field, { label: "Name", children: /* @__PURE__ */ jsx2(
2191
+ Input,
2192
+ {
2193
+ value: campaign.name,
2194
+ onChange: (event) => setCampaign((current) => ({
2195
+ ...current,
2196
+ name: event.target.value
2197
+ }))
2198
+ }
2199
+ ) }),
2200
+ /* @__PURE__ */ jsx2(Field, { label: "Identifier", children: /* @__PURE__ */ jsx2(
2201
+ Input,
2202
+ {
2203
+ value: campaign.campaign_identifier,
2204
+ onChange: (event) => setCampaign((current) => ({
2205
+ ...current,
2206
+ campaign_identifier: event.target.value
2207
+ }))
2208
+ }
2209
+ ) }),
2210
+ /* @__PURE__ */ jsx2(Field, { label: "Starts at", optional: true, children: /* @__PURE__ */ jsx2(
2211
+ Input,
2212
+ {
2213
+ type: "datetime-local",
2214
+ value: campaign.starts_at,
2215
+ onChange: (event) => setCampaign((current) => ({
2216
+ ...current,
2217
+ starts_at: event.target.value
2218
+ }))
2219
+ }
2220
+ ) }),
2221
+ /* @__PURE__ */ jsx2(Field, { label: "Ends at", optional: true, children: /* @__PURE__ */ jsx2(
2222
+ Input,
2223
+ {
2224
+ type: "datetime-local",
2225
+ value: campaign.ends_at,
2226
+ onChange: (event) => setCampaign((current) => ({
2227
+ ...current,
2228
+ ends_at: event.target.value
2229
+ }))
2230
+ }
2231
+ ) })
2232
+ ] })
2233
+ ] }) }) }),
2234
+ activeStep === "prices" && /* @__PURE__ */ jsx2(ProgressTabs.Content, { value: "prices", style: { height: "100%" }, children: /* @__PURE__ */ jsx2(
2235
+ ProductPricesTable,
2236
+ {
2237
+ currencies,
2238
+ couponValue: formatCouponValue(coupon, currencies),
2239
+ prices: product.price_amounts,
2240
+ onChange: (currencyCode, value) => setProduct((current) => ({
2241
+ ...current,
2242
+ price_amounts: {
2243
+ ...current.price_amounts,
2244
+ [currencyCode]: value
2245
+ }
2246
+ }))
2247
+ }
2248
+ ) })
2249
+ ]
2250
+ }
2251
+ )
2252
+ }
2253
+ ) }),
2254
+ /* @__PURE__ */ jsxs2(FocusModal.Footer, { style: { flexShrink: 0 }, children: [
2255
+ /* @__PURE__ */ jsx2(Button, { variant: "secondary", onClick: () => onOpenChange(false), children: "Cancel" }),
2256
+ currentStepIndex > 0 && /* @__PURE__ */ jsx2(
2257
+ Button,
2258
+ {
2259
+ variant: "secondary",
2260
+ onClick: () => setActiveStep(visibleSteps[currentStepIndex - 1]),
2261
+ children: "Back"
2262
+ }
2263
+ ),
2264
+ currentStepIndex < visibleSteps.length - 1 ? /* @__PURE__ */ jsx2(
2265
+ Button,
2266
+ {
2267
+ disabled: !activeStepComplete,
2268
+ onClick: () => {
2269
+ const nextIndex = currentStepIndex + 1;
2270
+ setFurthestStepIndex(
2271
+ (current) => Math.max(current, nextIndex)
2272
+ );
2273
+ setActiveStep(visibleSteps[nextIndex]);
2274
+ },
2275
+ children: "Continue"
2276
+ }
2277
+ ) : /* @__PURE__ */ jsx2(
2278
+ Button,
2279
+ {
2280
+ disabled: !activeStepComplete,
2281
+ isLoading: saving,
2282
+ onClick: () => void save(),
2283
+ children: "Save"
2284
+ }
2285
+ )
2286
+ ] })
2287
+ ]
2288
+ }
2289
+ )
2290
+ ] }) });
2291
+ }
2292
+ function CouponProductsPage({
2293
+ allowPromotionMirror = false,
2294
+ apiBase,
2295
+ title
2296
+ }) {
2297
+ const [products, setProducts] = useState([]);
2298
+ const [options, setOptions] = useState({});
2299
+ const [loading, setLoading] = useState(true);
2300
+ const [loadError, setLoadError] = useState(null);
2301
+ const [modalOpen, setModalOpen] = useState(false);
2302
+ const [editingRow, setEditingRow] = useState(null);
2303
+ const prompt = usePrompt();
2304
+ const couponBase = `${apiBase}/coupon-products`;
2305
+ const load = useCallback(async () => {
2306
+ setLoading(true);
2307
+ setLoadError(null);
2308
+ try {
2309
+ const [productsPayload, optionsPayload] = await Promise.all([
2310
+ apiFetch(couponBase),
2311
+ apiFetch(`${couponBase}/options`)
2312
+ ]);
2313
+ setProducts(productsPayload.coupon_products || []);
2314
+ setOptions(optionsPayload || {});
2315
+ } catch (error) {
2316
+ const message = error instanceof Error ? error.message : "Failed to load coupon products";
2317
+ setLoadError(message);
2318
+ toast.error(message);
2319
+ } finally {
2320
+ setLoading(false);
2321
+ }
2322
+ }, [couponBase]);
2323
+ useEffect(() => {
2324
+ void load();
2325
+ }, [load]);
2326
+ const remove = async (row) => {
2327
+ const confirmed = await prompt({
2328
+ title: "Remove coupon product?",
2329
+ description: `This removes coupon issuance from ${row.product.title || row.product.id}. The underlying Medusa product will remain available.`,
2330
+ confirmText: "Remove product",
2331
+ cancelText: "Cancel",
2332
+ variant: "danger"
2333
+ });
2334
+ if (!confirmed) return;
2335
+ try {
2336
+ await apiFetch(`${couponBase}/${row.product.id}`, { method: "DELETE" });
2337
+ toast.success("Coupon configuration removed");
2338
+ await load();
2339
+ } catch (error) {
2340
+ toast.error(error instanceof Error ? error.message : "Delete failed");
2341
+ }
2342
+ };
2343
+ const mirror = async (row) => {
2344
+ try {
2345
+ await apiFetch(
2346
+ `/admin/coupon-products/${row.product.id}/mirror-promotion`,
2347
+ {
2348
+ method: "POST",
2349
+ body: JSON.stringify({})
2350
+ }
2351
+ );
2352
+ toast.success("Promotion mirror created");
2353
+ } catch (error) {
2354
+ toast.error(error instanceof Error ? error.message : "Mirror failed");
2355
+ }
2356
+ };
2357
+ return /* @__PURE__ */ jsxs2(Container, { className: "divide-y p-0", children: [
2358
+ /* @__PURE__ */ jsxs2("div", { className: "flex items-center justify-between px-6 py-4", children: [
2359
+ /* @__PURE__ */ jsx2(Heading, { level: "h1", children: title }),
2360
+ /* @__PURE__ */ jsxs2("div", { className: "flex items-center gap-x-2", children: [
2361
+ /* @__PURE__ */ jsxs2(Button, { size: "small", variant: "secondary", onClick: () => void load(), children: [
2362
+ /* @__PURE__ */ jsx2(ArrowPath, {}),
2363
+ " Refresh"
2364
+ ] }),
2365
+ /* @__PURE__ */ jsxs2(
2366
+ Button,
2367
+ {
2368
+ size: "small",
2369
+ onClick: () => {
2370
+ setEditingRow(null);
2371
+ setModalOpen(true);
2372
+ },
2373
+ children: [
2374
+ /* @__PURE__ */ jsx2(Plus, {}),
2375
+ " Create"
2376
+ ]
2377
+ }
2378
+ )
2379
+ ] })
2380
+ ] }),
2381
+ loading ? /* @__PURE__ */ jsx2(CouponEmptyState, { title: "Loading coupon products" }) : loadError ? /* @__PURE__ */ jsx2(CouponEmptyState, { title: loadError }) : products.length ? /* @__PURE__ */ jsxs2(Table, { children: [
2382
+ /* @__PURE__ */ jsx2(Table.Header, { children: /* @__PURE__ */ jsxs2(Table.Row, { children: [
2383
+ /* @__PURE__ */ jsx2(Table.HeaderCell, { children: "Product" }),
2384
+ /* @__PURE__ */ jsx2(Table.HeaderCell, { children: "Status" }),
2385
+ /* @__PURE__ */ jsx2(Table.HeaderCell, { children: "Type" }),
2386
+ /* @__PURE__ */ jsx2(Table.HeaderCell, { children: "Code" }),
2387
+ /* @__PURE__ */ jsx2(Table.HeaderCell, { children: "Campaign" }),
2388
+ /* @__PURE__ */ jsx2(Table.HeaderCell, { children: "Issued" }),
2389
+ /* @__PURE__ */ jsx2(Table.HeaderCell, {})
2390
+ ] }) }),
2391
+ /* @__PURE__ */ jsx2(
2392
+ Table.Body,
2393
+ {
2394
+ style: { borderBottom: "none" },
2395
+ children: products.map((row) => {
2396
+ const config3 = row.coupon_product_config;
2397
+ return /* @__PURE__ */ jsxs2(
2398
+ Table.Row,
2399
+ {
2400
+ style: { borderBottom: "none", background: "none" },
2401
+ children: [
2402
+ /* @__PURE__ */ jsx2(Table.Cell, { children: /* @__PURE__ */ jsxs2("div", { className: "flex flex-col", children: [
2403
+ /* @__PURE__ */ jsx2(Text2, { weight: "plus", children: row.product.title || row.product.id }),
2404
+ /* @__PURE__ */ jsx2(Text2, { size: "small", className: "text-ui-fg-muted", children: row.product.handle || row.product.id })
2405
+ ] }) }),
2406
+ /* @__PURE__ */ jsx2(Table.Cell, { children: /* @__PURE__ */ jsx2(
2407
+ StatusBadge,
2408
+ {
2409
+ color: couponStatusColor(config3.promotion_status),
2410
+ children: config3.promotion_status || "draft"
2411
+ }
2412
+ ) }),
2413
+ /* @__PURE__ */ jsx2(Table.Cell, { children: couponTypeLabel(config3) }),
2414
+ /* @__PURE__ */ jsx2(Table.Cell, { children: config3.code_strategy === "shared_code" ? config3.shared_code || "Shared" : `${config3.code_prefix || "COUPON"}-*` }),
2415
+ /* @__PURE__ */ jsx2(Table.Cell, { children: campaignLabel(config3) }),
2416
+ /* @__PURE__ */ jsx2(Table.Cell, { children: row.entitlements_count || 0 }),
2417
+ /* @__PURE__ */ jsx2(Table.Cell, { children: /* @__PURE__ */ jsxs2("div", { className: "flex justify-end gap-x-2", children: [
2418
+ allowPromotionMirror && !(config3.benefit_type === "fixed_amount" && (config3.amounts?.length || 0) > 1) && /* @__PURE__ */ jsx2(
2419
+ Button,
2420
+ {
2421
+ size: "small",
2422
+ variant: "secondary",
2423
+ onClick: () => void mirror(row),
2424
+ children: "Mirror"
2425
+ }
2426
+ ),
2427
+ /* @__PURE__ */ jsx2(
2428
+ Button,
2429
+ {
2430
+ size: "small",
2431
+ variant: "secondary",
2432
+ onClick: () => {
2433
+ setEditingRow(row);
2434
+ setModalOpen(true);
2435
+ },
2436
+ children: /* @__PURE__ */ jsx2(PencilSquare, {})
2437
+ }
2438
+ ),
2439
+ /* @__PURE__ */ jsx2(
2440
+ Button,
2441
+ {
2442
+ size: "small",
2443
+ variant: "danger",
2444
+ onClick: () => void remove(row),
2445
+ children: /* @__PURE__ */ jsx2(Trash, {})
2446
+ }
2447
+ )
2448
+ ] }) })
2449
+ ]
2450
+ },
2451
+ row.id
2452
+ );
2453
+ })
2454
+ }
2455
+ )
2456
+ ] }) : /* @__PURE__ */ jsx2(
2457
+ CouponEmptyState,
2458
+ {
2459
+ title: "No coupon products found",
2460
+ description: "Create a new coupon product to get started."
2461
+ }
2462
+ ),
2463
+ /* @__PURE__ */ jsx2(
2464
+ CouponProductModal,
2465
+ {
2466
+ open: modalOpen,
2467
+ row: editingRow,
2468
+ apiBase,
2469
+ options,
2470
+ allowPromotionMirror,
2471
+ onOpenChange: setModalOpen,
2472
+ onSaved: load
2473
+ }
2474
+ )
2475
+ ] });
2476
+ }
2477
+
2478
+ // src/dashboard/coupons/coupon-manager.tsx
2479
+ import { Fragment as Fragment2, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
2480
+ function backendUrl2() {
2481
+ return typeof __BACKEND_URL__ === "string" ? __BACKEND_URL__.replace(/\/$/, "") : "";
2482
+ }
2483
+ function apiErrorMessage2(payload, fallback) {
2484
+ const candidates = [
2485
+ payload?.message,
2486
+ payload?.error?.message,
2487
+ payload?.error,
2488
+ payload?.errors?.[0]?.message
2489
+ ];
2490
+ const message = candidates.find(
2491
+ (candidate) => typeof candidate === "string" && candidate.trim()
2492
+ );
2493
+ return message || fallback || "Request failed";
2494
+ }
2495
+ async function apiFetch2(path, options = {}) {
2496
+ const response = await fetch(`${backendUrl2()}${path}`, {
2497
+ ...options,
2498
+ credentials: "include",
2499
+ headers: {
2500
+ ...options.body ? { "Content-Type": "application/json" } : {},
2501
+ ...options.headers
2502
+ }
2503
+ });
2504
+ if (!response.ok) {
2505
+ const payload = await response.json().catch(() => null);
2506
+ throw new Error(apiErrorMessage2(payload, response.statusText));
2507
+ }
2508
+ return response.json();
2509
+ }
2510
+ function formatDate(value) {
2511
+ if (!value) return "-";
2512
+ const date = new Date(value);
2513
+ if (Number.isNaN(date.getTime())) return "-";
2514
+ return date.toLocaleDateString();
2515
+ }
2516
+ function formatDateTime(value) {
2517
+ if (!value) return "-";
2518
+ const date = new Date(value);
2519
+ if (Number.isNaN(date.getTime())) return "-";
2520
+ return date.toLocaleString();
2521
+ }
2522
+ function formatFullDate(value) {
2523
+ if (!value) return "-";
2524
+ const date = new Date(value);
2525
+ if (Number.isNaN(date.getTime())) return "-";
2526
+ return date.toLocaleString(void 0, {
2527
+ day: "numeric",
2528
+ hour: "numeric",
2529
+ minute: "2-digit",
2530
+ month: "short",
2531
+ year: "numeric"
2532
+ });
2533
+ }
2534
+ function formatRelativeDate(value) {
2535
+ if (!value) return "-";
2536
+ const date = new Date(value);
2537
+ if (Number.isNaN(date.getTime())) return "-";
2538
+ const diffSeconds = Math.round((date.getTime() - Date.now()) / 1e3);
2539
+ const absSeconds = Math.abs(diffSeconds);
2540
+ const units = [
2541
+ ["year", 60 * 60 * 24 * 365],
2542
+ ["month", 60 * 60 * 24 * 30],
2543
+ ["week", 60 * 60 * 24 * 7],
2544
+ ["day", 60 * 60 * 24],
2545
+ ["hour", 60 * 60],
2546
+ ["minute", 60]
2547
+ ];
2548
+ const [unit, seconds] = units.find(([, secondsPerUnit]) => absSeconds >= secondsPerUnit) || [];
2549
+ if (!unit || !seconds) {
2550
+ return "just now";
2551
+ }
2552
+ return new Intl.RelativeTimeFormat(void 0, { numeric: "auto" }).format(
2553
+ Math.round(diffSeconds / seconds),
2554
+ unit
2555
+ );
2556
+ }
2557
+ function formatSnapshotAmount(amount, currency) {
2558
+ if (amount == null) return "-";
2559
+ const code = currency ? currency.toUpperCase() : "";
2560
+ return [code, amount.toLocaleString(void 0, { maximumFractionDigits: 2 })].filter(Boolean).join(" ");
2561
+ }
2562
+ function entitlementStatusColor(status) {
2563
+ if (status === "issued") return "green";
2564
+ if (status === "redeemed") return "blue";
2565
+ if (status === "expired" || status === "canceled") return "grey";
2566
+ return "orange";
2567
+ }
2568
+ function snapshotString(snapshot, key) {
2569
+ const value = snapshot?.[key];
2570
+ if (typeof value === "string" && value.trim()) return value;
2571
+ if (typeof value === "number") return String(value);
2572
+ return "";
2573
+ }
2574
+ function snapshotNumber(snapshot, key) {
2575
+ const value = snapshot?.[key];
2576
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
2577
+ }
2578
+ function jsonBlock(value) {
2579
+ if (value == null) return "{}";
2580
+ return JSON.stringify(value, null, 2);
2581
+ }
2582
+ function couponCode(entitlement) {
2583
+ return entitlement.code || entitlement.shared_code || "-";
2584
+ }
2585
+ function entitlementSource(entitlement) {
2586
+ if (entitlement.origin === "external") return "External";
2587
+ return "Purchase";
2588
+ }
2589
+ function entitlementSellerScope(entitlement) {
2590
+ const count = entitlement.seller_targets?.length || 0;
2591
+ if (entitlement.origin !== "external") {
2592
+ if (!count) return "Product seller";
2593
+ return `Product seller + ${count} linked`;
2594
+ }
2595
+ if (!count) return "Admin only";
2596
+ return count === 1 ? "1 linked seller" : `${count} linked sellers`;
2597
+ }
2598
+ function orderDisplayId(order) {
2599
+ if (!order) return "-";
2600
+ return order.display_id == null ? order.id : `#${order.display_id}`;
2601
+ }
2602
+ function dashboardBasePath(apiBase) {
2603
+ return apiBase === "/vendor" ? "/seller" : "/dashboard";
2604
+ }
2605
+ function couponDetailPath(apiBase, entitlementId) {
2606
+ return `${dashboardBasePath(apiBase)}/coupons/${encodeURIComponent(
2607
+ entitlementId
2608
+ )}`;
2609
+ }
2610
+ function orderDetailPath(apiBase, orderId) {
2611
+ return `${dashboardBasePath(apiBase)}/orders/${encodeURIComponent(orderId)}`;
2612
+ }
2613
+ function currentCouponDetailId(apiBase) {
2614
+ if (typeof window === "undefined") {
2615
+ return "";
2616
+ }
2617
+ const prefix = `${dashboardBasePath(apiBase)}/coupons/`;
2618
+ const path = window.location.pathname;
2619
+ const index = path.indexOf(prefix);
2620
+ if (index === -1) {
2621
+ return "";
2622
+ }
2623
+ const id = path.slice(index + prefix.length).split("/")[0];
2624
+ if (!id || id === "products") {
2625
+ return "";
2626
+ }
2627
+ try {
2628
+ return decodeURIComponent(id);
2629
+ } catch {
2630
+ return id;
2631
+ }
2632
+ }
2633
+ function benefitSnapshotLabel(snapshot) {
2634
+ const type = snapshotString(snapshot, "benefit_type");
2635
+ if (type === "fixed_amount") {
2636
+ const amounts = Array.isArray(snapshot?.amounts) ? snapshot.amounts : [];
2637
+ if (amounts.length) {
2638
+ return amounts.map((row) => {
2639
+ const amount2 = snapshotNumber(row, "amount");
2640
+ const currency2 = snapshotString(row, "currency_code").toUpperCase();
2641
+ return `${amount2 ?? 0} ${currency2}`.trim();
2642
+ }).join(", ");
2643
+ }
2644
+ const amount = snapshotNumber(snapshot, "amount");
2645
+ const currency = snapshotString(snapshot, "currency_code").toUpperCase();
2646
+ return `${amount ?? 0} ${currency}`.trim();
2647
+ }
2648
+ if (type === "percentage") {
2649
+ const template = snapshot?.promotion_template;
2650
+ const method = template?.application_method;
2651
+ const scope = snapshotString(method, "target_type") === "order" ? "order" : "products";
2652
+ return `${snapshotNumber(snapshot, "percentage") ?? 0}% off ${scope}`;
2653
+ }
2654
+ if (type === "free_shipping") {
2655
+ return "Free shipping";
2656
+ }
2657
+ if (type === "buy_get") {
2658
+ return "Buy X Get Y";
2659
+ }
2660
+ return "Unknown";
2661
+ }
2662
+ function expirationPolicyLabel(snapshot) {
2663
+ const policy = snapshot?.expiration_policy;
2664
+ const type = snapshotString(policy, "type");
2665
+ if (type === "none") return "No expiration";
2666
+ if (type === "duration") {
2667
+ const days = snapshotNumber(policy, "duration_days") ?? 0;
2668
+ return `${days} days after issuance`;
2669
+ }
2670
+ if (type === "fixed") {
2671
+ return `Fixed date ${formatDateTime(snapshotString(policy, "expires_at"))}`;
2672
+ }
2673
+ return "-";
2674
+ }
2675
+ function campaignSnapshotLabel(snapshot) {
2676
+ const campaignSnapshot = snapshot?.campaign_snapshot;
2677
+ return snapshotString(campaignSnapshot, "name") || snapshotString(campaignSnapshot, "campaign_identifier") || snapshotString(snapshot, "campaign_id") || "None";
2678
+ }
2679
+ function promotionSnapshotLabel(snapshot) {
2680
+ const template = snapshot?.promotion_template;
2681
+ const method = template?.application_method;
2682
+ const target = snapshotString(method, "target_type");
2683
+ const allocation = snapshotString(method, "allocation");
2684
+ return [target, allocation].filter(Boolean).join(" / ") || "None";
2685
+ }
2686
+ var entitlementFilters = [
2687
+ { label: "All", value: "all" },
2688
+ { label: "Issued", value: "issued" },
2689
+ { label: "Redeemed", value: "redeemed" },
2690
+ { label: "Expired", value: "expired" },
2691
+ { label: "Canceled", value: "canceled" }
2692
+ ];
2693
+ function SnapshotBlock({ title, value }) {
2694
+ return /* @__PURE__ */ jsxs3("details", { className: "rounded-lg border p-3", children: [
2695
+ /* @__PURE__ */ jsx3("summary", { className: "cursor-pointer text-ui-fg-base txt-small-plus", children: title }),
2696
+ /* @__PURE__ */ jsx3(
2697
+ "pre",
2698
+ {
2699
+ className: "mt-3 rounded-md bg-ui-bg-subtle p-3 text-ui-fg-subtle txt-compact-xsmall",
2700
+ style: {
2701
+ maxHeight: 220,
2702
+ overflow: "auto",
2703
+ whiteSpace: "pre-wrap",
2704
+ wordBreak: "break-word"
2705
+ },
2706
+ children: jsonBlock(value)
2707
+ }
2708
+ )
2709
+ ] });
2710
+ }
2711
+ function TwoColumnLayout({
2712
+ firstCol,
2713
+ secondCol
2714
+ }) {
2715
+ return /* @__PURE__ */ jsxs3("div", { className: "flex flex-col gap-x-4 gap-y-3 xl:flex-row xl:items-start", children: [
2716
+ /* @__PURE__ */ jsx3("div", { className: "flex w-full flex-col gap-y-3", children: firstCol }),
2717
+ /* @__PURE__ */ jsx3("div", { className: "flex w-full max-w-[100%] flex-col gap-y-3 xl:mt-0 xl:max-w-[440px]", children: secondCol })
2718
+ ] });
2719
+ }
2720
+ function SectionRow({
2721
+ title,
2722
+ value
2723
+ }) {
2724
+ return /* @__PURE__ */ jsxs3("div", { className: "text-ui-fg-subtle grid grid-cols-2 items-center gap-x-4 px-6 py-4", children: [
2725
+ /* @__PURE__ */ jsx3(Text3, { size: "small", weight: "plus", leading: "compact", children: title }),
2726
+ typeof value === "string" || value == null ? /* @__PURE__ */ jsx3(
2727
+ Text3,
2728
+ {
2729
+ size: "small",
2730
+ leading: "compact",
2731
+ className: "text-pretty whitespace-pre-line",
2732
+ children: value || "-"
2733
+ }
2734
+ ) : /* @__PURE__ */ jsx3("div", { className: "min-w-0", children: value })
2735
+ ] });
2736
+ }
2737
+ function WidgetHeader({ title }) {
2738
+ return /* @__PURE__ */ jsx3("div", { className: "flex items-center justify-between px-6 py-4", children: /* @__PURE__ */ jsx3(Heading2, { level: "h2", children: title }) });
2739
+ }
2740
+ function SidebarLink({
2741
+ href,
2742
+ label,
2743
+ description,
2744
+ icon
2745
+ }) {
2746
+ return /* @__PURE__ */ jsx3("a", { href, className: "group outline-none", children: /* @__PURE__ */ jsx3("div", { className: "flex flex-col gap-2 px-2 pb-2", children: /* @__PURE__ */ jsx3("div", { className: "shadow-elevation-card-rest bg-ui-bg-component transition-fg hover:bg-ui-bg-component-hover active:bg-ui-bg-component-pressed group-focus-visible:shadow-borders-interactive-with-active rounded-md px-4 py-2", children: /* @__PURE__ */ jsxs3("div", { className: "flex items-center gap-4", children: [
2747
+ icon && /* @__PURE__ */ jsx3("div", { children: icon }),
2748
+ /* @__PURE__ */ jsxs3("div", { className: "flex flex-1 flex-col", children: [
2749
+ /* @__PURE__ */ jsx3(Text3, { size: "small", leading: "compact", weight: "plus", children: label }),
2750
+ /* @__PURE__ */ jsx3(
2751
+ Text3,
2752
+ {
2753
+ size: "small",
2754
+ leading: "compact",
2755
+ className: "text-ui-fg-subtle",
2756
+ children: description
2757
+ }
2758
+ )
2759
+ ] }),
2760
+ /* @__PURE__ */ jsx3("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ jsx3(TriangleRightMini, { className: "text-ui-fg-muted" }) })
2761
+ ] }) }) }) });
2762
+ }
2763
+ function SummaryWidget({
2764
+ label,
2765
+ value,
2766
+ tone = "green"
2767
+ }) {
2768
+ return /* @__PURE__ */ jsx3(Container2, { className: "px-6 py-4", children: /* @__PURE__ */ jsxs3("div", { className: "text-ui-fg-subtle flex items-center gap-x-3", children: [
2769
+ /* @__PURE__ */ jsx3(
2770
+ "div",
2771
+ {
2772
+ className: `h-8 w-1 rounded-full ${tone === "green" ? "bg-ui-tag-green-icon" : "bg-ui-tag-neutral-icon"}`
2773
+ }
2774
+ ),
2775
+ /* @__PURE__ */ jsxs3("div", { className: "min-w-0", children: [
2776
+ /* @__PURE__ */ jsx3(Text3, { weight: "plus", size: "small", className: "text-ui-fg-subtle", children: label }),
2777
+ /* @__PURE__ */ jsx3(
2778
+ Text3,
2779
+ {
2780
+ weight: "plus",
2781
+ size: "xlarge",
2782
+ className: "tabular-nums text-ui-fg-base break-words",
2783
+ children: value
2784
+ }
2785
+ )
2786
+ ] })
2787
+ ] }) });
2788
+ }
2789
+ function CouponGeneralSection({ detail }) {
2790
+ const entitlement = detail.customer_coupon_entitlement;
2791
+ const issuance = detail.coupon_issuance || null;
2792
+ const benefitSnapshot = entitlement.benefit_snapshot || null;
2793
+ const sourceSnapshot = entitlement.source_snapshot || null;
2794
+ const code = couponCode(entitlement);
2795
+ const external = entitlement.origin === "external";
2796
+ const productLabel = snapshotString(sourceSnapshot, "title") || snapshotString(sourceSnapshot, "source") || entitlement.product_id || "External";
2797
+ const variantLabel = snapshotString(sourceSnapshot, "variant_id") || entitlement.variant_id || "-";
2798
+ const issuedDate = entitlement.created_at || issuance?.created_at || null;
2799
+ return /* @__PURE__ */ jsxs3(Container2, { className: "divide-y p-0", children: [
2800
+ /* @__PURE__ */ jsxs3("div", { className: "flex items-center justify-between px-6 py-4", children: [
2801
+ /* @__PURE__ */ jsxs3("div", { className: "min-w-0", children: [
2802
+ /* @__PURE__ */ jsxs3("div", { className: "flex items-center gap-x-1", children: [
2803
+ /* @__PURE__ */ jsxs3(Heading2, { className: "break-all", children: [
2804
+ "#",
2805
+ code
2806
+ ] }),
2807
+ code !== "-" && /* @__PURE__ */ jsx3(Copy, { content: code, className: "text-ui-fg-muted" })
2808
+ ] }),
2809
+ /* @__PURE__ */ jsx3(Text3, { size: "small", className: "text-ui-fg-subtle", children: formatFullDate(issuedDate) })
2810
+ ] }),
2811
+ /* @__PURE__ */ jsx3(StatusBadge2, { color: entitlementStatusColor(entitlement.status), children: entitlement.status })
2812
+ ] }),
2813
+ /* @__PURE__ */ jsx3(SectionRow, { title: "Date issued", value: formatRelativeDate(issuedDate) }),
2814
+ /* @__PURE__ */ jsx3(
2815
+ SectionRow,
2816
+ {
2817
+ title: "Customer",
2818
+ value: entitlement.email || entitlement.customer_id || "-"
2819
+ }
2820
+ ),
2821
+ /* @__PURE__ */ jsx3(SectionRow, { title: "Origin", value: entitlementSource(entitlement) }),
2822
+ /* @__PURE__ */ jsx3(
2823
+ SectionRow,
2824
+ {
2825
+ title: external ? "Source" : "Coupon product",
2826
+ value: productLabel
2827
+ }
2828
+ ),
2829
+ /* @__PURE__ */ jsx3(SectionRow, { title: "Seller scope", value: entitlementSellerScope(entitlement) }),
2830
+ !external && /* @__PURE__ */ jsx3(SectionRow, { title: "Variant", value: variantLabel }),
2831
+ !external && /* @__PURE__ */ jsx3(
2832
+ SectionRow,
2833
+ {
2834
+ title: "Quantity",
2835
+ value: String(
2836
+ snapshotNumber(sourceSnapshot, "quantity") ?? issuance?.quantity ?? 1
2837
+ )
2838
+ }
2839
+ ),
2840
+ /* @__PURE__ */ jsx3(
2841
+ SectionRow,
2842
+ {
2843
+ title: "Benefit",
2844
+ value: benefitSnapshotLabel(benefitSnapshot)
2845
+ }
2846
+ ),
2847
+ /* @__PURE__ */ jsx3(
2848
+ SectionRow,
2849
+ {
2850
+ title: "Expiration policy",
2851
+ value: expirationPolicyLabel(benefitSnapshot)
2852
+ }
2853
+ ),
2854
+ /* @__PURE__ */ jsx3(SectionRow, { title: "Expiration Date", value: formatDate(entitlement.expires_at) }),
2855
+ /* @__PURE__ */ jsx3(SectionRow, { title: "Redeemed Date", value: formatDate(entitlement.redeemed_at) })
2856
+ ] });
2857
+ }
2858
+ function RelatedOrderSection({
2859
+ apiBase,
2860
+ detail
2861
+ }) {
2862
+ const entitlement = detail.customer_coupon_entitlement;
2863
+ const order = detail.order || null;
2864
+ const orderId = order?.id || entitlement.order_id;
2865
+ if (!orderId) {
2866
+ return null;
2867
+ }
2868
+ return /* @__PURE__ */ jsxs3(Container2, { className: "p-0", children: [
2869
+ /* @__PURE__ */ jsx3(WidgetHeader, { title: "Related Order" }),
2870
+ /* @__PURE__ */ jsx3(
2871
+ SidebarLink,
2872
+ {
2873
+ href: orderDetailPath(apiBase, orderId),
2874
+ label: order ? orderDisplayId(order) : orderId,
2875
+ description: order?.created_at ? `Order placed ${formatRelativeDate(order.created_at)}` : "Purchased coupon order",
2876
+ icon: /* @__PURE__ */ jsx3(ShoppingCart, {})
2877
+ }
2878
+ )
2879
+ ] });
2880
+ }
2881
+ function CouponSnapshotsSection({
2882
+ detail
2883
+ }) {
2884
+ const entitlement = detail.customer_coupon_entitlement;
2885
+ const issuance = detail.coupon_issuance || null;
2886
+ return /* @__PURE__ */ jsxs3(Container2, { className: "p-0", children: [
2887
+ /* @__PURE__ */ jsx3(WidgetHeader, { title: "JSON" }),
2888
+ /* @__PURE__ */ jsxs3("div", { className: "flex flex-col gap-y-3 px-6 pb-6", children: [
2889
+ /* @__PURE__ */ jsx3(
2890
+ SnapshotBlock,
2891
+ {
2892
+ title: "Benefit snapshot",
2893
+ value: entitlement.benefit_snapshot
2894
+ }
2895
+ ),
2896
+ /* @__PURE__ */ jsx3(
2897
+ SnapshotBlock,
2898
+ {
2899
+ title: "Source snapshot",
2900
+ value: entitlement.source_snapshot
2901
+ }
2902
+ ),
2903
+ /* @__PURE__ */ jsx3(
2904
+ SnapshotBlock,
2905
+ {
2906
+ title: "Issuance config snapshot",
2907
+ value: issuance?.config_snapshot
2908
+ }
2909
+ ),
2910
+ /* @__PURE__ */ jsx3(SnapshotBlock, { title: "Seller targets", value: entitlement.seller_targets }),
2911
+ /* @__PURE__ */ jsx3(SnapshotBlock, { title: "Metadata", value: entitlement.metadata })
2912
+ ] })
2913
+ ] });
2914
+ }
2915
+ function CouponSummarySections({
2916
+ detail
2917
+ }) {
2918
+ const entitlement = detail.customer_coupon_entitlement;
2919
+ const issuance = detail.coupon_issuance || null;
2920
+ const benefitSnapshot = entitlement.benefit_snapshot || null;
2921
+ const sourceSnapshot = entitlement.source_snapshot || null;
2922
+ const order = detail.order || null;
2923
+ const lineTotal = snapshotNumber(sourceSnapshot, "total");
2924
+ const external = entitlement.origin === "external";
2925
+ return /* @__PURE__ */ jsxs3(Fragment2, { children: [
2926
+ /* @__PURE__ */ jsx3(
2927
+ SummaryWidget,
2928
+ {
2929
+ label: "Benefit",
2930
+ value: benefitSnapshotLabel(benefitSnapshot)
2931
+ }
2932
+ ),
2933
+ !external && /* @__PURE__ */ jsx3(
2934
+ SummaryWidget,
2935
+ {
2936
+ label: "Line Total",
2937
+ value: formatSnapshotAmount(lineTotal, order?.currency_code),
2938
+ tone: "neutral"
2939
+ }
2940
+ ),
2941
+ !external && /* @__PURE__ */ jsxs3(Container2, { className: "divide-y p-0", children: [
2942
+ /* @__PURE__ */ jsx3(WidgetHeader, { title: "Campaign" }),
2943
+ /* @__PURE__ */ jsx3(SectionRow, { title: "Campaign", value: campaignSnapshotLabel(benefitSnapshot) }),
2944
+ /* @__PURE__ */ jsx3(SectionRow, { title: "Promotion", value: promotionSnapshotLabel(benefitSnapshot) }),
2945
+ /* @__PURE__ */ jsx3(
2946
+ SectionRow,
2947
+ {
2948
+ title: "Promotion status",
2949
+ value: snapshotString(benefitSnapshot, "promotion_status") || "-"
2950
+ }
2951
+ )
2952
+ ] }),
2953
+ !external && /* @__PURE__ */ jsxs3(Container2, { className: "divide-y p-0", children: [
2954
+ /* @__PURE__ */ jsx3(WidgetHeader, { title: "Issuance" }),
2955
+ /* @__PURE__ */ jsx3(SectionRow, { title: "Status", value: issuance?.status || "-" }),
2956
+ /* @__PURE__ */ jsx3(
2957
+ SectionRow,
2958
+ {
2959
+ title: "Issued / failed",
2960
+ value: issuance ? `${issuance.issued_count ?? 0} / ${issuance.failed_count ?? 0}` : "-"
2961
+ }
2962
+ ),
2963
+ /* @__PURE__ */ jsx3(SectionRow, { title: "Config", value: entitlement.config_id || "-" }),
2964
+ /* @__PURE__ */ jsx3(
2965
+ SectionRow,
2966
+ {
2967
+ title: "Variant config",
2968
+ value: entitlement.variant_config_id || "-"
2969
+ }
2970
+ )
2971
+ ] })
2972
+ ] });
2973
+ }
2974
+ function CouponDetailPageView({ apiBase }) {
2975
+ const id = currentCouponDetailId(apiBase);
2976
+ const [detail, setDetail] = useState2(null);
2977
+ const [loading, setLoading] = useState2(true);
2978
+ const [loadError, setLoadError] = useState2(null);
2979
+ useEffect2(() => {
2980
+ let active = true;
2981
+ async function load() {
2982
+ if (!id) {
2983
+ setLoadError("Missing coupon id");
2984
+ setLoading(false);
2985
+ return;
2986
+ }
2987
+ setLoading(true);
2988
+ setLoadError(null);
2989
+ try {
2990
+ const payload = await apiFetch2(
2991
+ `${apiBase}/coupon-products/entitlements/${encodeURIComponent(id)}`
2992
+ );
2993
+ if (active) {
2994
+ setDetail(payload);
2995
+ }
2996
+ } catch (error) {
2997
+ const message = error instanceof Error ? error.message : "Failed to load coupon details";
2998
+ if (active) {
2999
+ setLoadError(message);
3000
+ toast2.error(message);
3001
+ }
3002
+ } finally {
3003
+ if (active) {
3004
+ setLoading(false);
3005
+ }
3006
+ }
3007
+ }
3008
+ void load();
3009
+ return () => {
3010
+ active = false;
3011
+ };
3012
+ }, [apiBase, id]);
3013
+ if (loading) {
3014
+ return /* @__PURE__ */ jsx3(CouponEmptyState, { title: "Loading coupon" });
3015
+ }
3016
+ if (loadError) {
3017
+ return /* @__PURE__ */ jsx3(CouponEmptyState, { title: loadError });
3018
+ }
3019
+ if (!detail) {
3020
+ return /* @__PURE__ */ jsx3(CouponEmptyState, { title: "Coupon not found" });
3021
+ }
3022
+ return /* @__PURE__ */ jsx3(
3023
+ TwoColumnLayout,
3024
+ {
3025
+ firstCol: /* @__PURE__ */ jsxs3(Fragment2, { children: [
3026
+ /* @__PURE__ */ jsx3(CouponGeneralSection, { detail }),
3027
+ /* @__PURE__ */ jsx3(RelatedOrderSection, { apiBase, detail }),
3028
+ /* @__PURE__ */ jsx3(CouponSnapshotsSection, { detail })
3029
+ ] }),
3030
+ secondCol: /* @__PURE__ */ jsx3(CouponSummarySections, { detail })
3031
+ }
3032
+ );
3033
+ }
3034
+ function EntitlementsTable({
3035
+ entitlements,
3036
+ loading,
3037
+ error,
3038
+ onOpen
3039
+ }) {
3040
+ if (loading) {
3041
+ return /* @__PURE__ */ jsx3(CouponEmptyState, { title: "Loading coupons" });
3042
+ }
3043
+ if (error) {
3044
+ return /* @__PURE__ */ jsx3(CouponEmptyState, { title: error });
3045
+ }
3046
+ if (!entitlements.length) {
3047
+ return /* @__PURE__ */ jsx3(
3048
+ CouponEmptyState,
3049
+ {
3050
+ title: "No coupons found",
3051
+ description: "Purchased coupons will appear here after they are issued."
3052
+ }
3053
+ );
3054
+ }
3055
+ return /* @__PURE__ */ jsxs3(Table2, { children: [
3056
+ /* @__PURE__ */ jsx3(Table2.Header, { children: /* @__PURE__ */ jsxs3(Table2.Row, { children: [
3057
+ /* @__PURE__ */ jsx3(Table2.HeaderCell, { children: "Status" }),
3058
+ /* @__PURE__ */ jsx3(Table2.HeaderCell, { children: "Code" }),
3059
+ /* @__PURE__ */ jsx3(Table2.HeaderCell, { children: "Date issued" }),
3060
+ /* @__PURE__ */ jsx3(Table2.HeaderCell, { children: "Order" }),
3061
+ /* @__PURE__ */ jsx3(Table2.HeaderCell, { children: "Customer" }),
3062
+ /* @__PURE__ */ jsx3(Table2.HeaderCell, { children: "Origin" }),
3063
+ /* @__PURE__ */ jsx3(Table2.HeaderCell, { children: "Seller scope" }),
3064
+ /* @__PURE__ */ jsx3(Table2.HeaderCell, { children: "Source" }),
3065
+ /* @__PURE__ */ jsx3(Table2.HeaderCell, { children: "Expires" })
3066
+ ] }) }),
3067
+ /* @__PURE__ */ jsx3(Table2.Body, { children: entitlements.map((item) => /* @__PURE__ */ jsxs3(
3068
+ Table2.Row,
3069
+ {
3070
+ className: "cursor-pointer hover:bg-ui-bg-subtle",
3071
+ onClick: () => onOpen(item),
3072
+ children: [
3073
+ /* @__PURE__ */ jsx3(Table2.Cell, { children: /* @__PURE__ */ jsx3(StatusBadge2, { color: entitlementStatusColor(item.status), children: item.status }) }),
3074
+ /* @__PURE__ */ jsx3(Table2.Cell, { children: item.code || item.shared_code || "-" }),
3075
+ /* @__PURE__ */ jsx3(Table2.Cell, { title: formatFullDate(item.created_at), children: formatRelativeDate(item.created_at) }),
3076
+ /* @__PURE__ */ jsx3(Table2.Cell, { children: item.order_id || "-" }),
3077
+ /* @__PURE__ */ jsx3(Table2.Cell, { children: item.email || item.customer_id || "-" }),
3078
+ /* @__PURE__ */ jsx3(Table2.Cell, { children: entitlementSource(item) }),
3079
+ /* @__PURE__ */ jsx3(Table2.Cell, { children: entitlementSellerScope(item) }),
3080
+ /* @__PURE__ */ jsx3(Table2.Cell, { children: snapshotString(item.source_snapshot, "title") || snapshotString(item.source_snapshot, "source") || item.product_id || "External" }),
3081
+ /* @__PURE__ */ jsx3(Table2.Cell, { children: formatDate(item.expires_at) })
3082
+ ]
3083
+ },
3084
+ item.id
3085
+ )) })
3086
+ ] });
3087
+ }
3088
+ function CouponsPageView({
3089
+ apiBase,
3090
+ title
3091
+ }) {
3092
+ const [entitlements, setEntitlements] = useState2([]);
3093
+ const [loading, setLoading] = useState2(true);
3094
+ const [loadError, setLoadError] = useState2(null);
3095
+ const [filter, setFilter] = useState2("all");
3096
+ const load = useCallback2(async () => {
3097
+ setLoading(true);
3098
+ setLoadError(null);
3099
+ try {
3100
+ const payload = await apiFetch2(`${apiBase}/coupon-products/entitlements`);
3101
+ setEntitlements(payload.customer_coupon_entitlements || []);
3102
+ } catch (error) {
3103
+ const message = error instanceof Error ? error.message : "Failed to load coupons";
3104
+ setLoadError(message);
3105
+ toast2.error(message);
3106
+ } finally {
3107
+ setLoading(false);
3108
+ }
3109
+ }, [apiBase]);
3110
+ useEffect2(() => {
3111
+ void load();
3112
+ }, [load]);
3113
+ const openDetail = useCallback2(
3114
+ (entitlement) => {
3115
+ window.location.assign(couponDetailPath(apiBase, entitlement.id));
3116
+ },
3117
+ [apiBase]
3118
+ );
3119
+ return /* @__PURE__ */ jsxs3(Container2, { className: "divide-y p-0", children: [
3120
+ /* @__PURE__ */ jsxs3("div", { className: "flex items-center justify-between px-6 py-4", children: [
3121
+ /* @__PURE__ */ jsx3(Heading2, { level: "h1", children: title }),
3122
+ /* @__PURE__ */ jsxs3(Button2, { size: "small", variant: "secondary", onClick: () => void load(), children: [
3123
+ /* @__PURE__ */ jsx3(ArrowPath2, {}),
3124
+ "Refresh"
3125
+ ] })
3126
+ ] }),
3127
+ /* @__PURE__ */ jsxs3(
3128
+ Tabs,
3129
+ {
3130
+ value: filter,
3131
+ onValueChange: (value) => setFilter(value),
3132
+ children: [
3133
+ /* @__PURE__ */ jsx3("div", { className: "px-6 py-2 border-b", children: /* @__PURE__ */ jsx3(Tabs.List, { children: entitlementFilters.map((item) => /* @__PURE__ */ jsx3(Tabs.Trigger, { value: item.value, children: item.label }, item.value)) }) }),
3134
+ entitlementFilters.map((item) => /* @__PURE__ */ jsx3(Tabs.Content, { value: item.value, children: /* @__PURE__ */ jsx3(
3135
+ EntitlementsTable,
3136
+ {
3137
+ loading,
3138
+ error: loadError,
3139
+ onOpen: openDetail,
3140
+ entitlements: item.value === "all" ? entitlements : entitlements.filter(
3141
+ (entitlement) => entitlement.status === item.value
3142
+ )
3143
+ }
3144
+ ) }, item.value))
3145
+ ]
3146
+ }
3147
+ )
3148
+ ] });
3149
+ }
3150
+ function CouponProductsPageView({
3151
+ apiBase,
3152
+ title,
3153
+ allowPromotionMirror = false
3154
+ }) {
3155
+ return /* @__PURE__ */ jsx3(
3156
+ CouponProductsPage,
3157
+ {
3158
+ apiBase,
3159
+ title,
3160
+ allowPromotionMirror
3161
+ }
3162
+ );
3163
+ }
3164
+
3165
+ // src/vendor/routes/coupons/page.tsx
3166
+ import { jsx as jsx4 } from "react/jsx-runtime";
3167
+ var config = {
3168
+ label: "Coupons",
3169
+ icon: ReceiptPercent
3170
+ };
3171
+ function VendorCouponsPage() {
3172
+ return /* @__PURE__ */ jsx4(CouponsPageView, { apiBase: "/vendor", title: "Coupons" });
3173
+ }
3174
+
3175
+ // src/vendor/routes/coupons/[id]/page.tsx
3176
+ import { jsx as jsx5 } from "react/jsx-runtime";
3177
+ function VendorCouponDetailPage() {
3178
+ return /* @__PURE__ */ jsx5(CouponDetailPageView, { apiBase: "/vendor" });
3179
+ }
3180
+
3181
+ // src/vendor/routes/coupons/products/page.tsx
3182
+ import { ReceiptPercent as ReceiptPercent2 } from "@medusajs/icons";
3183
+ import { jsx as jsx6 } from "react/jsx-runtime";
3184
+ var config2 = {
3185
+ label: "Coupon Products",
3186
+ icon: ReceiptPercent2
3187
+ };
3188
+ function VendorCouponProductsPage() {
3189
+ return /* @__PURE__ */ jsx6(CouponProductsPageView, { apiBase: "/vendor", title: "Coupon Products" });
3190
+ }
3191
+
3192
+ // src/vendor/index.ts
3193
+ var routeModule = {
3194
+ routes: [
3195
+ {
3196
+ Component: VendorCouponsPage,
3197
+ path: "/coupons"
3198
+ },
3199
+ {
3200
+ Component: VendorCouponProductsPage,
3201
+ path: "/coupons/products"
3202
+ },
3203
+ {
3204
+ Component: VendorCouponDetailPage,
3205
+ path: "/coupons/:id"
3206
+ }
3207
+ ]
3208
+ };
3209
+ var menuItemModule = {
3210
+ menuItems: [
3211
+ {
3212
+ label: config.label,
3213
+ icon: config.icon,
3214
+ path: "/coupons",
3215
+ rank: config.rank,
3216
+ nested: config.nested,
3217
+ translationNs: config.translationNs
3218
+ },
3219
+ {
3220
+ label: config2.label,
3221
+ icon: config2.icon,
3222
+ path: "/coupons/products",
3223
+ rank: 11,
3224
+ nested: "/coupons",
3225
+ translationNs: config2.translationNs
3226
+ }
3227
+ ]
3228
+ };
3229
+ var vendor_default = {
3230
+ routeModule,
3231
+ menuItemModule,
3232
+ i18nModule: i18n_default
3233
+ };
3234
+ export {
3235
+ vendor_default as default
3236
+ };
3237
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3ZlbmRvci9pMThuL2VuLmpzb24iLCAiLi4vLi4vLi4vLi4vc3JjL3ZlbmRvci9pMThuL2luZGV4LnRzIiwgIi4uLy4uLy4uLy4uL3NyYy92ZW5kb3Ivcm91dGVzL2NvdXBvbnMvcGFnZS50c3giLCAiLi4vLi4vLi4vLi4vc3JjL2Rhc2hib2FyZC9jb3Vwb25zL2NvdXBvbi1tYW5hZ2VyLnRzeCIsICIuLi8uLi8uLi8uLi9zcmMvZGFzaGJvYXJkL2NvdXBvbnMvY291cG9uLXByb2R1Y3RzLXBhZ2UudHN4IiwgIi4uLy4uLy4uLy4uL3NyYy9kYXNoYm9hcmQvY291cG9ucy9lbXB0eS1zdGF0ZS50c3giLCAiLi4vLi4vLi4vLi4vc3JjL3ZlbmRvci9yb3V0ZXMvY291cG9ucy9baWRdL3BhZ2UudHN4IiwgIi4uLy4uLy4uLy4uL3NyYy92ZW5kb3Ivcm91dGVzL2NvdXBvbnMvcHJvZHVjdHMvcGFnZS50c3giLCAiLi4vLi4vLi4vLi4vc3JjL3ZlbmRvci9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsie1xuICBcImNvdXBvbnNcIjoge1xuICAgIFwibWVudVwiOiBcIkNvdXBvbnNcIixcbiAgICBcInByb2R1Y3RzTWVudVwiOiBcIkNvdXBvbiBQcm9kdWN0c1wiXG4gIH1cbn1cbiIsICJpbXBvcnQgZW4gZnJvbSBcIi4vZW4uanNvblwiXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW46IHtcbiAgICB0cmFuc2xhdGlvbjogZW4sXG4gIH0sXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBSb3V0ZUNvbmZpZyB9IGZyb20gXCJAbWVyY3VyanMvZGFzaGJvYXJkLXNka1wiXG5pbXBvcnQgeyBSZWNlaXB0UGVyY2VudCB9IGZyb20gXCJAbWVkdXNhanMvaWNvbnNcIlxuaW1wb3J0IHsgQ291cG9uc1BhZ2VWaWV3IH0gZnJvbSBcIi4uLy4uLy4uL2Rhc2hib2FyZC9jb3Vwb25zL2NvdXBvbi1tYW5hZ2VyXCJcblxuZXhwb3J0IGNvbnN0IGNvbmZpZzogUm91dGVDb25maWcgPSB7XG4gIGxhYmVsOiBcIkNvdXBvbnNcIixcbiAgaWNvbjogUmVjZWlwdFBlcmNlbnQsXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFZlbmRvckNvdXBvbnNQYWdlKCkge1xuICByZXR1cm4gPENvdXBvbnNQYWdlVmlldyBhcGlCYXNlPVwiL3ZlbmRvclwiIHRpdGxlPVwiQ291cG9uc1wiIC8+XG59XG4iLCAiaW1wb3J0IHtcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlU3RhdGUsXG4gIHR5cGUgQ2hhbmdlRXZlbnQsXG4gIHR5cGUgQ1NTUHJvcGVydGllcyxcbiAgdHlwZSBSZWFjdE5vZGUsXG59IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQge1xuICBBcnJvd1BhdGgsXG4gIFBlbmNpbFNxdWFyZSxcbiAgUGx1cyxcbiAgU2hvcHBpbmdDYXJ0LFxuICBUcmFzaCxcbiAgVHJpYW5nbGVSaWdodE1pbmksXG59IGZyb20gXCJAbWVkdXNhanMvaWNvbnNcIlxuaW1wb3J0IHtcbiAgQnV0dG9uLFxuICBDb250YWluZXIsXG4gIENvcHksXG4gIEN1cnJlbmN5SW5wdXQsXG4gIEZvY3VzTW9kYWwsXG4gIEhlYWRpbmcsXG4gIElucHV0LFxuICBMYWJlbCxcbiAgUHJvZ3Jlc3NUYWJzLFxuICBTZWxlY3QsXG4gIFN0YXR1c0JhZGdlLFxuICBTd2l0Y2gsXG4gIFRhYmxlLFxuICBUYWJzLFxuICBUZXh0LFxuICBUZXh0YXJlYSxcbiAgdG9hc3QsXG4gIHVzZVByb21wdCxcbn0gZnJvbSBcIkBtZWR1c2Fqcy91aVwiXG5pbXBvcnQgeyBDb3Vwb25Qcm9kdWN0c1BhZ2UgfSBmcm9tIFwiLi9jb3Vwb24tcHJvZHVjdHMtcGFnZVwiXG5pbXBvcnQgeyBDb3Vwb25FbXB0eVN0YXRlIH0gZnJvbSBcIi4vZW1wdHktc3RhdGVcIlxuXG5kZWNsYXJlIGNvbnN0IF9fQkFDS0VORF9VUkxfXzogc3RyaW5nXG5cbnR5cGUgQXBpQmFzZSA9IFwiL2FkbWluXCIgfCBcIi92ZW5kb3JcIlxudHlwZSBCZW5lZml0VHlwZSA9IFwiZml4ZWRfYW1vdW50XCIgfCBcInBlcmNlbnRhZ2VcIiB8IFwiZnJlZV9zaGlwcGluZ1wiIHwgXCJidXlfZ2V0XCJcbnR5cGUgQ29kZVN0cmF0ZWd5ID0gXCJ1bmlxdWVfY29kZVwiIHwgXCJzaGFyZWRfY29kZVwiXG50eXBlIE1pcnJvck1vZGUgPSBcIm5vbmVcIiB8IFwibWFudWFsXCIgfCBcImF1dG9cIlxudHlwZSBQcm9tb3Rpb25TdGF0dXMgPSBcImRyYWZ0XCIgfCBcImFjdGl2ZVwiIHwgXCJpbmFjdGl2ZVwiXG50eXBlIENhbXBhaWduTW9kZSA9IFwibm9uZVwiIHwgXCJleGlzdGluZ1wiIHwgXCJuZXdcIlxudHlwZSBFeHBpcmF0aW9uUG9saWN5VHlwZSA9IFwiZHVyYXRpb25cIiB8IFwiZml4ZWRcIlxudHlwZSBXaXphcmRTdGVwID0gXCJkZXRhaWxzXCIgfCBcIm9yZ2FuaXplXCIgfCBcInZhcmlhbnRzXCIgfCBcImNvdXBvblwiIHwgXCJjYW1wYWlnblwiXG5cbnR5cGUgQ291cG9uUHJvZHVjdENvbmZpZyA9IHtcbiAgaWQ6IHN0cmluZ1xuICBlbmFibGVkOiBib29sZWFuXG4gIHByb2R1Y3RfaWQ6IHN0cmluZ1xuICBiZW5lZml0X3R5cGU6IEJlbmVmaXRUeXBlXG4gIGFtb3VudDogbnVtYmVyIHwgbnVsbFxuICBwZXJjZW50YWdlOiBudW1iZXIgfCBudWxsXG4gIGN1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGxcbiAgY29kZV9zdHJhdGVneTogQ29kZVN0cmF0ZWd5XG4gIGNvZGVfcHJlZml4OiBzdHJpbmcgfCBudWxsXG4gIHNoYXJlZF9jb2RlOiBzdHJpbmcgfCBudWxsXG4gIGV4cGlyYXRpb25fcG9saWN5OlxuICAgIHwge1xuICAgICAgICB0eXBlOiBcImR1cmF0aW9uXCJcbiAgICAgICAgZHVyYXRpb25fZGF5czogbnVtYmVyXG4gICAgICAgIGNhcF9ieV9jYW1wYWlnbj86IGJvb2xlYW5cbiAgICAgICAgY2FwX2F0Pzogc3RyaW5nIHwgbnVsbFxuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiBcImZpeGVkXCJcbiAgICAgICAgZXhwaXJlc19hdDogc3RyaW5nXG4gICAgICAgIGNhcF9ieV9jYW1wYWlnbj86IGJvb2xlYW5cbiAgICAgICAgY2FwX2F0Pzogc3RyaW5nIHwgbnVsbFxuICAgICAgfVxuICBtYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW06IG51bWJlclxuICBwcm9tb3Rpb25fbWlycm9yX21vZGU6IE1pcnJvck1vZGVcbiAgcHJvbW90aW9uX3N0YXR1cz86IFByb21vdGlvblN0YXR1cyB8IG51bGxcbiAgY2FtcGFpZ25fbW9kZT86IENhbXBhaWduTW9kZSB8IG51bGxcbiAgY2FtcGFpZ25faWQ/OiBzdHJpbmcgfCBudWxsXG4gIGNhbXBhaWduX3NuYXBzaG90PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsXG4gIGNvbmZpZ192ZXJzaW9uOiBudW1iZXJcbn1cblxudHlwZSBDb3Vwb25WYXJpYW50Q29uZmlnID0gUGFydGlhbDxDb3Vwb25Qcm9kdWN0Q29uZmlnPiAmIHtcbiAgaWQ6IHN0cmluZ1xuICBwcm9kdWN0X2NvbmZpZ19pZDogc3RyaW5nXG4gIHZhcmlhbnRfaWQ6IHN0cmluZ1xufVxuXG50eXBlIFByb2R1Y3RWYXJpYW50ID0ge1xuICBpZDogc3RyaW5nXG4gIHRpdGxlOiBzdHJpbmcgfCBudWxsXG4gIHNrdT86IHN0cmluZyB8IG51bGxcbiAgcHJpY2VzPzogeyBjdXJyZW5jeV9jb2RlPzogc3RyaW5nOyBhbW91bnQ/OiBudW1iZXIgfVtdXG59XG5cbnR5cGUgUHJvZHVjdFJlY29yZCA9IHtcbiAgaWQ6IHN0cmluZ1xuICB0aXRsZTogc3RyaW5nIHwgbnVsbFxuICBzdWJ0aXRsZT86IHN0cmluZyB8IG51bGxcbiAgaGFuZGxlOiBzdHJpbmcgfCBudWxsXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbFxuICBzdGF0dXM6IHN0cmluZyB8IG51bGxcbiAgdGh1bWJuYWlsOiBzdHJpbmcgfCBudWxsXG4gIGRpc2NvdW50YWJsZT86IGJvb2xlYW5cbiAgdHlwZV9pZD86IHN0cmluZyB8IG51bGxcbiAgY29sbGVjdGlvbl9pZD86IHN0cmluZyB8IG51bGxcbiAgc2hpcHBpbmdfcHJvZmlsZV9pZD86IHN0cmluZyB8IG51bGxcbiAgdmFyaWFudHM/OiBQcm9kdWN0VmFyaWFudFtdXG4gIGNhdGVnb3JpZXM/OiB7IGlkOiBzdHJpbmc7IG5hbWU/OiBzdHJpbmcgfCBudWxsIH1bXVxuICB0YWdzPzogeyBpZDogc3RyaW5nOyB2YWx1ZT86IHN0cmluZyB8IG51bGwgfVtdXG4gIHNhbGVzX2NoYW5uZWxzPzogeyBpZDogc3RyaW5nOyBuYW1lPzogc3RyaW5nIHwgbnVsbCB9W11cbn1cblxudHlwZSBDb3Vwb25Qcm9kdWN0Um93ID0ge1xuICBpZDogc3RyaW5nXG4gIHByb2R1Y3Q6IFByb2R1Y3RSZWNvcmRcbiAgY291cG9uX3Byb2R1Y3RfY29uZmlnOiBDb3Vwb25Qcm9kdWN0Q29uZmlnXG4gIGNvdXBvbl9wcm9kdWN0X3ZhcmlhbnRfY29uZmlnczogQ291cG9uVmFyaWFudENvbmZpZ1tdXG4gIGVudGl0bGVtZW50c19jb3VudDogbnVtYmVyXG59XG5cbnR5cGUgQ291cG9uRW50aXRsZW1lbnQgPSB7XG4gIGlkOiBzdHJpbmdcbiAgb3JpZ2luPzogXCJwdXJjaGFzZVwiIHwgXCJleHRlcm5hbFwiXG4gIGN1c3RvbWVyX2lkOiBzdHJpbmcgfCBudWxsXG4gIGVtYWlsOiBzdHJpbmcgfCBudWxsXG4gIGNvZGU6IHN0cmluZyB8IG51bGxcbiAgc2hhcmVkX2NvZGU6IHN0cmluZyB8IG51bGxcbiAgc3RhdHVzOiBzdHJpbmdcbiAgcHJvZHVjdF9pZDogc3RyaW5nIHwgbnVsbFxuICB2YXJpYW50X2lkOiBzdHJpbmcgfCBudWxsXG4gIG9yZGVyX2lkOiBzdHJpbmcgfCBudWxsXG4gIGxpbmVfaXRlbV9pZDogc3RyaW5nIHwgbnVsbFxuICBpc3N1YW5jZV9pZD86IHN0cmluZyB8IG51bGxcbiAgY29uZmlnX2lkPzogc3RyaW5nIHwgbnVsbFxuICB2YXJpYW50X2NvbmZpZ19pZD86IHN0cmluZyB8IG51bGxcbiAgZXhwaXJlc19hdDogc3RyaW5nIHwgbnVsbFxuICByZWRlZW1lZF9hdDogc3RyaW5nIHwgbnVsbFxuICBjcmVhdGVkX2F0Pzogc3RyaW5nXG4gIGJlbmVmaXRfc25hcHNob3Q/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGxcbiAgc291cmNlX3NuYXBzaG90PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsXG4gIGV4dGVybmFsX3JlZmVyZW5jZT86IHN0cmluZyB8IG51bGxcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGxcbiAgc2VsbGVyX3RhcmdldHM/OiBBcnJheTx7XG4gICAgc2VsbGVyX2lkOiBzdHJpbmdcbiAgICBzZWxsZXJfbWVtYmVyX2lkPzogc3RyaW5nIHwgbnVsbFxuICB9PlxufVxuXG50eXBlIENvdXBvbklzc3VhbmNlUmVjb3JkID0ge1xuICBpZDogc3RyaW5nXG4gIHN0YXR1cz86IHN0cmluZyB8IG51bGxcbiAgcXVhbnRpdHk/OiBudW1iZXIgfCBudWxsXG4gIGNvbmZpZ19zbmFwc2hvdD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbFxuICBpc3N1ZWRfY291bnQ/OiBudW1iZXIgfCBudWxsXG4gIGZhaWxlZF9jb3VudD86IG51bWJlciB8IG51bGxcbiAgY3JlYXRlZF9hdD86IHN0cmluZ1xuICB1cGRhdGVkX2F0Pzogc3RyaW5nXG59XG5cbnR5cGUgQ291cG9uT3JkZXJTdW1tYXJ5ID0ge1xuICBpZDogc3RyaW5nXG4gIGRpc3BsYXlfaWQ6IHN0cmluZyB8IG51bWJlciB8IG51bGxcbiAgZW1haWw6IHN0cmluZyB8IG51bGxcbiAgY3VzdG9tZXJfaWQ6IHN0cmluZyB8IG51bGxcbiAgY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbFxuICB0b3RhbDogbnVtYmVyIHwgbnVsbFxuICBjcmVhdGVkX2F0OiBzdHJpbmcgfCBudWxsXG59XG5cbnR5cGUgQ291cG9uRW50aXRsZW1lbnREZXRhaWwgPSB7XG4gIGN1c3RvbWVyX2NvdXBvbl9lbnRpdGxlbWVudDogQ291cG9uRW50aXRsZW1lbnRcbiAgY291cG9uX2lzc3VhbmNlPzogQ291cG9uSXNzdWFuY2VSZWNvcmQgfCBudWxsXG4gIG9yZGVyPzogQ291cG9uT3JkZXJTdW1tYXJ5IHwgbnVsbFxufVxuXG50eXBlIE9wdGlvblJlY29yZCA9IHtcbiAgaWQ6IHN0cmluZ1xuICBuYW1lPzogc3RyaW5nIHwgbnVsbFxuICB0aXRsZT86IHN0cmluZyB8IG51bGxcbiAgdmFsdWU/OiBzdHJpbmcgfCBudWxsXG4gIGhhbmRsZT86IHN0cmluZyB8IG51bGxcbiAgY2FtcGFpZ25faWRlbnRpZmllcj86IHN0cmluZyB8IG51bGxcbn1cblxudHlwZSBDdXJyZW5jeU9wdGlvbiA9IHtcbiAgY29kZTogc3RyaW5nXG4gIG5hbWU6IHN0cmluZ1xuICBzeW1ib2w6IHN0cmluZ1xuICBzeW1ib2xfbmF0aXZlOiBzdHJpbmdcbiAgaXNfZGVmYXVsdDogYm9vbGVhblxufVxuXG50eXBlIE9wdGlvbnNQYXlsb2FkID0ge1xuICBjdXJyZW5jaWVzPzogQ3VycmVuY3lPcHRpb25bXVxuICBwcm9kdWN0X3R5cGVzPzogT3B0aW9uUmVjb3JkW11cbiAgcHJvZHVjdF9jb2xsZWN0aW9ucz86IE9wdGlvblJlY29yZFtdXG4gIHByb2R1Y3RfY2F0ZWdvcmllcz86IE9wdGlvblJlY29yZFtdXG4gIHByb2R1Y3RfdGFncz86IE9wdGlvblJlY29yZFtdXG4gIHNhbGVzX2NoYW5uZWxzPzogT3B0aW9uUmVjb3JkW11cbiAgc2hpcHBpbmdfcHJvZmlsZXM/OiBPcHRpb25SZWNvcmRbXVxuICBjYW1wYWlnbnM/OiBPcHRpb25SZWNvcmRbXVxuICBzZWxsZXJzPzogT3B0aW9uUmVjb3JkW11cbn1cblxudHlwZSBQcm9kdWN0Rm9ybVN0YXRlID0ge1xuICBpZDogc3RyaW5nXG4gIHRpdGxlOiBzdHJpbmdcbiAgc3VidGl0bGU6IHN0cmluZ1xuICBoYW5kbGU6IHN0cmluZ1xuICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gIHRodW1ibmFpbDogc3RyaW5nXG4gIHN0YXR1czogc3RyaW5nXG4gIGRpc2NvdW50YWJsZTogYm9vbGVhblxuICBzZWxsZXJfaWQ6IHN0cmluZ1xuICB0eXBlX2lkOiBzdHJpbmdcbiAgY29sbGVjdGlvbl9pZDogc3RyaW5nXG4gIGNhdGVnb3J5X2lkOiBzdHJpbmdcbiAgdGFnX2lkOiBzdHJpbmdcbiAgc2FsZXNfY2hhbm5lbF9pZDogc3RyaW5nXG4gIHZhcmlhbnRzOiBWYXJpYW50Rm9ybVN0YXRlW11cbn1cblxudHlwZSBWYXJpYW50Rm9ybVN0YXRlID0ge1xuICBpZD86IHN0cmluZ1xuICBvdmVycmlkZV9jb25maWdfaWQ/OiBzdHJpbmdcbiAgdGl0bGU6IHN0cmluZ1xuICBza3U6IHN0cmluZ1xuICBjdXJyZW5jeV9jb2RlOiBzdHJpbmdcbiAgYW1vdW50OiBzdHJpbmdcbiAgb3ZlcnJpZGVfZW5hYmxlZDogYm9vbGVhblxuICBvdmVycmlkZV9iZW5lZml0X3R5cGU6IEJlbmVmaXRUeXBlXG4gIG92ZXJyaWRlX2N1cnJlbmN5X2NvZGU6IHN0cmluZ1xuICBvdmVycmlkZV9hbW91bnQ6IHN0cmluZ1xuICBvdmVycmlkZV9wZXJjZW50YWdlOiBzdHJpbmdcbn1cblxudHlwZSBDb3Vwb25Gb3JtU3RhdGUgPSB7XG4gIGVuYWJsZWQ6IGJvb2xlYW5cbiAgYmVuZWZpdF90eXBlOiBCZW5lZml0VHlwZVxuICBhbW91bnQ6IHN0cmluZ1xuICBwZXJjZW50YWdlOiBzdHJpbmdcbiAgY3VycmVuY3lfY29kZTogc3RyaW5nXG4gIGNvZGVfc3RyYXRlZ3k6IENvZGVTdHJhdGVneVxuICBjb2RlX3ByZWZpeDogc3RyaW5nXG4gIHNoYXJlZF9jb2RlOiBzdHJpbmdcbiAgZXhwaXJhdGlvbl90eXBlOiBFeHBpcmF0aW9uUG9saWN5VHlwZVxuICBleHBpcmF0aW9uX2RheXM6IHN0cmluZ1xuICBleHBpcmF0aW9uX2RhdGU6IHN0cmluZ1xuICBleHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbjogYm9vbGVhblxuICBleHBpcmF0aW9uX2NhcF9hdDogc3RyaW5nXG4gIG1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbTogc3RyaW5nXG4gIHByb21vdGlvbl9taXJyb3JfbW9kZTogTWlycm9yTW9kZVxuICBwcm9tb3Rpb25fc3RhdHVzOiBQcm9tb3Rpb25TdGF0dXNcbn1cblxudHlwZSBDYW1wYWlnbkZvcm1TdGF0ZSA9IHtcbiAgbW9kZTogQ2FtcGFpZ25Nb2RlXG4gIGNhbXBhaWduX2lkOiBzdHJpbmdcbiAgbmFtZTogc3RyaW5nXG4gIGNhbXBhaWduX2lkZW50aWZpZXI6IHN0cmluZ1xuICBzdGFydHNfYXQ6IHN0cmluZ1xuICBlbmRzX2F0OiBzdHJpbmdcbn1cblxuY29uc3QgTk9ORSA9IFwiX19ub25lX19cIlxuY29uc3Qgc3RlcHM6IFdpemFyZFN0ZXBbXSA9IFtcbiAgXCJkZXRhaWxzXCIsXG4gIFwib3JnYW5pemVcIixcbiAgXCJ2YXJpYW50c1wiLFxuICBcImNvdXBvblwiLFxuICBcImNhbXBhaWduXCIsXG5dXG5cbmNvbnN0IGVtcHR5VmFyaWFudDogVmFyaWFudEZvcm1TdGF0ZSA9IHtcbiAgdGl0bGU6IFwiRGVmYXVsdCB2YXJpYW50XCIsXG4gIHNrdTogXCJcIixcbiAgY3VycmVuY3lfY29kZTogXCJcIixcbiAgYW1vdW50OiBcIlwiLFxuICBvdmVycmlkZV9lbmFibGVkOiBmYWxzZSxcbiAgb3ZlcnJpZGVfYmVuZWZpdF90eXBlOiBcImZpeGVkX2Ftb3VudFwiLFxuICBvdmVycmlkZV9jdXJyZW5jeV9jb2RlOiBcIlwiLFxuICBvdmVycmlkZV9hbW91bnQ6IFwiXCIsXG4gIG92ZXJyaWRlX3BlcmNlbnRhZ2U6IFwiXCIsXG59XG5cbmNvbnN0IGVtcHR5UHJvZHVjdDogUHJvZHVjdEZvcm1TdGF0ZSA9IHtcbiAgaWQ6IFwiXCIsXG4gIHRpdGxlOiBcIlwiLFxuICBzdWJ0aXRsZTogXCJcIixcbiAgaGFuZGxlOiBcIlwiLFxuICBkZXNjcmlwdGlvbjogXCJcIixcbiAgdGh1bWJuYWlsOiBcIlwiLFxuICBzdGF0dXM6IFwiZHJhZnRcIixcbiAgZGlzY291bnRhYmxlOiBmYWxzZSxcbiAgc2VsbGVyX2lkOiBcIlwiLFxuICB0eXBlX2lkOiBcIlwiLFxuICBjb2xsZWN0aW9uX2lkOiBcIlwiLFxuICBjYXRlZ29yeV9pZDogXCJcIixcbiAgdGFnX2lkOiBcIlwiLFxuICBzYWxlc19jaGFubmVsX2lkOiBcIlwiLFxuICB2YXJpYW50czogW2VtcHR5VmFyaWFudF0sXG59XG5cbmNvbnN0IGVtcHR5Q291cG9uOiBDb3Vwb25Gb3JtU3RhdGUgPSB7XG4gIGVuYWJsZWQ6IHRydWUsXG4gIGJlbmVmaXRfdHlwZTogXCJmaXhlZF9hbW91bnRcIixcbiAgYW1vdW50OiBcIlwiLFxuICBwZXJjZW50YWdlOiBcIlwiLFxuICBjdXJyZW5jeV9jb2RlOiBcIlwiLFxuICBjb2RlX3N0cmF0ZWd5OiBcInVuaXF1ZV9jb2RlXCIsXG4gIGNvZGVfcHJlZml4OiBcIkNPVVBPTlwiLFxuICBzaGFyZWRfY29kZTogXCJcIixcbiAgZXhwaXJhdGlvbl90eXBlOiBcImR1cmF0aW9uXCIsXG4gIGV4cGlyYXRpb25fZGF5czogXCIzMFwiLFxuICBleHBpcmF0aW9uX2RhdGU6IFwiXCIsXG4gIGV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWduOiB0cnVlLFxuICBleHBpcmF0aW9uX2NhcF9hdDogXCJcIixcbiAgbWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtOiBcIjFcIixcbiAgcHJvbW90aW9uX21pcnJvcl9tb2RlOiBcIm5vbmVcIixcbiAgcHJvbW90aW9uX3N0YXR1czogXCJkcmFmdFwiLFxufVxuXG5jb25zdCBlbXB0eUNhbXBhaWduOiBDYW1wYWlnbkZvcm1TdGF0ZSA9IHtcbiAgbW9kZTogXCJub25lXCIsXG4gIGNhbXBhaWduX2lkOiBcIlwiLFxuICBuYW1lOiBcIlwiLFxuICBjYW1wYWlnbl9pZGVudGlmaWVyOiBcIlwiLFxuICBzdGFydHNfYXQ6IFwiXCIsXG4gIGVuZHNfYXQ6IFwiXCIsXG59XG5cbmNvbnN0IG1vZGFsQ29udGVudFN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBkaXNwbGF5OiBcImZsZXhcIixcbiAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG59XG5cbmNvbnN0IG1vZGFsU3RhdGljUm93U3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGZsZXhTaHJpbms6IDAsXG59XG5cbmNvbnN0IG1vZGFsV2l6YXJkU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGRpc3BsYXk6IFwiZmxleFwiLFxuICBmbGV4OiBcIjEgMSBhdXRvXCIsXG4gIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gIG1pbkhlaWdodDogMCxcbn1cblxuY29uc3QgbW9kYWxCb2R5U3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGZsZXg6IFwiMSAxIGF1dG9cIixcbiAgbWluSGVpZ2h0OiAwLFxuICBvdmVyZmxvd1k6IFwiYXV0b1wiLFxuICBwYWRkaW5nOiBcIjMycHggMjRweFwiLFxufVxuXG5jb25zdCBtb2RhbEZvcm1TdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgbWFyZ2luOiBcIjAgYXV0b1wiLFxuICBtYXhXaWR0aDogOTIwLFxuICB3aWR0aDogXCJtaW4oOTIwcHgsIDEwMCUpXCIsXG59XG5cbmNvbnN0IHN0YWNrU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGRpc3BsYXk6IFwiZmxleFwiLFxuICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICBnYXA6IDE2LFxufVxuXG5jb25zdCB0d29Db2x1bW5HcmlkU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGRpc3BsYXk6IFwiZ3JpZFwiLFxuICBnYXA6IDE2LFxuICBncmlkVGVtcGxhdGVDb2x1bW5zOiBcInJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDI2MHB4LCAxZnIpKVwiLFxufVxuXG5jb25zdCB0aHJlZUNvbHVtbkdyaWRTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgZGlzcGxheTogXCJncmlkXCIsXG4gIGdhcDogMTYsXG4gIGdyaWRUZW1wbGF0ZUNvbHVtbnM6IFwicmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMjIwcHgsIDFmcikpXCIsXG59XG5cbmNvbnN0IGZvdXJDb2x1bW5HcmlkU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGRpc3BsYXk6IFwiZ3JpZFwiLFxuICBnYXA6IDE2LFxuICBncmlkVGVtcGxhdGVDb2x1bW5zOiBcInJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDE2MHB4LCAxZnIpKVwiLFxufVxuXG5jb25zdCBwYW5lbFN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBib3JkZXI6IFwiMXB4IHNvbGlkIHZhcigtLWJvcmRlci1iYXNlKVwiLFxuICBib3JkZXJSYWRpdXM6IDgsXG4gIHBhZGRpbmc6IDE2LFxufVxuXG5jb25zdCByb3dCZXR3ZWVuU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gIGRpc3BsYXk6IFwiZmxleFwiLFxuICBnYXA6IDE2LFxuICBqdXN0aWZ5Q29udGVudDogXCJzcGFjZS1iZXR3ZWVuXCIsXG59XG5cbmZ1bmN0aW9uIGJhY2tlbmRVcmwoKSB7XG4gIHJldHVybiB0eXBlb2YgX19CQUNLRU5EX1VSTF9fID09PSBcInN0cmluZ1wiXG4gICAgPyBfX0JBQ0tFTkRfVVJMX18ucmVwbGFjZSgvXFwvJC8sIFwiXCIpXG4gICAgOiBcIlwiXG59XG5cbmZ1bmN0aW9uIGFwaUVycm9yTWVzc2FnZShwYXlsb2FkOiBhbnksIGZhbGxiYWNrOiBzdHJpbmcpIHtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFtcbiAgICBwYXlsb2FkPy5tZXNzYWdlLFxuICAgIHBheWxvYWQ/LmVycm9yPy5tZXNzYWdlLFxuICAgIHBheWxvYWQ/LmVycm9yLFxuICAgIHBheWxvYWQ/LmVycm9ycz8uWzBdPy5tZXNzYWdlLFxuICBdXG4gIGNvbnN0IG1lc3NhZ2UgPSBjYW5kaWRhdGVzLmZpbmQoXG4gICAgKGNhbmRpZGF0ZSkgPT4gdHlwZW9mIGNhbmRpZGF0ZSA9PT0gXCJzdHJpbmdcIiAmJiBjYW5kaWRhdGUudHJpbSgpLFxuICApXG5cbiAgcmV0dXJuIG1lc3NhZ2UgfHwgZmFsbGJhY2sgfHwgXCJSZXF1ZXN0IGZhaWxlZFwiXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFwaUZldGNoPFQ+KFxuICBwYXRoOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge30sXG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtiYWNrZW5kVXJsKCl9JHtwYXRofWAsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcbiAgICBoZWFkZXJzOiB7XG4gICAgICAuLi4ob3B0aW9ucy5ib2R5ID8geyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9IDoge30pLFxuICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgIH0sXG4gIH0pXG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gbnVsbClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYXBpRXJyb3JNZXNzYWdlKHBheWxvYWQsIHJlc3BvbnNlLnN0YXR1c1RleHQpKVxuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKVxufVxuXG5mdW5jdGlvbiBudW1iZXJPck51bGwodmFsdWU6IHN0cmluZykge1xuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpXG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSAmJiBwYXJzZWQgPiAwID8gcGFyc2VkIDogbnVsbFxufVxuXG5mdW5jdGlvbiBvcHRpb25MYWJlbChvcHRpb246IE9wdGlvblJlY29yZCkge1xuICByZXR1cm4gKFxuICAgIG9wdGlvbi5uYW1lIHx8IG9wdGlvbi50aXRsZSB8fCBvcHRpb24udmFsdWUgfHwgb3B0aW9uLmhhbmRsZSB8fCBvcHRpb24uaWRcbiAgKVxufVxuXG5mdW5jdGlvbiBiZW5lZml0TGFiZWwoXG4gIGNvbmZpZzogUGljazxcbiAgICBDb3Vwb25Qcm9kdWN0Q29uZmlnLFxuICAgIFwiYmVuZWZpdF90eXBlXCIgfCBcImFtb3VudFwiIHwgXCJwZXJjZW50YWdlXCIgfCBcImN1cnJlbmN5X2NvZGVcIlxuICA+LFxuKSB7XG4gIGlmIChjb25maWcuYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiKSB7XG4gICAgcmV0dXJuIGAke2NvbmZpZy5hbW91bnQgfHwgMH0gJHsoY29uZmlnLmN1cnJlbmN5X2NvZGUgfHwgXCJcIikudG9VcHBlckNhc2UoKX1gXG4gIH1cbiAgaWYgKGNvbmZpZy5iZW5lZml0X3R5cGUgPT09IFwicGVyY2VudGFnZVwiKSB7XG4gICAgcmV0dXJuIGAke2NvbmZpZy5wZXJjZW50YWdlIHx8IDB9JWBcbiAgfVxuICBpZiAoY29uZmlnLmJlbmVmaXRfdHlwZSA9PT0gXCJmcmVlX3NoaXBwaW5nXCIpIHtcbiAgICByZXR1cm4gXCJGcmVlIHNoaXBwaW5nXCJcbiAgfVxuICByZXR1cm4gXCJCdXkgZ2V0XCJcbn1cblxuZnVuY3Rpb24gZm9ybWF0RGF0ZSh2YWx1ZT86IHN0cmluZyB8IG51bGwpIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiLVwiXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgaWYgKE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkpIHJldHVybiBcIi1cIlxuICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoKVxufVxuXG5mdW5jdGlvbiBmb3JtYXREYXRlVGltZSh2YWx1ZT86IHN0cmluZyB8IG51bGwpIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiLVwiXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgaWYgKE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkpIHJldHVybiBcIi1cIlxuICByZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZygpXG59XG5cbmZ1bmN0aW9uIGZvcm1hdEZ1bGxEYXRlKHZhbHVlPzogc3RyaW5nIHwgbnVsbCkge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gXCItXCJcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKVxuICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkgcmV0dXJuIFwiLVwiXG4gIHJldHVybiBkYXRlLnRvTG9jYWxlU3RyaW5nKHVuZGVmaW5lZCwge1xuICAgIGRheTogXCJudW1lcmljXCIsXG4gICAgaG91cjogXCJudW1lcmljXCIsXG4gICAgbWludXRlOiBcIjItZGlnaXRcIixcbiAgICBtb250aDogXCJzaG9ydFwiLFxuICAgIHllYXI6IFwibnVtZXJpY1wiLFxuICB9KVxufVxuXG5mdW5jdGlvbiBmb3JtYXRSZWxhdGl2ZURhdGUodmFsdWU/OiBzdHJpbmcgfCBudWxsKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIi1cIlxuICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsdWUpXG4gIGlmIChOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSByZXR1cm4gXCItXCJcblxuICBjb25zdCBkaWZmU2Vjb25kcyA9IE1hdGgucm91bmQoKGRhdGUuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSkgLyAxMDAwKVxuICBjb25zdCBhYnNTZWNvbmRzID0gTWF0aC5hYnMoZGlmZlNlY29uZHMpXG4gIGNvbnN0IHVuaXRzOiBBcnJheTxbSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXRVbml0LCBudW1iZXJdPiA9IFtcbiAgICBbXCJ5ZWFyXCIsIDYwICogNjAgKiAyNCAqIDM2NV0sXG4gICAgW1wibW9udGhcIiwgNjAgKiA2MCAqIDI0ICogMzBdLFxuICAgIFtcIndlZWtcIiwgNjAgKiA2MCAqIDI0ICogN10sXG4gICAgW1wiZGF5XCIsIDYwICogNjAgKiAyNF0sXG4gICAgW1wiaG91clwiLCA2MCAqIDYwXSxcbiAgICBbXCJtaW51dGVcIiwgNjBdLFxuICBdXG4gIGNvbnN0IFt1bml0LCBzZWNvbmRzXSA9XG4gICAgdW5pdHMuZmluZCgoWywgc2Vjb25kc1BlclVuaXRdKSA9PiBhYnNTZWNvbmRzID49IHNlY29uZHNQZXJVbml0KSB8fCBbXVxuXG4gIGlmICghdW5pdCB8fCAhc2Vjb25kcykge1xuICAgIHJldHVybiBcImp1c3Qgbm93XCJcbiAgfVxuXG4gIHJldHVybiBuZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQodW5kZWZpbmVkLCB7IG51bWVyaWM6IFwiYXV0b1wiIH0pLmZvcm1hdChcbiAgICBNYXRoLnJvdW5kKGRpZmZTZWNvbmRzIC8gc2Vjb25kcyksXG4gICAgdW5pdCxcbiAgKVxufVxuXG5mdW5jdGlvbiBmb3JtYXRTbmFwc2hvdEFtb3VudChhbW91bnQ6IG51bWJlciB8IG51bGwsIGN1cnJlbmN5Pzogc3RyaW5nIHwgbnVsbCkge1xuICBpZiAoYW1vdW50ID09IG51bGwpIHJldHVybiBcIi1cIlxuICBjb25zdCBjb2RlID0gY3VycmVuY3kgPyBjdXJyZW5jeS50b1VwcGVyQ2FzZSgpIDogXCJcIlxuICByZXR1cm4gW2NvZGUsIGFtb3VudC50b0xvY2FsZVN0cmluZyh1bmRlZmluZWQsIHsgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiAyIH0pXVxuICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAuam9pbihcIiBcIilcbn1cblxuZnVuY3Rpb24gdG9EYXRlVGltZUxvY2FsKHZhbHVlPzogc3RyaW5nIHwgbnVsbCkge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gXCJcIlxuICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsdWUpXG4gIGlmIChOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSByZXR1cm4gXCJcIlxuICBjb25zdCBsb2NhbERhdGUgPSBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSAtIGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwXzAwMClcbiAgcmV0dXJuIGxvY2FsRGF0ZS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDE2KVxufVxuXG5mdW5jdGlvbiBlbnRpdGxlbWVudFN0YXR1c0NvbG9yKHN0YXR1czogc3RyaW5nKSB7XG4gIGlmIChzdGF0dXMgPT09IFwiaXNzdWVkXCIpIHJldHVybiBcImdyZWVuXCIgYXMgY29uc3RcbiAgaWYgKHN0YXR1cyA9PT0gXCJyZWRlZW1lZFwiKSByZXR1cm4gXCJibHVlXCIgYXMgY29uc3RcbiAgaWYgKHN0YXR1cyA9PT0gXCJleHBpcmVkXCIgfHwgc3RhdHVzID09PSBcImNhbmNlbGVkXCIpIHJldHVybiBcImdyZXlcIiBhcyBjb25zdFxuICByZXR1cm4gXCJvcmFuZ2VcIiBhcyBjb25zdFxufVxuXG5mdW5jdGlvbiBwcm9kdWN0U3RhdHVzQ29sb3Ioc3RhdHVzPzogc3RyaW5nIHwgbnVsbCkge1xuICBpZiAoc3RhdHVzID09PSBcInB1Ymxpc2hlZFwiKSByZXR1cm4gXCJncmVlblwiIGFzIGNvbnN0XG4gIGlmIChzdGF0dXMgPT09IFwicmVqZWN0ZWRcIikgcmV0dXJuIFwicmVkXCIgYXMgY29uc3RcbiAgaWYgKHN0YXR1cyA9PT0gXCJwcm9wb3NlZFwiKSByZXR1cm4gXCJvcmFuZ2VcIiBhcyBjb25zdFxuICByZXR1cm4gXCJncmV5XCIgYXMgY29uc3Rcbn1cblxuZnVuY3Rpb24gc25hcHNob3RTdHJpbmcoXG4gIHNuYXBzaG90OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGtleTogc3RyaW5nLFxuKSB7XG4gIGNvbnN0IHZhbHVlID0gc25hcHNob3Q/LltrZXldXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUudHJpbSgpKSByZXR1cm4gdmFsdWVcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgcmV0dXJuIFwiXCJcbn1cblxuZnVuY3Rpb24gc25hcHNob3ROdW1iZXIoXG4gIHNuYXBzaG90OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGtleTogc3RyaW5nLFxuKSB7XG4gIGNvbnN0IHZhbHVlID0gc25hcHNob3Q/LltrZXldXG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSA/IHZhbHVlIDogbnVsbFxufVxuXG5mdW5jdGlvbiBqc29uQmxvY2sodmFsdWU6IHVua25vd24pIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBcInt9XCJcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKVxufVxuXG5mdW5jdGlvbiBjb3Vwb25Db2RlKGVudGl0bGVtZW50OiBDb3Vwb25FbnRpdGxlbWVudCkge1xuICByZXR1cm4gZW50aXRsZW1lbnQuY29kZSB8fCBlbnRpdGxlbWVudC5zaGFyZWRfY29kZSB8fCBcIi1cIlxufVxuXG5mdW5jdGlvbiBlbnRpdGxlbWVudFNvdXJjZShlbnRpdGxlbWVudDogQ291cG9uRW50aXRsZW1lbnQpIHtcbiAgaWYgKGVudGl0bGVtZW50Lm9yaWdpbiA9PT0gXCJleHRlcm5hbFwiKSByZXR1cm4gXCJFeHRlcm5hbFwiXG4gIHJldHVybiBcIlB1cmNoYXNlXCJcbn1cblxuZnVuY3Rpb24gZW50aXRsZW1lbnRTZWxsZXJTY29wZShlbnRpdGxlbWVudDogQ291cG9uRW50aXRsZW1lbnQpIHtcbiAgY29uc3QgY291bnQgPSBlbnRpdGxlbWVudC5zZWxsZXJfdGFyZ2V0cz8ubGVuZ3RoIHx8IDBcbiAgaWYgKGVudGl0bGVtZW50Lm9yaWdpbiAhPT0gXCJleHRlcm5hbFwiKSB7XG4gICAgaWYgKCFjb3VudCkgcmV0dXJuIFwiUHJvZHVjdCBzZWxsZXJcIlxuICAgIHJldHVybiBgUHJvZHVjdCBzZWxsZXIgKyAke2NvdW50fSBsaW5rZWRgXG4gIH1cbiAgaWYgKCFjb3VudCkgcmV0dXJuIFwiQWRtaW4gb25seVwiXG4gIHJldHVybiBjb3VudCA9PT0gMSA/IFwiMSBsaW5rZWQgc2VsbGVyXCIgOiBgJHtjb3VudH0gbGlua2VkIHNlbGxlcnNgXG59XG5cbmZ1bmN0aW9uIG9yZGVyRGlzcGxheUlkKG9yZGVyOiBDb3Vwb25PcmRlclN1bW1hcnkgfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gIGlmICghb3JkZXIpIHJldHVybiBcIi1cIlxuICByZXR1cm4gb3JkZXIuZGlzcGxheV9pZCA9PSBudWxsID8gb3JkZXIuaWQgOiBgIyR7b3JkZXIuZGlzcGxheV9pZH1gXG59XG5cbmZ1bmN0aW9uIGRhc2hib2FyZEJhc2VQYXRoKGFwaUJhc2U6IEFwaUJhc2UpIHtcbiAgcmV0dXJuIGFwaUJhc2UgPT09IFwiL3ZlbmRvclwiID8gXCIvc2VsbGVyXCIgOiBcIi9kYXNoYm9hcmRcIlxufVxuXG5mdW5jdGlvbiBjb3Vwb25EZXRhaWxQYXRoKGFwaUJhc2U6IEFwaUJhc2UsIGVudGl0bGVtZW50SWQ6IHN0cmluZykge1xuICByZXR1cm4gYCR7ZGFzaGJvYXJkQmFzZVBhdGgoYXBpQmFzZSl9L2NvdXBvbnMvJHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgZW50aXRsZW1lbnRJZCxcbiAgKX1gXG59XG5cbmZ1bmN0aW9uIG9yZGVyRGV0YWlsUGF0aChhcGlCYXNlOiBBcGlCYXNlLCBvcmRlcklkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGAke2Rhc2hib2FyZEJhc2VQYXRoKGFwaUJhc2UpfS9vcmRlcnMvJHtlbmNvZGVVUklDb21wb25lbnQob3JkZXJJZCl9YFxufVxuXG5mdW5jdGlvbiBjdXJyZW50Q291cG9uRGV0YWlsSWQoYXBpQmFzZTogQXBpQmFzZSkge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiBcIlwiXG4gIH1cblxuICBjb25zdCBwcmVmaXggPSBgJHtkYXNoYm9hcmRCYXNlUGF0aChhcGlCYXNlKX0vY291cG9ucy9gXG4gIGNvbnN0IHBhdGggPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWVcbiAgY29uc3QgaW5kZXggPSBwYXRoLmluZGV4T2YocHJlZml4KVxuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIFwiXCJcbiAgfVxuXG4gIGNvbnN0IGlkID0gcGF0aC5zbGljZShpbmRleCArIHByZWZpeC5sZW5ndGgpLnNwbGl0KFwiL1wiKVswXVxuICBpZiAoIWlkIHx8IGlkID09PSBcInByb2R1Y3RzXCIpIHtcbiAgICByZXR1cm4gXCJcIlxuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGlkKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gaWRcbiAgfVxufVxuXG5mdW5jdGlvbiBiZW5lZml0U25hcHNob3RMYWJlbChcbiAgc25hcHNob3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbikge1xuICBjb25zdCB0eXBlID0gc25hcHNob3RTdHJpbmcoc25hcHNob3QsIFwiYmVuZWZpdF90eXBlXCIpXG4gIGlmICh0eXBlID09PSBcImZpeGVkX2Ftb3VudFwiKSB7XG4gICAgY29uc3QgYW1vdW50cyA9IEFycmF5LmlzQXJyYXkoc25hcHNob3Q/LmFtb3VudHMpXG4gICAgICA/IChzbmFwc2hvdC5hbW91bnRzIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PilcbiAgICAgIDogW11cbiAgICBpZiAoYW1vdW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBhbW91bnRzXG4gICAgICAgIC5tYXAoKHJvdykgPT4ge1xuICAgICAgICAgIGNvbnN0IGFtb3VudCA9IHNuYXBzaG90TnVtYmVyKHJvdywgXCJhbW91bnRcIilcbiAgICAgICAgICBjb25zdCBjdXJyZW5jeSA9IHNuYXBzaG90U3RyaW5nKHJvdywgXCJjdXJyZW5jeV9jb2RlXCIpLnRvVXBwZXJDYXNlKClcbiAgICAgICAgICByZXR1cm4gYCR7YW1vdW50ID8/IDB9ICR7Y3VycmVuY3l9YC50cmltKClcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKVxuICAgIH1cblxuICAgIGNvbnN0IGFtb3VudCA9IHNuYXBzaG90TnVtYmVyKHNuYXBzaG90LCBcImFtb3VudFwiKVxuICAgIGNvbnN0IGN1cnJlbmN5ID0gc25hcHNob3RTdHJpbmcoc25hcHNob3QsIFwiY3VycmVuY3lfY29kZVwiKS50b1VwcGVyQ2FzZSgpXG4gICAgcmV0dXJuIGAke2Ftb3VudCA/PyAwfSAke2N1cnJlbmN5fWAudHJpbSgpXG4gIH1cblxuICBpZiAodHlwZSA9PT0gXCJwZXJjZW50YWdlXCIpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHNuYXBzaG90Py5wcm9tb3Rpb25fdGVtcGxhdGUgYXNcbiAgICAgIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgIHwgbnVsbFxuICAgICAgfCB1bmRlZmluZWRcbiAgICBjb25zdCBtZXRob2QgPSB0ZW1wbGF0ZT8uYXBwbGljYXRpb25fbWV0aG9kIGFzXG4gICAgICB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICB8IG51bGxcbiAgICAgIHwgdW5kZWZpbmVkXG4gICAgY29uc3Qgc2NvcGUgPSBzbmFwc2hvdFN0cmluZyhtZXRob2QsIFwidGFyZ2V0X3R5cGVcIikgPT09IFwib3JkZXJcIlxuICAgICAgPyBcIm9yZGVyXCJcbiAgICAgIDogXCJwcm9kdWN0c1wiXG4gICAgcmV0dXJuIGAke3NuYXBzaG90TnVtYmVyKHNuYXBzaG90LCBcInBlcmNlbnRhZ2VcIikgPz8gMH0lIG9mZiAke3Njb3BlfWBcbiAgfVxuXG4gIGlmICh0eXBlID09PSBcImZyZWVfc2hpcHBpbmdcIikge1xuICAgIHJldHVybiBcIkZyZWUgc2hpcHBpbmdcIlxuICB9XG5cbiAgaWYgKHR5cGUgPT09IFwiYnV5X2dldFwiKSB7XG4gICAgcmV0dXJuIFwiQnV5IFggR2V0IFlcIlxuICB9XG5cbiAgcmV0dXJuIFwiVW5rbm93blwiXG59XG5cbmZ1bmN0aW9uIGV4cGlyYXRpb25Qb2xpY3lMYWJlbChcbiAgc25hcHNob3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbikge1xuICBjb25zdCBwb2xpY3kgPSBzbmFwc2hvdD8uZXhwaXJhdGlvbl9wb2xpY3kgYXNcbiAgICB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgfCBudWxsXG4gICAgfCB1bmRlZmluZWRcbiAgY29uc3QgdHlwZSA9IHNuYXBzaG90U3RyaW5nKHBvbGljeSwgXCJ0eXBlXCIpXG5cbiAgaWYgKHR5cGUgPT09IFwibm9uZVwiKSByZXR1cm4gXCJObyBleHBpcmF0aW9uXCJcbiAgaWYgKHR5cGUgPT09IFwiZHVyYXRpb25cIikge1xuICAgIGNvbnN0IGRheXMgPSBzbmFwc2hvdE51bWJlcihwb2xpY3ksIFwiZHVyYXRpb25fZGF5c1wiKSA/PyAwXG4gICAgcmV0dXJuIGAke2RheXN9IGRheXMgYWZ0ZXIgaXNzdWFuY2VgXG4gIH1cbiAgaWYgKHR5cGUgPT09IFwiZml4ZWRcIikge1xuICAgIHJldHVybiBgRml4ZWQgZGF0ZSAke2Zvcm1hdERhdGVUaW1lKHNuYXBzaG90U3RyaW5nKHBvbGljeSwgXCJleHBpcmVzX2F0XCIpKX1gXG4gIH1cblxuICByZXR1cm4gXCItXCJcbn1cblxuZnVuY3Rpb24gY2FtcGFpZ25TbmFwc2hvdExhYmVsKFxuICBzbmFwc2hvdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIHwgdW5kZWZpbmVkLFxuKSB7XG4gIGNvbnN0IGNhbXBhaWduU25hcHNob3QgPSBzbmFwc2hvdD8uY2FtcGFpZ25fc25hcHNob3QgYXNcbiAgICB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgfCBudWxsXG4gICAgfCB1bmRlZmluZWRcbiAgcmV0dXJuIChcbiAgICBzbmFwc2hvdFN0cmluZyhjYW1wYWlnblNuYXBzaG90LCBcIm5hbWVcIikgfHxcbiAgICBzbmFwc2hvdFN0cmluZyhjYW1wYWlnblNuYXBzaG90LCBcImNhbXBhaWduX2lkZW50aWZpZXJcIikgfHxcbiAgICBzbmFwc2hvdFN0cmluZyhzbmFwc2hvdCwgXCJjYW1wYWlnbl9pZFwiKSB8fFxuICAgIFwiTm9uZVwiXG4gIClcbn1cblxuZnVuY3Rpb24gcHJvbW90aW9uU25hcHNob3RMYWJlbChcbiAgc25hcHNob3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbikge1xuICBjb25zdCB0ZW1wbGF0ZSA9IHNuYXBzaG90Py5wcm9tb3Rpb25fdGVtcGxhdGUgYXNcbiAgICB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgfCBudWxsXG4gICAgfCB1bmRlZmluZWRcbiAgY29uc3QgbWV0aG9kID0gdGVtcGxhdGU/LmFwcGxpY2F0aW9uX21ldGhvZCBhc1xuICAgIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICB8IG51bGxcbiAgICB8IHVuZGVmaW5lZFxuICBjb25zdCB0YXJnZXQgPSBzbmFwc2hvdFN0cmluZyhtZXRob2QsIFwidGFyZ2V0X3R5cGVcIilcbiAgY29uc3QgYWxsb2NhdGlvbiA9IHNuYXBzaG90U3RyaW5nKG1ldGhvZCwgXCJhbGxvY2F0aW9uXCIpXG5cbiAgcmV0dXJuIFt0YXJnZXQsIGFsbG9jYXRpb25dLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIC8gXCIpIHx8IFwiTm9uZVwiXG59XG5cbmZ1bmN0aW9uIGNhbXBhaWduTGFiZWwoY29uZmlnOiBDb3Vwb25Qcm9kdWN0Q29uZmlnKSB7XG4gIGNvbnN0IG5hbWUgPSBjb25maWcuY2FtcGFpZ25fc25hcHNob3Q/Lm5hbWVcbiAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiICYmIG5hbWUpIHtcbiAgICByZXR1cm4gbmFtZVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5jYW1wYWlnbl9pZCB8fCBcIk5vbmVcIlxufVxuXG5mdW5jdGlvbiBmb3JtRnJvbVJvdyhyb3c6IENvdXBvblByb2R1Y3RSb3csIGRlZmF1bHRDdXJyZW5jeUNvZGU6IHN0cmluZykge1xuICBjb25zdCBwcm9kdWN0ID0gcm93LnByb2R1Y3QgfHwgKHt9IGFzIFByb2R1Y3RSZWNvcmQpXG4gIGNvbnN0IGNvbmZpZyA9IHJvdy5jb3Vwb25fcHJvZHVjdF9jb25maWdcbiAgY29uc3QgdmFyaWFudENvbmZpZ0J5VmFyaWFudElkID0gbmV3IE1hcChcbiAgICAocm93LmNvdXBvbl9wcm9kdWN0X3ZhcmlhbnRfY29uZmlncyB8fCBbXSkubWFwKCh2YXJpYW50Q29uZmlnKSA9PiBbXG4gICAgICB2YXJpYW50Q29uZmlnLnZhcmlhbnRfaWQsXG4gICAgICB2YXJpYW50Q29uZmlnLFxuICAgIF0pLFxuICApXG4gIGNvbnN0IGR1cmF0aW9uRGF5cyA9XG4gICAgY29uZmlnLmV4cGlyYXRpb25fcG9saWN5Py50eXBlID09PSBcImR1cmF0aW9uXCJcbiAgICAgID8gY29uZmlnLmV4cGlyYXRpb25fcG9saWN5LmR1cmF0aW9uX2RheXNcbiAgICAgIDogMzBcblxuICByZXR1cm4ge1xuICAgIHByb2R1Y3Q6IHtcbiAgICAgIC4uLmVtcHR5UHJvZHVjdCxcbiAgICAgIGlkOiBwcm9kdWN0LmlkIHx8IFwiXCIsXG4gICAgICB0aXRsZTogcHJvZHVjdC50aXRsZSB8fCBcIlwiLFxuICAgICAgc3VidGl0bGU6IHByb2R1Y3Quc3VidGl0bGUgfHwgXCJcIixcbiAgICAgIGhhbmRsZTogcHJvZHVjdC5oYW5kbGUgfHwgXCJcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9kdWN0LmRlc2NyaXB0aW9uIHx8IFwiXCIsXG4gICAgICB0aHVtYm5haWw6IHByb2R1Y3QudGh1bWJuYWlsIHx8IFwiXCIsXG4gICAgICBzdGF0dXM6IHByb2R1Y3Quc3RhdHVzIHx8IFwiZHJhZnRcIixcbiAgICAgIGRpc2NvdW50YWJsZTogQm9vbGVhbihwcm9kdWN0LmRpc2NvdW50YWJsZSksXG4gICAgICB0eXBlX2lkOiBwcm9kdWN0LnR5cGVfaWQgfHwgXCJcIixcbiAgICAgIGNvbGxlY3Rpb25faWQ6IHByb2R1Y3QuY29sbGVjdGlvbl9pZCB8fCBcIlwiLFxuICAgICAgY2F0ZWdvcnlfaWQ6IHByb2R1Y3QuY2F0ZWdvcmllcz8uWzBdPy5pZCB8fCBcIlwiLFxuICAgICAgdGFnX2lkOiBwcm9kdWN0LnRhZ3M/LlswXT8uaWQgfHwgXCJcIixcbiAgICAgIHNhbGVzX2NoYW5uZWxfaWQ6IHByb2R1Y3Quc2FsZXNfY2hhbm5lbHM/LlswXT8uaWQgfHwgXCJcIixcbiAgICAgIHZhcmlhbnRzOiAocHJvZHVjdC52YXJpYW50cz8ubGVuZ3RoID8gcHJvZHVjdC52YXJpYW50cyA6IFtdKS5tYXAoXG4gICAgICAgICh2YXJpYW50KSA9PiB7XG4gICAgICAgICAgY29uc3Qgb3ZlcnJpZGUgPSB2YXJpYW50Q29uZmlnQnlWYXJpYW50SWQuZ2V0KHZhcmlhbnQuaWQpXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmVtcHR5VmFyaWFudCxcbiAgICAgICAgICAgIGlkOiB2YXJpYW50LmlkLFxuICAgICAgICAgICAgb3ZlcnJpZGVfY29uZmlnX2lkOiBvdmVycmlkZT8uaWQsXG4gICAgICAgICAgICB0aXRsZTogdmFyaWFudC50aXRsZSB8fCBcIlwiLFxuICAgICAgICAgICAgc2t1OiB2YXJpYW50LnNrdSB8fCBcIlwiLFxuICAgICAgICAgICAgY3VycmVuY3lfY29kZTpcbiAgICAgICAgICAgICAgdmFyaWFudC5wcmljZXM/LlswXT8uY3VycmVuY3lfY29kZSB8fFxuICAgICAgICAgICAgICBvdmVycmlkZT8uY3VycmVuY3lfY29kZSB8fFxuICAgICAgICAgICAgICBjb25maWcuY3VycmVuY3lfY29kZSB8fFxuICAgICAgICAgICAgICBkZWZhdWx0Q3VycmVuY3lDb2RlLFxuICAgICAgICAgICAgYW1vdW50OlxuICAgICAgICAgICAgICB2YXJpYW50LnByaWNlcz8uWzBdPy5hbW91bnQgPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gXCJcIlxuICAgICAgICAgICAgICAgIDogU3RyaW5nKHZhcmlhbnQucHJpY2VzPy5bMF0/LmFtb3VudCksXG4gICAgICAgICAgICBvdmVycmlkZV9lbmFibGVkOiBvdmVycmlkZSA/IG92ZXJyaWRlLmVuYWJsZWQgIT09IGZhbHNlIDogZmFsc2UsXG4gICAgICAgICAgICBvdmVycmlkZV9iZW5lZml0X3R5cGU6XG4gICAgICAgICAgICAgIG92ZXJyaWRlPy5iZW5lZml0X3R5cGUgfHwgY29uZmlnLmJlbmVmaXRfdHlwZSB8fCBcImZpeGVkX2Ftb3VudFwiLFxuICAgICAgICAgICAgb3ZlcnJpZGVfY3VycmVuY3lfY29kZTpcbiAgICAgICAgICAgICAgb3ZlcnJpZGU/LmN1cnJlbmN5X2NvZGUgfHxcbiAgICAgICAgICAgICAgY29uZmlnLmN1cnJlbmN5X2NvZGUgfHxcbiAgICAgICAgICAgICAgZGVmYXVsdEN1cnJlbmN5Q29kZSxcbiAgICAgICAgICAgIG92ZXJyaWRlX2Ftb3VudDpcbiAgICAgICAgICAgICAgb3ZlcnJpZGU/LmFtb3VudCA9PSBudWxsID8gXCJcIiA6IFN0cmluZyhvdmVycmlkZS5hbW91bnQpLFxuICAgICAgICAgICAgb3ZlcnJpZGVfcGVyY2VudGFnZTpcbiAgICAgICAgICAgICAgb3ZlcnJpZGU/LnBlcmNlbnRhZ2UgPT0gbnVsbCA/IFwiXCIgOiBTdHJpbmcob3ZlcnJpZGUucGVyY2VudGFnZSksXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICB9LFxuICAgIGNvdXBvbjoge1xuICAgICAgLi4uZW1wdHlDb3Vwb24sXG4gICAgICBlbmFibGVkOiBjb25maWcuZW5hYmxlZCxcbiAgICAgIGJlbmVmaXRfdHlwZTogY29uZmlnLmJlbmVmaXRfdHlwZSxcbiAgICAgIGFtb3VudDogY29uZmlnLmFtb3VudCA9PSBudWxsID8gXCJcIiA6IFN0cmluZyhjb25maWcuYW1vdW50KSxcbiAgICAgIHBlcmNlbnRhZ2U6IGNvbmZpZy5wZXJjZW50YWdlID09IG51bGwgPyBcIlwiIDogU3RyaW5nKGNvbmZpZy5wZXJjZW50YWdlKSxcbiAgICAgIGN1cnJlbmN5X2NvZGU6IGNvbmZpZy5jdXJyZW5jeV9jb2RlIHx8IGRlZmF1bHRDdXJyZW5jeUNvZGUsXG4gICAgICBjb2RlX3N0cmF0ZWd5OiBjb25maWcuY29kZV9zdHJhdGVneSxcbiAgICAgIGNvZGVfcHJlZml4OiBjb25maWcuY29kZV9wcmVmaXggfHwgXCJcIixcbiAgICAgIHNoYXJlZF9jb2RlOiBjb25maWcuc2hhcmVkX2NvZGUgfHwgXCJcIixcbiAgICAgIGV4cGlyYXRpb25fdHlwZTogY29uZmlnLmV4cGlyYXRpb25fcG9saWN5Py50eXBlIHx8IFwiZHVyYXRpb25cIixcbiAgICAgIGV4cGlyYXRpb25fZGF5czogU3RyaW5nKGR1cmF0aW9uRGF5cyksXG4gICAgICBleHBpcmF0aW9uX2RhdGU6XG4gICAgICAgIGNvbmZpZy5leHBpcmF0aW9uX3BvbGljeT8udHlwZSA9PT0gXCJmaXhlZFwiXG4gICAgICAgICAgPyB0b0RhdGVUaW1lTG9jYWwoY29uZmlnLmV4cGlyYXRpb25fcG9saWN5LmV4cGlyZXNfYXQpXG4gICAgICAgICAgOiBcIlwiLFxuICAgICAgZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ246XG4gICAgICAgIGNvbmZpZy5leHBpcmF0aW9uX3BvbGljeT8uY2FwX2J5X2NhbXBhaWduICE9PSBmYWxzZSxcbiAgICAgIGV4cGlyYXRpb25fY2FwX2F0OiBjb25maWcuZXhwaXJhdGlvbl9wb2xpY3k/LmNhcF9hdFxuICAgICAgICA/IHRvRGF0ZVRpbWVMb2NhbChjb25maWcuZXhwaXJhdGlvbl9wb2xpY3kuY2FwX2F0KVxuICAgICAgICA6IFwiXCIsXG4gICAgICBtYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW06IFN0cmluZyhcbiAgICAgICAgY29uZmlnLm1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbSB8fCAxLFxuICAgICAgKSxcbiAgICAgIHByb21vdGlvbl9taXJyb3JfbW9kZTogY29uZmlnLnByb21vdGlvbl9taXJyb3JfbW9kZSB8fCBcIm5vbmVcIixcbiAgICAgIHByb21vdGlvbl9zdGF0dXM6IGNvbmZpZy5wcm9tb3Rpb25fc3RhdHVzIHx8IFwiZHJhZnRcIixcbiAgICB9LFxuICAgIGNhbXBhaWduOiB7XG4gICAgICAuLi5lbXB0eUNhbXBhaWduLFxuICAgICAgbW9kZTogY29uZmlnLmNhbXBhaWduX2lkID8gXCJleGlzdGluZ1wiIDogXCJub25lXCIsXG4gICAgICBjYW1wYWlnbl9pZDogY29uZmlnLmNhbXBhaWduX2lkIHx8IFwiXCIsXG4gICAgfSxcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZENvdXBvblBheWxvYWQoXG4gIGNvdXBvbjogQ291cG9uRm9ybVN0YXRlLFxuICBhbGxvd1Byb21vdGlvbk1pcnJvcjogYm9vbGVhbixcbikge1xuICByZXR1cm4ge1xuICAgIGVuYWJsZWQ6IGNvdXBvbi5lbmFibGVkLFxuICAgIGJlbmVmaXRfdHlwZTogY291cG9uLmJlbmVmaXRfdHlwZSxcbiAgICBhbW91bnQ6XG4gICAgICBjb3Vwb24uYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiXG4gICAgICAgID8gbnVtYmVyT3JOdWxsKGNvdXBvbi5hbW91bnQpXG4gICAgICAgIDogbnVsbCxcbiAgICBwZXJjZW50YWdlOlxuICAgICAgY291cG9uLmJlbmVmaXRfdHlwZSA9PT0gXCJwZXJjZW50YWdlXCJcbiAgICAgICAgPyBudW1iZXJPck51bGwoY291cG9uLnBlcmNlbnRhZ2UpXG4gICAgICAgIDogbnVsbCxcbiAgICBjdXJyZW5jeV9jb2RlOlxuICAgICAgY291cG9uLmJlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIlxuICAgICAgICA/IGNvdXBvbi5jdXJyZW5jeV9jb2RlLnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIDogbnVsbCxcbiAgICBjb2RlX3N0cmF0ZWd5OiBjb3Vwb24uY29kZV9zdHJhdGVneSxcbiAgICBjb2RlX3ByZWZpeDpcbiAgICAgIGNvdXBvbi5jb2RlX3N0cmF0ZWd5ID09PSBcInVuaXF1ZV9jb2RlXCJcbiAgICAgICAgPyBjb3Vwb24uY29kZV9wcmVmaXgudHJpbSgpIHx8IFwiQ09VUE9OXCJcbiAgICAgICAgOiBudWxsLFxuICAgIHNoYXJlZF9jb2RlOlxuICAgICAgY291cG9uLmNvZGVfc3RyYXRlZ3kgPT09IFwic2hhcmVkX2NvZGVcIiA/IGNvdXBvbi5zaGFyZWRfY29kZS50cmltKCkgOiBudWxsLFxuICAgIGV4cGlyYXRpb25fcG9saWN5OlxuICAgICAgY291cG9uLmV4cGlyYXRpb25fdHlwZSA9PT0gXCJmaXhlZFwiXG4gICAgICAgID8ge1xuICAgICAgICAgICAgdHlwZTogXCJmaXhlZFwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgZXhwaXJlc19hdDogbmV3IERhdGUoY291cG9uLmV4cGlyYXRpb25fZGF0ZSkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgIGNhcF9ieV9jYW1wYWlnbjogY291cG9uLmV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWduLFxuICAgICAgICAgICAgY2FwX2F0OiBjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYXRcbiAgICAgICAgICAgICAgPyBuZXcgRGF0ZShjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYXQpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICB0eXBlOiBcImR1cmF0aW9uXCIgYXMgY29uc3QsXG4gICAgICAgICAgICBkdXJhdGlvbl9kYXlzOiBOdW1iZXIoY291cG9uLmV4cGlyYXRpb25fZGF5cykgfHwgMzAsXG4gICAgICAgICAgICBjYXBfYnlfY2FtcGFpZ246IGNvdXBvbi5leHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbixcbiAgICAgICAgICAgIGNhcF9hdDogY291cG9uLmV4cGlyYXRpb25fY2FwX2F0XG4gICAgICAgICAgICAgID8gbmV3IERhdGUoY291cG9uLmV4cGlyYXRpb25fY2FwX2F0KS50b0lTT1N0cmluZygpXG4gICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICB9LFxuICAgIG1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbTpcbiAgICAgIE51bWJlcihjb3Vwb24ubWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtKSB8fCAxLFxuICAgIC4uLihhbGxvd1Byb21vdGlvbk1pcnJvclxuICAgICAgPyB7XG4gICAgICAgICAgcHJvbW90aW9uX21pcnJvcl9tb2RlOiBjb3Vwb24ucHJvbW90aW9uX21pcnJvcl9tb2RlLFxuICAgICAgICAgIHByb21vdGlvbl9zdGF0dXM6IGNvdXBvbi5wcm9tb3Rpb25fc3RhdHVzLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZENhbXBhaWduUGF5bG9hZChcbiAgY2FtcGFpZ246IENhbXBhaWduRm9ybVN0YXRlLFxuICBhbGxvd0NhbXBhaWduOiBib29sZWFuLFxuKSB7XG4gIGlmICghYWxsb3dDYW1wYWlnbikge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuICBpZiAoY2FtcGFpZ24ubW9kZSA9PT0gXCJleGlzdGluZ1wiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGU6IFwiZXhpc3RpbmdcIixcbiAgICAgIGNhbXBhaWduX2lkOiBjYW1wYWlnbi5jYW1wYWlnbl9pZCB8fCBudWxsLFxuICAgIH1cbiAgfVxuICBpZiAoY2FtcGFpZ24ubW9kZSA9PT0gXCJuZXdcIikge1xuICAgIHJldHVybiB7XG4gICAgICBtb2RlOiBcIm5ld1wiLFxuICAgICAgY2FtcGFpZ246IHtcbiAgICAgICAgbmFtZTogY2FtcGFpZ24ubmFtZSxcbiAgICAgICAgY2FtcGFpZ25faWRlbnRpZmllcjogY2FtcGFpZ24uY2FtcGFpZ25faWRlbnRpZmllcixcbiAgICAgICAgc3RhcnRzX2F0OiBjYW1wYWlnbi5zdGFydHNfYXRcbiAgICAgICAgICA/IG5ldyBEYXRlKGNhbXBhaWduLnN0YXJ0c19hdCkudG9JU09TdHJpbmcoKVxuICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgZW5kc19hdDogY2FtcGFpZ24uZW5kc19hdFxuICAgICAgICAgID8gbmV3IERhdGUoY2FtcGFpZ24uZW5kc19hdCkudG9JU09TdHJpbmcoKVxuICAgICAgICAgIDogbnVsbCxcbiAgICAgIH0sXG4gICAgfVxuICB9XG4gIHJldHVybiB7IG1vZGU6IFwibm9uZVwiIH1cbn1cblxuZnVuY3Rpb24gc3RlcFN0YXR1cyhzdGVwOiBXaXphcmRTdGVwLCBhY3RpdmU6IFdpemFyZFN0ZXApIHtcbiAgY29uc3Qgc3RlcEluZGV4ID0gc3RlcHMuaW5kZXhPZihzdGVwKVxuICBjb25zdCBhY3RpdmVJbmRleCA9IHN0ZXBzLmluZGV4T2YoYWN0aXZlKVxuICBpZiAoc3RlcEluZGV4IDwgYWN0aXZlSW5kZXgpIHJldHVybiBcImNvbXBsZXRlZFwiXG4gIGlmIChzdGVwSW5kZXggPT09IGFjdGl2ZUluZGV4KSByZXR1cm4gXCJpbi1wcm9ncmVzc1wiXG4gIHJldHVybiBcIm5vdC1zdGFydGVkXCJcbn1cblxuZnVuY3Rpb24gRmllbGQoeyBsYWJlbCwgY2hpbGRyZW4gfTogeyBsYWJlbDogc3RyaW5nOyBjaGlsZHJlbjogUmVhY3ROb2RlIH0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLXktMVwiIHN0eWxlPXt7IG1pbldpZHRoOiAwIH19PlxuICAgICAgPExhYmVsPntsYWJlbH08L0xhYmVsPlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvZGl2PlxuICApXG59XG5cbmZ1bmN0aW9uIGN1cnJlbmN5RGVjaW1hbERpZ2l0cyhjb2RlOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KFwiZW5cIiwge1xuICAgICAgc3R5bGU6IFwiY3VycmVuY3lcIixcbiAgICAgIGN1cnJlbmN5OiBjb2RlLnRvVXBwZXJDYXNlKCksXG4gICAgfSkucmVzb2x2ZWRPcHRpb25zKCkubWF4aW11bUZyYWN0aW9uRGlnaXRzXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAyXG4gIH1cbn1cblxuZnVuY3Rpb24gY3VycmVuY3lTeW1ib2woY29kZTogc3RyaW5nKSB7XG4gIGlmICghY29kZSkgcmV0dXJuIFwiXCJcblxuICB0cnkge1xuICAgIHJldHVybiAoXG4gICAgICBuZXcgSW50bC5OdW1iZXJGb3JtYXQoXCJlblwiLCB7XG4gICAgICAgIHN0eWxlOiBcImN1cnJlbmN5XCIsXG4gICAgICAgIGN1cnJlbmN5OiBjb2RlLnRvVXBwZXJDYXNlKCksXG4gICAgICAgIGN1cnJlbmN5RGlzcGxheTogXCJuYXJyb3dTeW1ib2xcIixcbiAgICAgIH0pXG4gICAgICAgIC5mb3JtYXRUb1BhcnRzKDApXG4gICAgICAgIC5maW5kKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09IFwiY3VycmVuY3lcIik/LnZhbHVlIHx8IGNvZGUudG9VcHBlckNhc2UoKVxuICAgIClcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGNvZGUudG9VcHBlckNhc2UoKVxuICB9XG59XG5cbmZ1bmN0aW9uIEN1cnJlbmN5U2VsZWN0KHtcbiAgY3VycmVuY2llcyxcbiAgZGlzYWJsZWQsXG4gIG9uQ2hhbmdlLFxuICB2YWx1ZSxcbn06IHtcbiAgY3VycmVuY2llczogQ3VycmVuY3lPcHRpb25bXVxuICBkaXNhYmxlZD86IGJvb2xlYW5cbiAgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG4gIHZhbHVlOiBzdHJpbmdcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8U2VsZWN0XG4gICAgICB2YWx1ZT17dmFsdWUgfHwgdW5kZWZpbmVkfVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkIHx8ICFjdXJyZW5jaWVzLmxlbmd0aH1cbiAgICAgIG9uVmFsdWVDaGFuZ2U9e29uQ2hhbmdlfVxuICAgID5cbiAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgPFNlbGVjdC5WYWx1ZVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtcbiAgICAgICAgICAgIGN1cnJlbmNpZXMubGVuZ3RoID8gXCJTZWxlY3QgY3VycmVuY3lcIiA6IFwiTm8gY3VycmVuY2llcyBhdmFpbGFibGVcIlxuICAgICAgICAgIH1cbiAgICAgICAgLz5cbiAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgIHtjdXJyZW5jaWVzLm1hcCgoY3VycmVuY3kpID0+IChcbiAgICAgICAgICA8U2VsZWN0Lkl0ZW0ga2V5PXtjdXJyZW5jeS5jb2RlfSB2YWx1ZT17Y3VycmVuY3kuY29kZX0+XG4gICAgICAgICAgICB7Y3VycmVuY3kubmFtZX0gKHtjdXJyZW5jeS5jb2RlLnRvVXBwZXJDYXNlKCl9KVxuICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICkpfVxuICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICA8L1NlbGVjdD5cbiAgKVxufVxuXG5mdW5jdGlvbiBDdXJyZW5jeUFtb3VudElucHV0KHtcbiAgY3VycmVuY2llcyxcbiAgY3VycmVuY3lDb2RlLFxuICBkaXNhYmxlZCxcbiAgb25DaGFuZ2UsXG4gIHZhbHVlLFxufToge1xuICBjdXJyZW5jaWVzOiBDdXJyZW5jeU9wdGlvbltdXG4gIGN1cnJlbmN5Q29kZTogc3RyaW5nXG4gIGRpc2FibGVkPzogYm9vbGVhblxuICBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWRcbiAgdmFsdWU6IHN0cmluZ1xufSkge1xuICBjb25zdCBjdXJyZW5jeSA9IGN1cnJlbmNpZXMuZmluZCgoaXRlbSkgPT4gaXRlbS5jb2RlID09PSBjdXJyZW5jeUNvZGUpXG4gIGNvbnN0IGNvZGUgPSBjdXJyZW5jeUNvZGUudG9VcHBlckNhc2UoKVxuICBjb25zdCBkZWNpbWFscyA9IGN1cnJlbmN5RGVjaW1hbERpZ2l0cyhjb2RlIHx8IFwiVVNEXCIpXG5cbiAgcmV0dXJuIChcbiAgICA8Q3VycmVuY3lJbnB1dFxuICAgICAgY29kZT17Y29kZSB8fCBcIlVTRFwifVxuICAgICAgc3ltYm9sPXtcbiAgICAgICAgY3VycmVuY3k/LnN5bWJvbF9uYXRpdmUgfHxcbiAgICAgICAgY3VycmVuY3k/LnN5bWJvbCB8fFxuICAgICAgICBjdXJyZW5jeVN5bWJvbChjb2RlIHx8IFwiVVNEXCIpXG4gICAgICB9XG4gICAgICBtaW49ezB9XG4gICAgICBkZWNpbWFsU2NhbGU9e2RlY2ltYWxzfVxuICAgICAgZGVjaW1hbHNMaW1pdD17ZGVjaW1hbHN9XG4gICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWQgfHwgIWN1cnJlbmN5Q29kZX1cbiAgICAgIG9uVmFsdWVDaGFuZ2U9eyhuZXh0VmFsdWUpID0+IG9uQ2hhbmdlKG5leHRWYWx1ZSB8fCBcIlwiKX1cbiAgICAvPlxuICApXG59XG5cbmNvbnN0IGVudGl0bGVtZW50RmlsdGVycyA9IFtcbiAgeyBsYWJlbDogXCJBbGxcIiwgdmFsdWU6IFwiYWxsXCIgfSxcbiAgeyBsYWJlbDogXCJJc3N1ZWRcIiwgdmFsdWU6IFwiaXNzdWVkXCIgfSxcbiAgeyBsYWJlbDogXCJSZWRlZW1lZFwiLCB2YWx1ZTogXCJyZWRlZW1lZFwiIH0sXG4gIHsgbGFiZWw6IFwiRXhwaXJlZFwiLCB2YWx1ZTogXCJleHBpcmVkXCIgfSxcbiAgeyBsYWJlbDogXCJDYW5jZWxlZFwiLCB2YWx1ZTogXCJjYW5jZWxlZFwiIH0sXG5dIGFzIGNvbnN0XG5cbnR5cGUgRW50aXRsZW1lbnRGaWx0ZXIgPSAodHlwZW9mIGVudGl0bGVtZW50RmlsdGVycylbbnVtYmVyXVtcInZhbHVlXCJdXG5cbmZ1bmN0aW9uIFNuYXBzaG90QmxvY2soeyB0aXRsZSwgdmFsdWUgfTogeyB0aXRsZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9KSB7XG4gIHJldHVybiAoXG4gICAgPGRldGFpbHMgY2xhc3NOYW1lPVwicm91bmRlZC1sZyBib3JkZXIgcC0zXCI+XG4gICAgICA8c3VtbWFyeSBjbGFzc05hbWU9XCJjdXJzb3ItcG9pbnRlciB0ZXh0LXVpLWZnLWJhc2UgdHh0LXNtYWxsLXBsdXNcIj5cbiAgICAgICAge3RpdGxlfVxuICAgICAgPC9zdW1tYXJ5PlxuICAgICAgPHByZVxuICAgICAgICBjbGFzc05hbWU9XCJtdC0zIHJvdW5kZWQtbWQgYmctdWktYmctc3VidGxlIHAtMyB0ZXh0LXVpLWZnLXN1YnRsZSB0eHQtY29tcGFjdC14c21hbGxcIlxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIG1heEhlaWdodDogMjIwLFxuICAgICAgICAgIG92ZXJmbG93OiBcImF1dG9cIixcbiAgICAgICAgICB3aGl0ZVNwYWNlOiBcInByZS13cmFwXCIsXG4gICAgICAgICAgd29yZEJyZWFrOiBcImJyZWFrLXdvcmRcIixcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAge2pzb25CbG9jayh2YWx1ZSl9XG4gICAgICA8L3ByZT5cbiAgICA8L2RldGFpbHM+XG4gIClcbn1cblxuZnVuY3Rpb24gVHdvQ29sdW1uTGF5b3V0KHtcbiAgZmlyc3RDb2wsXG4gIHNlY29uZENvbCxcbn06IHtcbiAgZmlyc3RDb2w6IFJlYWN0Tm9kZVxuICBzZWNvbmRDb2w6IFJlYWN0Tm9kZVxufSkge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAteC00IGdhcC15LTMgeGw6ZmxleC1yb3cgeGw6aXRlbXMtc3RhcnRcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCB3LWZ1bGwgZmxleC1jb2wgZ2FwLXktM1wiPntmaXJzdENvbH08L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCB3LWZ1bGwgbWF4LXctWzEwMCVdIGZsZXgtY29sIGdhcC15LTMgeGw6bXQtMCB4bDptYXgtdy1bNDQwcHhdXCI+XG4gICAgICAgIHtzZWNvbmRDb2x9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5mdW5jdGlvbiBTZWN0aW9uUm93KHtcbiAgdGl0bGUsXG4gIHZhbHVlLFxufToge1xuICB0aXRsZTogc3RyaW5nXG4gIHZhbHVlOiBSZWFjdE5vZGVcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtdWktZmctc3VidGxlIGdyaWQgZ3JpZC1jb2xzLTIgaXRlbXMtY2VudGVyIGdhcC14LTQgcHgtNiBweS00XCI+XG4gICAgICA8VGV4dCBzaXplPVwic21hbGxcIiB3ZWlnaHQ9XCJwbHVzXCIgbGVhZGluZz1cImNvbXBhY3RcIj5cbiAgICAgICAge3RpdGxlfVxuICAgICAgPC9UZXh0PlxuICAgICAge3R5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB2YWx1ZSA9PSBudWxsID8gKFxuICAgICAgICA8VGV4dFxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgbGVhZGluZz1cImNvbXBhY3RcIlxuICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtcHJldHR5IHdoaXRlc3BhY2UtcHJlLWxpbmVcIlxuICAgICAgICA+XG4gICAgICAgICAge3ZhbHVlIHx8IFwiLVwifVxuICAgICAgICA8L1RleHQ+XG4gICAgICApIDogKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1pbi13LTBcIj57dmFsdWV9PC9kaXY+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApXG59XG5cbmZ1bmN0aW9uIFdpZGdldEhlYWRlcih7IHRpdGxlIH06IHsgdGl0bGU6IHN0cmluZyB9KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHgtNiBweS00XCI+XG4gICAgICA8SGVhZGluZyBsZXZlbD1cImgyXCI+e3RpdGxlfTwvSGVhZGluZz5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5mdW5jdGlvbiBTaWRlYmFyTGluayh7XG4gIGhyZWYsXG4gIGxhYmVsLFxuICBkZXNjcmlwdGlvbixcbiAgaWNvbixcbn06IHtcbiAgaHJlZjogc3RyaW5nXG4gIGxhYmVsOiBzdHJpbmdcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xuICBpY29uPzogUmVhY3ROb2RlXG59KSB7XG4gIHJldHVybiAoXG4gICAgPGEgaHJlZj17aHJlZn0gY2xhc3NOYW1lPVwiZ3JvdXAgb3V0bGluZS1ub25lXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLTIgcHgtMiBwYi0yXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2hhZG93LWVsZXZhdGlvbi1jYXJkLXJlc3QgYmctdWktYmctY29tcG9uZW50IHRyYW5zaXRpb24tZmcgaG92ZXI6YmctdWktYmctY29tcG9uZW50LWhvdmVyIGFjdGl2ZTpiZy11aS1iZy1jb21wb25lbnQtcHJlc3NlZCBncm91cC1mb2N1cy12aXNpYmxlOnNoYWRvdy1ib3JkZXJzLWludGVyYWN0aXZlLXdpdGgtYWN0aXZlIHJvdW5kZWQtbWQgcHgtNCBweS0yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNFwiPlxuICAgICAgICAgICAge2ljb24gJiYgPGRpdj57aWNvbn08L2Rpdj59XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC0xIGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIGxlYWRpbmc9XCJjb21wYWN0XCIgd2VpZ2h0PVwicGx1c1wiPlxuICAgICAgICAgICAgICAgIHtsYWJlbH1cbiAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICA8VGV4dFxuICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgbGVhZGluZz1cImNvbXBhY3RcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtdWktZmctc3VidGxlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtkZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxUcmlhbmdsZVJpZ2h0TWluaSBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvYT5cbiAgKVxufVxuXG5mdW5jdGlvbiBTdW1tYXJ5V2lkZ2V0KHtcbiAgbGFiZWwsXG4gIHZhbHVlLFxuICB0b25lID0gXCJncmVlblwiLFxufToge1xuICBsYWJlbDogc3RyaW5nXG4gIHZhbHVlOiBzdHJpbmdcbiAgdG9uZT86IFwiZ3JlZW5cIiB8IFwibmV1dHJhbFwiXG59KSB7XG4gIHJldHVybiAoXG4gICAgPENvbnRhaW5lciBjbGFzc05hbWU9XCJweC02IHB5LTRcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1zdWJ0bGUgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLXgtM1wiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPXtgaC04IHctMSByb3VuZGVkLWZ1bGwgJHtcbiAgICAgICAgICAgIHRvbmUgPT09IFwiZ3JlZW5cIlxuICAgICAgICAgICAgICA/IFwiYmctdWktdGFnLWdyZWVuLWljb25cIlxuICAgICAgICAgICAgICA6IFwiYmctdWktdGFnLW5ldXRyYWwtaWNvblwiXG4gICAgICAgICAgfWB9XG4gICAgICAgIC8+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLXctMFwiPlxuICAgICAgICAgIDxUZXh0IHdlaWdodD1cInBsdXNcIiBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLXN1YnRsZVwiPlxuICAgICAgICAgICAge2xhYmVsfVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8VGV4dFxuICAgICAgICAgICAgd2VpZ2h0PVwicGx1c1wiXG4gICAgICAgICAgICBzaXplPVwieGxhcmdlXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInRhYnVsYXItbnVtcyB0ZXh0LXVpLWZnLWJhc2UgYnJlYWstd29yZHNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt2YWx1ZX1cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9Db250YWluZXI+XG4gIClcbn1cblxuZnVuY3Rpb24gQ291cG9uR2VuZXJhbFNlY3Rpb24oeyBkZXRhaWwgfTogeyBkZXRhaWw6IENvdXBvbkVudGl0bGVtZW50RGV0YWlsIH0pIHtcbiAgY29uc3QgZW50aXRsZW1lbnQgPSBkZXRhaWwuY3VzdG9tZXJfY291cG9uX2VudGl0bGVtZW50XG4gIGNvbnN0IGlzc3VhbmNlID0gZGV0YWlsLmNvdXBvbl9pc3N1YW5jZSB8fCBudWxsXG4gIGNvbnN0IGJlbmVmaXRTbmFwc2hvdCA9IGVudGl0bGVtZW50LmJlbmVmaXRfc25hcHNob3QgfHwgbnVsbFxuICBjb25zdCBzb3VyY2VTbmFwc2hvdCA9IGVudGl0bGVtZW50LnNvdXJjZV9zbmFwc2hvdCB8fCBudWxsXG4gIGNvbnN0IGNvZGUgPSBjb3Vwb25Db2RlKGVudGl0bGVtZW50KVxuICBjb25zdCBleHRlcm5hbCA9IGVudGl0bGVtZW50Lm9yaWdpbiA9PT0gXCJleHRlcm5hbFwiXG4gIGNvbnN0IHByb2R1Y3RMYWJlbCA9XG4gICAgc25hcHNob3RTdHJpbmcoc291cmNlU25hcHNob3QsIFwidGl0bGVcIikgfHxcbiAgICBzbmFwc2hvdFN0cmluZyhzb3VyY2VTbmFwc2hvdCwgXCJzb3VyY2VcIikgfHxcbiAgICBlbnRpdGxlbWVudC5wcm9kdWN0X2lkIHx8XG4gICAgXCJFeHRlcm5hbFwiXG4gIGNvbnN0IHZhcmlhbnRMYWJlbCA9XG4gICAgc25hcHNob3RTdHJpbmcoc291cmNlU25hcHNob3QsIFwidmFyaWFudF9pZFwiKSB8fCBlbnRpdGxlbWVudC52YXJpYW50X2lkIHx8IFwiLVwiXG4gIGNvbnN0IGlzc3VlZERhdGUgPSBlbnRpdGxlbWVudC5jcmVhdGVkX2F0IHx8IGlzc3VhbmNlPy5jcmVhdGVkX2F0IHx8IG51bGxcblxuICByZXR1cm4gKFxuICAgIDxDb250YWluZXIgY2xhc3NOYW1lPVwiZGl2aWRlLXkgcC0wXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBweC02IHB5LTRcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtaW4tdy0wXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC0xXCI+XG4gICAgICAgICAgICA8SGVhZGluZyBjbGFzc05hbWU9XCJicmVhay1hbGxcIj4je2NvZGV9PC9IZWFkaW5nPlxuICAgICAgICAgICAge2NvZGUgIT09IFwiLVwiICYmIChcbiAgICAgICAgICAgICAgPENvcHkgY29udGVudD17Y29kZX0gY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIGNsYXNzTmFtZT1cInRleHQtdWktZmctc3VidGxlXCI+XG4gICAgICAgICAgICB7Zm9ybWF0RnVsbERhdGUoaXNzdWVkRGF0ZSl9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPFN0YXR1c0JhZGdlIGNvbG9yPXtlbnRpdGxlbWVudFN0YXR1c0NvbG9yKGVudGl0bGVtZW50LnN0YXR1cyl9PlxuICAgICAgICAgIHtlbnRpdGxlbWVudC5zdGF0dXN9XG4gICAgICAgIDwvU3RhdHVzQmFkZ2U+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxTZWN0aW9uUm93IHRpdGxlPVwiRGF0ZSBpc3N1ZWRcIiB2YWx1ZT17Zm9ybWF0UmVsYXRpdmVEYXRlKGlzc3VlZERhdGUpfSAvPlxuICAgICAgPFNlY3Rpb25Sb3dcbiAgICAgICAgdGl0bGU9XCJDdXN0b21lclwiXG4gICAgICAgIHZhbHVlPXtlbnRpdGxlbWVudC5lbWFpbCB8fCBlbnRpdGxlbWVudC5jdXN0b21lcl9pZCB8fCBcIi1cIn1cbiAgICAgIC8+XG4gICAgICA8U2VjdGlvblJvdyB0aXRsZT1cIk9yaWdpblwiIHZhbHVlPXtlbnRpdGxlbWVudFNvdXJjZShlbnRpdGxlbWVudCl9IC8+XG4gICAgICA8U2VjdGlvblJvd1xuICAgICAgICB0aXRsZT17ZXh0ZXJuYWwgPyBcIlNvdXJjZVwiIDogXCJDb3Vwb24gcHJvZHVjdFwifVxuICAgICAgICB2YWx1ZT17cHJvZHVjdExhYmVsfVxuICAgICAgLz5cbiAgICAgIDxTZWN0aW9uUm93IHRpdGxlPVwiU2VsbGVyIHNjb3BlXCIgdmFsdWU9e2VudGl0bGVtZW50U2VsbGVyU2NvcGUoZW50aXRsZW1lbnQpfSAvPlxuICAgICAgeyFleHRlcm5hbCAmJiA8U2VjdGlvblJvdyB0aXRsZT1cIlZhcmlhbnRcIiB2YWx1ZT17dmFyaWFudExhYmVsfSAvPn1cbiAgICAgIHshZXh0ZXJuYWwgJiYgKFxuICAgICAgICA8U2VjdGlvblJvd1xuICAgICAgICAgIHRpdGxlPVwiUXVhbnRpdHlcIlxuICAgICAgICAgIHZhbHVlPXtTdHJpbmcoXG4gICAgICAgICAgICBzbmFwc2hvdE51bWJlcihzb3VyY2VTbmFwc2hvdCwgXCJxdWFudGl0eVwiKSA/PyBpc3N1YW5jZT8ucXVhbnRpdHkgPz8gMSxcbiAgICAgICAgICApfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAgIDxTZWN0aW9uUm93XG4gICAgICAgIHRpdGxlPVwiQmVuZWZpdFwiXG4gICAgICAgIHZhbHVlPXtiZW5lZml0U25hcHNob3RMYWJlbChiZW5lZml0U25hcHNob3QpfVxuICAgICAgLz5cbiAgICAgIDxTZWN0aW9uUm93XG4gICAgICAgIHRpdGxlPVwiRXhwaXJhdGlvbiBwb2xpY3lcIlxuICAgICAgICB2YWx1ZT17ZXhwaXJhdGlvblBvbGljeUxhYmVsKGJlbmVmaXRTbmFwc2hvdCl9XG4gICAgICAvPlxuICAgICAgPFNlY3Rpb25Sb3cgdGl0bGU9XCJFeHBpcmF0aW9uIERhdGVcIiB2YWx1ZT17Zm9ybWF0RGF0ZShlbnRpdGxlbWVudC5leHBpcmVzX2F0KX0gLz5cbiAgICAgIDxTZWN0aW9uUm93IHRpdGxlPVwiUmVkZWVtZWQgRGF0ZVwiIHZhbHVlPXtmb3JtYXREYXRlKGVudGl0bGVtZW50LnJlZGVlbWVkX2F0KX0gLz5cbiAgICA8L0NvbnRhaW5lcj5cbiAgKVxufVxuXG5mdW5jdGlvbiBSZWxhdGVkT3JkZXJTZWN0aW9uKHtcbiAgYXBpQmFzZSxcbiAgZGV0YWlsLFxufToge1xuICBhcGlCYXNlOiBBcGlCYXNlXG4gIGRldGFpbDogQ291cG9uRW50aXRsZW1lbnREZXRhaWxcbn0pIHtcbiAgY29uc3QgZW50aXRsZW1lbnQgPSBkZXRhaWwuY3VzdG9tZXJfY291cG9uX2VudGl0bGVtZW50XG4gIGNvbnN0IG9yZGVyID0gZGV0YWlsLm9yZGVyIHx8IG51bGxcbiAgY29uc3Qgb3JkZXJJZCA9IG9yZGVyPy5pZCB8fCBlbnRpdGxlbWVudC5vcmRlcl9pZFxuICBpZiAoIW9yZGVySWQpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8Q29udGFpbmVyIGNsYXNzTmFtZT1cInAtMFwiPlxuICAgICAgPFdpZGdldEhlYWRlciB0aXRsZT1cIlJlbGF0ZWQgT3JkZXJcIiAvPlxuICAgICAgPFNpZGViYXJMaW5rXG4gICAgICAgIGhyZWY9e29yZGVyRGV0YWlsUGF0aChhcGlCYXNlLCBvcmRlcklkKX1cbiAgICAgICAgbGFiZWw9e29yZGVyID8gb3JkZXJEaXNwbGF5SWQob3JkZXIpIDogb3JkZXJJZH1cbiAgICAgICAgZGVzY3JpcHRpb249e1xuICAgICAgICAgIG9yZGVyPy5jcmVhdGVkX2F0XG4gICAgICAgICAgICA/IGBPcmRlciBwbGFjZWQgJHtmb3JtYXRSZWxhdGl2ZURhdGUob3JkZXIuY3JlYXRlZF9hdCl9YFxuICAgICAgICAgICAgOiBcIlB1cmNoYXNlZCBjb3Vwb24gb3JkZXJcIlxuICAgICAgICB9XG4gICAgICAgIGljb249ezxTaG9wcGluZ0NhcnQgLz59XG4gICAgICAvPlxuICAgIDwvQ29udGFpbmVyPlxuICApXG59XG5cbmZ1bmN0aW9uIENvdXBvblNuYXBzaG90c1NlY3Rpb24oe1xuICBkZXRhaWwsXG59OiB7XG4gIGRldGFpbDogQ291cG9uRW50aXRsZW1lbnREZXRhaWxcbn0pIHtcbiAgY29uc3QgZW50aXRsZW1lbnQgPSBkZXRhaWwuY3VzdG9tZXJfY291cG9uX2VudGl0bGVtZW50XG4gIGNvbnN0IGlzc3VhbmNlID0gZGV0YWlsLmNvdXBvbl9pc3N1YW5jZSB8fCBudWxsXG5cbiAgcmV0dXJuIChcbiAgICA8Q29udGFpbmVyIGNsYXNzTmFtZT1cInAtMFwiPlxuICAgICAgPFdpZGdldEhlYWRlciB0aXRsZT1cIkpTT05cIiAvPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC15LTMgcHgtNiBwYi02XCI+XG4gICAgICAgIDxTbmFwc2hvdEJsb2NrXG4gICAgICAgICAgdGl0bGU9XCJCZW5lZml0IHNuYXBzaG90XCJcbiAgICAgICAgICB2YWx1ZT17ZW50aXRsZW1lbnQuYmVuZWZpdF9zbmFwc2hvdH1cbiAgICAgICAgLz5cbiAgICAgICAgPFNuYXBzaG90QmxvY2tcbiAgICAgICAgICB0aXRsZT1cIlNvdXJjZSBzbmFwc2hvdFwiXG4gICAgICAgICAgdmFsdWU9e2VudGl0bGVtZW50LnNvdXJjZV9zbmFwc2hvdH1cbiAgICAgICAgLz5cbiAgICAgICAgPFNuYXBzaG90QmxvY2tcbiAgICAgICAgICB0aXRsZT1cIklzc3VhbmNlIGNvbmZpZyBzbmFwc2hvdFwiXG4gICAgICAgICAgdmFsdWU9e2lzc3VhbmNlPy5jb25maWdfc25hcHNob3R9XG4gICAgICAgIC8+XG4gICAgICAgIDxTbmFwc2hvdEJsb2NrIHRpdGxlPVwiU2VsbGVyIHRhcmdldHNcIiB2YWx1ZT17ZW50aXRsZW1lbnQuc2VsbGVyX3RhcmdldHN9IC8+XG4gICAgICAgIDxTbmFwc2hvdEJsb2NrIHRpdGxlPVwiTWV0YWRhdGFcIiB2YWx1ZT17ZW50aXRsZW1lbnQubWV0YWRhdGF9IC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L0NvbnRhaW5lcj5cbiAgKVxufVxuXG5mdW5jdGlvbiBDb3Vwb25TdW1tYXJ5U2VjdGlvbnMoe1xuICBkZXRhaWwsXG59OiB7XG4gIGRldGFpbDogQ291cG9uRW50aXRsZW1lbnREZXRhaWxcbn0pIHtcbiAgY29uc3QgZW50aXRsZW1lbnQgPSBkZXRhaWwuY3VzdG9tZXJfY291cG9uX2VudGl0bGVtZW50XG4gIGNvbnN0IGlzc3VhbmNlID0gZGV0YWlsLmNvdXBvbl9pc3N1YW5jZSB8fCBudWxsXG4gIGNvbnN0IGJlbmVmaXRTbmFwc2hvdCA9IGVudGl0bGVtZW50LmJlbmVmaXRfc25hcHNob3QgfHwgbnVsbFxuICBjb25zdCBzb3VyY2VTbmFwc2hvdCA9IGVudGl0bGVtZW50LnNvdXJjZV9zbmFwc2hvdCB8fCBudWxsXG4gIGNvbnN0IG9yZGVyID0gZGV0YWlsLm9yZGVyIHx8IG51bGxcbiAgY29uc3QgbGluZVRvdGFsID0gc25hcHNob3ROdW1iZXIoc291cmNlU25hcHNob3QsIFwidG90YWxcIilcbiAgY29uc3QgZXh0ZXJuYWwgPSBlbnRpdGxlbWVudC5vcmlnaW4gPT09IFwiZXh0ZXJuYWxcIlxuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxTdW1tYXJ5V2lkZ2V0XG4gICAgICAgIGxhYmVsPVwiQmVuZWZpdFwiXG4gICAgICAgIHZhbHVlPXtiZW5lZml0U25hcHNob3RMYWJlbChiZW5lZml0U25hcHNob3QpfVxuICAgICAgLz5cbiAgICAgIHshZXh0ZXJuYWwgJiYgKFxuICAgICAgICA8U3VtbWFyeVdpZGdldFxuICAgICAgICAgIGxhYmVsPVwiTGluZSBUb3RhbFwiXG4gICAgICAgICAgdmFsdWU9e2Zvcm1hdFNuYXBzaG90QW1vdW50KGxpbmVUb3RhbCwgb3JkZXI/LmN1cnJlbmN5X2NvZGUpfVxuICAgICAgICAgIHRvbmU9XCJuZXV0cmFsXCJcbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgICB7IWV4dGVybmFsICYmIChcbiAgICAgICAgPENvbnRhaW5lciBjbGFzc05hbWU9XCJkaXZpZGUteSBwLTBcIj5cbiAgICAgICAgICA8V2lkZ2V0SGVhZGVyIHRpdGxlPVwiQ2FtcGFpZ25cIiAvPlxuICAgICAgICAgIDxTZWN0aW9uUm93IHRpdGxlPVwiQ2FtcGFpZ25cIiB2YWx1ZT17Y2FtcGFpZ25TbmFwc2hvdExhYmVsKGJlbmVmaXRTbmFwc2hvdCl9IC8+XG4gICAgICAgICAgPFNlY3Rpb25Sb3cgdGl0bGU9XCJQcm9tb3Rpb25cIiB2YWx1ZT17cHJvbW90aW9uU25hcHNob3RMYWJlbChiZW5lZml0U25hcHNob3QpfSAvPlxuICAgICAgICAgIDxTZWN0aW9uUm93XG4gICAgICAgICAgICB0aXRsZT1cIlByb21vdGlvbiBzdGF0dXNcIlxuICAgICAgICAgICAgdmFsdWU9e3NuYXBzaG90U3RyaW5nKGJlbmVmaXRTbmFwc2hvdCwgXCJwcm9tb3Rpb25fc3RhdHVzXCIpIHx8IFwiLVwifVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvQ29udGFpbmVyPlxuICAgICAgKX1cbiAgICAgIHshZXh0ZXJuYWwgJiYgKFxuICAgICAgICA8Q29udGFpbmVyIGNsYXNzTmFtZT1cImRpdmlkZS15IHAtMFwiPlxuICAgICAgICAgIDxXaWRnZXRIZWFkZXIgdGl0bGU9XCJJc3N1YW5jZVwiIC8+XG4gICAgICAgICAgPFNlY3Rpb25Sb3cgdGl0bGU9XCJTdGF0dXNcIiB2YWx1ZT17aXNzdWFuY2U/LnN0YXR1cyB8fCBcIi1cIn0gLz5cbiAgICAgICAgICA8U2VjdGlvblJvd1xuICAgICAgICAgICAgdGl0bGU9XCJJc3N1ZWQgLyBmYWlsZWRcIlxuICAgICAgICAgICAgdmFsdWU9e1xuICAgICAgICAgICAgICBpc3N1YW5jZVxuICAgICAgICAgICAgICAgID8gYCR7aXNzdWFuY2UuaXNzdWVkX2NvdW50ID8/IDB9IC8gJHtpc3N1YW5jZS5mYWlsZWRfY291bnQgPz8gMH1gXG4gICAgICAgICAgICAgICAgOiBcIi1cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIC8+XG4gICAgICAgICAgPFNlY3Rpb25Sb3cgdGl0bGU9XCJDb25maWdcIiB2YWx1ZT17ZW50aXRsZW1lbnQuY29uZmlnX2lkIHx8IFwiLVwifSAvPlxuICAgICAgICAgIDxTZWN0aW9uUm93XG4gICAgICAgICAgICB0aXRsZT1cIlZhcmlhbnQgY29uZmlnXCJcbiAgICAgICAgICAgIHZhbHVlPXtlbnRpdGxlbWVudC52YXJpYW50X2NvbmZpZ19pZCB8fCBcIi1cIn1cbiAgICAgICAgICAvPlxuICAgICAgICA8L0NvbnRhaW5lcj5cbiAgICAgICl9XG4gICAgPC8+XG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENvdXBvbkRldGFpbFBhZ2VWaWV3KHsgYXBpQmFzZSB9OiB7IGFwaUJhc2U6IEFwaUJhc2UgfSkge1xuICBjb25zdCBpZCA9IGN1cnJlbnRDb3Vwb25EZXRhaWxJZChhcGlCYXNlKVxuICBjb25zdCBbZGV0YWlsLCBzZXREZXRhaWxdID0gdXNlU3RhdGU8Q291cG9uRW50aXRsZW1lbnREZXRhaWwgfCBudWxsPihudWxsKVxuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKVxuICBjb25zdCBbbG9hZEVycm9yLCBzZXRMb2FkRXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbClcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBhY3RpdmUgPSB0cnVlXG4gICAgYXN5bmMgZnVuY3Rpb24gbG9hZCgpIHtcbiAgICAgIGlmICghaWQpIHtcbiAgICAgICAgc2V0TG9hZEVycm9yKFwiTWlzc2luZyBjb3Vwb24gaWRcIilcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHNldExvYWRpbmcodHJ1ZSlcbiAgICAgIHNldExvYWRFcnJvcihudWxsKVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgYXBpRmV0Y2g8Q291cG9uRW50aXRsZW1lbnREZXRhaWw+KFxuICAgICAgICAgIGAke2FwaUJhc2V9L2NvdXBvbi1wcm9kdWN0cy9lbnRpdGxlbWVudHMvJHtlbmNvZGVVUklDb21wb25lbnQoaWQpfWAsXG4gICAgICAgIClcbiAgICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICAgIHNldERldGFpbChwYXlsb2FkKVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICA/IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgIDogXCJGYWlsZWQgdG8gbG9hZCBjb3Vwb24gZGV0YWlsc1wiXG4gICAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgICBzZXRMb2FkRXJyb3IobWVzc2FnZSlcbiAgICAgICAgICB0b2FzdC5lcnJvcihtZXNzYWdlKVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZvaWQgbG9hZCgpXG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2VcbiAgICB9XG4gIH0sIFthcGlCYXNlLCBpZF0pXG5cbiAgaWYgKGxvYWRpbmcpIHtcbiAgICByZXR1cm4gPENvdXBvbkVtcHR5U3RhdGUgdGl0bGU9XCJMb2FkaW5nIGNvdXBvblwiIC8+XG4gIH1cblxuICBpZiAobG9hZEVycm9yKSB7XG4gICAgcmV0dXJuIDxDb3Vwb25FbXB0eVN0YXRlIHRpdGxlPXtsb2FkRXJyb3J9IC8+XG4gIH1cblxuICBpZiAoIWRldGFpbCkge1xuICAgIHJldHVybiA8Q291cG9uRW1wdHlTdGF0ZSB0aXRsZT1cIkNvdXBvbiBub3QgZm91bmRcIiAvPlxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8VHdvQ29sdW1uTGF5b3V0XG4gICAgICBmaXJzdENvbD17XG4gICAgICAgIDw+XG4gICAgICAgICAgPENvdXBvbkdlbmVyYWxTZWN0aW9uIGRldGFpbD17ZGV0YWlsfSAvPlxuICAgICAgICAgIDxSZWxhdGVkT3JkZXJTZWN0aW9uIGFwaUJhc2U9e2FwaUJhc2V9IGRldGFpbD17ZGV0YWlsfSAvPlxuICAgICAgICAgIDxDb3Vwb25TbmFwc2hvdHNTZWN0aW9uIGRldGFpbD17ZGV0YWlsfSAvPlxuICAgICAgICA8Lz5cbiAgICAgIH1cbiAgICAgIHNlY29uZENvbD17PENvdXBvblN1bW1hcnlTZWN0aW9ucyBkZXRhaWw9e2RldGFpbH0gLz59XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBFbnRpdGxlbWVudHNUYWJsZSh7XG4gIGVudGl0bGVtZW50cyxcbiAgbG9hZGluZyxcbiAgZXJyb3IsXG4gIG9uT3Blbixcbn06IHtcbiAgZW50aXRsZW1lbnRzOiBDb3Vwb25FbnRpdGxlbWVudFtdXG4gIGxvYWRpbmc6IGJvb2xlYW5cbiAgZXJyb3I6IHN0cmluZyB8IG51bGxcbiAgb25PcGVuOiAoZW50aXRsZW1lbnQ6IENvdXBvbkVudGl0bGVtZW50KSA9PiB2b2lkXG59KSB7XG4gIGlmIChsb2FkaW5nKSB7XG4gICAgcmV0dXJuIDxDb3Vwb25FbXB0eVN0YXRlIHRpdGxlPVwiTG9hZGluZyBjb3Vwb25zXCIgLz5cbiAgfVxuICBpZiAoZXJyb3IpIHtcbiAgICByZXR1cm4gPENvdXBvbkVtcHR5U3RhdGUgdGl0bGU9e2Vycm9yfSAvPlxuICB9XG4gIGlmICghZW50aXRsZW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiAoXG4gICAgICA8Q291cG9uRW1wdHlTdGF0ZVxuICAgICAgICB0aXRsZT1cIk5vIGNvdXBvbnMgZm91bmRcIlxuICAgICAgICBkZXNjcmlwdGlvbj1cIlB1cmNoYXNlZCBjb3Vwb25zIHdpbGwgYXBwZWFyIGhlcmUgYWZ0ZXIgdGhleSBhcmUgaXNzdWVkLlwiXG4gICAgICAvPlxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFRhYmxlPlxuICAgICAgPFRhYmxlLkhlYWRlcj5cbiAgICAgICAgPFRhYmxlLlJvdz5cbiAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5TdGF0dXM8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+Q29kZTwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5EYXRlIGlzc3VlZDwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5PcmRlcjwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5DdXN0b21lcjwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5PcmlnaW48L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+U2VsbGVyIHNjb3BlPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPlNvdXJjZTwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5FeHBpcmVzPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICA8L1RhYmxlLlJvdz5cbiAgICAgIDwvVGFibGUuSGVhZGVyPlxuICAgICAgPFRhYmxlLkJvZHk+XG4gICAgICAgIHtlbnRpdGxlbWVudHMubWFwKChpdGVtKSA9PiAoXG4gICAgICAgICAgPFRhYmxlLlJvd1xuICAgICAgICAgICAga2V5PXtpdGVtLmlkfVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiY3Vyc29yLXBvaW50ZXIgaG92ZXI6YmctdWktYmctc3VidGxlXCJcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG9uT3BlbihpdGVtKX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8VGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgPFN0YXR1c0JhZGdlIGNvbG9yPXtlbnRpdGxlbWVudFN0YXR1c0NvbG9yKGl0ZW0uc3RhdHVzKX0+XG4gICAgICAgICAgICAgICAge2l0ZW0uc3RhdHVzfVxuICAgICAgICAgICAgICA8L1N0YXR1c0JhZGdlPlxuICAgICAgICAgICAgPC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgPFRhYmxlLkNlbGw+e2l0ZW0uY29kZSB8fCBpdGVtLnNoYXJlZF9jb2RlIHx8IFwiLVwifTwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgIDxUYWJsZS5DZWxsIHRpdGxlPXtmb3JtYXRGdWxsRGF0ZShpdGVtLmNyZWF0ZWRfYXQpfT5cbiAgICAgICAgICAgICAge2Zvcm1hdFJlbGF0aXZlRGF0ZShpdGVtLmNyZWF0ZWRfYXQpfVxuICAgICAgICAgICAgPC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgPFRhYmxlLkNlbGw+e2l0ZW0ub3JkZXJfaWQgfHwgXCItXCJ9PC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgPFRhYmxlLkNlbGw+e2l0ZW0uZW1haWwgfHwgaXRlbS5jdXN0b21lcl9pZCB8fCBcIi1cIn08L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICA8VGFibGUuQ2VsbD57ZW50aXRsZW1lbnRTb3VyY2UoaXRlbSl9PC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgPFRhYmxlLkNlbGw+e2VudGl0bGVtZW50U2VsbGVyU2NvcGUoaXRlbSl9PC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgPFRhYmxlLkNlbGw+XG4gICAgICAgICAgICAgIHtzbmFwc2hvdFN0cmluZyhpdGVtLnNvdXJjZV9zbmFwc2hvdCwgXCJ0aXRsZVwiKSB8fFxuICAgICAgICAgICAgICAgIHNuYXBzaG90U3RyaW5nKGl0ZW0uc291cmNlX3NuYXBzaG90LCBcInNvdXJjZVwiKSB8fFxuICAgICAgICAgICAgICAgIGl0ZW0ucHJvZHVjdF9pZCB8fFxuICAgICAgICAgICAgICAgIFwiRXh0ZXJuYWxcIn1cbiAgICAgICAgICAgIDwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgIDxUYWJsZS5DZWxsPntmb3JtYXREYXRlKGl0ZW0uZXhwaXJlc19hdCl9PC9UYWJsZS5DZWxsPlxuICAgICAgICAgIDwvVGFibGUuUm93PlxuICAgICAgICApKX1cbiAgICAgIDwvVGFibGUuQm9keT5cbiAgICA8L1RhYmxlPlxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDb3Vwb25zUGFnZVZpZXcoe1xuICBhcGlCYXNlLFxuICB0aXRsZSxcbn06IHtcbiAgYXBpQmFzZTogQXBpQmFzZVxuICB0aXRsZTogc3RyaW5nXG59KSB7XG4gIGNvbnN0IFtlbnRpdGxlbWVudHMsIHNldEVudGl0bGVtZW50c10gPSB1c2VTdGF0ZTxDb3Vwb25FbnRpdGxlbWVudFtdPihbXSlcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSlcbiAgY29uc3QgW2xvYWRFcnJvciwgc2V0TG9hZEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtmaWx0ZXIsIHNldEZpbHRlcl0gPSB1c2VTdGF0ZTxFbnRpdGxlbWVudEZpbHRlcj4oXCJhbGxcIilcblxuICBjb25zdCBsb2FkID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIHNldExvYWRpbmcodHJ1ZSlcbiAgICBzZXRMb2FkRXJyb3IobnVsbClcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IGFwaUZldGNoPHtcbiAgICAgICAgY3VzdG9tZXJfY291cG9uX2VudGl0bGVtZW50czogQ291cG9uRW50aXRsZW1lbnRbXVxuICAgICAgfT4oYCR7YXBpQmFzZX0vY291cG9uLXByb2R1Y3RzL2VudGl0bGVtZW50c2ApXG4gICAgICBzZXRFbnRpdGxlbWVudHMocGF5bG9hZC5jdXN0b21lcl9jb3Vwb25fZW50aXRsZW1lbnRzIHx8IFtdKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIkZhaWxlZCB0byBsb2FkIGNvdXBvbnNcIlxuICAgICAgc2V0TG9hZEVycm9yKG1lc3NhZ2UpXG4gICAgICB0b2FzdC5lcnJvcihtZXNzYWdlKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgIH1cbiAgfSwgW2FwaUJhc2VdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgdm9pZCBsb2FkKClcbiAgfSwgW2xvYWRdKVxuXG4gIGNvbnN0IG9wZW5EZXRhaWwgPSB1c2VDYWxsYmFjayhcbiAgICAoZW50aXRsZW1lbnQ6IENvdXBvbkVudGl0bGVtZW50KSA9PiB7XG4gICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKGNvdXBvbkRldGFpbFBhdGgoYXBpQmFzZSwgZW50aXRsZW1lbnQuaWQpKVxuICAgIH0sXG4gICAgW2FwaUJhc2VdLFxuICApXG5cbiAgcmV0dXJuIChcbiAgICA8Q29udGFpbmVyIGNsYXNzTmFtZT1cImRpdmlkZS15IHAtMFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHgtNiBweS00XCI+XG4gICAgICAgIDxIZWFkaW5nIGxldmVsPVwiaDFcIj57dGl0bGV9PC9IZWFkaW5nPlxuICAgICAgICA8QnV0dG9uIHNpemU9XCJzbWFsbFwiIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIiBvbkNsaWNrPXsoKSA9PiB2b2lkIGxvYWQoKX0+XG4gICAgICAgICAgPEFycm93UGF0aCAvPlxuICAgICAgICAgIFJlZnJlc2hcbiAgICAgICAgPC9CdXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxUYWJzXG4gICAgICAgIHZhbHVlPXtmaWx0ZXJ9XG4gICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZSkgPT4gc2V0RmlsdGVyKHZhbHVlIGFzIEVudGl0bGVtZW50RmlsdGVyKX1cbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJweC02IHB5LTIgYm9yZGVyLWJcIj5cbiAgICAgICAgICA8VGFicy5MaXN0PlxuICAgICAgICAgICAge2VudGl0bGVtZW50RmlsdGVycy5tYXAoKGl0ZW0pID0+IChcbiAgICAgICAgICAgICAgPFRhYnMuVHJpZ2dlciBrZXk9e2l0ZW0udmFsdWV9IHZhbHVlPXtpdGVtLnZhbHVlfT5cbiAgICAgICAgICAgICAgICB7aXRlbS5sYWJlbH1cbiAgICAgICAgICAgICAgPC9UYWJzLlRyaWdnZXI+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L1RhYnMuTGlzdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHtlbnRpdGxlbWVudEZpbHRlcnMubWFwKChpdGVtKSA9PiAoXG4gICAgICAgICAgPFRhYnMuQ29udGVudCBrZXk9e2l0ZW0udmFsdWV9IHZhbHVlPXtpdGVtLnZhbHVlfT5cbiAgICAgICAgICAgIDxFbnRpdGxlbWVudHNUYWJsZVxuICAgICAgICAgICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgICAgICAgICBlcnJvcj17bG9hZEVycm9yfVxuICAgICAgICAgICAgICBvbk9wZW49e29wZW5EZXRhaWx9XG4gICAgICAgICAgICAgIGVudGl0bGVtZW50cz17XG4gICAgICAgICAgICAgICAgaXRlbS52YWx1ZSA9PT0gXCJhbGxcIlxuICAgICAgICAgICAgICAgICAgPyBlbnRpdGxlbWVudHNcbiAgICAgICAgICAgICAgICAgIDogZW50aXRsZW1lbnRzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAoZW50aXRsZW1lbnQpID0+IGVudGl0bGVtZW50LnN0YXR1cyA9PT0gaXRlbS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvVGFicy5Db250ZW50PlxuICAgICAgICApKX1cbiAgICAgIDwvVGFicz5cbiAgICA8L0NvbnRhaW5lcj5cbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gQ291cG9uUHJvZHVjdHNQYWdlVmlldyh7XG4gIGFwaUJhc2UsXG4gIHRpdGxlLFxuICBhbGxvd1Byb21vdGlvbk1pcnJvciA9IGZhbHNlLFxufToge1xuICBhcGlCYXNlOiBBcGlCYXNlXG4gIHRpdGxlOiBzdHJpbmdcbiAgYWxsb3dQcm9tb3Rpb25NaXJyb3I/OiBib29sZWFuXG59KSB7XG4gIHJldHVybiAoXG4gICAgPENvdXBvblByb2R1Y3RzUGFnZVxuICAgICAgYXBpQmFzZT17YXBpQmFzZX1cbiAgICAgIHRpdGxlPXt0aXRsZX1cbiAgICAgIGFsbG93UHJvbW90aW9uTWlycm9yPXthbGxvd1Byb21vdGlvbk1pcnJvcn1cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIExlZ2FjeUNvdXBvblByb2R1Y3RzUGFnZVZpZXcoe1xuICBhcGlCYXNlLFxuICB0aXRsZSxcbiAgYWxsb3dQcm9tb3Rpb25NaXJyb3IgPSBmYWxzZSxcbn06IHtcbiAgYXBpQmFzZTogQXBpQmFzZVxuICB0aXRsZTogc3RyaW5nXG4gIGFsbG93UHJvbW90aW9uTWlycm9yPzogYm9vbGVhblxufSkge1xuICBjb25zdCBbcHJvZHVjdHMsIHNldFByb2R1Y3RzXSA9IHVzZVN0YXRlPENvdXBvblByb2R1Y3RSb3dbXT4oW10pXG4gIGNvbnN0IFtvcHRpb25zLCBzZXRPcHRpb25zXSA9IHVzZVN0YXRlPE9wdGlvbnNQYXlsb2FkPih7fSlcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSlcbiAgY29uc3QgW2xvYWRFcnJvciwgc2V0TG9hZEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFttb2RhbE9wZW4sIHNldE1vZGFsT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3NhdmluZywgc2V0U2F2aW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbYWN0aXZlU3RlcCwgc2V0QWN0aXZlU3RlcF0gPSB1c2VTdGF0ZTxXaXphcmRTdGVwPihcImRldGFpbHNcIilcbiAgY29uc3QgW3Byb2R1Y3RGb3JtLCBzZXRQcm9kdWN0Rm9ybV0gPSB1c2VTdGF0ZTxQcm9kdWN0Rm9ybVN0YXRlPihlbXB0eVByb2R1Y3QpXG4gIGNvbnN0IFtjb3Vwb25Gb3JtLCBzZXRDb3Vwb25Gb3JtXSA9IHVzZVN0YXRlPENvdXBvbkZvcm1TdGF0ZT4oZW1wdHlDb3Vwb24pXG4gIGNvbnN0IFtjYW1wYWlnbkZvcm0sIHNldENhbXBhaWduRm9ybV0gPVxuICAgIHVzZVN0YXRlPENhbXBhaWduRm9ybVN0YXRlPihlbXB0eUNhbXBhaWduKVxuICBjb25zdCBwcm9tcHQgPSB1c2VQcm9tcHQoKVxuXG4gIGNvbnN0IGNvdXBvbkJhc2UgPSBgJHthcGlCYXNlfS9jb3Vwb24tcHJvZHVjdHNgXG5cbiAgY29uc3QgbG9hZCA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgc2V0TG9hZEVycm9yKG51bGwpXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IFtwcm9kdWN0c1BheWxvYWQsIG9wdGlvbnNQYXlsb2FkXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgYXBpRmV0Y2g8eyBjb3Vwb25fcHJvZHVjdHM6IENvdXBvblByb2R1Y3RSb3dbXSB9Pihjb3Vwb25CYXNlKSxcbiAgICAgICAgYXBpRmV0Y2g8T3B0aW9uc1BheWxvYWQ+KGAke2NvdXBvbkJhc2V9L29wdGlvbnNgKSxcbiAgICAgIF0pXG4gICAgICBzZXRQcm9kdWN0cyhwcm9kdWN0c1BheWxvYWQuY291cG9uX3Byb2R1Y3RzIHx8IFtdKVxuICAgICAgc2V0T3B0aW9ucyhvcHRpb25zUGF5bG9hZCB8fCB7fSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICA/IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICA6IFwiRmFpbGVkIHRvIGxvYWQgY291cG9uIHByb2R1Y3RzXCJcbiAgICAgIHNldExvYWRFcnJvcihtZXNzYWdlKVxuICAgICAgdG9hc3QuZXJyb3IobWVzc2FnZSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICB9XG4gIH0sIFtjb3Vwb25CYXNlXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHZvaWQgbG9hZCgpXG4gIH0sIFtsb2FkXSlcblxuICBjb25zdCBvcHRpb25EZWZhdWx0cyA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIHNhbGVzX2NoYW5uZWxfaWQ6IG9wdGlvbnMuc2FsZXNfY2hhbm5lbHM/LlswXT8uaWQgfHwgXCJcIixcbiAgICAgIGN1cnJlbmN5X2NvZGU6XG4gICAgICAgIG9wdGlvbnMuY3VycmVuY2llcz8uZmluZCgoY3VycmVuY3kpID0+IGN1cnJlbmN5LmlzX2RlZmF1bHQpPy5jb2RlIHx8XG4gICAgICAgIG9wdGlvbnMuY3VycmVuY2llcz8uWzBdPy5jb2RlIHx8XG4gICAgICAgIFwiXCIsXG4gICAgfSksXG4gICAgW29wdGlvbnNdLFxuICApXG5cbiAgY29uc3QgY3VycmVuY2llcyA9IG9wdGlvbnMuY3VycmVuY2llcyB8fCBbXVxuICBjb25zdCBzdXBwb3J0ZWRDdXJyZW5jeUNvZGVzID0gdXNlTWVtbyhcbiAgICAoKSA9PiBuZXcgU2V0KGN1cnJlbmNpZXMubWFwKChjdXJyZW5jeSkgPT4gY3VycmVuY3kuY29kZSkpLFxuICAgIFtjdXJyZW5jaWVzXSxcbiAgKVxuXG4gIGNvbnN0IHVwZGF0ZVByb2R1Y3QgPVxuICAgIChmaWVsZDoga2V5b2YgUHJvZHVjdEZvcm1TdGF0ZSkgPT5cbiAgICAoZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50PikgPT4ge1xuICAgICAgc2V0UHJvZHVjdEZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgIFtmaWVsZF06IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgIH0pKVxuICAgIH1cblxuICBjb25zdCB1cGRhdGVDb3Vwb24gPVxuICAgIChmaWVsZDoga2V5b2YgQ291cG9uRm9ybVN0YXRlKSA9PlxuICAgIChldmVudDogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIHNldENvdXBvbkZvcm0oKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIFtmaWVsZF06IGV2ZW50LnRhcmdldC52YWx1ZSB9KSlcbiAgICB9XG5cbiAgY29uc3QgdXBkYXRlQ2FtcGFpZ24gPVxuICAgIChmaWVsZDoga2V5b2YgQ2FtcGFpZ25Gb3JtU3RhdGUpID0+XG4gICAgKGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgc2V0Q2FtcGFpZ25Gb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICBbZmllbGRdOiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICB9KSlcbiAgICB9XG5cbiAgZnVuY3Rpb24gb3BlbkNyZWF0ZSgpIHtcbiAgICBjb25zdCBjdXJyZW5jeUNvZGUgPSBvcHRpb25EZWZhdWx0cy5jdXJyZW5jeV9jb2RlXG4gICAgc2V0UHJvZHVjdEZvcm0oe1xuICAgICAgLi4uZW1wdHlQcm9kdWN0LFxuICAgICAgLi4ub3B0aW9uRGVmYXVsdHMsXG4gICAgICB2YXJpYW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgLi4uZW1wdHlWYXJpYW50LFxuICAgICAgICAgIGN1cnJlbmN5X2NvZGU6IGN1cnJlbmN5Q29kZSxcbiAgICAgICAgICBvdmVycmlkZV9jdXJyZW5jeV9jb2RlOiBjdXJyZW5jeUNvZGUsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pXG4gICAgc2V0Q291cG9uRm9ybSh7IC4uLmVtcHR5Q291cG9uLCBjdXJyZW5jeV9jb2RlOiBjdXJyZW5jeUNvZGUgfSlcbiAgICBzZXRDYW1wYWlnbkZvcm0oZW1wdHlDYW1wYWlnbilcbiAgICBzZXRBY3RpdmVTdGVwKFwiZGV0YWlsc1wiKVxuICAgIHNldE1vZGFsT3Blbih0cnVlKVxuICB9XG5cbiAgZnVuY3Rpb24gb3BlbkVkaXQocm93OiBDb3Vwb25Qcm9kdWN0Um93KSB7XG4gICAgY29uc3QgZm9ybXMgPSBmb3JtRnJvbVJvdyhyb3csIG9wdGlvbkRlZmF1bHRzLmN1cnJlbmN5X2NvZGUpXG4gICAgc2V0UHJvZHVjdEZvcm0oe1xuICAgICAgLi4uZm9ybXMucHJvZHVjdCxcbiAgICAgIHZhcmlhbnRzOiBmb3Jtcy5wcm9kdWN0LnZhcmlhbnRzLmxlbmd0aFxuICAgICAgICA/IGZvcm1zLnByb2R1Y3QudmFyaWFudHNcbiAgICAgICAgOiBbeyAuLi5lbXB0eVZhcmlhbnQgfV0sXG4gICAgfSlcbiAgICBzZXRDb3Vwb25Gb3JtKGZvcm1zLmNvdXBvbilcbiAgICBzZXRDYW1wYWlnbkZvcm0oZm9ybXMuY2FtcGFpZ24pXG4gICAgc2V0QWN0aXZlU3RlcChcImRldGFpbHNcIilcbiAgICBzZXRNb2RhbE9wZW4odHJ1ZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFZhcmlhbnQoaW5kZXg6IG51bWJlciwgcGF0Y2g6IFBhcnRpYWw8VmFyaWFudEZvcm1TdGF0ZT4pIHtcbiAgICBzZXRQcm9kdWN0Rm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICB2YXJpYW50czogY3VycmVudC52YXJpYW50cy5tYXAoKHZhcmlhbnQsIHZhcmlhbnRJbmRleCkgPT5cbiAgICAgICAgdmFyaWFudEluZGV4ID09PSBpbmRleCA/IHsgLi4udmFyaWFudCwgLi4ucGF0Y2ggfSA6IHZhcmlhbnQsXG4gICAgICApLFxuICAgIH0pKVxuICB9XG5cbiAgZnVuY3Rpb24gYWRkVmFyaWFudCgpIHtcbiAgICBjb25zdCBjdXJyZW5jeUNvZGUgPVxuICAgICAgY291cG9uRm9ybS5jdXJyZW5jeV9jb2RlIHx8IG9wdGlvbkRlZmF1bHRzLmN1cnJlbmN5X2NvZGVcbiAgICBzZXRQcm9kdWN0Rm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICB2YXJpYW50czogW1xuICAgICAgICAuLi5jdXJyZW50LnZhcmlhbnRzLFxuICAgICAgICB7XG4gICAgICAgICAgLi4uZW1wdHlWYXJpYW50LFxuICAgICAgICAgIGN1cnJlbmN5X2NvZGU6IGN1cnJlbmN5Q29kZSxcbiAgICAgICAgICBvdmVycmlkZV9jdXJyZW5jeV9jb2RlOiBjdXJyZW5jeUNvZGUsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pKVxuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlVmFyaWFudChpbmRleDogbnVtYmVyKSB7XG4gICAgc2V0UHJvZHVjdEZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAuLi5jdXJyZW50LFxuICAgICAgdmFyaWFudHM6IGN1cnJlbnQudmFyaWFudHMuZmlsdGVyKFxuICAgICAgICAoXywgdmFyaWFudEluZGV4KSA9PiB2YXJpYW50SW5kZXggIT09IGluZGV4LFxuICAgICAgKSxcbiAgICB9KSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHByb2R1Y3RQYXlsb2FkKGluY2x1ZGVWYXJpYW50czogYm9vbGVhbikge1xuICAgIGNvbnN0IHByb2R1Y3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgdGl0bGU6IHByb2R1Y3RGb3JtLnRpdGxlLFxuICAgICAgc3VidGl0bGU6IHByb2R1Y3RGb3JtLnN1YnRpdGxlIHx8IG51bGwsXG4gICAgICBoYW5kbGU6IHByb2R1Y3RGb3JtLmhhbmRsZSB8fCBudWxsLFxuICAgICAgZGVzY3JpcHRpb246IHByb2R1Y3RGb3JtLmRlc2NyaXB0aW9uIHx8IG51bGwsXG4gICAgICBzdGF0dXM6IHByb2R1Y3RGb3JtLnN0YXR1cyxcbiAgICAgIHRodW1ibmFpbDogcHJvZHVjdEZvcm0udGh1bWJuYWlsIHx8IG51bGwsXG4gICAgICBkaXNjb3VudGFibGU6IHByb2R1Y3RGb3JtLmRpc2NvdW50YWJsZSxcbiAgICAgIHR5cGVfaWQ6IHByb2R1Y3RGb3JtLnR5cGVfaWQgfHwgbnVsbCxcbiAgICAgIGNvbGxlY3Rpb25faWQ6IHByb2R1Y3RGb3JtLmNvbGxlY3Rpb25faWQgfHwgbnVsbCxcbiAgICAgIGNhdGVnb3JpZXM6IHByb2R1Y3RGb3JtLmNhdGVnb3J5X2lkXG4gICAgICAgID8gW3sgaWQ6IHByb2R1Y3RGb3JtLmNhdGVnb3J5X2lkIH1dXG4gICAgICAgIDogW10sXG4gICAgICB0YWdzOiBwcm9kdWN0Rm9ybS50YWdfaWQgPyBbeyBpZDogcHJvZHVjdEZvcm0udGFnX2lkIH1dIDogW10sXG4gICAgICBzYWxlc19jaGFubmVsczogcHJvZHVjdEZvcm0uc2FsZXNfY2hhbm5lbF9pZFxuICAgICAgICA/IFt7IGlkOiBwcm9kdWN0Rm9ybS5zYWxlc19jaGFubmVsX2lkIH1dXG4gICAgICAgIDogW10sXG4gICAgfVxuXG4gICAgaWYgKGluY2x1ZGVWYXJpYW50cykge1xuICAgICAgcHJvZHVjdC52YXJpYW50cyA9IHByb2R1Y3RGb3JtLnZhcmlhbnRzLm1hcCgodmFyaWFudCkgPT4gKHtcbiAgICAgICAgdGl0bGU6IHZhcmlhbnQudGl0bGUsXG4gICAgICAgIHNrdTogdmFyaWFudC5za3UgfHwgbnVsbCxcbiAgICAgICAgbWFuYWdlX2ludmVudG9yeTogZmFsc2UsXG4gICAgICAgIGFsbG93X2JhY2tvcmRlcjogdHJ1ZSxcbiAgICAgICAgcHJpY2VzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY3VycmVuY3lfY29kZTogdmFyaWFudC5jdXJyZW5jeV9jb2RlLnRyaW0oKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgYW1vdW50OiBOdW1iZXIodmFyaWFudC5hbW91bnQpIHx8IDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pKVxuICAgIH1cblxuICAgIHJldHVybiBwcm9kdWN0XG4gIH1cblxuICBmdW5jdGlvbiB2YXJpYW50T3ZlcnJpZGVzKCkge1xuICAgIHJldHVybiBwcm9kdWN0Rm9ybS52YXJpYW50c1xuICAgICAgLm1hcCgodmFyaWFudCwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKCF2YXJpYW50Lm92ZXJyaWRlX2VuYWJsZWQpIHJldHVybiBudWxsXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmFyaWFudF9pbmRleDogaW5kZXgsXG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBiZW5lZml0X3R5cGU6IHZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlLFxuICAgICAgICAgIGFtb3VudDpcbiAgICAgICAgICAgIHZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiXG4gICAgICAgICAgICAgID8gbnVtYmVyT3JOdWxsKHZhcmlhbnQub3ZlcnJpZGVfYW1vdW50KVxuICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgcGVyY2VudGFnZTpcbiAgICAgICAgICAgIHZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlID09PSBcInBlcmNlbnRhZ2VcIlxuICAgICAgICAgICAgICA/IG51bWJlck9yTnVsbCh2YXJpYW50Lm92ZXJyaWRlX3BlcmNlbnRhZ2UpXG4gICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBjdXJyZW5jeV9jb2RlOlxuICAgICAgICAgICAgdmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCJcbiAgICAgICAgICAgICAgPyB2YXJpYW50Lm92ZXJyaWRlX2N1cnJlbmN5X2NvZGUudHJpbSgpLnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgICAgICAgICAgICBjb3Vwb25Gb3JtLmN1cnJlbmN5X2NvZGVcbiAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICB9XG5cbiAgZnVuY3Rpb24gdmFsaWRhdGVGb3JtKCkge1xuICAgIGlmICghcHJvZHVjdEZvcm0udGl0bGUudHJpbSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm9kdWN0IHRpdGxlIGlzIHJlcXVpcmVkXCIpXG4gICAgfVxuICAgIGlmICghcHJvZHVjdEZvcm0uaWQgJiYgIXByb2R1Y3RGb3JtLnZhcmlhbnRzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXQgbGVhc3Qgb25lIHByb2R1Y3QgdmFyaWFudCBpcyByZXF1aXJlZFwiKVxuICAgIH1cbiAgICBpZiAoIWN1cnJlbmNpZXMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBZGQgYSBzdXBwb3J0ZWQgY3VycmVuY3kgdG8gdGhlIHN0b3JlIGJlZm9yZSBjb250aW51aW5nXCIpXG4gICAgfVxuICAgIGlmICghcHJvZHVjdEZvcm0uaWQpIHtcbiAgICAgIGZvciAoY29uc3QgdmFyaWFudCBvZiBwcm9kdWN0Rm9ybS52YXJpYW50cykge1xuICAgICAgICBpZiAoIXN1cHBvcnRlZEN1cnJlbmN5Q29kZXMuaGFzKHZhcmlhbnQuY3VycmVuY3lfY29kZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlbGVjdCBhbiBhdmFpbGFibGUgY3VycmVuY3kgZm9yICR7dmFyaWFudC50aXRsZX1gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNvdXBvbkZvcm0uYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiICYmXG4gICAgICBudW1iZXJPck51bGwoY291cG9uRm9ybS5hbW91bnQpID09IG51bGxcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgcG9zaXRpdmUgY291cG9uIGFtb3VudCBpcyByZXF1aXJlZFwiKVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBjb3Vwb25Gb3JtLmJlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIiAmJlxuICAgICAgIXN1cHBvcnRlZEN1cnJlbmN5Q29kZXMuaGFzKGNvdXBvbkZvcm0uY3VycmVuY3lfY29kZSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNlbGVjdCBhbiBhdmFpbGFibGUgY291cG9uIGN1cnJlbmN5XCIpXG4gICAgfVxuICAgIGlmIChjb3Vwb25Gb3JtLmJlbmVmaXRfdHlwZSA9PT0gXCJwZXJjZW50YWdlXCIpIHtcbiAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSBudW1iZXJPck51bGwoY291cG9uRm9ybS5wZXJjZW50YWdlKVxuICAgICAgaWYgKHBlcmNlbnRhZ2UgPT0gbnVsbCB8fCBwZXJjZW50YWdlID4gMTAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdXBvbiBwZXJjZW50YWdlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMDBcIilcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgY291cG9uRm9ybS5jb2RlX3N0cmF0ZWd5ID09PSBcInNoYXJlZF9jb2RlXCIgJiZcbiAgICAgICFjb3Vwb25Gb3JtLnNoYXJlZF9jb2RlLnRyaW0oKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSBzaGFyZWQgY291cG9uIGNvZGUgaXMgcmVxdWlyZWRcIilcbiAgICB9XG4gICAgaWYgKGNvdXBvbkZvcm0uZXhwaXJhdGlvbl90eXBlID09PSBcImZpeGVkXCIpIHtcbiAgICAgIGNvbnN0IGV4cGlyYXRpb24gPSBuZXcgRGF0ZShjb3Vwb25Gb3JtLmV4cGlyYXRpb25fZGF0ZSlcbiAgICAgIGlmICghY291cG9uRm9ybS5leHBpcmF0aW9uX2RhdGUgfHwgTnVtYmVyLmlzTmFOKGV4cGlyYXRpb24uZ2V0VGltZSgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIHZhbGlkIGZpeGVkIGV4cGlyYXRpb24gZGF0ZSBpcyByZXF1aXJlZFwiKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY291cG9uRm9ybS5leHBpcmF0aW9uX2NhcF9hdCkge1xuICAgICAgY29uc3QgZXhwaXJhdGlvbkNhcCA9IG5ldyBEYXRlKGNvdXBvbkZvcm0uZXhwaXJhdGlvbl9jYXBfYXQpXG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKGV4cGlyYXRpb25DYXAuZ2V0VGltZSgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIHZhbGlkIGV4cGlyYXRpb24gY2FwIGRhdGUgaXMgcmVxdWlyZWRcIilcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCB2YXJpYW50IG9mIHByb2R1Y3RGb3JtLnZhcmlhbnRzKSB7XG4gICAgICBpZiAoIXZhcmlhbnQub3ZlcnJpZGVfZW5hYmxlZCkgY29udGludWVcbiAgICAgIGlmIChcbiAgICAgICAgdmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCIgJiZcbiAgICAgICAgbnVtYmVyT3JOdWxsKHZhcmlhbnQub3ZlcnJpZGVfYW1vdW50KSA9PSBudWxsXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBBIHBvc2l0aXZlIGNvdXBvbiBhbW91bnQgaXMgcmVxdWlyZWQgZm9yICR7dmFyaWFudC50aXRsZX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiICYmXG4gICAgICAgICFzdXBwb3J0ZWRDdXJyZW5jeUNvZGVzLmhhcyh2YXJpYW50Lm92ZXJyaWRlX2N1cnJlbmN5X2NvZGUpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTZWxlY3QgYW4gYXZhaWxhYmxlIGNvdXBvbiBjdXJyZW5jeSBmb3IgJHt2YXJpYW50LnRpdGxlfWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGlmICh2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSA9PT0gXCJwZXJjZW50YWdlXCIpIHtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9IG51bWJlck9yTnVsbCh2YXJpYW50Lm92ZXJyaWRlX3BlcmNlbnRhZ2UpXG4gICAgICAgIGlmIChwZXJjZW50YWdlID09IG51bGwgfHwgcGVyY2VudGFnZSA+IDEwMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDb3Vwb24gcGVyY2VudGFnZSBmb3IgJHt2YXJpYW50LnRpdGxlfSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTAwYCxcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgYWxsb3dQcm9tb3Rpb25NaXJyb3IgJiZcbiAgICAgIGNhbXBhaWduRm9ybS5tb2RlID09PSBcImV4aXN0aW5nXCIgJiZcbiAgICAgICFjYW1wYWlnbkZvcm0uY2FtcGFpZ25faWRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNlbGVjdCBhbiBleGlzdGluZyBjYW1wYWlnblwiKVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBhbGxvd1Byb21vdGlvbk1pcnJvciAmJlxuICAgICAgY2FtcGFpZ25Gb3JtLm1vZGUgPT09IFwibmV3XCIgJiZcbiAgICAgICghY2FtcGFpZ25Gb3JtLm5hbWUudHJpbSgpIHx8ICFjYW1wYWlnbkZvcm0uY2FtcGFpZ25faWRlbnRpZmllci50cmltKCkpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW1wYWlnbiBuYW1lIGFuZCBpZGVudGlmaWVyIGFyZSByZXF1aXJlZFwiKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHN5bmNWYXJpYW50T3ZlcnJpZGVzKHByb2R1Y3RJZDogc3RyaW5nKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwcm9kdWN0Rm9ybS52YXJpYW50cy5tYXAoYXN5bmMgKHZhcmlhbnQpID0+IHtcbiAgICAgICAgaWYgKCF2YXJpYW50LmlkKSByZXR1cm5cblxuICAgICAgICBpZiAoIXZhcmlhbnQub3ZlcnJpZGVfZW5hYmxlZCkge1xuICAgICAgICAgIGlmICh2YXJpYW50Lm92ZXJyaWRlX2NvbmZpZ19pZCkge1xuICAgICAgICAgICAgYXdhaXQgYXBpRmV0Y2goYCR7Y291cG9uQmFzZX0vJHtwcm9kdWN0SWR9L3ZhcmlhbnRzYCwge1xuICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgdmFyaWFudF9pZDogdmFyaWFudC5pZCxcbiAgICAgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IGFwaUZldGNoKGAke2NvdXBvbkJhc2V9LyR7cHJvZHVjdElkfS92YXJpYW50c2AsIHtcbiAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHZhcmlhbnRfaWQ6IHZhcmlhbnQuaWQsXG4gICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgYmVuZWZpdF90eXBlOiB2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSxcbiAgICAgICAgICAgIGFtb3VudDpcbiAgICAgICAgICAgICAgdmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCJcbiAgICAgICAgICAgICAgICA/IG51bWJlck9yTnVsbCh2YXJpYW50Lm92ZXJyaWRlX2Ftb3VudClcbiAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICBwZXJjZW50YWdlOlxuICAgICAgICAgICAgICB2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSA9PT0gXCJwZXJjZW50YWdlXCJcbiAgICAgICAgICAgICAgICA/IG51bWJlck9yTnVsbCh2YXJpYW50Lm92ZXJyaWRlX3BlcmNlbnRhZ2UpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgY3VycmVuY3lfY29kZTpcbiAgICAgICAgICAgICAgdmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCJcbiAgICAgICAgICAgICAgICA/IHZhcmlhbnQub3ZlcnJpZGVfY3VycmVuY3lfY29kZS50cmltKCkudG9Mb3dlckNhc2UoKSB8fFxuICAgICAgICAgICAgICAgICAgY291cG9uRm9ybS5jdXJyZW5jeV9jb2RlLnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KVxuICAgICAgfSksXG4gICAgKVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc2F2ZVByb2R1Y3QoKSB7XG4gICAgc2V0U2F2aW5nKHRydWUpXG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlRm9ybSgpXG4gICAgICBjb25zdCBpc0VkaXQgPSBCb29sZWFuKHByb2R1Y3RGb3JtLmlkKVxuICAgICAgY29uc3QgcGF0aCA9IGlzRWRpdCA/IGAke2NvdXBvbkJhc2V9LyR7cHJvZHVjdEZvcm0uaWR9YCA6IGNvdXBvbkJhc2VcbiAgICAgIGNvbnN0IG1ldGhvZCA9IGlzRWRpdCA/IFwiUEFUQ0hcIiA6IFwiUE9TVFwiXG4gICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICBwcm9kdWN0OiBwcm9kdWN0UGF5bG9hZCghaXNFZGl0KSxcbiAgICAgICAgY291cG9uOiBidWlsZENvdXBvblBheWxvYWQoY291cG9uRm9ybSwgYWxsb3dQcm9tb3Rpb25NaXJyb3IpLFxuICAgICAgICBjYW1wYWlnbjogYnVpbGRDYW1wYWlnblBheWxvYWQoY2FtcGFpZ25Gb3JtLCBhbGxvd1Byb21vdGlvbk1pcnJvciksXG4gICAgICAgIHNlbGxlcl9pZDogcHJvZHVjdEZvcm0uc2VsbGVyX2lkIHx8IG51bGwsXG4gICAgICAgIHZhcmlhbnRfb3ZlcnJpZGVzOiBpc0VkaXQgPyBbXSA6IHZhcmlhbnRPdmVycmlkZXMoKSxcbiAgICAgIH1cblxuICAgICAgYXdhaXQgYXBpRmV0Y2gocGF0aCwge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICAgICAgfSlcbiAgICAgIGlmIChpc0VkaXQpIHtcbiAgICAgICAgYXdhaXQgc3luY1ZhcmlhbnRPdmVycmlkZXMocHJvZHVjdEZvcm0uaWQpXG4gICAgICB9XG4gICAgICB0b2FzdC5zdWNjZXNzKFxuICAgICAgICBpc0VkaXQgPyBcIkNvdXBvbiBwcm9kdWN0IHVwZGF0ZWRcIiA6IFwiQ291cG9uIHByb2R1Y3QgY3JlYXRlZFwiLFxuICAgICAgKVxuICAgICAgc2V0TW9kYWxPcGVuKGZhbHNlKVxuICAgICAgYXdhaXQgbG9hZCgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRvYXN0LmVycm9yKFxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgPyBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgOiBcIkZhaWxlZCB0byBzYXZlIGNvdXBvbiBwcm9kdWN0XCIsXG4gICAgICApXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldFNhdmluZyhmYWxzZSlcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBkZWxldGVQcm9kdWN0KHJvdzogQ291cG9uUHJvZHVjdFJvdykge1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHByb21wdCh7XG4gICAgICB0aXRsZTogXCJSZW1vdmUgY291cG9uIHByb2R1Y3Q/XCIsXG4gICAgICBkZXNjcmlwdGlvbjogYFRoaXMgcmVtb3ZlcyBjb3Vwb24gaXNzdWFuY2UgZnJvbSAke1xuICAgICAgICByb3cucHJvZHVjdC50aXRsZSB8fCByb3cucHJvZHVjdC5pZFxuICAgICAgfS4gVGhlIHVuZGVybHlpbmcgTWVkdXNhIHByb2R1Y3Qgd2lsbCByZW1haW4gYXZhaWxhYmxlLmAsXG4gICAgICBjb25maXJtVGV4dDogXCJSZW1vdmUgcHJvZHVjdFwiLFxuICAgICAgY2FuY2VsVGV4dDogXCJDYW5jZWxcIixcbiAgICAgIHZhcmlhbnQ6IFwiZGFuZ2VyXCIsXG4gICAgfSlcbiAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgYXBpRmV0Y2goYCR7Y291cG9uQmFzZX0vJHtyb3cucHJvZHVjdC5pZH1gLCB7IG1ldGhvZDogXCJERUxFVEVcIiB9KVxuICAgICAgdG9hc3Quc3VjY2VzcyhcIkNvdXBvbiBjb25maWd1cmF0aW9uIHJlbW92ZWRcIilcbiAgICAgIGF3YWl0IGxvYWQoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0b2FzdC5lcnJvcihcbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgID8gZXJyb3IubWVzc2FnZVxuICAgICAgICAgIDogXCJGYWlsZWQgdG8gcmVtb3ZlIGNvdXBvbiBwcm9kdWN0XCIsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbWlycm9yUHJvbW90aW9uKHJvdzogQ291cG9uUHJvZHVjdFJvdykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhcGlGZXRjaChcbiAgICAgICAgYC9hZG1pbi9jb3Vwb24tcHJvZHVjdHMvJHtyb3cucHJvZHVjdC5pZH0vbWlycm9yLXByb21vdGlvbmAsXG4gICAgICAgIHtcbiAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHt9KSxcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICAgIHRvYXN0LnN1Y2Nlc3MoXCJQcm9tb3Rpb24gbWlycm9yIGNyZWF0ZWRcIilcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdG9hc3QuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIk1pcnJvciBmYWlsZWRcIilcbiAgICB9XG4gIH1cblxuICBjb25zdCBjdXJyZW50U3RlcEluZGV4ID0gc3RlcHMuaW5kZXhPZihhY3RpdmVTdGVwKVxuICBjb25zdCBjYW5Hb0JhY2sgPSBjdXJyZW50U3RlcEluZGV4ID4gMFxuICBjb25zdCBjYW5Hb05leHQgPSBjdXJyZW50U3RlcEluZGV4IDwgc3RlcHMubGVuZ3RoIC0gMVxuICBjb25zdCBzaG93Q2FtcGFpZ25TdGVwID0gYWxsb3dQcm9tb3Rpb25NaXJyb3JcbiAgY29uc3QgdmlzaWJsZVN0ZXBzID0gc2hvd0NhbXBhaWduU3RlcFxuICAgID8gc3RlcHNcbiAgICA6IHN0ZXBzLmZpbHRlcigoc3RlcCkgPT4gc3RlcCAhPT0gXCJjYW1wYWlnblwiKVxuXG4gIHJldHVybiAoXG4gICAgPENvbnRhaW5lciBjbGFzc05hbWU9XCJkaXZpZGUteSBwLTBcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB4LTYgcHktNFwiPlxuICAgICAgICA8SGVhZGluZyBsZXZlbD1cImgxXCI+e3RpdGxlfTwvSGVhZGluZz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC0yXCI+XG4gICAgICAgICAgPEJ1dHRvbiBzaXplPVwic21hbGxcIiB2YXJpYW50PVwic2Vjb25kYXJ5XCIgb25DbGljaz17KCkgPT4gdm9pZCBsb2FkKCl9PlxuICAgICAgICAgICAgPEFycm93UGF0aCAvPlxuICAgICAgICAgICAgUmVmcmVzaFxuICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgIDxCdXR0b24gc2l6ZT1cInNtYWxsXCIgb25DbGljaz17b3BlbkNyZWF0ZX0+XG4gICAgICAgICAgICA8UGx1cyAvPlxuICAgICAgICAgICAgQ3JlYXRlXG4gICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgPENvdXBvbkVtcHR5U3RhdGUgdGl0bGU9XCJMb2FkaW5nIGNvdXBvbiBwcm9kdWN0c1wiIC8+XG4gICAgICApIDogbG9hZEVycm9yID8gKFxuICAgICAgICA8Q291cG9uRW1wdHlTdGF0ZSB0aXRsZT17bG9hZEVycm9yfSAvPlxuICAgICAgKSA6IHByb2R1Y3RzLmxlbmd0aCA/IChcbiAgICAgICAgPFRhYmxlPlxuICAgICAgICAgIDxUYWJsZS5IZWFkZXI+XG4gICAgICAgICAgICA8VGFibGUuUm93PlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5Qcm9kdWN0PC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5TdGF0dXM8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPkJlbmVmaXQ8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPkNvZGU8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPkNhbXBhaWduPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5Jc3N1ZWQ8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsIC8+XG4gICAgICAgICAgICA8L1RhYmxlLlJvdz5cbiAgICAgICAgICA8L1RhYmxlLkhlYWRlcj5cbiAgICAgICAgICA8VGFibGUuQm9keT5cbiAgICAgICAgICAgIHtwcm9kdWN0cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBjb25maWcgPSByb3cuY291cG9uX3Byb2R1Y3RfY29uZmlnXG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPFRhYmxlLlJvdyBrZXk9e3Jvdy5pZH0+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPFRleHQgd2VpZ2h0PVwicGx1c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3Jvdy5wcm9kdWN0LnRpdGxlIHx8IHJvdy5wcm9kdWN0LmlkfVxuICAgICAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cm93LnByb2R1Y3QuaGFuZGxlIHx8IHJvdy5wcm9kdWN0LmlkfVxuICAgICAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPFN0YXR1c0JhZGdlIGNvbG9yPXtwcm9kdWN0U3RhdHVzQ29sb3Iocm93LnByb2R1Y3Quc3RhdHVzKX0+XG4gICAgICAgICAgICAgICAgICAgICAge3Jvdy5wcm9kdWN0LnN0YXR1cyB8fCBcImRyYWZ0XCJ9XG4gICAgICAgICAgICAgICAgICAgIDwvU3RhdHVzQmFkZ2U+XG4gICAgICAgICAgICAgICAgICA8L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD57YmVuZWZpdExhYmVsKGNvbmZpZyl9PC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICAgIHtjb25maWcuY29kZV9zdHJhdGVneSA9PT0gXCJzaGFyZWRfY29kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBjb25maWcuc2hhcmVkX2NvZGUgfHwgXCItXCJcbiAgICAgICAgICAgICAgICAgICAgICA6IGNvbmZpZy5jb2RlX3ByZWZpeCB8fCBcIkNPVVBPTlwifVxuICAgICAgICAgICAgICAgICAgPC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGw+e2NhbXBhaWduTGFiZWwoY29uZmlnKX08L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD57cm93LmVudGl0bGVtZW50c19jb3VudCB8fCAwfTwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1lbmQgZ2FwLXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgIHthbGxvd1Byb21vdGlvbk1pcnJvciAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB2b2lkIG1pcnJvclByb21vdGlvbihyb3cpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBNaXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gb3BlbkVkaXQocm93KX1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8UGVuY2lsU3F1YXJlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICBFZGl0XG4gICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJkYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gdm9pZCBkZWxldGVQcm9kdWN0KHJvdyl9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFRyYXNoIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmUgY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgIDwvVGFibGUuUm93PlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA8L1RhYmxlLkJvZHk+XG4gICAgICAgIDwvVGFibGU+XG4gICAgICApIDogKFxuICAgICAgICA8Q291cG9uRW1wdHlTdGF0ZVxuICAgICAgICAgIHRpdGxlPVwiTm8gY291cG9uIHByb2R1Y3RzIGZvdW5kXCJcbiAgICAgICAgICBkZXNjcmlwdGlvbj1cIkNyZWF0ZSBhIG5ldyBjb3Vwb24gcHJvZHVjdCB0byBnZXQgc3RhcnRlZC5cIlxuICAgICAgICAvPlxuICAgICAgKX1cblxuICAgICAgPEZvY3VzTW9kYWwgb3Blbj17bW9kYWxPcGVufSBvbk9wZW5DaGFuZ2U9e3NldE1vZGFsT3Blbn0+XG4gICAgICAgIDxGb2N1c01vZGFsLkNvbnRlbnQgc3R5bGU9e21vZGFsQ29udGVudFN0eWxlfT5cbiAgICAgICAgICA8Rm9jdXNNb2RhbC5IZWFkZXIgc3R5bGU9e21vZGFsU3RhdGljUm93U3R5bGV9PlxuICAgICAgICAgICAgPEZvY3VzTW9kYWwuVGl0bGU+XG4gICAgICAgICAgICAgIHtwcm9kdWN0Rm9ybS5pZCA/IFwiRWRpdCBDb3Vwb24gUHJvZHVjdFwiIDogXCJDcmVhdGUgQ291cG9uIFByb2R1Y3RcIn1cbiAgICAgICAgICAgIDwvRm9jdXNNb2RhbC5UaXRsZT5cbiAgICAgICAgICA8L0ZvY3VzTW9kYWwuSGVhZGVyPlxuICAgICAgICAgIDxQcm9ncmVzc1RhYnNcbiAgICAgICAgICAgIHZhbHVlPXthY3RpdmVTdGVwfVxuICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHZhbHVlKSA9PiBzZXRBY3RpdmVTdGVwKHZhbHVlIGFzIFdpemFyZFN0ZXApfVxuICAgICAgICAgICAgc3R5bGU9e21vZGFsV2l6YXJkU3R5bGV9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPFByb2dyZXNzVGFicy5MaXN0IGNsYXNzTmFtZT1cImJvcmRlci1iXCIgc3R5bGU9e21vZGFsU3RhdGljUm93U3R5bGV9PlxuICAgICAgICAgICAgICB7dmlzaWJsZVN0ZXBzLm1hcCgoc3RlcCkgPT4gKFxuICAgICAgICAgICAgICAgIDxQcm9ncmVzc1RhYnMuVHJpZ2dlclxuICAgICAgICAgICAgICAgICAga2V5PXtzdGVwfVxuICAgICAgICAgICAgICAgICAgdmFsdWU9e3N0ZXB9XG4gICAgICAgICAgICAgICAgICBzdGF0dXM9e3N0ZXBTdGF0dXMoc3RlcCwgYWN0aXZlU3RlcCl9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3N0ZXAgPT09IFwiZGV0YWlsc1wiXG4gICAgICAgICAgICAgICAgICAgID8gXCJEZXRhaWxzXCJcbiAgICAgICAgICAgICAgICAgICAgOiBzdGVwID09PSBcIm9yZ2FuaXplXCJcbiAgICAgICAgICAgICAgICAgICAgICA/IFwiT3JnYW5pemVcIlxuICAgICAgICAgICAgICAgICAgICAgIDogc3RlcCA9PT0gXCJ2YXJpYW50c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwiVmFyaWFudHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBzdGVwID09PSBcImNvdXBvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJDb3Vwb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiQ2FtcGFpZ25cIn1cbiAgICAgICAgICAgICAgICA8L1Byb2dyZXNzVGFicy5UcmlnZ2VyPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvUHJvZ3Jlc3NUYWJzLkxpc3Q+XG4gICAgICAgICAgICA8Rm9jdXNNb2RhbC5Cb2R5IHN0eWxlPXttb2RhbEJvZHlTdHlsZX0+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9e21vZGFsRm9ybVN0eWxlfT5cbiAgICAgICAgICAgICAgICA8UHJvZ3Jlc3NUYWJzLkNvbnRlbnQgdmFsdWU9XCJkZXRhaWxzXCIgc3R5bGU9e3N0YWNrU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17dGhyZWVDb2x1bW5HcmlkU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJUaXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3RGb3JtLnRpdGxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZVByb2R1Y3QoXCJ0aXRsZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJTdWJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3RGb3JtLnN1YnRpdGxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZVByb2R1Y3QoXCJzdWJ0aXRsZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJIYW5kbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0Rm9ybS5oYW5kbGV9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlUHJvZHVjdChcImhhbmRsZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtzdGFja1N0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiRGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8VGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0Rm9ybS5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVQcm9kdWN0KFwiZGVzY3JpcHRpb25cIil9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiTWVkaWEgVVJMXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdEZvcm0udGh1bWJuYWlsfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZVByb2R1Y3QoXCJ0aHVtYm5haWxcIil9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvUHJvZ3Jlc3NUYWJzLkNvbnRlbnQ+XG5cbiAgICAgICAgICAgICAgICA8UHJvZ3Jlc3NUYWJzLkNvbnRlbnQgdmFsdWU9XCJvcmdhbml6ZVwiIHN0eWxlPXtzdGFja1N0eWxlfT5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3R3b0NvbHVtbkdyaWRTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlN0YXR1c1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0Rm9ybS5zdGF0dXN9XG4gICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3RGb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJkcmFmdFwiPkRyYWZ0PC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwicHVibGlzaGVkXCI+UHVibGlzaGVkPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwicHJvcG9zZWRcIj5Qcm9wb3NlZDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cInJlamVjdGVkXCI+UmVqZWN0ZWQ8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAge2FwaUJhc2UgPT09IFwiL2FkbWluXCIgJiYgIXByb2R1Y3RGb3JtLmlkICYmIChcbiAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJTZWxsZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxPcHRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3RGb3JtLnNlbGxlcl9pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5zZWxsZXJzIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3RGb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGxlcl9pZDogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiVHlwZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxPcHRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0Rm9ybS50eXBlX2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5wcm9kdWN0X3R5cGVzIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdEZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX2lkOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ29sbGVjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxPcHRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0Rm9ybS5jb2xsZWN0aW9uX2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5wcm9kdWN0X2NvbGxlY3Rpb25zIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdEZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uX2lkOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ2F0ZWdvcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8T3B0aW9uU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdEZvcm0uY2F0ZWdvcnlfaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zLnByb2R1Y3RfY2F0ZWdvcmllcyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3RGb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfaWQ6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJUYWdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8T3B0aW9uU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdEZvcm0udGFnX2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5wcm9kdWN0X3RhZ3MgfHwgW119XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0Rm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ19pZDogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlNhbGVzIGNoYW5uZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8T3B0aW9uU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdEZvcm0uc2FsZXNfY2hhbm5lbF9pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMuc2FsZXNfY2hhbm5lbHMgfHwgW119XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0Rm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbGVzX2NoYW5uZWxfaWQ6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtwYW5lbFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17cm93QmV0d2VlblN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgd2VpZ2h0PVwicGx1c1wiPkRpc2NvdW50YWJsZTwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY291bnRzIGNhbiBhcHBseSB0byB0aGlzIHByb2R1Y3RcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8U3dpdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtwcm9kdWN0Rm9ybS5kaXNjb3VudGFibGV9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoZWNrZWRDaGFuZ2U9eyhjaGVja2VkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0Rm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdW50YWJsZTogQm9vbGVhbihjaGVja2VkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L1Byb2dyZXNzVGFicy5Db250ZW50PlxuXG4gICAgICAgICAgICAgICAgPFByb2dyZXNzVGFicy5Db250ZW50IHZhbHVlPVwidmFyaWFudHNcIiBzdHlsZT17c3RhY2tTdHlsZX0+XG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtyb3dCZXR3ZWVuU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICA8SGVhZGluZyBsZXZlbD1cImgyXCI+VmFyaWFudHM8L0hlYWRpbmc+XG4gICAgICAgICAgICAgICAgICAgIHshcHJvZHVjdEZvcm0uaWQgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2FkZFZhcmlhbnR9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFBsdXMgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIEFkZCB2YXJpYW50XG4gICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAteS00XCI+XG4gICAgICAgICAgICAgICAgICAgIHtwcm9kdWN0Rm9ybS52YXJpYW50cy5tYXAoKHZhcmlhbnQsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBrZXk9e2Ake3ZhcmlhbnQuaWQgfHwgaW5kZXh9YH0gc3R5bGU9e3BhbmVsU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17Zm91ckNvbHVtbkdyaWRTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dmFyaWFudC50aXRsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtCb29sZWFuKHByb2R1Y3RGb3JtLmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhcmlhbnQoaW5kZXgsIHsgdGl0bGU6IGV2ZW50LnRhcmdldC52YWx1ZSB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlNLVVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3ZhcmlhbnQuc2t1fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e0Jvb2xlYW4ocHJvZHVjdEZvcm0uaWQpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFyaWFudChpbmRleCwgeyBza3U6IGV2ZW50LnRhcmdldC52YWx1ZSB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkN1cnJlbmN5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEN1cnJlbmN5U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jaWVzPXtjdXJyZW5jaWVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3ZhcmlhbnQuY3VycmVuY3lfY29kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtCb29sZWFuKHByb2R1Y3RGb3JtLmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoY3VycmVuY3lfY29kZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFyaWFudChpbmRleCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5X2NvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiUHJpY2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q3VycmVuY3lBbW91bnRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY2llcz17Y3VycmVuY2llc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5Q29kZT17dmFyaWFudC5jdXJyZW5jeV9jb2RlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3ZhcmlhbnQuYW1vdW50fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e0Jvb2xlYW4ocHJvZHVjdEZvcm0uaWQpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhhbW91bnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhcmlhbnQoaW5kZXgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW91bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclRvcDogXCIxcHggc29saWQgdmFyKC0tYm9yZGVyLWJhc2UpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luVG9wOiAxNixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nVG9wOiAxNixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17cm93QmV0d2VlblN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCB3ZWlnaHQ9XCJwbHVzXCI+Q291cG9uIGJlbmVmaXQgb3ZlcnJpZGU8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFN3aXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17dmFyaWFudC5vdmVycmlkZV9lbmFibGVkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGVja2VkQ2hhbmdlPXsoY2hlY2tlZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFyaWFudChpbmRleCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlX2VuYWJsZWQ6IEJvb2xlYW4oY2hlY2tlZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt2YXJpYW50Lm92ZXJyaWRlX2VuYWJsZWQgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IC4uLmZvdXJDb2x1bW5HcmlkU3R5bGUsIG1hcmdpblRvcDogMTIgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJCZW5lZml0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFyaWFudChpbmRleCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZV9iZW5lZml0X3R5cGU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgYXMgQmVuZWZpdFR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImZpeGVkX2Ftb3VudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXhlZCBhbW91bnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJwZXJjZW50YWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmNlbnRhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJmcmVlX3NoaXBwaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWUgc2hpcHBpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ3VycmVuY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEN1cnJlbmN5U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY2llcz17Y3VycmVuY2llc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dmFyaWFudC5vdmVycmlkZV9jdXJyZW5jeV9jb2RlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlICE9PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmaXhlZF9hbW91bnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KG92ZXJyaWRlX2N1cnJlbmN5X2NvZGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYXJpYW50KGluZGV4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlX2N1cnJlbmN5X2NvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJBbW91bnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEN1cnJlbmN5QW1vdW50SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jaWVzPXtjdXJyZW5jaWVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5Q29kZT17dmFyaWFudC5vdmVycmlkZV9jdXJyZW5jeV9jb2RlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt2YXJpYW50Lm92ZXJyaWRlX2Ftb3VudH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSAhPT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZml4ZWRfYW1vdW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhvdmVycmlkZV9hbW91bnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYXJpYW50KGluZGV4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlX2Ftb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlBlcmNlbnRhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3ZhcmlhbnQub3ZlcnJpZGVfcGVyY2VudGFnZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSAhPT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicGVyY2VudGFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYXJpYW50KGluZGV4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlX3BlcmNlbnRhZ2U6IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyFwcm9kdWN0Rm9ybS5pZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RGb3JtLnZhcmlhbnRzLmxlbmd0aCA+IDEgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJtdC00XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgbWFyZ2luVG9wOiAxNiB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gcmVtb3ZlVmFyaWFudChpbmRleCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZSB2YXJpYW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9Qcm9ncmVzc1RhYnMuQ29udGVudD5cblxuICAgICAgICAgICAgICAgIDxQcm9ncmVzc1RhYnMuQ29udGVudCB2YWx1ZT1cImNvdXBvblwiIHN0eWxlPXtzdGFja1N0eWxlfT5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3BhbmVsU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtyb3dCZXR3ZWVuU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCB3ZWlnaHQ9XCJwbHVzXCI+Q291cG9uIGlzc3VhbmNlPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBJc3N1ZSBjb3Vwb25zIHdoZW4gY3VzdG9tZXJzIHB1cmNoYXNlIHRoaXMgcHJvZHVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxTd2l0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e2NvdXBvbkZvcm0uZW5hYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hlY2tlZENoYW5nZT17KGNoZWNrZWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbkZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiBCb29sZWFuKGNoZWNrZWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17dHdvQ29sdW1uR3JpZFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQmVuZWZpdFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLmJlbmVmaXRfdHlwZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uRm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlbmVmaXRfdHlwZTogdmFsdWUgYXMgQmVuZWZpdFR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiZml4ZWRfYW1vdW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4ZWQgYW1vdW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cInBlcmNlbnRhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJjZW50YWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImZyZWVfc2hpcHBpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmVlIHNoaXBwaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICB7YWxsb3dQcm9tb3Rpb25NaXJyb3IgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlByb21vdGlvbiBzdGF0dXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbkZvcm0ucHJvbW90aW9uX3N0YXR1c31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbkZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uX3N0YXR1czogdmFsdWUgYXMgUHJvbW90aW9uU3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJkcmFmdFwiPkRyYWZ0PC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJhY3RpdmVcIj5BY3RpdmU8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImluYWN0aXZlXCI+SW5hY3RpdmU8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQW1vdW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPEN1cnJlbmN5QW1vdW50SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmNpZXM9e2N1cnJlbmNpZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeUNvZGU9e2NvdXBvbkZvcm0uY3VycmVuY3lfY29kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtjb3Vwb25Gb3JtLmJlbmVmaXRfdHlwZSAhPT0gXCJmaXhlZF9hbW91bnRcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLmFtb3VudH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoYW1vdW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb25Gb3JtKChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBhbW91bnQgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiUGVyY2VudGFnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17Y291cG9uRm9ybS5iZW5lZml0X3R5cGUgIT09IFwicGVyY2VudGFnZVwifVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbkZvcm0ucGVyY2VudGFnZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVDb3Vwb24oXCJwZXJjZW50YWdlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkN1cnJlbmN5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPEN1cnJlbmN5U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jaWVzPXtjdXJyZW5jaWVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbkZvcm0uY3VycmVuY3lfY29kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtjb3Vwb25Gb3JtLmJlbmVmaXRfdHlwZSAhPT0gXCJmaXhlZF9hbW91bnRcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoY3VycmVuY3lfY29kZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uRm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5X2NvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkV4cGlyYXRpb24gcG9saWN5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbkZvcm0uZXhwaXJhdGlvbl90eXBlfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb25Gb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJhdGlvbl90eXBlOiB2YWx1ZSBhcyBFeHBpcmF0aW9uUG9saWN5VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJkdXJhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1cmF0aW9uIGFmdGVyIGlzc3VlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImZpeGVkXCI+Rml4ZWQgZGF0ZTwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICB7Y291cG9uRm9ybS5leHBpcmF0aW9uX3R5cGUgPT09IFwiZHVyYXRpb25cIiA/IChcbiAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJFeHBpcmF0aW9uIGRheXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWluPXsxfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uRm9ybS5leHBpcmF0aW9uX2RheXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVDb3Vwb24oXCJleHBpcmF0aW9uX2RheXNcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiRXhwaXJlcyBhdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLmV4cGlyYXRpb25fZGF0ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZUNvdXBvbihcImV4cGlyYXRpb25fZGF0ZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ2FwIGV4cGlyYXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtyb3dCZXR3ZWVuU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBDYW1wYWlnbiBlbmQgb3IgY2FwIGRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTd2l0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17Y291cG9uRm9ybS5leHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGVja2VkQ2hhbmdlPXsoY2hlY2tlZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb25Gb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWduOiBCb29sZWFuKGNoZWNrZWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJFeHBpcmF0aW9uIGNhcCBkYXRlIChvcHRpb25hbClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWNvdXBvbkZvcm0uZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ259XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uRm9ybS5leHBpcmF0aW9uX2NhcF9hdH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVDb3Vwb24oXCJleHBpcmF0aW9uX2NhcF9hdFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDb2RlIHN0cmF0ZWd5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbkZvcm0uY29kZV9zdHJhdGVneX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uRm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfc3RyYXRlZ3k6IHZhbHVlIGFzIENvZGVTdHJhdGVneSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJ1bmlxdWVfY29kZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaXF1ZSBjb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cInNoYXJlZF9jb2RlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhcmVkIGNvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkNvZGUgcHJlZml4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17Y291cG9uRm9ybS5jb2RlX3N0cmF0ZWd5ICE9PSBcInVuaXF1ZV9jb2RlXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uRm9ybS5jb2RlX3ByZWZpeH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVDb3Vwb24oXCJjb2RlX3ByZWZpeFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJTaGFyZWQgY29kZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2NvdXBvbkZvcm0uY29kZV9zdHJhdGVneSAhPT0gXCJzaGFyZWRfY29kZVwifVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbkZvcm0uc2hhcmVkX2NvZGV9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlQ291cG9uKFwic2hhcmVkX2NvZGVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiTWF4IGlzc3VhbmNlIHBlciBpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLm1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVDb3Vwb24oXCJtYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW1cIil9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAge2FsbG93UHJvbW90aW9uTWlycm9yICYmIChcbiAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJQcm9tb3Rpb24gbWlycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLnByb21vdGlvbl9taXJyb3JfbW9kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbkZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uX21pcnJvcl9tb2RlOiB2YWx1ZSBhcyBNaXJyb3JNb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJub25lXCI+Tm9uZTwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwibWFudWFsXCI+TWFudWFsPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJhdXRvXCI+QXV0bzwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9Qcm9ncmVzc1RhYnMuQ29udGVudD5cblxuICAgICAgICAgICAgICAgIHthbGxvd1Byb21vdGlvbk1pcnJvciAmJiAoXG4gICAgICAgICAgICAgICAgICA8UHJvZ3Jlc3NUYWJzLkNvbnRlbnQgdmFsdWU9XCJjYW1wYWlnblwiIHN0eWxlPXtzdGFja1N0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17dHdvQ29sdW1uR3JpZFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDYW1wYWlnblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2FtcGFpZ25Gb3JtLm1vZGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDYW1wYWlnbkZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogdmFsdWUgYXMgQ2FtcGFpZ25Nb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJub25lXCI+Tm8gY2FtcGFpZ248L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImV4aXN0aW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGlzdGluZyBjYW1wYWlnblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwibmV3XCI+TmV3IGNhbXBhaWduPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAge2NhbXBhaWduRm9ybS5tb2RlID09PSBcImV4aXN0aW5nXCIgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiRXhpc3RpbmcgY2FtcGFpZ25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPE9wdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjYW1wYWlnbkZvcm0uY2FtcGFpZ25faWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5jYW1wYWlnbnMgfHwgW119XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENhbXBhaWduRm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtcGFpZ25faWQ6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIHtjYW1wYWlnbkZvcm0ubW9kZSA9PT0gXCJuZXdcIiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJOYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2FtcGFpZ25Gb3JtLm5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlQ2FtcGFpZ24oXCJuYW1lXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIklkZW50aWZpZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjYW1wYWlnbkZvcm0uY2FtcGFpZ25faWRlbnRpZmllcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVDYW1wYWlnbihcImNhbXBhaWduX2lkZW50aWZpZXJcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiU3RhcnRzIGF0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NhbXBhaWduRm9ybS5zdGFydHNfYXR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlQ2FtcGFpZ24oXCJzdGFydHNfYXRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiRW5kcyBhdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjYW1wYWlnbkZvcm0uZW5kc19hdH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVDYW1wYWlnbihcImVuZHNfYXRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9Qcm9ncmVzc1RhYnMuQ29udGVudD5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvRm9jdXNNb2RhbC5Cb2R5PlxuICAgICAgICAgIDwvUHJvZ3Jlc3NUYWJzPlxuICAgICAgICAgIDxGb2N1c01vZGFsLkZvb3RlciBzdHlsZT17bW9kYWxTdGF0aWNSb3dTdHlsZX0+XG4gICAgICAgICAgICA8QnV0dG9uIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIiBvbkNsaWNrPXsoKSA9PiBzZXRNb2RhbE9wZW4oZmFsc2UpfT5cbiAgICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgIHtjYW5Hb0JhY2sgJiYgKFxuICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgIHNldEFjdGl2ZVN0ZXAodmlzaWJsZVN0ZXBzW2N1cnJlbnRTdGVwSW5kZXggLSAxXSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBCYWNrXG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHtjYW5Hb05leHQgJiZcbiAgICAgICAgICAgIGFjdGl2ZVN0ZXAgIT09IHZpc2libGVTdGVwc1t2aXNpYmxlU3RlcHMubGVuZ3RoIC0gMV0gPyAoXG4gICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgc2V0QWN0aXZlU3RlcCh2aXNpYmxlU3RlcHNbY3VycmVudFN0ZXBJbmRleCArIDFdKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIENvbnRpbnVlXG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPEJ1dHRvbiBpc0xvYWRpbmc9e3NhdmluZ30gb25DbGljaz17KCkgPT4gdm9pZCBzYXZlUHJvZHVjdCgpfT5cbiAgICAgICAgICAgICAgICBTYXZlXG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L0ZvY3VzTW9kYWwuRm9vdGVyPlxuICAgICAgICA8L0ZvY3VzTW9kYWwuQ29udGVudD5cbiAgICAgIDwvRm9jdXNNb2RhbD5cbiAgICA8L0NvbnRhaW5lcj5cbiAgKVxufVxuXG5mdW5jdGlvbiBPcHRpb25TZWxlY3Qoe1xuICB2YWx1ZSxcbiAgb3B0aW9ucyxcbiAgb25DaGFuZ2UsXG59OiB7XG4gIHZhbHVlOiBzdHJpbmdcbiAgb3B0aW9uczogT3B0aW9uUmVjb3JkW11cbiAgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG59KSB7XG4gIHJldHVybiAoXG4gICAgPFNlbGVjdFxuICAgICAgdmFsdWU9e3ZhbHVlIHx8IE5PTkV9XG4gICAgICBvblZhbHVlQ2hhbmdlPXsobmV4dCkgPT4gb25DaGFuZ2UobmV4dCA9PT0gTk9ORSA/IFwiXCIgOiBuZXh0KX1cbiAgICA+XG4gICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgIDxTZWxlY3QuVmFsdWUgLz5cbiAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT17Tk9ORX0+Tm9uZTwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgIHtvcHRpb25zLm1hcCgob3B0aW9uKSA9PiAoXG4gICAgICAgICAgPFNlbGVjdC5JdGVtIGtleT17b3B0aW9uLmlkfSB2YWx1ZT17b3B0aW9uLmlkfT5cbiAgICAgICAgICAgIHtvcHRpb25MYWJlbChvcHRpb24pfVxuICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICkpfVxuICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICA8L1NlbGVjdD5cbiAgKVxufVxuIiwgImltcG9ydCB7XG4gIHVzZUNhbGxiYWNrLFxuICB1c2VFZmZlY3QsXG4gIHVzZU1lbW8sXG4gIHVzZVJlZixcbiAgdXNlU3RhdGUsXG4gIHR5cGUgQ2hhbmdlRXZlbnQsXG4gIHR5cGUgQ1NTUHJvcGVydGllcyxcbiAgdHlwZSBEcmFnRXZlbnQsXG4gIHR5cGUgUmVhY3ROb2RlLFxufSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHtcbiAgQWRqdXN0bWVudHMsXG4gIEFycm93UGF0aCxcbiAgQXJyb3dVcFRyYXksXG4gIEluZm9ybWF0aW9uQ2lyY2xlLFxuICBQZW5jaWxTcXVhcmUsXG4gIFBsdXMsXG4gIFRheEV4Y2x1c2l2ZSxcbiAgVGF4SW5jbHVzaXZlLFxuICBUcmFzaCxcbiAgWE1hcmtNaW5pLFxufSBmcm9tIFwiQG1lZHVzYWpzL2ljb25zXCJcbmltcG9ydCB7XG4gIEJ1dHRvbixcbiAgQ2hlY2tib3gsXG4gIENvbnRhaW5lcixcbiAgQ3VycmVuY3lJbnB1dCxcbiAgRGl2aWRlcixcbiAgRHJvcGRvd25NZW51LFxuICBEcmF3ZXIsXG4gIEZvY3VzTW9kYWwsXG4gIEhlYWRpbmcsXG4gIElucHV0LFxuICBMYWJlbCxcbiAgUHJvZ3Jlc3NUYWJzLFxuICBSYWRpb0dyb3VwLFxuICBTZWxlY3QsXG4gIFN0YXR1c0JhZGdlLFxuICBTd2l0Y2gsXG4gIFRhYmxlLFxuICBUZXh0LFxuICBUZXh0YXJlYSxcbiAgVG9vbHRpcCxcbiAgdG9hc3QsXG4gIHVzZVByb21wdCxcbn0gZnJvbSBcIkBtZWR1c2Fqcy91aVwiXG5pbXBvcnQgeyBDb3Vwb25FbXB0eVN0YXRlIH0gZnJvbSBcIi4vZW1wdHktc3RhdGVcIlxuXG5kZWNsYXJlIGNvbnN0IF9fQkFDS0VORF9VUkxfXzogc3RyaW5nXG5cbnR5cGUgQXBpQmFzZSA9IFwiL2FkbWluXCIgfCBcIi92ZW5kb3JcIlxudHlwZSBCZW5lZml0VHlwZSA9IFwiZml4ZWRfYW1vdW50XCIgfCBcInBlcmNlbnRhZ2VcIiB8IFwiZnJlZV9zaGlwcGluZ1wiIHwgXCJidXlfZ2V0XCJcbnR5cGUgQ291cG9uVHlwZSA9XG4gIHwgXCJhbW91bnRfb2ZmX3Byb2R1Y3RzXCJcbiAgfCBcImFtb3VudF9vZmZfb3JkZXJcIlxuICB8IFwicGVyY2VudGFnZV9vZmZfcHJvZHVjdFwiXG4gIHwgXCJwZXJjZW50YWdlX29mZl9vcmRlclwiXG4gIHwgXCJidXlfeF9nZXRfeVwiXG4gIHwgXCJmcmVlX3NoaXBwaW5nXCJcbnR5cGUgQ29kZVN0cmF0ZWd5ID0gXCJ1bmlxdWVfY29kZVwiIHwgXCJzaGFyZWRfY29kZVwiXG50eXBlIE1pcnJvck1vZGUgPSBcIm5vbmVcIiB8IFwibWFudWFsXCIgfCBcImF1dG9cIlxudHlwZSBQcm9tb3Rpb25TdGF0dXMgPSBcImRyYWZ0XCIgfCBcImFjdGl2ZVwiIHwgXCJpbmFjdGl2ZVwiXG50eXBlIENhbXBhaWduTW9kZSA9IFwibm9uZVwiIHwgXCJleGlzdGluZ1wiIHwgXCJuZXdcIlxudHlwZSBFeHBpcmF0aW9uUG9saWN5VHlwZSA9IFwibm9uZVwiIHwgXCJkdXJhdGlvblwiIHwgXCJmaXhlZFwiXG50eXBlIENvdXBvbkFsbG9jYXRpb24gPSBcImVhY2hcIiB8IFwib25jZVwiXG50eXBlIFdpemFyZFN0ZXAgPSBcImRldGFpbHNcIiB8IFwib3JnYW5pemVcIiB8IFwiY2FtcGFpZ25cIiB8IFwicHJpY2VzXCJcbnR5cGUgUHVyY2hhc2VDb25kaXRpb25BdHRyaWJ1dGUgPVxuICB8IFwiY3VzdG9tZXIuZ3JvdXBzLmlkXCJcbiAgfCBcInJlZ2lvbi5pZFwiXG4gIHwgXCJzaGlwcGluZ19hZGRyZXNzLmNvdW50cnlfY29kZVwiXG4gIHwgXCJzYWxlc19jaGFubmVsX2lkXCJcbiAgfCBcImN1cnJlbmN5X2NvZGVcIlxudHlwZSBQdXJjaGFzZUNvbmRpdGlvbk9wZXJhdG9yID0gXCJpblwiIHwgXCJlcVwiIHwgXCJuZVwiXG5cbnR5cGUgUHVyY2hhc2VDb25kaXRpb25Gb3JtID0ge1xuICBrZXk6IHN0cmluZ1xuICBhdHRyaWJ1dGU6IFB1cmNoYXNlQ29uZGl0aW9uQXR0cmlidXRlIHwgXCJcIlxuICBvcGVyYXRvcjogUHVyY2hhc2VDb25kaXRpb25PcGVyYXRvciB8IFwiXCJcbiAgdmFsdWVzOiBzdHJpbmdbXVxufVxuXG50eXBlIE9wdGlvblJlY29yZCA9IHtcbiAgaWQ6IHN0cmluZ1xuICBuYW1lPzogc3RyaW5nIHwgbnVsbFxuICB0aXRsZT86IHN0cmluZyB8IG51bGxcbiAgdmFsdWU/OiBzdHJpbmcgfCBudWxsXG4gIGhhbmRsZT86IHN0cmluZyB8IG51bGxcbiAgY2FtcGFpZ25faWRlbnRpZmllcj86IHN0cmluZyB8IG51bGxcbiAgZGlzcGxheV9uYW1lPzogc3RyaW5nIHwgbnVsbFxuICBpc29fMj86IHN0cmluZyB8IG51bGxcbn1cblxudHlwZSBDdXJyZW5jeU9wdGlvbiA9IHtcbiAgY29kZTogc3RyaW5nXG4gIG5hbWU6IHN0cmluZ1xuICBzeW1ib2w6IHN0cmluZ1xuICBzeW1ib2xfbmF0aXZlOiBzdHJpbmdcbiAgaXNfZGVmYXVsdDogYm9vbGVhblxuICBpc190YXhfaW5jbHVzaXZlPzogYm9vbGVhblxufVxuXG50eXBlIE9wdGlvbnNQYXlsb2FkID0ge1xuICBjdXJyZW5jaWVzPzogQ3VycmVuY3lPcHRpb25bXVxuICBwcm9kdWN0X3R5cGVzPzogT3B0aW9uUmVjb3JkW11cbiAgcHJvZHVjdF9jb2xsZWN0aW9ucz86IE9wdGlvblJlY29yZFtdXG4gIHByb2R1Y3RfY2F0ZWdvcmllcz86IE9wdGlvblJlY29yZFtdXG4gIHByb2R1Y3RfdGFncz86IE9wdGlvblJlY29yZFtdXG4gIHNhbGVzX2NoYW5uZWxzPzogT3B0aW9uUmVjb3JkW11cbiAgc2hpcHBpbmdfcHJvZmlsZXM/OiBPcHRpb25SZWNvcmRbXVxuICBjYW1wYWlnbnM/OiBPcHRpb25SZWNvcmRbXVxuICBzZWxsZXJzPzogT3B0aW9uUmVjb3JkW11cbiAgY3VzdG9tZXJfZ3JvdXBzPzogT3B0aW9uUmVjb3JkW11cbiAgcmVnaW9ucz86IE9wdGlvblJlY29yZFtdXG4gIGNvdW50cmllcz86IE9wdGlvblJlY29yZFtdXG59XG5cbnR5cGUgQ291cG9uUHJvZHVjdENvbmZpZyA9IHtcbiAgaWQ6IHN0cmluZ1xuICBlbmFibGVkOiBib29sZWFuXG4gIHByb2R1Y3RfaWQ6IHN0cmluZ1xuICBiZW5lZml0X3R5cGU6IEJlbmVmaXRUeXBlXG4gIHB1cmNoYXNlX2NvbmRpdGlvbnM/OiBBcnJheTx7XG4gICAgYXR0cmlidXRlOiBQdXJjaGFzZUNvbmRpdGlvbkF0dHJpYnV0ZVxuICAgIG9wZXJhdG9yOiBQdXJjaGFzZUNvbmRpdGlvbk9wZXJhdG9yXG4gICAgdmFsdWVzOiBzdHJpbmdbXVxuICB9PiB8IG51bGxcbiAgYW1vdW50cz86IHsgY3VycmVuY3lfY29kZTogc3RyaW5nOyBhbW91bnQ6IG51bWJlciB9W10gfCBudWxsXG4gIGFtb3VudDogbnVtYmVyIHwgbnVsbFxuICBwZXJjZW50YWdlOiBudW1iZXIgfCBudWxsXG4gIGN1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGxcbiAgY29kZV9zdHJhdGVneTogQ29kZVN0cmF0ZWd5XG4gIGNvZGVfcHJlZml4OiBzdHJpbmcgfCBudWxsXG4gIHNoYXJlZF9jb2RlOiBzdHJpbmcgfCBudWxsXG4gIGV4cGlyYXRpb25fcG9saWN5OlxuICB8IHsgdHlwZTogXCJub25lXCIgfVxuICB8IHtcbiAgICB0eXBlOiBcImR1cmF0aW9uXCJcbiAgICBkdXJhdGlvbl9kYXlzOiBudW1iZXJcbiAgICBjYXBfYnlfY2FtcGFpZ24/OiBib29sZWFuXG4gICAgY2FwX2F0Pzogc3RyaW5nIHwgbnVsbFxuICB9XG4gIHwge1xuICAgIHR5cGU6IFwiZml4ZWRcIlxuICAgIGV4cGlyZXNfYXQ6IHN0cmluZ1xuICAgIGNhcF9ieV9jYW1wYWlnbj86IGJvb2xlYW5cbiAgICBjYXBfYXQ/OiBzdHJpbmcgfCBudWxsXG4gIH1cbiAgbWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtOiBudW1iZXJcbiAgcHJvbW90aW9uX21pcnJvcl9tb2RlOiBNaXJyb3JNb2RlXG4gIHByb21vdGlvbl9zdGF0dXM/OiBQcm9tb3Rpb25TdGF0dXMgfCBudWxsXG4gIHByb21vdGlvbl90ZW1wbGF0ZT86IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsXG4gIGNhbXBhaWduX2lkPzogc3RyaW5nIHwgbnVsbFxuICBjYW1wYWlnbl9zbmFwc2hvdD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbFxufVxuXG50eXBlIFByb2R1Y3RSZWNvcmQgPSB7XG4gIGlkOiBzdHJpbmdcbiAgdGl0bGU6IHN0cmluZyB8IG51bGxcbiAgc3VidGl0bGU/OiBzdHJpbmcgfCBudWxsXG4gIGhhbmRsZTogc3RyaW5nIHwgbnVsbFxuICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGxcbiAgc3RhdHVzOiBzdHJpbmcgfCBudWxsXG4gIHRodW1ibmFpbDogc3RyaW5nIHwgbnVsbFxuICB0aHVtYm5haWxfYXNzZXRfaWQ/OiBzdHJpbmcgfCBudWxsXG4gIGltYWdlcz86IHsgaWQ/OiBzdHJpbmc7IHVybD86IHN0cmluZyB8IG51bGw7IGFzc2V0X2lkPzogc3RyaW5nIHwgbnVsbCB9W11cbiAgZGlzY291bnRhYmxlPzogYm9vbGVhblxuICB0eXBlX2lkPzogc3RyaW5nIHwgbnVsbFxuICBjb2xsZWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbFxuICBzaGlwcGluZ19wcm9maWxlX2lkPzogc3RyaW5nIHwgbnVsbFxuICB2YXJpYW50cz86IHtcbiAgICBpZDogc3RyaW5nXG4gICAgc2t1Pzogc3RyaW5nIHwgbnVsbFxuICAgIHByaWNlcz86IHsgY3VycmVuY3lfY29kZT86IHN0cmluZzsgYW1vdW50PzogbnVtYmVyIH1bXVxuICB9W11cbiAgY2F0ZWdvcmllcz86IHsgaWQ6IHN0cmluZyB9W11cbiAgdGFncz86IHsgaWQ6IHN0cmluZyB9W11cbiAgc2FsZXNfY2hhbm5lbHM/OiB7IGlkOiBzdHJpbmc7IG5hbWU/OiBzdHJpbmcgfCBudWxsIH1bXVxufVxuXG50eXBlIFByb2R1Y3RNZWRpYSA9IHtcbiAgdXJsOiBzdHJpbmdcbiAgYXNzZXRfaWQ/OiBzdHJpbmdcbn1cblxudHlwZSBDb3Vwb25Qcm9kdWN0Um93ID0ge1xuICBpZDogc3RyaW5nXG4gIHByb2R1Y3Q6IFByb2R1Y3RSZWNvcmRcbiAgY291cG9uX3Byb2R1Y3RfY29uZmlnOiBDb3Vwb25Qcm9kdWN0Q29uZmlnXG4gIGVudGl0bGVtZW50c19jb3VudDogbnVtYmVyXG59XG5cbnR5cGUgUHJvZHVjdEZvcm1TdGF0ZSA9IHtcbiAgdGl0bGU6IHN0cmluZ1xuICBzdWJ0aXRsZTogc3RyaW5nXG4gIGhhbmRsZTogc3RyaW5nXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgbWVkaWE6IFByb2R1Y3RNZWRpYVtdXG4gIHNrdTogc3RyaW5nXG4gIHByaWNlX2Ftb3VudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgc3RhdHVzOiBzdHJpbmdcbiAgZGlzY291bnRhYmxlOiBib29sZWFuXG4gIHNlbGxlcl9pZDogc3RyaW5nXG4gIHR5cGVfaWQ6IHN0cmluZ1xuICBjb2xsZWN0aW9uX2lkOiBzdHJpbmdcbiAgY2F0ZWdvcnlfaWQ6IHN0cmluZ1xuICB0YWdfaWQ6IHN0cmluZ1xufVxuXG50eXBlIENvdXBvbkZvcm1TdGF0ZSA9IHtcbiAgZW5hYmxlZDogYm9vbGVhblxuICB0eXBlOiBDb3Vwb25UeXBlXG4gIHB1cmNoYXNlX2NvbmRpdGlvbnM6IFB1cmNoYXNlQ29uZGl0aW9uRm9ybVtdXG4gIGFtb3VudHM6IENvdXBvbkFtb3VudEZvcm1Sb3dbXVxuICBwZXJjZW50YWdlOiBzdHJpbmdcbiAgYWxsb2NhdGlvbjogQ291cG9uQWxsb2NhdGlvblxuICBjb2RlX3N0cmF0ZWd5OiBDb2RlU3RyYXRlZ3lcbiAgY29kZV9wcmVmaXg6IHN0cmluZ1xuICBzaGFyZWRfY29kZTogc3RyaW5nXG4gIGV4cGlyYXRpb25fdHlwZTogRXhwaXJhdGlvblBvbGljeVR5cGVcbiAgZXhwaXJhdGlvbl9kYXlzOiBzdHJpbmdcbiAgZXhwaXJhdGlvbl9kYXRlOiBzdHJpbmdcbiAgZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ246IGJvb2xlYW5cbiAgZXhwaXJhdGlvbl9jYXBfYXQ6IHN0cmluZ1xuICBtYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW06IHN0cmluZ1xuICBwcm9tb3Rpb25fbWlycm9yX21vZGU6IE1pcnJvck1vZGVcbiAgcHJvbW90aW9uX3N0YXR1czogUHJvbW90aW9uU3RhdHVzXG59XG5cbnR5cGUgQ291cG9uQW1vdW50Rm9ybVJvdyA9IHtcbiAga2V5OiBzdHJpbmdcbiAgY3VycmVuY3lfY29kZTogc3RyaW5nXG4gIGFtb3VudDogc3RyaW5nXG59XG5cbnR5cGUgQ2FtcGFpZ25Gb3JtU3RhdGUgPSB7XG4gIG1vZGU6IENhbXBhaWduTW9kZVxuICBjYW1wYWlnbl9pZDogc3RyaW5nXG4gIG5hbWU6IHN0cmluZ1xuICBjYW1wYWlnbl9pZGVudGlmaWVyOiBzdHJpbmdcbiAgc3RhcnRzX2F0OiBzdHJpbmdcbiAgZW5kc19hdDogc3RyaW5nXG59XG5cbmNvbnN0IE5PTkUgPSBcIl9fbm9uZV9fXCJcbmNvbnN0IGFsbFN0ZXBzOiBXaXphcmRTdGVwW10gPSBbXCJkZXRhaWxzXCIsIFwib3JnYW5pemVcIiwgXCJjYW1wYWlnblwiLCBcInByaWNlc1wiXVxuXG5jb25zdCBjb25kaXRpb25BdHRyaWJ1dGVzOiBBcnJheTx7XG4gIHZhbHVlOiBQdXJjaGFzZUNvbmRpdGlvbkF0dHJpYnV0ZVxuICBsYWJlbDogc3RyaW5nXG59PiA9IFtcbiAgeyB2YWx1ZTogXCJjdXN0b21lci5ncm91cHMuaWRcIiwgbGFiZWw6IFwiQ3VzdG9tZXIgR3JvdXBcIiB9LFxuICB7IHZhbHVlOiBcInJlZ2lvbi5pZFwiLCBsYWJlbDogXCJSZWdpb25cIiB9LFxuICB7IHZhbHVlOiBcInNoaXBwaW5nX2FkZHJlc3MuY291bnRyeV9jb2RlXCIsIGxhYmVsOiBcIkNvdW50cnlcIiB9LFxuICB7IHZhbHVlOiBcInNhbGVzX2NoYW5uZWxfaWRcIiwgbGFiZWw6IFwiU2FsZXMgQ2hhbm5lbFwiIH0sXG4gIHsgdmFsdWU6IFwiY3VycmVuY3lfY29kZVwiLCBsYWJlbDogXCJDdXJyZW5jeSBDb2RlXCIgfSxcbl1cblxuY29uc3QgY29uZGl0aW9uT3BlcmF0b3JzOiBBcnJheTx7XG4gIHZhbHVlOiBQdXJjaGFzZUNvbmRpdGlvbk9wZXJhdG9yXG4gIGxhYmVsOiBzdHJpbmdcbn0+ID0gW1xuICB7IHZhbHVlOiBcImluXCIsIGxhYmVsOiBcIkluXCIgfSxcbiAgeyB2YWx1ZTogXCJlcVwiLCBsYWJlbDogXCJFcXVhbHNcIiB9LFxuICB7IHZhbHVlOiBcIm5lXCIsIGxhYmVsOiBcIk5vdCBJblwiIH0sXG5dXG5cbmV4cG9ydCBjb25zdCB0eXBlQ2hvaWNlczoge1xuICB2YWx1ZTogQ291cG9uVHlwZVxuICBsYWJlbDogc3RyaW5nXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbn1bXSA9IFtcbiAgICB7XG4gICAgICB2YWx1ZTogXCJhbW91bnRfb2ZmX3Byb2R1Y3RzXCIsXG4gICAgICBsYWJlbDogXCJBbW91bnQgb2ZmIHByb2R1Y3RzXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJEaXNjb3VudCBzcGVjaWZpYyBwcm9kdWN0cyBvciBhIGNvbGxlY3Rpb24gb2YgcHJvZHVjdHNcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHZhbHVlOiBcImFtb3VudF9vZmZfb3JkZXJcIixcbiAgICAgIGxhYmVsOiBcIkFtb3VudCBvZmYgb3JkZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkRpc2NvdW50IHRoZSB0b3RhbCBvcmRlciBhbW91bnRcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHZhbHVlOiBcInBlcmNlbnRhZ2Vfb2ZmX3Byb2R1Y3RcIixcbiAgICAgIGxhYmVsOiBcIlBlcmNlbnRhZ2Ugb2ZmIHByb2R1Y3RcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkRpc2NvdW50IGEgcGVyY2VudGFnZSBvZmYgc2VsZWN0ZWQgcHJvZHVjdHNcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHZhbHVlOiBcInBlcmNlbnRhZ2Vfb2ZmX29yZGVyXCIsXG4gICAgICBsYWJlbDogXCJQZXJjZW50YWdlIG9mZiBvcmRlclwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiRGlzY291bnQgYSBwZXJjZW50YWdlIG9mZiB0aGUgdG90YWwgb3JkZXIgYW1vdW50XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB2YWx1ZTogXCJidXlfeF9nZXRfeVwiLFxuICAgICAgbGFiZWw6IFwiQnV5IFggR2V0IFlcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIklzc3VlIGEgQnV5IFggR2V0IFkgY291cG9uIGVudGl0bGVtZW50XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB2YWx1ZTogXCJmcmVlX3NoaXBwaW5nXCIsXG4gICAgICBsYWJlbDogXCJGcmVlIHNoaXBwaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJBcHBseSBhIDEwMCUgZGlzY291bnQgdG8gc2hpcHBpbmcgZmVlc1wiLFxuICAgIH0sXG4gIF1cblxuY29uc3Qgc3RhdHVzQ2hvaWNlczoge1xuICB2YWx1ZTogUHJvbW90aW9uU3RhdHVzXG4gIGxhYmVsOiBzdHJpbmdcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xufVtdID0gW1xuICAgIHtcbiAgICAgIHZhbHVlOiBcImRyYWZ0XCIsXG4gICAgICBsYWJlbDogXCJEcmFmdFwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiQ3VzdG9tZXJzIHdpbGwgbm90IGJlIGFibGUgdG8gdXNlIHRoZSBjb2RlIHlldFwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdmFsdWU6IFwiYWN0aXZlXCIsXG4gICAgICBsYWJlbDogXCJBY3RpdmVcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkN1c3RvbWVycyB3aWxsIGJlIGFibGUgdG8gdXNlIHRoZSBjb2RlXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB2YWx1ZTogXCJpbmFjdGl2ZVwiLFxuICAgICAgbGFiZWw6IFwiSW5hY3RpdmVcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIktlZXAgdGhlIHByb21vdGlvbiB1bmF2YWlsYWJsZSB1bnRpbCByZWFjdGl2YXRlZFwiLFxuICAgIH0sXG4gIF1cblxuZnVuY3Rpb24gYmFja2VuZFVybCgpIHtcbiAgcmV0dXJuIHR5cGVvZiBfX0JBQ0tFTkRfVVJMX18gPT09IFwic3RyaW5nXCJcbiAgICA/IF9fQkFDS0VORF9VUkxfXy5yZXBsYWNlKC9cXC8kLywgXCJcIilcbiAgICA6IFwiXCJcbn1cblxuZnVuY3Rpb24gYXBpRXJyb3JNZXNzYWdlKHBheWxvYWQ6IGFueSwgZmFsbGJhY2s6IHN0cmluZykge1xuICByZXR1cm4gKFxuICAgIFtwYXlsb2FkPy5tZXNzYWdlLCBwYXlsb2FkPy5lcnJvcj8ubWVzc2FnZSwgcGF5bG9hZD8uZXJyb3JdLmZpbmQoXG4gICAgICAoY2FuZGlkYXRlKSA9PiB0eXBlb2YgY2FuZGlkYXRlID09PSBcInN0cmluZ1wiICYmIGNhbmRpZGF0ZS50cmltKCksXG4gICAgKSB8fFxuICAgIGZhbGxiYWNrIHx8XG4gICAgXCJSZXF1ZXN0IGZhaWxlZFwiXG4gIClcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBpRmV0Y2g8VD4oXG4gIHBhdGg6IHN0cmluZyxcbiAgb3B0aW9uczogUmVxdWVzdEluaXQgPSB7fSxcbik6IFByb21pc2U8VD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2JhY2tlbmRVcmwoKX0ke3BhdGh9YCwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIC4uLihvcHRpb25zLmJvZHkgPyB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0gOiB7fSksXG4gICAgICAuLi5vcHRpb25zLmhlYWRlcnMsXG4gICAgfSxcbiAgfSlcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiBudWxsKVxuICAgIHRocm93IG5ldyBFcnJvcihhcGlFcnJvck1lc3NhZ2UocGF5bG9hZCwgcmVzcG9uc2Uuc3RhdHVzVGV4dCkpXG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2UuanNvbigpXG59XG5cbmZ1bmN0aW9uIG9wdGlvbkxhYmVsKG9wdGlvbjogT3B0aW9uUmVjb3JkKSB7XG4gIHJldHVybiAoXG4gICAgb3B0aW9uLm5hbWUgfHwgb3B0aW9uLnRpdGxlIHx8IG9wdGlvbi52YWx1ZSB8fCBvcHRpb24uaGFuZGxlIHx8IG9wdGlvbi5pZFxuICApXG59XG5cbmZ1bmN0aW9uIG51bWJlck9yTnVsbCh2YWx1ZTogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSlcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwYXJzZWQpICYmIHBhcnNlZCA+IDAgPyBwYXJzZWQgOiBudWxsXG59XG5cbmZ1bmN0aW9uIG5vbk5lZ2F0aXZlTnVtYmVyT3JOdWxsKHZhbHVlOiBzdHJpbmcpIHtcbiAgaWYgKCF2YWx1ZS50cmltKCkpIHJldHVybiBudWxsXG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSlcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwYXJzZWQpICYmIHBhcnNlZCA+PSAwID8gcGFyc2VkIDogbnVsbFxufVxuXG5mdW5jdGlvbiB0b0RhdGVUaW1lTG9jYWwodmFsdWU/OiBzdHJpbmcgfCBudWxsKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIlwiXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgaWYgKE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkpIHJldHVybiBcIlwiXG4gIGNvbnN0IGxvY2FsRGF0ZSA9IG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpIC0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpICogNjBfMDAwKVxuICByZXR1cm4gbG9jYWxEYXRlLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTYpXG59XG5cbmZ1bmN0aW9uIGN1cnJlbmN5RGVjaW1hbERpZ2l0cyhjb2RlOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KFwiZW5cIiwge1xuICAgICAgc3R5bGU6IFwiY3VycmVuY3lcIixcbiAgICAgIGN1cnJlbmN5OiBjb2RlLnRvVXBwZXJDYXNlKCksXG4gICAgfSkucmVzb2x2ZWRPcHRpb25zKCkubWF4aW11bUZyYWN0aW9uRGlnaXRzXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAyXG4gIH1cbn1cblxuZnVuY3Rpb24gY3VycmVuY3lTeW1ib2woY29kZTogc3RyaW5nKSB7XG4gIGlmICghY29kZSkgcmV0dXJuIFwiXCJcbiAgdHJ5IHtcbiAgICByZXR1cm4gKFxuICAgICAgbmV3IEludGwuTnVtYmVyRm9ybWF0KFwiZW5cIiwge1xuICAgICAgICBzdHlsZTogXCJjdXJyZW5jeVwiLFxuICAgICAgICBjdXJyZW5jeTogY29kZS50b1VwcGVyQ2FzZSgpLFxuICAgICAgICBjdXJyZW5jeURpc3BsYXk6IFwibmFycm93U3ltYm9sXCIsXG4gICAgICB9KVxuICAgICAgICAuZm9ybWF0VG9QYXJ0cygwKVxuICAgICAgICAuZmluZCgocGFydCkgPT4gcGFydC50eXBlID09PSBcImN1cnJlbmN5XCIpPy52YWx1ZSB8fCBjb2RlLnRvVXBwZXJDYXNlKClcbiAgICApXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBjb2RlLnRvVXBwZXJDYXNlKClcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY291cG9uVHlwZUZyb21Db25maWcoY29uZmlnOiBDb3Vwb25Qcm9kdWN0Q29uZmlnKTogQ291cG9uVHlwZSB7XG4gIGlmIChjb25maWcuYmVuZWZpdF90eXBlID09PSBcInBlcmNlbnRhZ2VcIikge1xuICAgIHJldHVybiBjb25maWcucHJvbW90aW9uX3RlbXBsYXRlPy5hcHBsaWNhdGlvbl9tZXRob2Q/LnRhcmdldF90eXBlID09PSBcIm9yZGVyXCJcbiAgICAgID8gXCJwZXJjZW50YWdlX29mZl9vcmRlclwiXG4gICAgICA6IFwicGVyY2VudGFnZV9vZmZfcHJvZHVjdFwiXG4gIH1cbiAgaWYgKGNvbmZpZy5iZW5lZml0X3R5cGUgPT09IFwiYnV5X2dldFwiKSByZXR1cm4gXCJidXlfeF9nZXRfeVwiXG4gIGlmIChjb25maWcuYmVuZWZpdF90eXBlID09PSBcImZyZWVfc2hpcHBpbmdcIikgcmV0dXJuIFwiZnJlZV9zaGlwcGluZ1wiXG5cbiAgcmV0dXJuIGNvbmZpZy5wcm9tb3Rpb25fdGVtcGxhdGU/LmFwcGxpY2F0aW9uX21ldGhvZD8udGFyZ2V0X3R5cGUgPT09IFwib3JkZXJcIlxuICAgID8gXCJhbW91bnRfb2ZmX29yZGVyXCJcbiAgICA6IFwiYW1vdW50X29mZl9wcm9kdWN0c1wiXG59XG5cbmZ1bmN0aW9uIGJlbmVmaXRUeXBlRnJvbUNvdXBvblR5cGUodHlwZTogQ291cG9uVHlwZSk6IEJlbmVmaXRUeXBlIHtcbiAgaWYgKFxuICAgIHR5cGUgPT09IFwicGVyY2VudGFnZV9vZmZfcHJvZHVjdFwiIHx8XG4gICAgdHlwZSA9PT0gXCJwZXJjZW50YWdlX29mZl9vcmRlclwiXG4gICkgcmV0dXJuIFwicGVyY2VudGFnZVwiXG4gIGlmICh0eXBlID09PSBcImJ1eV94X2dldF95XCIpIHJldHVybiBcImJ1eV9nZXRcIlxuICBpZiAodHlwZSA9PT0gXCJmcmVlX3NoaXBwaW5nXCIpIHJldHVybiBcImZyZWVfc2hpcHBpbmdcIlxuICByZXR1cm4gXCJmaXhlZF9hbW91bnRcIlxufVxuXG5mdW5jdGlvbiBjb3Vwb25UeXBlTGFiZWwoY29uZmlnOiBDb3Vwb25Qcm9kdWN0Q29uZmlnKSB7XG4gIHJldHVybiB0eXBlQ2hvaWNlcy5maW5kKFxuICAgIChjaG9pY2UpID0+IGNob2ljZS52YWx1ZSA9PT0gY291cG9uVHlwZUZyb21Db25maWcoY29uZmlnKSxcbiAgKT8ubGFiZWxcbn1cblxuZnVuY3Rpb24gY291cG9uU3RhdHVzQ29sb3Ioc3RhdHVzPzogUHJvbW90aW9uU3RhdHVzIHwgbnVsbCkge1xuICBpZiAoc3RhdHVzID09PSBcImFjdGl2ZVwiKSByZXR1cm4gXCJncmVlblwiIGFzIGNvbnN0XG4gIGlmIChzdGF0dXMgPT09IFwiaW5hY3RpdmVcIikgcmV0dXJuIFwib3JhbmdlXCIgYXMgY29uc3RcbiAgcmV0dXJuIFwiZ3JleVwiIGFzIGNvbnN0XG59XG5cbmZ1bmN0aW9uIHByb2R1Y3RTdGF0dXNGcm9tQ291cG9uU3RhdHVzKHN0YXR1czogUHJvbW90aW9uU3RhdHVzKSB7XG4gIHJldHVybiBzdGF0dXMgPT09IFwiYWN0aXZlXCIgPyBcInB1Ymxpc2hlZFwiIDogXCJkcmFmdFwiXG59XG5cbmZ1bmN0aW9uIGNhbXBhaWduTGFiZWwoY29uZmlnOiBDb3Vwb25Qcm9kdWN0Q29uZmlnKSB7XG4gIGNvbnN0IG5hbWUgPSBjb25maWcuY2FtcGFpZ25fc25hcHNob3Q/Lm5hbWVcbiAgcmV0dXJuIHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiICYmIG5hbWUgPyBuYW1lIDogY29uZmlnLmNhbXBhaWduX2lkIHx8IFwiTm9uZVwiXG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRDdXJyZW5jeShvcHRpb25zOiBPcHRpb25zUGF5bG9hZCkge1xuICByZXR1cm4gKFxuICAgIG9wdGlvbnMuY3VycmVuY2llcz8uZmluZCgoY3VycmVuY3kpID0+IGN1cnJlbmN5LmlzX2RlZmF1bHQpPy5jb2RlIHx8XG4gICAgb3B0aW9ucy5jdXJyZW5jaWVzPy5bMF0/LmNvZGUgfHxcbiAgICBcIlwiXG4gIClcbn1cblxuZnVuY3Rpb24gY29uZGl0aW9uS2V5KHByZWZpeCA9IFwiY29uZGl0aW9uXCIpIHtcbiAgcmV0dXJuIGAke3ByZWZpeH0tJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDgpfWBcbn1cblxuZnVuY3Rpb24gaXNBbW91bnRDb3Vwb25UeXBlKHR5cGU6IENvdXBvblR5cGUpIHtcbiAgcmV0dXJuIHR5cGUgPT09IFwiYW1vdW50X29mZl9wcm9kdWN0c1wiIHx8IHR5cGUgPT09IFwiYW1vdW50X29mZl9vcmRlclwiXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlZmZlY3RpdmVDb3Vwb25DdXJyZW5jaWVzKFxuICBjb25kaXRpb25zOiBQdXJjaGFzZUNvbmRpdGlvbkZvcm1bXSxcbiAgY3VycmVuY2llczogQ3VycmVuY3lPcHRpb25bXSxcbikge1xuICBjb25zdCBjb25kaXRpb24gPSBjb25kaXRpb25zLmZpbmQoXG4gICAgKGl0ZW0pID0+IGl0ZW0uYXR0cmlidXRlID09PSBcImN1cnJlbmN5X2NvZGVcIixcbiAgKVxuICBpZiAoIWNvbmRpdGlvbiB8fCAhY29uZGl0aW9uLm9wZXJhdG9yKSByZXR1cm4gW11cbiAgY29uc3Qgc2VsZWN0ZWQgPSBuZXcgU2V0KGNvbmRpdGlvbi52YWx1ZXMpXG4gIGNvbnN0IHN1cHBvcnRlZCA9IGN1cnJlbmNpZXMubWFwKChjdXJyZW5jeSkgPT4gY3VycmVuY3kuY29kZSlcblxuICByZXR1cm4gY29uZGl0aW9uLm9wZXJhdG9yID09PSBcIm5lXCJcbiAgICA/IHN1cHBvcnRlZC5maWx0ZXIoKGNvZGUpID0+ICFzZWxlY3RlZC5oYXMoY29kZSkpXG4gICAgOiBzdXBwb3J0ZWQuZmlsdGVyKChjb2RlKSA9PiBzZWxlY3RlZC5oYXMoY29kZSkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWNvbmNpbGVDb3Vwb25BbW91bnRzKFxuICBjdXJyZW50OiBDb3Vwb25BbW91bnRGb3JtUm93W10sXG4gIGN1cnJlbmN5Q29kZXM6IHN0cmluZ1tdLFxuKSB7XG4gIGNvbnN0IGJ5Q3VycmVuY3kgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgY3VycmVudC5tYXAoKHJvdykgPT4gW3Jvdy5jdXJyZW5jeV9jb2RlLCByb3ddKSxcbiAgKVxuICByZXR1cm4gY3VycmVuY3lDb2Rlcy5tYXAoKGN1cnJlbmN5Q29kZSkgPT4gKHtcbiAgICBrZXk6IGJ5Q3VycmVuY3lbY3VycmVuY3lDb2RlXT8ua2V5IHx8IGNvbmRpdGlvbktleShcImNvdXBvbi12YWx1ZVwiKSxcbiAgICBjdXJyZW5jeV9jb2RlOiBjdXJyZW5jeUNvZGUsXG4gICAgYW1vdW50OiBieUN1cnJlbmN5W2N1cnJlbmN5Q29kZV0/LmFtb3VudCB8fCBcIlwiLFxuICB9KSlcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFB1cmNoYXNlQ29uZGl0aW9ucyhvcHRpb25zOiBPcHRpb25zUGF5bG9hZCkge1xuICBjb25zdCBjdXJyZW5jeUNvZGUgPSBkZWZhdWx0Q3VycmVuY3kob3B0aW9ucylcbiAgcmV0dXJuIGN1cnJlbmN5Q29kZVxuICAgID8gW1xuICAgICAge1xuICAgICAgICBrZXk6IGNvbmRpdGlvbktleShcImN1cnJlbmN5XCIpLFxuICAgICAgICBhdHRyaWJ1dGU6IFwiY3VycmVuY3lfY29kZVwiIGFzIGNvbnN0LFxuICAgICAgICBvcGVyYXRvcjogXCJlcVwiIGFzIGNvbnN0LFxuICAgICAgICB2YWx1ZXM6IFtjdXJyZW5jeUNvZGVdLFxuICAgICAgfSxcbiAgICBdXG4gICAgOiBbXVxufVxuXG5mdW5jdGlvbiBlbXB0eVByb2R1Y3Qob3B0aW9uczogT3B0aW9uc1BheWxvYWQpOiBQcm9kdWN0Rm9ybVN0YXRlIHtcbiAgcmV0dXJuIHtcbiAgICB0aXRsZTogXCJcIixcbiAgICBzdWJ0aXRsZTogXCJcIixcbiAgICBoYW5kbGU6IFwiXCIsXG4gICAgZGVzY3JpcHRpb246IFwiXCIsXG4gICAgbWVkaWE6IFtdLFxuICAgIHNrdTogXCJcIixcbiAgICBwcmljZV9hbW91bnRzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAob3B0aW9ucy5jdXJyZW5jaWVzIHx8IFtdKS5tYXAoKGN1cnJlbmN5KSA9PiBbY3VycmVuY3kuY29kZSwgXCJcIl0pLFxuICAgICksXG4gICAgc3RhdHVzOiBcImRyYWZ0XCIsXG4gICAgZGlzY291bnRhYmxlOiBmYWxzZSxcbiAgICBzZWxsZXJfaWQ6IFwiXCIsXG4gICAgdHlwZV9pZDogXCJcIixcbiAgICBjb2xsZWN0aW9uX2lkOiBcIlwiLFxuICAgIGNhdGVnb3J5X2lkOiBcIlwiLFxuICAgIHRhZ19pZDogXCJcIixcbiAgfVxufVxuXG5mdW5jdGlvbiBlbXB0eUNvdXBvbihvcHRpb25zOiBPcHRpb25zUGF5bG9hZCk6IENvdXBvbkZvcm1TdGF0ZSB7XG4gIGNvbnN0IGN1cnJlbmN5Q29kZSA9IGRlZmF1bHRDdXJyZW5jeShvcHRpb25zKVxuICBjb25zdCBwdXJjaGFzZUNvbmRpdGlvbnMgPSBkZWZhdWx0UHVyY2hhc2VDb25kaXRpb25zKG9wdGlvbnMpXG4gIHJldHVybiB7XG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICB0eXBlOiBcImFtb3VudF9vZmZfcHJvZHVjdHNcIixcbiAgICBwdXJjaGFzZV9jb25kaXRpb25zOiBwdXJjaGFzZUNvbmRpdGlvbnMsXG4gICAgYW1vdW50czogY3VycmVuY3lDb2RlXG4gICAgICA/IFtcbiAgICAgICAge1xuICAgICAgICAgIGtleTogXCJjb3Vwb24tdmFsdWUtZGVmYXVsdFwiLFxuICAgICAgICAgIGN1cnJlbmN5X2NvZGU6IGN1cnJlbmN5Q29kZSxcbiAgICAgICAgICBhbW91bnQ6IFwiXCIsXG4gICAgICAgIH0sXG4gICAgICBdXG4gICAgICA6IFtdLFxuICAgIHBlcmNlbnRhZ2U6IFwiXCIsXG4gICAgYWxsb2NhdGlvbjogXCJlYWNoXCIsXG4gICAgY29kZV9zdHJhdGVneTogXCJ1bmlxdWVfY29kZVwiLFxuICAgIGNvZGVfcHJlZml4OiBcIkNPVVBPTlwiLFxuICAgIHNoYXJlZF9jb2RlOiBcIlwiLFxuICAgIGV4cGlyYXRpb25fdHlwZTogXCJkdXJhdGlvblwiLFxuICAgIGV4cGlyYXRpb25fZGF5czogXCIzMFwiLFxuICAgIGV4cGlyYXRpb25fZGF0ZTogXCJcIixcbiAgICBleHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbjogdHJ1ZSxcbiAgICBleHBpcmF0aW9uX2NhcF9hdDogXCJcIixcbiAgICBtYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW06IFwiMVwiLFxuICAgIHByb21vdGlvbl9taXJyb3JfbW9kZTogXCJub25lXCIsXG4gICAgcHJvbW90aW9uX3N0YXR1czogXCJkcmFmdFwiLFxuICB9XG59XG5cbmNvbnN0IGVtcHR5Q2FtcGFpZ246IENhbXBhaWduRm9ybVN0YXRlID0ge1xuICBtb2RlOiBcIm5vbmVcIixcbiAgY2FtcGFpZ25faWQ6IFwiXCIsXG4gIG5hbWU6IFwiXCIsXG4gIGNhbXBhaWduX2lkZW50aWZpZXI6IFwiXCIsXG4gIHN0YXJ0c19hdDogXCJcIixcbiAgZW5kc19hdDogXCJcIixcbn1cblxuZnVuY3Rpb24gZm9ybXNGcm9tUm93KFxuICByb3c6IENvdXBvblByb2R1Y3RSb3csXG4gIG9wdGlvbnM6IE9wdGlvbnNQYXlsb2FkLFxuKToge1xuICBwcm9kdWN0OiBQcm9kdWN0Rm9ybVN0YXRlXG4gIGNvdXBvbjogQ291cG9uRm9ybVN0YXRlXG4gIGNhbXBhaWduOiBDYW1wYWlnbkZvcm1TdGF0ZVxufSB7XG4gIGNvbnN0IHByb2R1Y3QgPSByb3cucHJvZHVjdFxuICBjb25zdCBjb25maWcgPSByb3cuY291cG9uX3Byb2R1Y3RfY29uZmlnXG4gIGNvbnN0IHZhcmlhbnQgPSBwcm9kdWN0LnZhcmlhbnRzPy5bMF1cbiAgY29uc3QgcHJpY2VzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICh2YXJpYW50Py5wcmljZXMgfHwgW10pXG4gICAgICAuZmlsdGVyKChwcmljZSkgPT4gcHJpY2UuY3VycmVuY3lfY29kZSlcbiAgICAgIC5tYXAoKHByaWNlKSA9PiBbXG4gICAgICAgIFN0cmluZyhwcmljZS5jdXJyZW5jeV9jb2RlKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICBwcmljZS5hbW91bnQgPT0gbnVsbCA/IFwiXCIgOiBTdHJpbmcocHJpY2UuYW1vdW50KSxcbiAgICAgIF0pLFxuICApXG4gIGNvbnN0IG1lZGlhID0gQXJyYXkuZnJvbShcbiAgICBuZXcgTWFwKFxuICAgICAgW1xuICAgICAgICAuLi4ocHJvZHVjdC50aHVtYm5haWxcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHVybDogcHJvZHVjdC50aHVtYm5haWwsXG4gICAgICAgICAgICAgICAgYXNzZXRfaWQ6IHByb2R1Y3QudGh1bWJuYWlsX2Fzc2V0X2lkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICA6IFtdKSxcbiAgICAgICAgLi4uKHByb2R1Y3QuaW1hZ2VzIHx8IFtdKVxuICAgICAgICAgIC5maWx0ZXIoKGltYWdlKSA9PiBpbWFnZS51cmwpXG4gICAgICAgICAgLm1hcCgoaW1hZ2UpID0+ICh7XG4gICAgICAgICAgICB1cmw6IFN0cmluZyhpbWFnZS51cmwpLFxuICAgICAgICAgICAgYXNzZXRfaWQ6IGltYWdlLmFzc2V0X2lkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICB9KSksXG4gICAgICBdLm1hcCgoaXRlbSkgPT4gW2l0ZW0udXJsLCBpdGVtXSksXG4gICAgKS52YWx1ZXMoKSxcbiAgKVxuICBjb25zdCBjb25maWd1cmVkQW1vdW50cyA9XG4gICAgQXJyYXkuaXNBcnJheShjb25maWcuYW1vdW50cykgJiYgY29uZmlnLmFtb3VudHMubGVuZ3RoXG4gICAgICA/IGNvbmZpZy5hbW91bnRzXG4gICAgICA6IGNvbmZpZy5hbW91bnQgIT0gbnVsbCAmJiBjb25maWcuY3VycmVuY3lfY29kZVxuICAgICAgICA/IFt7IGFtb3VudDogY29uZmlnLmFtb3VudCwgY3VycmVuY3lfY29kZTogY29uZmlnLmN1cnJlbmN5X2NvZGUgfV1cbiAgICAgICAgOiBbXVxuICBjb25zdCBjb25maWd1cmVkQ29uZGl0aW9ucyA9IChjb25maWcucHVyY2hhc2VfY29uZGl0aW9ucyB8fCBbXSkubWFwKFxuICAgIChjb25kaXRpb24sIGluZGV4KSA9PiAoe1xuICAgICAga2V5OiBgY29uZGl0aW9uLSR7aW5kZXh9YCxcbiAgICAgIGF0dHJpYnV0ZTogY29uZGl0aW9uLmF0dHJpYnV0ZSxcbiAgICAgIG9wZXJhdG9yOiBjb25kaXRpb24ub3BlcmF0b3IsXG4gICAgICB2YWx1ZXM6IGNvbmRpdGlvbi52YWx1ZXMubWFwKCh2YWx1ZSkgPT5cbiAgICAgICAgY29uZGl0aW9uLmF0dHJpYnV0ZSA9PT0gXCJjdXJyZW5jeV9jb2RlXCIgfHxcbiAgICAgICAgICBjb25kaXRpb24uYXR0cmlidXRlID09PSBcInNoaXBwaW5nX2FkZHJlc3MuY291bnRyeV9jb2RlXCJcbiAgICAgICAgICA/IHZhbHVlLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICA6IHZhbHVlLFxuICAgICAgKSxcbiAgICB9KSxcbiAgKVxuICBpZiAoXG4gICAgIWNvbmZpZ3VyZWRDb25kaXRpb25zLnNvbWUoXG4gICAgICAoY29uZGl0aW9uKSA9PiBjb25kaXRpb24uYXR0cmlidXRlID09PSBcImN1cnJlbmN5X2NvZGVcIixcbiAgICApICYmXG4gICAgY29uZmlnLmJlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIiAmJlxuICAgIGNvbmZpZ3VyZWRBbW91bnRzLmxlbmd0aFxuICApIHtcbiAgICBjb25maWd1cmVkQ29uZGl0aW9ucy5wdXNoKHtcbiAgICAgIGtleTogXCJjb25kaXRpb24tbGVnYWN5LWN1cnJlbmN5XCIsXG4gICAgICBhdHRyaWJ1dGU6IFwiY3VycmVuY3lfY29kZVwiLFxuICAgICAgb3BlcmF0b3I6IGNvbmZpZ3VyZWRBbW91bnRzLmxlbmd0aCA9PT0gMSA/IFwiZXFcIiA6IFwiaW5cIixcbiAgICAgIHZhbHVlczogY29uZmlndXJlZEFtb3VudHMubWFwKChhbW91bnQpID0+XG4gICAgICAgIGFtb3VudC5jdXJyZW5jeV9jb2RlLnRvTG93ZXJDYXNlKCksXG4gICAgICApLFxuICAgIH0pXG4gIH1cbiAgaWYgKFxuICAgICFjb25maWd1cmVkQ29uZGl0aW9ucy5zb21lKFxuICAgICAgKGNvbmRpdGlvbikgPT4gY29uZGl0aW9uLmF0dHJpYnV0ZSA9PT0gXCJzYWxlc19jaGFubmVsX2lkXCIsXG4gICAgKSAmJlxuICAgIHByb2R1Y3Quc2FsZXNfY2hhbm5lbHM/Lmxlbmd0aFxuICApIHtcbiAgICBjb25maWd1cmVkQ29uZGl0aW9ucy5wdXNoKHtcbiAgICAgIGtleTogXCJjb25kaXRpb24tbGVnYWN5LXNhbGVzLWNoYW5uZWxcIixcbiAgICAgIGF0dHJpYnV0ZTogXCJzYWxlc19jaGFubmVsX2lkXCIsXG4gICAgICBvcGVyYXRvcjogcHJvZHVjdC5zYWxlc19jaGFubmVscy5sZW5ndGggPT09IDEgPyBcImVxXCIgOiBcImluXCIsXG4gICAgICB2YWx1ZXM6IHByb2R1Y3Quc2FsZXNfY2hhbm5lbHMubWFwKChjaGFubmVsKSA9PiBjaGFubmVsLmlkKSxcbiAgICB9KVxuICB9XG4gIGNvbnN0IGV4cGlyYXRpb25Qb2xpY3kgPSBjb25maWcuZXhwaXJhdGlvbl9wb2xpY3lcbiAgY29uc3QgY29uZmlndXJlZEFtb3VudFJvd3MgPSBjb25maWd1cmVkQW1vdW50cy5tYXAoKHJvdywgaW5kZXgpID0+ICh7XG4gICAga2V5OiBgY291cG9uLXZhbHVlLSR7aW5kZXh9YCxcbiAgICBhbW91bnQ6IFN0cmluZyhyb3cuYW1vdW50KSxcbiAgICBjdXJyZW5jeV9jb2RlOiByb3cuY3VycmVuY3lfY29kZS50b0xvd2VyQ2FzZSgpLFxuICB9KSlcbiAgY29uc3QgYW1vdW50Um93cyA9XG4gICAgY29uZmlnLmJlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIlxuICAgICAgPyByZWNvbmNpbGVDb3Vwb25BbW91bnRzKFxuICAgICAgICBjb25maWd1cmVkQW1vdW50Um93cyxcbiAgICAgICAgZWZmZWN0aXZlQ291cG9uQ3VycmVuY2llcyhjb25maWd1cmVkQ29uZGl0aW9ucywgb3B0aW9ucy5jdXJyZW5jaWVzIHx8IFtdKSxcbiAgICAgIClcbiAgICAgIDogY29uZmlndXJlZEFtb3VudFJvd3NcblxuICByZXR1cm4ge1xuICAgIHByb2R1Y3Q6IHtcbiAgICAgIC4uLmVtcHR5UHJvZHVjdChvcHRpb25zKSxcbiAgICAgIHRpdGxlOiBwcm9kdWN0LnRpdGxlIHx8IFwiXCIsXG4gICAgICBzdWJ0aXRsZTogcHJvZHVjdC5zdWJ0aXRsZSB8fCBcIlwiLFxuICAgICAgaGFuZGxlOiBwcm9kdWN0LmhhbmRsZSB8fCBcIlwiLFxuICAgICAgZGVzY3JpcHRpb246IHByb2R1Y3QuZGVzY3JpcHRpb24gfHwgXCJcIixcbiAgICAgIG1lZGlhLFxuICAgICAgc2t1OiB2YXJpYW50Py5za3UgfHwgXCJcIixcbiAgICAgIHByaWNlX2Ftb3VudHM6IHtcbiAgICAgICAgLi4uZW1wdHlQcm9kdWN0KG9wdGlvbnMpLnByaWNlX2Ftb3VudHMsXG4gICAgICAgIC4uLnByaWNlcyxcbiAgICAgIH0sXG4gICAgICBzdGF0dXM6IHByb2R1Y3Quc3RhdHVzIHx8IFwiZHJhZnRcIixcbiAgICAgIGRpc2NvdW50YWJsZTogQm9vbGVhbihwcm9kdWN0LmRpc2NvdW50YWJsZSksXG4gICAgICB0eXBlX2lkOiBwcm9kdWN0LnR5cGVfaWQgfHwgXCJcIixcbiAgICAgIGNvbGxlY3Rpb25faWQ6IHByb2R1Y3QuY29sbGVjdGlvbl9pZCB8fCBcIlwiLFxuICAgICAgY2F0ZWdvcnlfaWQ6IHByb2R1Y3QuY2F0ZWdvcmllcz8uWzBdPy5pZCB8fCBcIlwiLFxuICAgICAgdGFnX2lkOiBwcm9kdWN0LnRhZ3M/LlswXT8uaWQgfHwgXCJcIixcbiAgICB9LFxuICAgIGNvdXBvbjoge1xuICAgICAgLi4uZW1wdHlDb3Vwb24ob3B0aW9ucyksXG4gICAgICBlbmFibGVkOiBjb25maWcuZW5hYmxlZCxcbiAgICAgIHR5cGU6IGNvdXBvblR5cGVGcm9tQ29uZmlnKGNvbmZpZyksXG4gICAgICBwdXJjaGFzZV9jb25kaXRpb25zOiBjb25maWd1cmVkQ29uZGl0aW9ucyxcbiAgICAgIGFtb3VudHM6XG4gICAgICAgIGNvbmZpZy5iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCJcbiAgICAgICAgICA/IGFtb3VudFJvd3NcbiAgICAgICAgICA6IGFtb3VudFJvd3MubGVuZ3RoXG4gICAgICAgICAgICA/IGFtb3VudFJvd3NcbiAgICAgICAgICAgIDogZW1wdHlDb3Vwb24ob3B0aW9ucykuYW1vdW50cyxcbiAgICAgIHBlcmNlbnRhZ2U6IGNvbmZpZy5wZXJjZW50YWdlID09IG51bGwgPyBcIlwiIDogU3RyaW5nKGNvbmZpZy5wZXJjZW50YWdlKSxcbiAgICAgIGFsbG9jYXRpb246XG4gICAgICAgIGNvbmZpZy5wcm9tb3Rpb25fdGVtcGxhdGU/LmFwcGxpY2F0aW9uX21ldGhvZD8uYWxsb2NhdGlvbiA9PT0gXCJvbmNlXCJcbiAgICAgICAgICA/IChcIm9uY2VcIiBhcyBjb25zdClcbiAgICAgICAgICA6IChcImVhY2hcIiBhcyBjb25zdCksXG4gICAgICBjb2RlX3N0cmF0ZWd5OiBjb25maWcuY29kZV9zdHJhdGVneSxcbiAgICAgIGNvZGVfcHJlZml4OiBjb25maWcuY29kZV9wcmVmaXggfHwgXCJcIixcbiAgICAgIHNoYXJlZF9jb2RlOiBjb25maWcuc2hhcmVkX2NvZGUgfHwgXCJcIixcbiAgICAgIGV4cGlyYXRpb25fdHlwZTogY29uZmlnLmV4cGlyYXRpb25fcG9saWN5Py50eXBlIHx8IFwiZHVyYXRpb25cIixcbiAgICAgIGV4cGlyYXRpb25fZGF5czpcbiAgICAgICAgY29uZmlnLmV4cGlyYXRpb25fcG9saWN5Py50eXBlID09PSBcImR1cmF0aW9uXCJcbiAgICAgICAgICA/IFN0cmluZyhjb25maWcuZXhwaXJhdGlvbl9wb2xpY3kuZHVyYXRpb25fZGF5cylcbiAgICAgICAgICA6IFwiMzBcIixcbiAgICAgIGV4cGlyYXRpb25fZGF0ZTpcbiAgICAgICAgY29uZmlnLmV4cGlyYXRpb25fcG9saWN5Py50eXBlID09PSBcImZpeGVkXCJcbiAgICAgICAgICA/IHRvRGF0ZVRpbWVMb2NhbChjb25maWcuZXhwaXJhdGlvbl9wb2xpY3kuZXhwaXJlc19hdClcbiAgICAgICAgICA6IFwiXCIsXG4gICAgICBleHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbjpcbiAgICAgICAgZXhwaXJhdGlvblBvbGljeS50eXBlID09PSBcIm5vbmVcIiB8fFxuICAgICAgICBleHBpcmF0aW9uUG9saWN5LmNhcF9ieV9jYW1wYWlnbiAhPT0gZmFsc2UsXG4gICAgICBleHBpcmF0aW9uX2NhcF9hdDpcbiAgICAgICAgZXhwaXJhdGlvblBvbGljeS50eXBlID09PSBcIm5vbmVcIlxuICAgICAgICAgID8gXCJcIlxuICAgICAgICAgIDogdG9EYXRlVGltZUxvY2FsKGV4cGlyYXRpb25Qb2xpY3kuY2FwX2F0KSxcbiAgICAgIG1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbTogU3RyaW5nKFxuICAgICAgICBjb25maWcubWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtIHx8IDEsXG4gICAgICApLFxuICAgICAgcHJvbW90aW9uX21pcnJvcl9tb2RlOiBjb25maWcucHJvbW90aW9uX21pcnJvcl9tb2RlIHx8IFwibm9uZVwiLFxuICAgICAgcHJvbW90aW9uX3N0YXR1czogY29uZmlnLnByb21vdGlvbl9zdGF0dXMgfHwgXCJkcmFmdFwiLFxuICAgIH0sXG4gICAgY2FtcGFpZ246IHtcbiAgICAgIC4uLmVtcHR5Q2FtcGFpZ24sXG4gICAgICBtb2RlOiBjb25maWcuY2FtcGFpZ25faWQgPyAoXCJleGlzdGluZ1wiIGFzIGNvbnN0KSA6IChcIm5vbmVcIiBhcyBjb25zdCksXG4gICAgICBjYW1wYWlnbl9pZDogY29uZmlnLmNhbXBhaWduX2lkIHx8IFwiXCIsXG4gICAgfSxcbiAgfVxufVxuXG5jb25zdCBtb2RhbENvbnRlbnRTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgZGlzcGxheTogXCJmbGV4XCIsXG4gIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gIG92ZXJmbG93OiBcImhpZGRlblwiLFxufVxuXG5jb25zdCBtb2RhbFdpemFyZFN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBkaXNwbGF5OiBcImZsZXhcIixcbiAgZmxleDogXCIxIDEgYXV0b1wiLFxuICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICBtaW5IZWlnaHQ6IDAsXG4gIG92ZXJmbG93OiBcImhpZGRlblwiLFxufVxuXG5jb25zdCB2aXN1YWxseUhpZGRlblN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBjbGlwOiBcInJlY3QoMCAwIDAgMClcIixcbiAgY2xpcFBhdGg6IFwiaW5zZXQoNTAlKVwiLFxuICBoZWlnaHQ6IDEsXG4gIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICB3aGl0ZVNwYWNlOiBcIm5vd3JhcFwiLFxuICB3aWR0aDogMSxcbn1cblxuY29uc3QgbW9kYWxCb2R5U3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGZsZXg6IFwiMSAxIGF1dG9cIixcbiAgbWluSGVpZ2h0OiAwLFxuICBwYWRkaW5nOiAwLFxufVxuXG5jb25zdCBtb2RhbFNjcm9sbFN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBoZWlnaHQ6IFwiMTAwJVwiLFxuICBvdmVyZmxvd1k6IFwiYXV0b1wiLFxuICBwYWRkaW5nOiBcIjY0cHggMjRweCAxMTJweFwiLFxuICB3aWR0aDogXCIxMDAlXCIsXG59XG5cbmNvbnN0IG1vZGFsRm9ybVN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBtYXJnaW46IFwiMCBhdXRvXCIsXG4gIG1heFdpZHRoOiA3MjAsXG4gIHdpZHRoOiBcIm1pbig3MjBweCwgMTAwJSlcIixcbn1cblxuY29uc3Qgc3RhY2tTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgZGlzcGxheTogXCJmbGV4XCIsXG4gIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gIGdhcDogMjQsXG59XG5cbmNvbnN0IHR3b0NvbHVtbkdyaWRTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgZGlzcGxheTogXCJncmlkXCIsXG4gIGdhcDogMTYsXG4gIGdyaWRUZW1wbGF0ZUNvbHVtbnM6IFwicmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMjYwcHgsIDFmcikpXCIsXG59XG5cbmNvbnN0IHRocmVlQ29sdW1uR3JpZFN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBkaXNwbGF5OiBcImdyaWRcIixcbiAgZ2FwOiAxNixcbiAgZ3JpZFRlbXBsYXRlQ29sdW1uczogXCJyZXBlYXQoYXV0by1maXQsIG1pbm1heCgxODBweCwgMWZyKSlcIixcbn1cblxuY29uc3QgcGFuZWxTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgYm9yZGVyOiBcIjFweCBzb2xpZCB2YXIoLS1ib3JkZXItYmFzZSlcIixcbiAgYm9yZGVyUmFkaXVzOiA4LFxuICBwYWRkaW5nOiAxNixcbn1cblxuZnVuY3Rpb24gRmllbGQoe1xuICBjaGlsZHJlbixcbiAgbGFiZWwsXG4gIG9wdGlvbmFsLFxuICB0b29sdGlwLFxufToge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlXG4gIGxhYmVsOiBzdHJpbmdcbiAgb3B0aW9uYWw/OiBib29sZWFuXG4gIHRvb2x0aXA/OiBzdHJpbmdcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLXktMVwiIHN0eWxlPXt7IG1pbldpZHRoOiAwIH19PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC0xXCI+XG4gICAgICAgIDxMYWJlbD57bGFiZWx9PC9MYWJlbD5cbiAgICAgICAge3Rvb2x0aXAgJiYgKFxuICAgICAgICAgIDxUb29sdGlwIGNvbnRlbnQ9e3Rvb2x0aXB9PlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD17YCR7bGFiZWx9IGluZm9ybWF0aW9uYH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxJbmZvcm1hdGlvbkNpcmNsZSAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICApfVxuICAgICAgICB7b3B0aW9uYWwgJiYgKFxuICAgICAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5cbiAgICAgICAgICAgIChPcHRpb25hbClcbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5mdW5jdGlvbiBTZWN0aW9uKHtcbiAgY2hpbGRyZW4sXG4gIGRlc2NyaXB0aW9uLFxuICB0aXRsZSxcbn06IHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZVxuICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICB0aXRsZTogc3RyaW5nXG59KSB7XG4gIHJldHVybiAoXG4gICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAteS00XCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8SGVhZGluZyBsZXZlbD1cImgyXCI+e3RpdGxlfTwvSGVhZGluZz5cbiAgICAgICAge2Rlc2NyaXB0aW9uICYmIChcbiAgICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgICB7ZGVzY3JpcHRpb259XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9zZWN0aW9uPlxuICApXG59XG5cbmZ1bmN0aW9uIE9wdGlvblNlbGVjdCh7XG4gIG9uQ2hhbmdlLFxuICBvcHRpb25zLFxuICB2YWx1ZSxcbn06IHtcbiAgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG4gIG9wdGlvbnM6IE9wdGlvblJlY29yZFtdXG4gIHZhbHVlOiBzdHJpbmdcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8U2VsZWN0XG4gICAgICB2YWx1ZT17dmFsdWUgfHwgTk9ORX1cbiAgICAgIG9uVmFsdWVDaGFuZ2U9eyhuZXh0KSA9PiBvbkNoYW5nZShuZXh0ID09PSBOT05FID8gXCJcIiA6IG5leHQpfVxuICAgID5cbiAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPXtOT05FfT5Ob25lPC9TZWxlY3QuSXRlbT5cbiAgICAgICAge29wdGlvbnMubWFwKChvcHRpb24pID0+IChcbiAgICAgICAgICA8U2VsZWN0Lkl0ZW0ga2V5PXtvcHRpb24uaWR9IHZhbHVlPXtvcHRpb24uaWR9PlxuICAgICAgICAgICAge29wdGlvbkxhYmVsKG9wdGlvbil9XG4gICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgKSl9XG4gICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgIDwvU2VsZWN0PlxuICApXG59XG5cbmZ1bmN0aW9uIEN1cnJlbmN5U2VsZWN0KHtcbiAgY3VycmVuY2llcyxcbiAgb25DaGFuZ2UsXG4gIHZhbHVlLFxufToge1xuICBjdXJyZW5jaWVzOiBDdXJyZW5jeU9wdGlvbltdXG4gIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZFxuICB2YWx1ZTogc3RyaW5nXG59KSB7XG4gIHJldHVybiAoXG4gICAgPFNlbGVjdFxuICAgICAgdmFsdWU9e3ZhbHVlIHx8IHVuZGVmaW5lZH1cbiAgICAgIGRpc2FibGVkPXshY3VycmVuY2llcy5sZW5ndGh9XG4gICAgICBvblZhbHVlQ2hhbmdlPXtvbkNoYW5nZX1cbiAgICA+XG4gICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgIDxTZWxlY3QuVmFsdWVcbiAgICAgICAgICBwbGFjZWhvbGRlcj17XG4gICAgICAgICAgICBjdXJyZW5jaWVzLmxlbmd0aCA/IFwiU2VsZWN0IGN1cnJlbmN5XCIgOiBcIk5vIGN1cnJlbmNpZXMgYXZhaWxhYmxlXCJcbiAgICAgICAgICB9XG4gICAgICAgIC8+XG4gICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICB7Y3VycmVuY2llcy5tYXAoKGN1cnJlbmN5KSA9PiAoXG4gICAgICAgICAgPFNlbGVjdC5JdGVtIGtleT17Y3VycmVuY3kuY29kZX0gdmFsdWU9e2N1cnJlbmN5LmNvZGV9PlxuICAgICAgICAgICAge2N1cnJlbmN5Lm5hbWV9ICh7Y3VycmVuY3kuY29kZS50b1VwcGVyQ2FzZSgpfSlcbiAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICApKX1cbiAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgPC9TZWxlY3Q+XG4gIClcbn1cblxuZnVuY3Rpb24gQ3VycmVuY3lBbW91bnRGaWVsZCh7XG4gIGN1cnJlbmNpZXMsXG4gIGN1cnJlbmN5Q29kZSxcbiAgb25DaGFuZ2UsXG4gIHZhbHVlLFxufToge1xuICBjdXJyZW5jaWVzOiBDdXJyZW5jeU9wdGlvbltdXG4gIGN1cnJlbmN5Q29kZTogc3RyaW5nXG4gIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZFxuICB2YWx1ZTogc3RyaW5nXG59KSB7XG4gIGNvbnN0IGN1cnJlbmN5ID0gY3VycmVuY2llcy5maW5kKChpdGVtKSA9PiBpdGVtLmNvZGUgPT09IGN1cnJlbmN5Q29kZSlcbiAgY29uc3QgY29kZSA9IGN1cnJlbmN5Q29kZS50b1VwcGVyQ2FzZSgpXG4gIGNvbnN0IGRlY2ltYWxzID0gY3VycmVuY3lEZWNpbWFsRGlnaXRzKGNvZGUgfHwgXCJVU0RcIilcbiAgcmV0dXJuIChcbiAgICA8Q3VycmVuY3lJbnB1dFxuICAgICAgY29kZT17Y29kZSB8fCBcIlVTRFwifVxuICAgICAgc3ltYm9sPXtcbiAgICAgICAgY3VycmVuY3k/LnN5bWJvbF9uYXRpdmUgfHxcbiAgICAgICAgY3VycmVuY3k/LnN5bWJvbCB8fFxuICAgICAgICBjdXJyZW5jeVN5bWJvbChjb2RlIHx8IFwiVVNEXCIpXG4gICAgICB9XG4gICAgICBtaW49ezB9XG4gICAgICBkZWNpbWFsU2NhbGU9e2RlY2ltYWxzfVxuICAgICAgZGVjaW1hbHNMaW1pdD17ZGVjaW1hbHN9XG4gICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICBkaXNhYmxlZD17IWN1cnJlbmN5Q29kZX1cbiAgICAgIG9uVmFsdWVDaGFuZ2U9eyhuZXh0VmFsdWUpID0+IG9uQ2hhbmdlKG5leHRWYWx1ZSB8fCBcIlwiKX1cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIFBlcmNlbnRhZ2VJbnB1dCh7XG4gIG9uQ2hhbmdlLFxuICB2YWx1ZSxcbn06IHtcbiAgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG4gIHZhbHVlOiBzdHJpbmdcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggdy1mdWxsIGl0ZW1zLXN0cmV0Y2hcIiBzdHlsZT17eyB3aWR0aDogXCIxMDAlXCIgfX0+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT1cImJnLXVpLWJnLWZpZWxkIHRleHQtdWktZmctbXV0ZWQgZmxleCBpdGVtcy1jZW50ZXIgYm9yZGVyXCJcbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBib3JkZXJDb2xvcjogXCJ2YXIoLS1ib3JkZXItYmFzZSlcIixcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiNnB4IDAgMCA2cHhcIixcbiAgICAgICAgICBib3JkZXJSaWdodDogMCxcbiAgICAgICAgICBwYWRkaW5nOiBcIjAgMTJweFwiLFxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICAlXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPVwibWluLXctMCBmbGV4LTFcIlxuICAgICAgICBzdHlsZT17eyBmbGV4OiBcIjEgMSAwJVwiLCBtaW5XaWR0aDogMCB9fVxuICAgICAgPlxuICAgICAgICA8SW5wdXRcbiAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGxcIlxuICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgIG1pbj17MX1cbiAgICAgICAgICBtYXg9ezEwMH1cbiAgICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCIwIDZweCA2cHggMFwiLFxuICAgICAgICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgICAgIH19XG4gICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT4gb25DaGFuZ2UoZXZlbnQudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApXG59XG5cbmZ1bmN0aW9uIEhhbmRsZUlucHV0KHtcbiAgb25DaGFuZ2UsXG4gIHZhbHVlLFxufToge1xuICBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWRcbiAgdmFsdWU6IHN0cmluZ1xufSkge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmVcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZCBwb2ludGVyLWV2ZW50cy1ub25lIGFic29sdXRlIGluc2V0LXktMCBsZWZ0LTAgei0xMCBmbGV4IG1pbi13LTggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGJvcmRlci1yIHB4LTIuNVwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0eHQtY29tcGFjdC1zbWFsbCBmb250LW1lZGl1bVwiPi88L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxJbnB1dFxuICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgIHBsYWNlaG9sZGVyPVwid2ludGVyLWphY2tldFwiXG4gICAgICAgIHN0eWxlPXt7IHBhZGRpbmdMZWZ0OiAzNCB9fVxuICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PiBvbkNoYW5nZShldmVudC50YXJnZXQudmFsdWUpfVxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5mdW5jdGlvbiBNZWRpYVVwbG9hZCh7XG4gIGlzVXBsb2FkaW5nLFxuICBtZWRpYSxcbiAgb25SZW1vdmUsXG4gIG9uVXBsb2FkLFxufToge1xuICBpc1VwbG9hZGluZzogYm9vbGVhblxuICBtZWRpYTogUHJvZHVjdE1lZGlhW11cbiAgb25SZW1vdmU6IChtZWRpYTogUHJvZHVjdE1lZGlhKSA9PiB2b2lkXG4gIG9uVXBsb2FkOiAoZmlsZXM6IEZpbGVbXSkgPT4gdm9pZFxufSkge1xuICBjb25zdCBpbnB1dFJlZiA9IHVzZVJlZjxIVE1MSW5wdXRFbGVtZW50PihudWxsKVxuICBjb25zdCBhY2NlcHQgPVxuICAgIFwiaW1hZ2UvanBlZyxpbWFnZS9wbmcsaW1hZ2UvZ2lmLGltYWdlL3dlYnAsaW1hZ2UvaGVpYyxpbWFnZS9zdmcreG1sXCJcblxuICBjb25zdCBoYW5kbGVGaWxlcyA9IChmaWxlczogRmlsZUxpc3QgfCBudWxsKSA9PiB7XG4gICAgaWYgKCFmaWxlcz8ubGVuZ3RoKSByZXR1cm5cbiAgICBvblVwbG9hZChBcnJheS5mcm9tKGZpbGVzKSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZURyb3AgPSAoZXZlbnQ6IERyYWdFdmVudDxIVE1MQnV0dG9uRWxlbWVudD4pID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgaGFuZGxlRmlsZXMoZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLXktM1wiPlxuICAgICAge21lZGlhLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtM1wiXG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGdyaWRUZW1wbGF0ZUNvbHVtbnM6IFwicmVwZWF0KGF1dG8tZmlsbCwgbWlubWF4KDEyMHB4LCAxZnIpKVwiLFxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICB7bWVkaWEubWFwKChpdGVtLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBrZXk9e2l0ZW0uYXNzZXRfaWQgfHwgaXRlbS51cmx9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJlbGF0aXZlIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLW1kIGJvcmRlclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICBzcmM9e2l0ZW0udXJsfVxuICAgICAgICAgICAgICAgIGFsdD1cIlwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC0zMiB3LWZ1bGwgb2JqZWN0LWNvdmVyXCJcbiAgICAgICAgICAgICAgICBzdHlsZT17eyBoZWlnaHQ6IDEyOCB9fVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LXgtMCBib3R0b20tMCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gYmctYmxhY2svNjAgcHgtMiBweS0xXCI+XG4gICAgICAgICAgICAgICAgPFRleHQgc2l6ZT1cInhzbWFsbFwiIHN0eWxlPXt7IGNvbG9yOiBcIndoaXRlXCIgfX0+XG4gICAgICAgICAgICAgICAgICB7aW5kZXggPT09IDAgPyBcIlRodW1ibmFpbFwiIDogYEltYWdlICR7aW5kZXggKyAxfWB9XG4gICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbW92ZSBpbWFnZVwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT17eyBjb2xvcjogXCJ3aGl0ZVwiIH19XG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvblJlbW92ZShpdGVtKX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8WE1hcmtNaW5pIC8+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICAgIDxpbnB1dFxuICAgICAgICByZWY9e2lucHV0UmVmfVxuICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgIGhpZGRlblxuICAgICAgICBtdWx0aXBsZVxuICAgICAgICBhY2NlcHQ9e2FjY2VwdH1cbiAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT4ge1xuICAgICAgICAgIGhhbmRsZUZpbGVzKGV2ZW50LnRhcmdldC5maWxlcylcbiAgICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBcIlwiXG4gICAgICAgIH19XG4gICAgICAvPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgZGlzYWJsZWQ9e2lzVXBsb2FkaW5nfVxuICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkIGZsZXggdy1mdWxsIGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAteS0yIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1kYXNoZWQgcC04XCJcbiAgICAgICAgc3R5bGU9e3sgbWluSGVpZ2h0OiAxNDggfX1cbiAgICAgICAgb25DbGljaz17KCkgPT4gaW5wdXRSZWYuY3VycmVudD8uY2xpY2soKX1cbiAgICAgICAgb25EcmFnT3Zlcj17KGV2ZW50KSA9PiBldmVudC5wcmV2ZW50RGVmYXVsdCgpfVxuICAgICAgICBvbkRyb3A9e2hhbmRsZURyb3B9XG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtdWktZmctYmFzZSBmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC0yXCI+XG4gICAgICAgICAgPEFycm93VXBUcmF5IC8+XG4gICAgICAgICAge2lzVXBsb2FkaW5nID8gXCJVcGxvYWRpbmcgaW1hZ2VzLi4uXCIgOiBcIlVwbG9hZCBpbWFnZXNcIn1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgRHJhZyBhbmQgZHJvcCBpbWFnZXMgaGVyZSBvciBjbGljayB0byB1cGxvYWQuXG4gICAgICAgIDwvVGV4dD5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICApXG59XG5cbnR5cGUgQ29uZGl0aW9uVmFsdWVPcHRpb24gPSB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVxuXG5mdW5jdGlvbiBjb25kaXRpb25WYWx1ZU9wdGlvbnMoXG4gIGF0dHJpYnV0ZTogUHVyY2hhc2VDb25kaXRpb25BdHRyaWJ1dGUgfCBcIlwiLFxuICBvcHRpb25zOiBPcHRpb25zUGF5bG9hZCxcbik6IENvbmRpdGlvblZhbHVlT3B0aW9uW10ge1xuICBpZiAoYXR0cmlidXRlID09PSBcImN1cnJlbmN5X2NvZGVcIikge1xuICAgIHJldHVybiAob3B0aW9ucy5jdXJyZW5jaWVzIHx8IFtdKS5tYXAoKGN1cnJlbmN5KSA9PiAoe1xuICAgICAgdmFsdWU6IGN1cnJlbmN5LmNvZGUsXG4gICAgICBsYWJlbDogYCR7Y3VycmVuY3kubmFtZX0gKCR7Y3VycmVuY3kuY29kZS50b1VwcGVyQ2FzZSgpfSlgLFxuICAgIH0pKVxuICB9XG4gIGlmIChhdHRyaWJ1dGUgPT09IFwic2hpcHBpbmdfYWRkcmVzcy5jb3VudHJ5X2NvZGVcIikge1xuICAgIHJldHVybiAob3B0aW9ucy5jb3VudHJpZXMgfHwgW10pLm1hcCgoY291bnRyeSkgPT4gKHtcbiAgICAgIHZhbHVlOiBTdHJpbmcoY291bnRyeS5pc29fMiB8fCBjb3VudHJ5LmlkKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgbGFiZWw6IGNvdW50cnkuZGlzcGxheV9uYW1lIHx8IGNvdW50cnkubmFtZSB8fCBjb3VudHJ5LmlkLFxuICAgIH0pKVxuICB9XG5cbiAgY29uc3QgcmVjb3JkcyA9XG4gICAgYXR0cmlidXRlID09PSBcImN1c3RvbWVyLmdyb3Vwcy5pZFwiXG4gICAgICA/IG9wdGlvbnMuY3VzdG9tZXJfZ3JvdXBzXG4gICAgICA6IGF0dHJpYnV0ZSA9PT0gXCJyZWdpb24uaWRcIlxuICAgICAgICA/IG9wdGlvbnMucmVnaW9uc1xuICAgICAgICA6IGF0dHJpYnV0ZSA9PT0gXCJzYWxlc19jaGFubmVsX2lkXCJcbiAgICAgICAgICA/IG9wdGlvbnMuc2FsZXNfY2hhbm5lbHNcbiAgICAgICAgICA6IFtdXG4gIHJldHVybiAocmVjb3JkcyB8fCBbXSkubWFwKChyZWNvcmQpID0+ICh7XG4gICAgdmFsdWU6IHJlY29yZC5pZCxcbiAgICBsYWJlbDogb3B0aW9uTGFiZWwocmVjb3JkKSxcbiAgfSkpXG59XG5cbmZ1bmN0aW9uIE11bHRpQ29uZGl0aW9uVmFsdWVzKHtcbiAgYXR0cmlidXRlLFxuICBvbkNoYW5nZSxcbiAgb3B0aW9ucyxcbiAgdmFsdWUsXG59OiB7XG4gIGF0dHJpYnV0ZTogUHVyY2hhc2VDb25kaXRpb25BdHRyaWJ1dGVcbiAgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nW10pID0+IHZvaWRcbiAgb3B0aW9uczogQ29uZGl0aW9uVmFsdWVPcHRpb25bXVxuICB2YWx1ZTogc3RyaW5nW11cbn0pIHtcbiAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtkcmFmdCwgc2V0RHJhZnRdID0gdXNlU3RhdGUodmFsdWUpXG4gIGNvbnN0IFtzZWFyY2gsIHNldFNlYXJjaF0gPSB1c2VTdGF0ZShcIlwiKVxuICBjb25zdCBsYWJlbHMgPSBPYmplY3QuZnJvbUVudHJpZXMob3B0aW9ucy5tYXAoKG9wdGlvbikgPT4gW29wdGlvbi52YWx1ZSwgb3B0aW9uLmxhYmVsXSkpXG4gIGNvbnN0IGZpbHRlcmVkID0gb3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT5cbiAgICBvcHRpb24ubGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2gudHJpbSgpLnRvTG93ZXJDYXNlKCkpLFxuICApXG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPEJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiXG4gICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBqdXN0aWZ5LXN0YXJ0XCJcbiAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgIHNldERyYWZ0KHZhbHVlKVxuICAgICAgICAgIHNldFNlYXJjaChcIlwiKVxuICAgICAgICAgIHNldE9wZW4odHJ1ZSlcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAge3ZhbHVlLmxlbmd0aFxuICAgICAgICAgID8gdmFsdWUubGVuZ3RoID09PSAxXG4gICAgICAgICAgICA/IGxhYmVsc1t2YWx1ZVswXV0gfHwgdmFsdWVbMF1cbiAgICAgICAgICAgIDogYCR7dmFsdWUubGVuZ3RofSB2YWx1ZXMgc2VsZWN0ZWRgXG4gICAgICAgICAgOiBcIlNlbGVjdCB2YWx1ZXNcIn1cbiAgICAgIDwvQnV0dG9uPlxuICAgICAge3ZhbHVlLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTIgZmxleCBmbGV4LXdyYXAgZ2FwLTFcIj5cbiAgICAgICAgICB7dmFsdWUubWFwKChpdGVtKSA9PiAoXG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBrZXk9e2l0ZW19XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJnLXVpLWJnLWNvbXBvbmVudCB0ZXh0LXVpLWZnLXN1YnRsZSBmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC0xIHJvdW5kZWQtbWQgYm9yZGVyIHB4LTIgcHktMSB0ZXh0LXhzXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2xhYmVsc1tpdGVtXSB8fCBpdGVtfVxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17YFJlbW92ZSAke2xhYmVsc1tpdGVtXSB8fCBpdGVtfWB9XG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gb25DaGFuZ2UodmFsdWUuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkgIT09IGl0ZW0pKX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxYTWFya01pbmkgLz5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICAgIDxEcmF3ZXIgb3Blbj17b3Blbn0gb25PcGVuQ2hhbmdlPXtzZXRPcGVufT5cbiAgICAgICAgPERyYXdlci5Db250ZW50PlxuICAgICAgICAgIDxEcmF3ZXIuSGVhZGVyPlxuICAgICAgICAgICAgPERyYXdlci5UaXRsZT5cbiAgICAgICAgICAgICAgU2VsZWN0IHtjb25kaXRpb25BdHRyaWJ1dGVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT09IGF0dHJpYnV0ZSk/LmxhYmVsfVxuICAgICAgICAgICAgPC9EcmF3ZXIuVGl0bGU+XG4gICAgICAgICAgPC9EcmF3ZXIuSGVhZGVyPlxuICAgICAgICAgIDxEcmF3ZXIuQm9keSBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC15LTMgb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgdmFsdWU9e3NlYXJjaH1cbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggdmFsdWVzXCJcbiAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT4gc2V0U2VhcmNoKGV2ZW50LnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAge2ZpbHRlcmVkLmxlbmd0aCA/IChcbiAgICAgICAgICAgICAgZmlsdGVyZWQubWFwKChvcHRpb24pID0+IChcbiAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgIGtleT17b3B0aW9uLnZhbHVlfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBjdXJzb3ItcG9pbnRlciBpdGVtcy1jZW50ZXIgZ2FwLXgtMyByb3VuZGVkLW1kIGJvcmRlciBwLTNcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtkcmFmdC5pbmNsdWRlcyhvcHRpb24udmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICBvbkNoZWNrZWRDaGFuZ2U9eyhjaGVja2VkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIHNldERyYWZ0KChjdXJyZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFycmF5LmZyb20obmV3IFNldChbLi4uY3VycmVudCwgb3B0aW9uLnZhbHVlXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogY3VycmVudC5maWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZSAhPT0gb3B0aW9uLnZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8VGV4dD57b3B0aW9uLmxhYmVsfTwvVGV4dD5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPFRleHQgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPk5vIG1hdGNoaW5nIHZhbHVlcy48L1RleHQ+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvRHJhd2VyLkJvZHk+XG4gICAgICAgICAgPERyYXdlci5Gb290ZXI+XG4gICAgICAgICAgICA8QnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwic2Vjb25kYXJ5XCIgb25DbGljaz17KCkgPT4gc2V0T3BlbihmYWxzZSl9PlxuICAgICAgICAgICAgICBDYW5jZWxcbiAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFkcmFmdC5sZW5ndGh9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICBvbkNoYW5nZShkcmFmdClcbiAgICAgICAgICAgICAgICBzZXRPcGVuKGZhbHNlKVxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBBcHBseVxuICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgPC9EcmF3ZXIuRm9vdGVyPlxuICAgICAgICA8L0RyYXdlci5Db250ZW50PlxuICAgICAgPC9EcmF3ZXI+XG4gICAgPC8+XG4gIClcbn1cblxuZnVuY3Rpb24gUHVyY2hhc2VDb25kaXRpb25zRmllbGQoe1xuICBmaXhlZEFtb3VudCxcbiAgb25DaGFuZ2UsXG4gIG9wdGlvbnMsXG4gIHZhbHVlLFxufToge1xuICBmaXhlZEFtb3VudDogYm9vbGVhblxuICBvbkNoYW5nZTogKGNvbmRpdGlvbnM6IFB1cmNoYXNlQ29uZGl0aW9uRm9ybVtdKSA9PiB2b2lkXG4gIG9wdGlvbnM6IE9wdGlvbnNQYXlsb2FkXG4gIHZhbHVlOiBQdXJjaGFzZUNvbmRpdGlvbkZvcm1bXVxufSkge1xuICBjb25zdCBzZWxlY3RlZEF0dHJpYnV0ZXMgPSBuZXcgU2V0KFxuICAgIHZhbHVlLm1hcCgoY29uZGl0aW9uKSA9PiBjb25kaXRpb24uYXR0cmlidXRlKS5maWx0ZXIoQm9vbGVhbiksXG4gIClcblxuICBjb25zdCByZXBsYWNlID0gKGtleTogc3RyaW5nLCB1cGRhdGU6IFBhcnRpYWw8UHVyY2hhc2VDb25kaXRpb25Gb3JtPikgPT5cbiAgICBvbkNoYW5nZShcbiAgICAgIHZhbHVlLm1hcCgoY29uZGl0aW9uKSA9PlxuICAgICAgICBjb25kaXRpb24ua2V5ID09PSBrZXkgPyB7IC4uLmNvbmRpdGlvbiwgLi4udXBkYXRlIH0gOiBjb25kaXRpb24sXG4gICAgICApLFxuICAgIClcblxuICByZXR1cm4gKFxuICAgIDxTZWN0aW9uXG4gICAgICB0aXRsZT1cIldobyBjYW4gcHVyY2hhc2UgdGhpcyBjb3Vwb24/XCJcbiAgICAgIGRlc2NyaXB0aW9uPVwiQ291cG9uIHByb2R1Y3RzIGNhbiBiZSBwdXJjaGFzZWQgYnkgYWxsIGN1c3RvbWVycyB3aGVuIG5vIGNvbmRpdGlvbnMgYXJlIGNvbmZpZ3VyZWQuIENvbmRpdGlvbnMgYXJlIGNvbWJpbmVkIHdpdGggQU5ELlwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC15LTNcIj5cbiAgICAgICAge3ZhbHVlLm1hcCgoY29uZGl0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IGNvbmRpdGlvblZhbHVlT3B0aW9ucyhjb25kaXRpb24uYXR0cmlidXRlLCBvcHRpb25zKVxuICAgICAgICAgIGNvbnN0IGN1cnJlbmN5UmVxdWlyZWQgPVxuICAgICAgICAgICAgZml4ZWRBbW91bnQgJiYgY29uZGl0aW9uLmF0dHJpYnV0ZSA9PT0gXCJjdXJyZW5jeV9jb2RlXCJcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBrZXk9e2NvbmRpdGlvbi5rZXl9PlxuICAgICAgICAgICAgICB7aW5kZXggPiAwICYmIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWQgZmxleCBoLTggaXRlbXMtY2VudGVyIHRleHQteHMgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIEFORFxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtwYW5lbFN0eWxlfSBjbGFzc05hbWU9XCJyZWxhdGl2ZSBmbGV4IGZsZXgtY29sIGdhcC15LTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnQgZ2FwLXgtMlwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb25kaXRpb24uYXR0cmlidXRlIHx8IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17Y3VycmVuY3lSZXF1aXJlZH1cbiAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsoYXR0cmlidXRlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZShjb25kaXRpb24ua2V5LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZTogYXR0cmlidXRlIGFzIFB1cmNoYXNlQ29uZGl0aW9uQXR0cmlidXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSBwbGFjZWhvbGRlcj1cIlNlbGVjdCBhdHRyaWJ1dGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAge2NvbmRpdGlvbkF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXR0cmlidXRlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLnZhbHVlID09PSBjb25kaXRpb24uYXR0cmlidXRlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRBdHRyaWJ1dGVzLmhhcyhhdHRyaWJ1dGUudmFsdWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGF0dHJpYnV0ZSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSBrZXk9e2F0dHJpYnV0ZS52YWx1ZX0gdmFsdWU9e2F0dHJpYnV0ZS52YWx1ZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7YXR0cmlidXRlLmxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwidHJhbnNwYXJlbnRcIlxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17Y3VycmVuY3lSZXF1aXJlZH1cbiAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbW92ZSBjb25kaXRpb25cIlxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlKHZhbHVlLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5rZXkgIT09IGNvbmRpdGlvbi5rZXkpKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxYTWFya01pbmkgLz5cbiAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3R3b0NvbHVtbkdyaWRTdHlsZX0+XG4gICAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb25kaXRpb24ub3BlcmF0b3IgfHwgdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWNvbmRpdGlvbi5hdHRyaWJ1dGV9XG4gICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyhvcGVyYXRvcikgPT5cbiAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlKGNvbmRpdGlvbi5rZXksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBvcGVyYXRvciBhcyBQdXJjaGFzZUNvbmRpdGlvbk9wZXJhdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA9PT0gXCJlcVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjb25kaXRpb24udmFsdWVzLnNsaWNlKDAsIDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb25kaXRpb24udmFsdWVzLFxuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgcGxhY2Vob2xkZXI9XCJTZWxlY3Qgb3BlcmF0b3JcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAge2NvbmRpdGlvbk9wZXJhdG9ycy5tYXAoKG9wZXJhdG9yKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0ga2V5PXtvcGVyYXRvci52YWx1ZX0gdmFsdWU9e29wZXJhdG9yLnZhbHVlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge29wZXJhdG9yLmxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAge2NvbmRpdGlvbi5hdHRyaWJ1dGUgJiYgY29uZGl0aW9uLm9wZXJhdG9yID09PSBcImVxXCIgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y29uZGl0aW9uLnZhbHVlc1swXSB8fCB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHNlbGVjdGVkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZShjb25kaXRpb24ua2V5LCB7IHZhbHVlczogW3NlbGVjdGVkXSB9KVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgcGxhY2Vob2xkZXI9XCJTZWxlY3QgdmFsdWVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAge3ZhbHVlcy5tYXAoKG9wdGlvbikgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0ga2V5PXtvcHRpb24udmFsdWV9IHZhbHVlPXtvcHRpb24udmFsdWV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvcHRpb24ubGFiZWx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICkgOiBjb25kaXRpb24uYXR0cmlidXRlICYmIGNvbmRpdGlvbi5vcGVyYXRvciA/IChcbiAgICAgICAgICAgICAgICAgICAgPE11bHRpQ29uZGl0aW9uVmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlPXtjb25kaXRpb24uYXR0cmlidXRlfVxuICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e3ZhbHVlc31cbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y29uZGl0aW9uLnZhbHVlc31cbiAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlcykgPT4gcmVwbGFjZShjb25kaXRpb24ua2V5LCB7IHZhbHVlcyB9KX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgIDxCdXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIiBkaXNhYmxlZCBjbGFzc05hbWU9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICBTZWxlY3QgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApXG4gICAgICAgIH0pfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC14LTJcIj5cbiAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgZGlzYWJsZWQ9e3NlbGVjdGVkQXR0cmlidXRlcy5zaXplID49IGNvbmRpdGlvbkF0dHJpYnV0ZXMubGVuZ3RofVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgb25DaGFuZ2UoW1xuICAgICAgICAgICAgICAgIC4uLnZhbHVlLFxuICAgICAgICAgICAgICAgIHsga2V5OiBjb25kaXRpb25LZXkoKSwgYXR0cmlidXRlOiBcIlwiLCBvcGVyYXRvcjogXCJcIiwgdmFsdWVzOiBbXSB9LFxuICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxQbHVzIC8+IEFkZCBjb25kaXRpb25cbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHZhcmlhbnQ9XCJ0cmFuc3BhcmVudFwiXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICBvbkNoYW5nZShmaXhlZEFtb3VudCA/IGRlZmF1bHRQdXJjaGFzZUNvbmRpdGlvbnMob3B0aW9ucykgOiBbXSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA+XG4gICAgICAgICAgICBDbGVhciBhbGxcbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L1NlY3Rpb24+XG4gIClcbn1cblxuZnVuY3Rpb24gUHJvZHVjdFByaWNlc1RhYmxlKHtcbiAgY3VycmVuY2llcyxcbiAgY291cG9uVmFsdWUsXG4gIG9uQ2hhbmdlLFxuICBwcmljZXMsXG59OiB7XG4gIGN1cnJlbmNpZXM6IEN1cnJlbmN5T3B0aW9uW11cbiAgY291cG9uVmFsdWU6IHN0cmluZ1xuICBvbkNoYW5nZTogKGN1cnJlbmN5Q29kZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG4gIHByaWNlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxufSkge1xuICBjb25zdCBbdmlzaWJsZUN1cnJlbmNpZXMsIHNldFZpc2libGVDdXJyZW5jaWVzXSA9IHVzZVN0YXRlPHN0cmluZ1tdPigoKSA9PlxuICAgIGN1cnJlbmNpZXMubWFwKChjdXJyZW5jeSkgPT4gY3VycmVuY3kuY29kZSksXG4gIClcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldFZpc2libGVDdXJyZW5jaWVzKChjdXJyZW50KSA9PiB7XG4gICAgICBjb25zdCBhdmFpbGFibGUgPSBuZXcgU2V0KGN1cnJlbmNpZXMubWFwKChjdXJyZW5jeSkgPT4gY3VycmVuY3kuY29kZSkpXG4gICAgICBjb25zdCByZXRhaW5lZCA9IGN1cnJlbnQuZmlsdGVyKChjb2RlKSA9PiBhdmFpbGFibGUuaGFzKGNvZGUpKVxuICAgICAgY29uc3QgYWRkZWQgPSBjdXJyZW5jaWVzXG4gICAgICAgIC5tYXAoKGN1cnJlbmN5KSA9PiBjdXJyZW5jeS5jb2RlKVxuICAgICAgICAuZmlsdGVyKChjb2RlKSA9PiAhY3VycmVudC5pbmNsdWRlcyhjb2RlKSlcbiAgICAgIHJldHVybiBbLi4ucmV0YWluZWQsIC4uLmFkZGVkXVxuICAgIH0pXG4gIH0sIFtjdXJyZW5jaWVzXSlcblxuICBjb25zdCBzaG93bkN1cnJlbmNpZXMgPSBjdXJyZW5jaWVzLmZpbHRlcigoY3VycmVuY3kpID0+XG4gICAgdmlzaWJsZUN1cnJlbmNpZXMuaW5jbHVkZXMoY3VycmVuY3kuY29kZSksXG4gIClcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBzaXplLWZ1bGwgZmxleC1jb2wgZGl2aWRlLXkgb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXVpLWJnLXN1YnRsZSBmbGV4IHNpemUtZnVsbCBmbGV4LWNvbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXVpLWJnLWJhc2UgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGJvcmRlci1iIHAtNFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLXgtMlwiPlxuICAgICAgICAgICAgPERyb3Bkb3duTWVudT5cbiAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5UcmlnZ2VyIGFzQ2hpbGQ+XG4gICAgICAgICAgICAgICAgPEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc2l6ZT1cInNtYWxsXCIgdmFyaWFudD1cInNlY29uZGFyeVwiPlxuICAgICAgICAgICAgICAgICAgPEFkanVzdG1lbnRzIC8+XG4gICAgICAgICAgICAgICAgICBWaWV3XG4gICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51LlRyaWdnZXI+XG4gICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuQ29udGVudCBhbGlnbj1cInN0YXJ0XCI+XG4gICAgICAgICAgICAgICAge2N1cnJlbmNpZXMubWFwKChjdXJyZW5jeSkgPT4gKFxuICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5DaGVja2JveEl0ZW1cbiAgICAgICAgICAgICAgICAgICAga2V5PXtjdXJyZW5jeS5jb2RlfVxuICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXt2aXNpYmxlQ3VycmVuY2llcy5pbmNsdWRlcyhjdXJyZW5jeS5jb2RlKX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGVja2VkQ2hhbmdlPXsoY2hlY2tlZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBzZXRWaXNpYmxlQ3VycmVuY2llcygoY3VycmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLmN1cnJlbnQsIGN1cnJlbmN5LmNvZGVdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjdXJyZW50LmZpbHRlcigoY29kZSkgPT4gY29kZSAhPT0gY3VycmVuY3kuY29kZSksXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIFByaWNlIHtjdXJyZW5jeS5jb2RlLnRvVXBwZXJDYXNlKCl9XG4gICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5DaGVja2JveEl0ZW0+XG4gICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51LkNvbnRlbnQ+XG4gICAgICAgICAgICA8L0Ryb3Bkb3duTWVudT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC14LTJcIiAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNpemUtZnVsbCBvdmVyZmxvdy1hdXRvXCI+XG4gICAgICAgICAgPFRhYmxlXG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBib3JkZXJDb2xsYXBzZTogXCJjb2xsYXBzZVwiLFxuICAgICAgICAgICAgICB0YWJsZUxheW91dDogXCJmaXhlZFwiLFxuICAgICAgICAgICAgICB3aWR0aDogXCJtYXgtY29udGVudFwiXG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxUYWJsZS5IZWFkZXIgc3R5bGU9e3sgYm9yZGVyVG9wOiBcIm5vbmVcIiB9fT5cbiAgICAgICAgICAgICAgPFRhYmxlLlJvdyBzdHlsZT17eyBoZWlnaHQ6IDQwIH19PlxuICAgICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsXG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBcInZhcigtLWJnLWJhc2UpXCIsXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbTogXCIxcHggc29saWQgdmFyKC0tYm9yZGVyLWJhc2UpXCIsXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCB2YXIoLS1ib3JkZXItYmFzZSlcIixcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiA0MCxcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogXCIwIDE2cHhcIixcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IFwic3RpY2t5XCIsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgIHpJbmRleDogMSxcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQ291cG9uIFZhbHVlXG4gICAgICAgICAgICAgICAgPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICAgIHtzaG93bkN1cnJlbmNpZXMubWFwKChjdXJyZW5jeSkgPT4gKFxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGxcbiAgICAgICAgICAgICAgICAgICAga2V5PXtjdXJyZW5jeS5jb2RlfVxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IFwidmFyKC0tYmctYmFzZSlcIixcbiAgICAgICAgICAgICAgICAgICAgICBib3JkZXJCb3R0b206IFwiMXB4IHNvbGlkIHZhcigtLWJvcmRlci1iYXNlKVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCB2YXIoLS1ib3JkZXItYmFzZSlcIixcbiAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDQwLFxuICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIjAgMTZweFwiLFxuICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRydW5jYXRlXCIgdGl0bGU9e2BQcmljZSAke2N1cnJlbmN5LmNvZGUudG9VcHBlckNhc2UoKX1gfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIFByaWNlIHtjdXJyZW5jeS5jb2RlLnRvVXBwZXJDYXNlKCl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIHtjdXJyZW5jeS5pc190YXhfaW5jbHVzaXZlID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPFRheEluY2x1c2l2ZSBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkIHNocmluay0wXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgPFRheEV4Y2x1c2l2ZSBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkIHNocmluay0wXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgPC9UYWJsZS5Sb3c+XG4gICAgICAgICAgICA8L1RhYmxlLkhlYWRlcj5cbiAgICAgICAgICAgIDxUYWJsZS5Cb2R5PlxuICAgICAgICAgICAgICA8VGFibGUuUm93IGNsYXNzTmFtZT1cImJnLXVpLWJnLXN1YnRsZVwiIHN0eWxlPXt7IGhlaWdodDogNDAgfX0+XG4gICAgICAgICAgICAgICAgPFRhYmxlLkNlbGxcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IFwidmFyKC0tYmctc3VidGxlKVwiLFxuICAgICAgICAgICAgICAgICAgICBib3JkZXJCb3R0b206IFwiMXB4IHNvbGlkIHZhcigtLWJvcmRlci1iYXNlKVwiLFxuICAgICAgICAgICAgICAgICAgICBib3JkZXJSaWdodDogXCIxcHggc29saWQgdmFyKC0tYm9yZGVyLWJhc2UpXCIsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogNDAsXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIG1heFdpZHRoOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMCAxNnB4XCIsXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcInN0aWNreVwiLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgICAgICAgICAgICAgICB6SW5kZXg6IDEsXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJsb2NrIHRydW5jYXRlXCI+e2NvdXBvblZhbHVlfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAge3Nob3duQ3VycmVuY2llcy5tYXAoKGN1cnJlbmN5KSA9PiAoXG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbFxuICAgICAgICAgICAgICAgICAgICBrZXk9e2N1cnJlbmN5LmNvZGV9XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogXCJ2YXIoLS1iZy1iYXNlKVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbTogXCIxcHggc29saWQgdmFyKC0tYm9yZGVyLWJhc2UpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkIHZhcigtLWJvcmRlci1iYXNlKVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogNDAsXG4gICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogMjAwLFxuICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPFRhYmxlUHJpY2VJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5PXtjdXJyZW5jeX1cbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJpY2VzW2N1cnJlbmN5LmNvZGVdIHx8IFwiXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4gb25DaGFuZ2UoY3VycmVuY3kuY29kZSwgdmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICA8L1RhYmxlLlJvdz5cbiAgICAgICAgICAgIDwvVGFibGUuQm9keT5cbiAgICAgICAgICA8L1RhYmxlPlxuXG4gICAgICAgICAgeyFjdXJyZW5jaWVzLmxlbmd0aCAmJiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtNFwiPlxuICAgICAgICAgICAgICA8VGV4dCBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgICAgICAgQWRkIGEgc3VwcG9ydGVkIGN1cnJlbmN5IHRvIHRoZSBzdG9yZSBiZWZvcmUgc2V0dGluZyBwcmljZXMuXG4gICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdENvdXBvblZhbHVlKFxuICBjb3Vwb246IFBpY2s8Q291cG9uRm9ybVN0YXRlLCBcImFtb3VudHNcIiB8IFwicGVyY2VudGFnZVwiIHwgXCJ0eXBlXCI+LFxuICBjdXJyZW5jaWVzOiBQaWNrPEN1cnJlbmN5T3B0aW9uLCBcImNvZGVcIiB8IFwiaXNfZGVmYXVsdFwiPltdLFxuKSB7XG4gIGlmIChcbiAgICBjb3Vwb24udHlwZSA9PT0gXCJhbW91bnRfb2ZmX3Byb2R1Y3RzXCIgfHxcbiAgICBjb3Vwb24udHlwZSA9PT0gXCJhbW91bnRfb2ZmX29yZGVyXCJcbiAgKSB7XG4gICAgY29uc3QgZGVmYXVsdENvZGUgPVxuICAgICAgY3VycmVuY2llcy5maW5kKChjdXJyZW5jeSkgPT4gY3VycmVuY3kuaXNfZGVmYXVsdCk/LmNvZGUgfHxcbiAgICAgIGN1cnJlbmNpZXNbMF0/LmNvZGVcbiAgICBjb25zdCBwcmltYXJ5ID1cbiAgICAgIGNvdXBvbi5hbW91bnRzLmZpbmQoKHJvdykgPT4gcm93LmN1cnJlbmN5X2NvZGUgPT09IGRlZmF1bHRDb2RlKSB8fFxuICAgICAgY291cG9uLmFtb3VudHNbMF1cbiAgICBjb25zdCBhbW91bnQgPSBudW1iZXJPck51bGwocHJpbWFyeT8uYW1vdW50KVxuICAgIGlmIChhbW91bnQgPT0gbnVsbCkgcmV0dXJuIFwiXHUyMDE0XCJcbiAgICBjb25zdCBhZGRpdGlvbmFsID0gTWF0aC5tYXgoMCwgY291cG9uLmFtb3VudHMubGVuZ3RoIC0gMSlcbiAgICBjb25zdCBmb3JtYXR0ZWQgPSBgJHthbW91bnR9JHtwcmltYXJ5LmN1cnJlbmN5X2NvZGUudG9VcHBlckNhc2UoKX1gXG4gICAgcmV0dXJuIGFkZGl0aW9uYWwgPyBgJHtmb3JtYXR0ZWR9ICske2FkZGl0aW9uYWx9YCA6IGZvcm1hdHRlZFxuICB9XG5cbiAgaWYgKFxuICAgIGNvdXBvbi50eXBlID09PSBcInBlcmNlbnRhZ2Vfb2ZmX3Byb2R1Y3RcIiB8fFxuICAgIGNvdXBvbi50eXBlID09PSBcInBlcmNlbnRhZ2Vfb2ZmX29yZGVyXCJcbiAgKSB7XG4gICAgY29uc3QgcGVyY2VudGFnZSA9IG51bWJlck9yTnVsbChjb3Vwb24ucGVyY2VudGFnZSlcbiAgICBpZiAocGVyY2VudGFnZSA9PSBudWxsKSByZXR1cm4gXCJcdTIwMTRcIlxuICAgIHJldHVybiBjb3Vwb24udHlwZSA9PT0gXCJwZXJjZW50YWdlX29mZl9vcmRlclwiXG4gICAgICA/IGAke3BlcmNlbnRhZ2V9JSBvZmYgb3JkZXJgXG4gICAgICA6IGAke3BlcmNlbnRhZ2V9JSBvZmYgcHJvZHVjdHNgXG4gIH1cblxuICByZXR1cm4gY291cG9uLnR5cGUgPT09IFwiZnJlZV9zaGlwcGluZ1wiID8gXCJGcmVlIHNoaXBwaW5nXCIgOiBcIkJ1eSBYIEdldCBZXCJcbn1cblxuZnVuY3Rpb24gVGFibGVQcmljZUlucHV0KHtcbiAgY3VycmVuY3ksXG4gIG9uQ2hhbmdlLFxuICB2YWx1ZSxcbn06IHtcbiAgY3VycmVuY3k6IEN1cnJlbmN5T3B0aW9uXG4gIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZFxuICB2YWx1ZTogc3RyaW5nXG59KSB7XG4gIGNvbnN0IHN5bWJvbCA9XG4gICAgY3VycmVuY3kuc3ltYm9sX25hdGl2ZSB8fFxuICAgIGN1cnJlbmN5LnN5bWJvbCB8fFxuICAgIGN1cnJlbmN5U3ltYm9sKGN1cnJlbmN5LmNvZGUgfHwgXCJVU0RcIilcblxuICByZXR1cm4gKFxuICAgIDxsYWJlbFxuICAgICAgY2xhc3NOYW1lPVwiYmctdWktYmctYmFzZSBob3ZlcjpiZy11aS1iZy1zdWJ0bGUgZm9jdXMtd2l0aGluOnNoYWRvdy1ib3JkZXJzLWludGVyYWN0aXZlLXdpdGgtYWN0aXZlIHRleHQtdWktZmctYmFzZVwiXG4gICAgICBzdHlsZT17e1xuICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICBib3JkZXJSYWRpdXM6IDAsXG4gICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICBoZWlnaHQ6IDQwLFxuICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgfX1cbiAgICA+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCJcbiAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgc3R5bGU9e3sgZmxleDogXCIwIDAgNDBweFwiLCBwYWRkaW5nTGVmdDogMTYgfX1cbiAgICAgID5cbiAgICAgICAge3N5bWJvbH1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxpbnB1dFxuICAgICAgICBhcmlhLWxhYmVsPXtgUHJpY2UgJHtjdXJyZW5jeS5jb2RlLnRvVXBwZXJDYXNlKCl9YH1cbiAgICAgICAgaW5wdXRNb2RlPVwiZGVjaW1hbFwiXG4gICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT4gb25DaGFuZ2UoZXZlbnQudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBhcHBlYXJhbmNlOiBcIm5vbmVcIixcbiAgICAgICAgICBiYWNrZ3JvdW5kOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgICAgYm9yZGVyOiAwLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogMCxcbiAgICAgICAgICBmbGV4OiBcIjEgMSBhdXRvXCIsXG4gICAgICAgICAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgICAgbWluV2lkdGg6IDAsXG4gICAgICAgICAgb3V0bGluZTogXCJub25lXCIsXG4gICAgICAgICAgcGFkZGluZzogXCIwIDE2cHggMCAwXCIsXG4gICAgICAgICAgdGV4dEFsaWduOiBcInJpZ2h0XCIsXG4gICAgICAgIH19XG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIC8+XG4gICAgPC9sYWJlbD5cbiAgKVxufVxuXG5mdW5jdGlvbiBDb3Vwb25Qcm9kdWN0TW9kYWwoe1xuICBhbGxvd1Byb21vdGlvbk1pcnJvcixcbiAgYXBpQmFzZSxcbiAgb25PcGVuQ2hhbmdlLFxuICBvblNhdmVkLFxuICBvcGVuLFxuICBvcHRpb25zLFxuICByb3csXG59OiB7XG4gIGFsbG93UHJvbW90aW9uTWlycm9yOiBib29sZWFuXG4gIGFwaUJhc2U6IEFwaUJhc2VcbiAgb25PcGVuQ2hhbmdlOiAob3BlbjogYm9vbGVhbikgPT4gdm9pZFxuICBvblNhdmVkOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gIG9wZW46IGJvb2xlYW5cbiAgb3B0aW9uczogT3B0aW9uc1BheWxvYWRcbiAgcm93OiBDb3Vwb25Qcm9kdWN0Um93IHwgbnVsbFxufSkge1xuICBjb25zdCBbYWN0aXZlU3RlcCwgc2V0QWN0aXZlU3RlcF0gPSB1c2VTdGF0ZTxXaXphcmRTdGVwPihcImRldGFpbHNcIilcbiAgY29uc3QgW3Byb2R1Y3QsIHNldFByb2R1Y3RdID0gdXNlU3RhdGU8UHJvZHVjdEZvcm1TdGF0ZT4oKCkgPT5cbiAgICBlbXB0eVByb2R1Y3Qob3B0aW9ucyksXG4gIClcbiAgY29uc3QgW2NvdXBvbiwgc2V0Q291cG9uXSA9IHVzZVN0YXRlPENvdXBvbkZvcm1TdGF0ZT4oKCkgPT5cbiAgICBlbXB0eUNvdXBvbihvcHRpb25zKSxcbiAgKVxuICBjb25zdCBbY2FtcGFpZ24sIHNldENhbXBhaWduXSA9IHVzZVN0YXRlPENhbXBhaWduRm9ybVN0YXRlPihlbXB0eUNhbXBhaWduKVxuICBjb25zdCBbc2F2aW5nLCBzZXRTYXZpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFt1cGxvYWRpbmcsIHNldFVwbG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2Z1cnRoZXN0U3RlcEluZGV4LCBzZXRGdXJ0aGVzdFN0ZXBJbmRleF0gPSB1c2VTdGF0ZSgwKVxuXG4gIGNvbnN0IHZpc2libGVTdGVwcyA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIGFsbG93UHJvbW90aW9uTWlycm9yXG4gICAgICAgID8gYWxsU3RlcHNcbiAgICAgICAgOiBhbGxTdGVwcy5maWx0ZXIoKHN0ZXApID0+IHN0ZXAgIT09IFwiY2FtcGFpZ25cIiksXG4gICAgW2FsbG93UHJvbW90aW9uTWlycm9yXSxcbiAgKVxuICBjb25zdCBjdXJyZW50U3RlcEluZGV4ID0gdmlzaWJsZVN0ZXBzLmluZGV4T2YoYWN0aXZlU3RlcClcbiAgY29uc3QgY3VycmVuY2llcyA9IG9wdGlvbnMuY3VycmVuY2llcyB8fCBbXVxuICBjb25zdCBzdXBwb3J0ZWRDdXJyZW5jeUNvZGVzID0gdXNlTWVtbyhcbiAgICAoKSA9PiBuZXcgU2V0KGN1cnJlbmNpZXMubWFwKChjdXJyZW5jeSkgPT4gY3VycmVuY3kuY29kZSkpLFxuICAgIFtjdXJyZW5jaWVzXSxcbiAgKVxuICBjb25zdCBpc0Ftb3VudFR5cGUgPVxuICAgIGNvdXBvbi50eXBlID09PSBcImFtb3VudF9vZmZfcHJvZHVjdHNcIiB8fCBjb3Vwb24udHlwZSA9PT0gXCJhbW91bnRfb2ZmX29yZGVyXCJcbiAgY29uc3QgaXNQZXJjZW50YWdlVHlwZSA9XG4gICAgY291cG9uLnR5cGUgPT09IFwicGVyY2VudGFnZV9vZmZfcHJvZHVjdFwiIHx8XG4gICAgY291cG9uLnR5cGUgPT09IFwicGVyY2VudGFnZV9vZmZfb3JkZXJcIlxuICBjb25zdCBpc0l0ZW1TY29wZWREaXNjb3VudCA9XG4gICAgY291cG9uLnR5cGUgPT09IFwiYW1vdW50X29mZl9wcm9kdWN0c1wiIHx8XG4gICAgY291cG9uLnR5cGUgPT09IFwicGVyY2VudGFnZV9vZmZfcHJvZHVjdFwiXG4gIGNvbnN0IGVmZmVjdGl2ZUN1cnJlbmNpZXMgPSB1c2VNZW1vKFxuICAgICgpID0+IGVmZmVjdGl2ZUNvdXBvbkN1cnJlbmNpZXMoY291cG9uLnB1cmNoYXNlX2NvbmRpdGlvbnMsIGN1cnJlbmNpZXMpLFxuICAgIFtjb3Vwb24ucHVyY2hhc2VfY29uZGl0aW9ucywgY3VycmVuY2llc10sXG4gIClcbiAgY29uc3QgcHJvZHVjdFByaWNlcyA9IGN1cnJlbmNpZXMuZmxhdE1hcCgoY3VycmVuY3kpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHByb2R1Y3QucHJpY2VfYW1vdW50c1tjdXJyZW5jeS5jb2RlXSB8fCBcIlwiXG4gICAgY29uc3QgYW1vdW50ID0gbm9uTmVnYXRpdmVOdW1iZXJPck51bGwodmFsdWUpXG4gICAgcmV0dXJuIGFtb3VudCA9PSBudWxsID8gW10gOiBbeyBjdXJyZW5jeV9jb2RlOiBjdXJyZW5jeS5jb2RlLCBhbW91bnQgfV1cbiAgfSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghb3BlbikgcmV0dXJuXG4gICAgY29uc3QgZm9ybXMgPSByb3dcbiAgICAgID8gZm9ybXNGcm9tUm93KHJvdywgb3B0aW9ucylcbiAgICAgIDoge1xuICAgICAgICBwcm9kdWN0OiBlbXB0eVByb2R1Y3Qob3B0aW9ucyksXG4gICAgICAgIGNvdXBvbjogZW1wdHlDb3Vwb24ob3B0aW9ucyksXG4gICAgICAgIGNhbXBhaWduOiBlbXB0eUNhbXBhaWduLFxuICAgICAgfVxuICAgIHNldFByb2R1Y3QoZm9ybXMucHJvZHVjdClcbiAgICBzZXRDb3Vwb24oZm9ybXMuY291cG9uKVxuICAgIHNldENhbXBhaWduKGZvcm1zLmNhbXBhaWduKVxuICAgIHNldEFjdGl2ZVN0ZXAoXCJkZXRhaWxzXCIpXG4gICAgc2V0RnVydGhlc3RTdGVwSW5kZXgoMClcbiAgfSwgW29wZW4sIHJvdywgb3B0aW9uc10pXG5cbiAgY29uc3QgdXBkYXRlUHVyY2hhc2VDb25kaXRpb25zID0gKFxuICAgIHB1cmNoYXNlQ29uZGl0aW9uczogUHVyY2hhc2VDb25kaXRpb25Gb3JtW10sXG4gICkgPT4ge1xuICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICBwdXJjaGFzZV9jb25kaXRpb25zOiBwdXJjaGFzZUNvbmRpdGlvbnMsXG4gICAgICBhbW91bnRzOiBpc0Ftb3VudENvdXBvblR5cGUoY3VycmVudC50eXBlKVxuICAgICAgICA/IHJlY29uY2lsZUNvdXBvbkFtb3VudHMoXG4gICAgICAgICAgY3VycmVudC5hbW91bnRzLFxuICAgICAgICAgIGVmZmVjdGl2ZUNvdXBvbkN1cnJlbmNpZXMocHVyY2hhc2VDb25kaXRpb25zLCBjdXJyZW5jaWVzKSxcbiAgICAgICAgKVxuICAgICAgICA6IGN1cnJlbnQuYW1vdW50cyxcbiAgICB9KSlcbiAgfVxuXG4gIGNvbnN0IHVwZGF0ZUNvdXBvblR5cGUgPSAodHlwZTogQ291cG9uVHlwZSkgPT4ge1xuICAgIHNldENvdXBvbigoY3VycmVudCkgPT4ge1xuICAgICAgbGV0IHB1cmNoYXNlQ29uZGl0aW9ucyA9IGN1cnJlbnQucHVyY2hhc2VfY29uZGl0aW9uc1xuICAgICAgaWYgKFxuICAgICAgICBpc0Ftb3VudENvdXBvblR5cGUodHlwZSkgJiZcbiAgICAgICAgIXB1cmNoYXNlQ29uZGl0aW9ucy5zb21lKFxuICAgICAgICAgIChjb25kaXRpb24pID0+IGNvbmRpdGlvbi5hdHRyaWJ1dGUgPT09IFwiY3VycmVuY3lfY29kZVwiLFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcHVyY2hhc2VDb25kaXRpb25zID0gW1xuICAgICAgICAgIC4uLnB1cmNoYXNlQ29uZGl0aW9ucyxcbiAgICAgICAgICAuLi5kZWZhdWx0UHVyY2hhc2VDb25kaXRpb25zKG9wdGlvbnMpLFxuICAgICAgICBdXG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICB0eXBlLFxuICAgICAgICBwdXJjaGFzZV9jb25kaXRpb25zOiBwdXJjaGFzZUNvbmRpdGlvbnMsXG4gICAgICAgIGFtb3VudHM6IGlzQW1vdW50Q291cG9uVHlwZSh0eXBlKVxuICAgICAgICAgID8gcmVjb25jaWxlQ291cG9uQW1vdW50cyhcbiAgICAgICAgICAgIGN1cnJlbnQuYW1vdW50cyxcbiAgICAgICAgICAgIGVmZmVjdGl2ZUNvdXBvbkN1cnJlbmNpZXMocHVyY2hhc2VDb25kaXRpb25zLCBjdXJyZW5jaWVzKSxcbiAgICAgICAgICApXG4gICAgICAgICAgOiBjdXJyZW50LmFtb3VudHMsXG4gICAgICAgIHByb21vdGlvbl9taXJyb3JfbW9kZTpcbiAgICAgICAgICB0eXBlID09PSBcImJ1eV94X2dldF95XCIgPyBcIm5vbmVcIiA6IGN1cnJlbnQucHJvbW90aW9uX21pcnJvcl9tb2RlLFxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBjb25zdCB1cGxvYWRNZWRpYSA9IGFzeW5jIChmaWxlczogRmlsZVtdKSA9PiB7XG4gICAgaWYgKCFmaWxlcy5sZW5ndGgpIHJldHVyblxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBmaWxlcy5mb3JFYWNoKChmaWxlKSA9PiBmb3JtRGF0YS5hcHBlbmQoXCJmaWxlc1wiLCBmaWxlKSlcbiAgICBpZiAoYXBpQmFzZSA9PT0gXCIvYWRtaW5cIiAmJiBwcm9kdWN0LnNlbGxlcl9pZCkge1xuICAgICAgZm9ybURhdGEuYXBwZW5kKFwic2VsbGVyX2lkXCIsIHByb2R1Y3Quc2VsbGVyX2lkKVxuICAgIH1cbiAgICBzZXRVcGxvYWRpbmcodHJ1ZSlcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgYCR7YmFja2VuZFVybCgpfSR7YXBpQmFzZX0vY291cG9uLXByb2R1Y3RzL3VwbG9hZHNgLFxuICAgICAgICB7XG4gICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICBib2R5OiBmb3JtRGF0YSxcbiAgICAgICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGFwaUVycm9yTWVzc2FnZShwYXlsb2FkLCByZXNwb25zZS5zdGF0dXNUZXh0KSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBheWxvYWQgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7XG4gICAgICAgIGZpbGVzPzogeyBhc3NldF9pZD86IHN0cmluZzsgdXJsPzogc3RyaW5nIH1bXVxuICAgICAgfVxuICAgICAgY29uc3QgdXBsb2FkZWQgPSAocGF5bG9hZC5maWxlcyB8fCBbXSlcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAoZmlsZSk6IGZpbGUgaXMgeyBhc3NldF9pZDogc3RyaW5nOyB1cmw6IHN0cmluZyB9ID0+XG4gICAgICAgICAgICBCb29sZWFuKGZpbGUuYXNzZXRfaWQgJiYgZmlsZS51cmwpLFxuICAgICAgICApXG4gICAgICAgIC5tYXAoKGZpbGUpID0+ICh7IGFzc2V0X2lkOiBmaWxlLmFzc2V0X2lkLCB1cmw6IGZpbGUudXJsIH0pKVxuICAgICAgaWYgKCF1cGxvYWRlZC5sZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSB1cGxvYWQgZGlkIG5vdCByZXR1cm4gYW4gaW1hZ2UgVVJMXCIpXG4gICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoe1xuICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICBtZWRpYTogQXJyYXkuZnJvbShcbiAgICAgICAgICBuZXcgTWFwKFxuICAgICAgICAgICAgWy4uLmN1cnJlbnQubWVkaWEsIC4uLnVwbG9hZGVkXS5tYXAoKGl0ZW0pID0+IFtpdGVtLnVybCwgaXRlbV0pLFxuICAgICAgICAgICkudmFsdWVzKCksXG4gICAgICAgICksXG4gICAgICB9KSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdG9hc3QuZXJyb3IoXG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJJbWFnZSB1cGxvYWQgZmFpbGVkXCIsXG4gICAgICApXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldFVwbG9hZGluZyhmYWxzZSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZXRhaWxzQ29tcGxldGUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIXByb2R1Y3QudGl0bGUudHJpbSgpKSByZXR1cm4gZmFsc2VcbiAgICBpZiAoIWN1cnJlbmNpZXMubGVuZ3RoKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBuZXcgU2V0PHN0cmluZz4oKVxuICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvdXBvbi5wdXJjaGFzZV9jb25kaXRpb25zKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFjb25kaXRpb24uYXR0cmlidXRlIHx8XG4gICAgICAgICFjb25kaXRpb24ub3BlcmF0b3IgfHxcbiAgICAgICAgIWNvbmRpdGlvbi52YWx1ZXMubGVuZ3RoIHx8XG4gICAgICAgIChjb25kaXRpb24ub3BlcmF0b3IgPT09IFwiZXFcIiAmJiBjb25kaXRpb24udmFsdWVzLmxlbmd0aCAhPT0gMSkgfHxcbiAgICAgICAgYXR0cmlidXRlcy5oYXMoY29uZGl0aW9uLmF0dHJpYnV0ZSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICAgIGF0dHJpYnV0ZXMuYWRkKGNvbmRpdGlvbi5hdHRyaWJ1dGUpXG4gICAgfVxuXG4gICAgaWYgKGlzQW1vdW50VHlwZSkge1xuICAgICAgaWYgKCFhdHRyaWJ1dGVzLmhhcyhcImN1cnJlbmN5X2NvZGVcIikpIHJldHVybiBmYWxzZVxuICAgICAgaWYgKCFjb3Vwb24uYW1vdW50cy5sZW5ndGgpIHJldHVybiBmYWxzZVxuICAgICAgaWYgKGNvdXBvbi5hbW91bnRzLmxlbmd0aCAhPT0gZWZmZWN0aXZlQ3VycmVuY2llcy5sZW5ndGgpIHJldHVybiBmYWxzZVxuICAgICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiBjb3Vwb24uYW1vdW50cykge1xuICAgICAgICBpZiAoIXN1cHBvcnRlZEN1cnJlbmN5Q29kZXMuaGFzKHJvdy5jdXJyZW5jeV9jb2RlKSkgcmV0dXJuIGZhbHNlXG4gICAgICAgIGlmIChzZWVuLmhhcyhyb3cuY3VycmVuY3lfY29kZSkpIHJldHVybiBmYWxzZVxuICAgICAgICBpZiAobnVtYmVyT3JOdWxsKHJvdy5hbW91bnQpID09IG51bGwpIHJldHVybiBmYWxzZVxuICAgICAgICBzZWVuLmFkZChyb3cuY3VycmVuY3lfY29kZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNQZXJjZW50YWdlVHlwZSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBudW1iZXJPck51bGwoY291cG9uLnBlcmNlbnRhZ2UpXG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA+IDEwMCkgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKGNvdXBvbi5jb2RlX3N0cmF0ZWd5ID09PSBcInNoYXJlZF9jb2RlXCIgJiYgIWNvdXBvbi5zaGFyZWRfY29kZS50cmltKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChjb3Vwb24uZXhwaXJhdGlvbl90eXBlID09PSBcImR1cmF0aW9uXCIpIHtcbiAgICAgIGNvbnN0IGRheXMgPSBOdW1iZXIoY291cG9uLmV4cGlyYXRpb25fZGF5cylcbiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihkYXlzKSB8fCBkYXlzIDwgMSkgcmV0dXJuIGZhbHNlXG4gICAgfSBlbHNlIGlmIChjb3Vwb24uZXhwaXJhdGlvbl90eXBlID09PSBcImZpeGVkXCIpIHtcbiAgICAgIGNvbnN0IGV4cGlyYXRpb24gPSBuZXcgRGF0ZShjb3Vwb24uZXhwaXJhdGlvbl9kYXRlKVxuICAgICAgaWYgKCFjb3Vwb24uZXhwaXJhdGlvbl9kYXRlIHx8IE51bWJlci5pc05hTihleHBpcmF0aW9uLmdldFRpbWUoKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvdXBvbi5leHBpcmF0aW9uX3R5cGUgIT09IFwibm9uZVwiICYmIGNvdXBvbi5leHBpcmF0aW9uX2NhcF9hdCkge1xuICAgICAgY29uc3QgY2FwID0gbmV3IERhdGUoY291cG9uLmV4cGlyYXRpb25fY2FwX2F0KVxuICAgICAgaWYgKE51bWJlci5pc05hTihjYXAuZ2V0VGltZSgpKSkgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgY29uc3QgbWF4SXNzdWFuY2UgPSBOdW1iZXIoY291cG9uLm1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbSlcbiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihtYXhJc3N1YW5jZSkgJiYgbWF4SXNzdWFuY2UgPiAwXG4gIH0sIFtcbiAgICBjb3Vwb24sXG4gICAgY3VycmVuY2llcy5sZW5ndGgsXG4gICAgZWZmZWN0aXZlQ3VycmVuY2llcy5sZW5ndGgsXG4gICAgaXNBbW91bnRUeXBlLFxuICAgIGlzUGVyY2VudGFnZVR5cGUsXG4gICAgcHJvZHVjdC50aXRsZSxcbiAgICBzdXBwb3J0ZWRDdXJyZW5jeUNvZGVzLFxuICBdKVxuXG4gIGNvbnN0IGNhbXBhaWduQ29tcGxldGUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIWFsbG93UHJvbW90aW9uTWlycm9yIHx8IGNhbXBhaWduLm1vZGUgPT09IFwibm9uZVwiKSByZXR1cm4gdHJ1ZVxuICAgIGlmIChjYW1wYWlnbi5tb2RlID09PSBcImV4aXN0aW5nXCIpIHJldHVybiBCb29sZWFuKGNhbXBhaWduLmNhbXBhaWduX2lkKVxuICAgIGlmICghY2FtcGFpZ24ubmFtZS50cmltKCkgfHwgIWNhbXBhaWduLmNhbXBhaWduX2lkZW50aWZpZXIudHJpbSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gW2NhbXBhaWduLnN0YXJ0c19hdCwgY2FtcGFpZ24uZW5kc19hdF0uZXZlcnkoKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIXZhbHVlKSByZXR1cm4gdHJ1ZVxuICAgICAgcmV0dXJuICFOdW1iZXIuaXNOYU4obmV3IERhdGUodmFsdWUpLmdldFRpbWUoKSlcbiAgICB9KVxuICB9LCBbYWxsb3dQcm9tb3Rpb25NaXJyb3IsIGNhbXBhaWduXSlcblxuICBjb25zdCBwcmljZXNDb21wbGV0ZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghY3VycmVuY2llcy5sZW5ndGggfHwgIXByb2R1Y3RQcmljZXMubGVuZ3RoKSByZXR1cm4gZmFsc2VcbiAgICByZXR1cm4gY3VycmVuY2llcy5ldmVyeSgoY3VycmVuY3kpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gcHJvZHVjdC5wcmljZV9hbW91bnRzW2N1cnJlbmN5LmNvZGVdIHx8IFwiXCJcbiAgICAgIHJldHVybiAhdmFsdWUudHJpbSgpIHx8IG5vbk5lZ2F0aXZlTnVtYmVyT3JOdWxsKHZhbHVlKSAhPSBudWxsXG4gICAgfSlcbiAgfSwgW2N1cnJlbmNpZXMsIHByb2R1Y3QucHJpY2VfYW1vdW50cywgcHJvZHVjdFByaWNlcy5sZW5ndGhdKVxuXG4gIGNvbnN0IHN0ZXBWYWxpZGl0eSA9IHVzZU1lbW88UmVjb3JkPFdpemFyZFN0ZXAsIGJvb2xlYW4+PihcbiAgICAoKSA9PiAoe1xuICAgICAgZGV0YWlsczogZGV0YWlsc0NvbXBsZXRlLFxuICAgICAgb3JnYW5pemU6IHRydWUsXG4gICAgICBjYW1wYWlnbjogY2FtcGFpZ25Db21wbGV0ZSxcbiAgICAgIHByaWNlczogcHJpY2VzQ29tcGxldGUsXG4gICAgfSksXG4gICAgW2NhbXBhaWduQ29tcGxldGUsIGRldGFpbHNDb21wbGV0ZSwgcHJpY2VzQ29tcGxldGVdLFxuICApXG5cbiAgY29uc3QgYWN0aXZlU3RlcENvbXBsZXRlID0gc3RlcFZhbGlkaXR5W2FjdGl2ZVN0ZXBdXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIW9wZW4gfHwgIWFjdGl2ZVN0ZXBDb21wbGV0ZSkgcmV0dXJuXG4gICAgc2V0RnVydGhlc3RTdGVwSW5kZXgoKGN1cnJlbnQpID0+XG4gICAgICBNYXRoLm1heChcbiAgICAgICAgY3VycmVudCxcbiAgICAgICAgTWF0aC5taW4oY3VycmVudFN0ZXBJbmRleCArIDEsIHZpc2libGVTdGVwcy5sZW5ndGggLSAxKSxcbiAgICAgICksXG4gICAgKVxuICB9LCBbYWN0aXZlU3RlcENvbXBsZXRlLCBjdXJyZW50U3RlcEluZGV4LCBvcGVuLCB2aXNpYmxlU3RlcHMubGVuZ3RoXSlcblxuICBjb25zdCBpc1N0ZXBEaXNhYmxlZCA9IChpbmRleDogbnVtYmVyKSA9PlxuICAgIGluZGV4ID4gZnVydGhlc3RTdGVwSW5kZXggfHxcbiAgICB2aXNpYmxlU3RlcHMuc2xpY2UoMCwgaW5kZXgpLnNvbWUoKHByZXZpb3VzKSA9PiAhc3RlcFZhbGlkaXR5W3ByZXZpb3VzXSlcblxuICBjb25zdCB2YWxpZGF0ZSA9ICgpID0+IHtcbiAgICBpZiAoIXByb2R1Y3QudGl0bGUudHJpbSgpKSB0aHJvdyBuZXcgRXJyb3IoXCJQcm9kdWN0IHRpdGxlIGlzIHJlcXVpcmVkXCIpXG4gICAgaWYgKCFjdXJyZW5jaWVzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWRkIGEgc3VwcG9ydGVkIGN1cnJlbmN5IHRvIHRoZSBzdG9yZSBiZWZvcmUgY29udGludWluZ1wiKVxuICAgIH1cbiAgICBjb25zdCBpbnZhbGlkUHJpY2UgPSBjdXJyZW5jaWVzLnNvbWUoKGN1cnJlbmN5KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHByb2R1Y3QucHJpY2VfYW1vdW50c1tjdXJyZW5jeS5jb2RlXSB8fCBcIlwiXG4gICAgICByZXR1cm4gdmFsdWUudHJpbSgpICYmIG5vbk5lZ2F0aXZlTnVtYmVyT3JOdWxsKHZhbHVlKSA9PSBudWxsXG4gICAgfSlcbiAgICBpZiAoaW52YWxpZFByaWNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm9kdWN0IHByaWNlcyBtdXN0IGJlIDAgb3IgbW9yZVwiKVxuICAgIH1cbiAgICBpZiAoIXByb2R1Y3RQcmljZXMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBZGQgYXQgbGVhc3Qgb25lIHByb2R1Y3QgcHJpY2VcIilcbiAgICB9XG4gICAgaWYgKGlzQW1vdW50VHlwZSkge1xuICAgICAgaWYgKCFjb3Vwb24uYW1vdW50cy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWRkIGF0IGxlYXN0IG9uZSBjb3Vwb24gdmFsdWVcIilcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKVxuICAgICAgY29uc3QgY3VycmVuY3lDb25kaXRpb24gPSBjb3Vwb24ucHVyY2hhc2VfY29uZGl0aW9ucy5maW5kKFxuICAgICAgICAoY29uZGl0aW9uKSA9PiBjb25kaXRpb24uYXR0cmlidXRlID09PSBcImN1cnJlbmN5X2NvZGVcIixcbiAgICAgIClcbiAgICAgIGlmICghY3VycmVuY3lDb25kaXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWRkIGEgQ3VycmVuY3kgQ29kZSBwdXJjaGFzZSBjb25kaXRpb25cIilcbiAgICAgIH1cbiAgICAgIGlmIChjb3Vwb24uYW1vdW50cy5sZW5ndGggIT09IGVmZmVjdGl2ZUN1cnJlbmNpZXMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIkNvdXBvbiB2YWx1ZXMgbXVzdCBtYXRjaCBldmVyeSBlZmZlY3RpdmUgY3VycmVuY3kgY29uZGl0aW9uIHZhbHVlXCIsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIGNvdXBvbi5hbW91bnRzKSB7XG4gICAgICAgIGlmICghc3VwcG9ydGVkQ3VycmVuY3lDb2Rlcy5oYXMocm93LmN1cnJlbmN5X2NvZGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2VsZWN0IGFuIGF2YWlsYWJsZSBjb3Vwb24gY3VycmVuY3lcIilcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2Vlbi5oYXMocm93LmN1cnJlbmN5X2NvZGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291cG9uIHZhbHVlIGN1cnJlbmNpZXMgY2Fubm90IGJlIGR1cGxpY2F0ZWRcIilcbiAgICAgICAgfVxuICAgICAgICBpZiAobnVtYmVyT3JOdWxsKHJvdy5hbW91bnQpID09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3Vwb24gdmFsdWVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIDBcIilcbiAgICAgICAgfVxuICAgICAgICBzZWVuLmFkZChyb3cuY3VycmVuY3lfY29kZSlcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc2VlbkF0dHJpYnV0ZXMgPSBuZXcgU2V0PHN0cmluZz4oKVxuICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvdXBvbi5wdXJjaGFzZV9jb25kaXRpb25zKSB7XG4gICAgICBpZiAoIWNvbmRpdGlvbi5hdHRyaWJ1dGUgfHwgIWNvbmRpdGlvbi5vcGVyYXRvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb21wbGV0ZSBldmVyeSBwdXJjaGFzZSBjb25kaXRpb25cIilcbiAgICAgIH1cbiAgICAgIGlmICghY29uZGl0aW9uLnZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2VsZWN0IGF0IGxlYXN0IG9uZSB2YWx1ZSBmb3IgZXZlcnkgcHVyY2hhc2UgY29uZGl0aW9uXCIpXG4gICAgICB9XG4gICAgICBpZiAoY29uZGl0aW9uLm9wZXJhdG9yID09PSBcImVxXCIgJiYgY29uZGl0aW9uLnZhbHVlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXF1YWxzIGNvbmRpdGlvbnMgcmVxdWlyZSBleGFjdGx5IG9uZSB2YWx1ZVwiKVxuICAgICAgfVxuICAgICAgaWYgKHNlZW5BdHRyaWJ1dGVzLmhhcyhjb25kaXRpb24uYXR0cmlidXRlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQdXJjaGFzZSBjb25kaXRpb24gYXR0cmlidXRlcyBjYW5ub3QgYmUgZHVwbGljYXRlZFwiKVxuICAgICAgfVxuICAgICAgc2VlbkF0dHJpYnV0ZXMuYWRkKGNvbmRpdGlvbi5hdHRyaWJ1dGUpXG4gICAgfVxuICAgIGlmIChpc1BlcmNlbnRhZ2VUeXBlKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG51bWJlck9yTnVsbChjb3Vwb24ucGVyY2VudGFnZSlcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID4gMTAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdXBvbiB2YWx1ZSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTAwIHBlcmNlbnRcIilcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvdXBvbi5jb2RlX3N0cmF0ZWd5ID09PSBcInNoYXJlZF9jb2RlXCIgJiYgIWNvdXBvbi5zaGFyZWRfY29kZS50cmltKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgc2hhcmVkIGNvdXBvbiBjb2RlIGlzIHJlcXVpcmVkXCIpXG4gICAgfVxuICAgIGlmIChjb3Vwb24uZXhwaXJhdGlvbl90eXBlID09PSBcImZpeGVkXCIpIHtcbiAgICAgIGNvbnN0IGV4cGlyYXRpb24gPSBuZXcgRGF0ZShjb3Vwb24uZXhwaXJhdGlvbl9kYXRlKVxuICAgICAgaWYgKCFjb3Vwb24uZXhwaXJhdGlvbl9kYXRlIHx8IE51bWJlci5pc05hTihleHBpcmF0aW9uLmdldFRpbWUoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSB2YWxpZCBmaXhlZCBleHBpcmF0aW9uIGRhdGUgaXMgcmVxdWlyZWRcIilcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvdXBvbi5leHBpcmF0aW9uX3R5cGUgIT09IFwibm9uZVwiICYmIGNvdXBvbi5leHBpcmF0aW9uX2NhcF9hdCkge1xuICAgICAgY29uc3QgY2FwID0gbmV3IERhdGUoY291cG9uLmV4cGlyYXRpb25fY2FwX2F0KVxuICAgICAgaWYgKE51bWJlci5pc05hTihjYXAuZ2V0VGltZSgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIHZhbGlkIGV4cGlyYXRpb24gY2FwIGRhdGUgaXMgcmVxdWlyZWRcIilcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNhbXBhaWduLm1vZGUgPT09IFwiZXhpc3RpbmdcIiAmJiAhY2FtcGFpZ24uY2FtcGFpZ25faWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNlbGVjdCBhbiBleGlzdGluZyBjYW1wYWlnblwiKVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBjYW1wYWlnbi5tb2RlID09PSBcIm5ld1wiICYmXG4gICAgICAoIWNhbXBhaWduLm5hbWUudHJpbSgpIHx8ICFjYW1wYWlnbi5jYW1wYWlnbl9pZGVudGlmaWVyLnRyaW0oKSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbXBhaWduIG5hbWUgYW5kIGlkZW50aWZpZXIgYXJlIHJlcXVpcmVkXCIpXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2F2ZSA9IGFzeW5jICgpID0+IHtcbiAgICBzZXRTYXZpbmcodHJ1ZSlcbiAgICB0cnkge1xuICAgICAgdmFsaWRhdGUoKVxuICAgICAgY29uc3QgYmVuZWZpdFR5cGUgPSBiZW5lZml0VHlwZUZyb21Db3Vwb25UeXBlKGNvdXBvbi50eXBlKVxuICAgICAgY29uc3QgdGFyZ2V0VHlwZSA9XG4gICAgICAgIGNvdXBvbi50eXBlID09PSBcImFtb3VudF9vZmZfb3JkZXJcIiB8fFxuICAgICAgICBjb3Vwb24udHlwZSA9PT0gXCJwZXJjZW50YWdlX29mZl9vcmRlclwiXG4gICAgICAgICAgPyBcIm9yZGVyXCJcbiAgICAgICAgICA6IFwiaXRlbXNcIlxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgcHJvZHVjdDoge1xuICAgICAgICAgIHRpdGxlOiBwcm9kdWN0LnRpdGxlLnRyaW0oKSxcbiAgICAgICAgICBzdWJ0aXRsZTogcHJvZHVjdC5zdWJ0aXRsZS50cmltKCkgfHwgbnVsbCxcbiAgICAgICAgICBoYW5kbGU6IHByb2R1Y3QuaGFuZGxlLnRyaW0oKSB8fCBudWxsLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBwcm9kdWN0LmRlc2NyaXB0aW9uLnRyaW0oKSB8fCBudWxsLFxuICAgICAgICAgIHN0YXR1czogcHJvZHVjdFN0YXR1c0Zyb21Db3Vwb25TdGF0dXMoY291cG9uLnByb21vdGlvbl9zdGF0dXMpLFxuICAgICAgICAgIHRodW1ibmFpbDogcHJvZHVjdC5tZWRpYVswXT8udXJsIHx8IG51bGwsXG4gICAgICAgICAgdGh1bWJuYWlsX2Fzc2V0X2lkOiBwcm9kdWN0Lm1lZGlhWzBdPy5hc3NldF9pZCB8fCBudWxsLFxuICAgICAgICAgIGltYWdlczogcHJvZHVjdC5tZWRpYS5zbGljZSgxKS5tYXAoKG1lZGlhKSA9PiAoe1xuICAgICAgICAgICAgdXJsOiBtZWRpYS51cmwsXG4gICAgICAgICAgICAuLi4obWVkaWEuYXNzZXRfaWQgPyB7IGFzc2V0X2lkOiBtZWRpYS5hc3NldF9pZCB9IDoge30pLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBkaXNjb3VudGFibGU6IHByb2R1Y3QuZGlzY291bnRhYmxlLFxuICAgICAgICAgIHR5cGVfaWQ6IHByb2R1Y3QudHlwZV9pZCB8fCBudWxsLFxuICAgICAgICAgIGNvbGxlY3Rpb25faWQ6IHByb2R1Y3QuY29sbGVjdGlvbl9pZCB8fCBudWxsLFxuICAgICAgICAgIGNhdGVnb3JpZXM6IHByb2R1Y3QuY2F0ZWdvcnlfaWQgPyBbeyBpZDogcHJvZHVjdC5jYXRlZ29yeV9pZCB9XSA6IFtdLFxuICAgICAgICAgIHRhZ3M6IHByb2R1Y3QudGFnX2lkID8gW3sgaWQ6IHByb2R1Y3QudGFnX2lkIH1dIDogW10sXG4gICAgICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGl0bGU6IFwiRGVmYXVsdFwiLFxuICAgICAgICAgICAgICBza3U6IHByb2R1Y3Quc2t1LnRyaW0oKSB8fCBudWxsLFxuICAgICAgICAgICAgICBtYW5hZ2VfaW52ZW50b3J5OiBmYWxzZSxcbiAgICAgICAgICAgICAgYWxsb3dfYmFja29yZGVyOiB0cnVlLFxuICAgICAgICAgICAgICBwcmljZXM6IHByb2R1Y3RQcmljZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIGNvdXBvbjoge1xuICAgICAgICAgIGVuYWJsZWQ6IGNvdXBvbi5lbmFibGVkLFxuICAgICAgICAgIGJlbmVmaXRfdHlwZTogYmVuZWZpdFR5cGUsXG4gICAgICAgICAgcHVyY2hhc2VfY29uZGl0aW9uczogY291cG9uLnB1cmNoYXNlX2NvbmRpdGlvbnMubWFwKChjb25kaXRpb24pID0+ICh7XG4gICAgICAgICAgICBhdHRyaWJ1dGU6IGNvbmRpdGlvbi5hdHRyaWJ1dGUsXG4gICAgICAgICAgICBvcGVyYXRvcjogY29uZGl0aW9uLm9wZXJhdG9yLFxuICAgICAgICAgICAgdmFsdWVzOiBjb25kaXRpb24udmFsdWVzLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBhbW91bnRzOiBpc0Ftb3VudFR5cGVcbiAgICAgICAgICAgID8gY291cG9uLmFtb3VudHMubWFwKChyb3cpID0+ICh7XG4gICAgICAgICAgICAgIGFtb3VudDogbnVtYmVyT3JOdWxsKHJvdy5hbW91bnQpLFxuICAgICAgICAgICAgICBjdXJyZW5jeV9jb2RlOiByb3cuY3VycmVuY3lfY29kZSxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIGFtb3VudDogbnVsbCxcbiAgICAgICAgICBwZXJjZW50YWdlOiBpc1BlcmNlbnRhZ2VUeXBlID8gbnVtYmVyT3JOdWxsKGNvdXBvbi5wZXJjZW50YWdlKSA6IG51bGwsXG4gICAgICAgICAgY3VycmVuY3lfY29kZTogbnVsbCxcbiAgICAgICAgICBjb2RlX3N0cmF0ZWd5OiBjb3Vwb24uY29kZV9zdHJhdGVneSxcbiAgICAgICAgICBjb2RlX3ByZWZpeDpcbiAgICAgICAgICAgIGNvdXBvbi5jb2RlX3N0cmF0ZWd5ID09PSBcInVuaXF1ZV9jb2RlXCJcbiAgICAgICAgICAgICAgPyBjb3Vwb24uY29kZV9wcmVmaXgudHJpbSgpIHx8IFwiQ09VUE9OXCJcbiAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIHNoYXJlZF9jb2RlOlxuICAgICAgICAgICAgY291cG9uLmNvZGVfc3RyYXRlZ3kgPT09IFwic2hhcmVkX2NvZGVcIlxuICAgICAgICAgICAgICA/IGNvdXBvbi5zaGFyZWRfY29kZS50cmltKClcbiAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIGV4cGlyYXRpb25fcG9saWN5OlxuICAgICAgICAgICAgY291cG9uLmV4cGlyYXRpb25fdHlwZSA9PT0gXCJub25lXCJcbiAgICAgICAgICAgICAgPyB7IHR5cGU6IFwibm9uZVwiIH1cbiAgICAgICAgICAgICAgOiBjb3Vwb24uZXhwaXJhdGlvbl90eXBlID09PSBcImZpeGVkXCJcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZml4ZWRcIixcbiAgICAgICAgICAgICAgICAgIGV4cGlyZXNfYXQ6IG5ldyBEYXRlKGNvdXBvbi5leHBpcmF0aW9uX2RhdGUpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICBjYXBfYnlfY2FtcGFpZ246IGNvdXBvbi5leHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbixcbiAgICAgICAgICAgICAgICAgIGNhcF9hdDogY291cG9uLmV4cGlyYXRpb25fY2FwX2F0XG4gICAgICAgICAgICAgICAgICAgID8gbmV3IERhdGUoY291cG9uLmV4cGlyYXRpb25fY2FwX2F0KS50b0lTT1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcImR1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgICBkdXJhdGlvbl9kYXlzOiBOdW1iZXIoY291cG9uLmV4cGlyYXRpb25fZGF5cykgfHwgMzAsXG4gICAgICAgICAgICAgICAgICBjYXBfYnlfY2FtcGFpZ246IGNvdXBvbi5leHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbixcbiAgICAgICAgICAgICAgICAgIGNhcF9hdDogY291cG9uLmV4cGlyYXRpb25fY2FwX2F0XG4gICAgICAgICAgICAgICAgICAgID8gbmV3IERhdGUoY291cG9uLmV4cGlyYXRpb25fY2FwX2F0KS50b0lTT1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgIG1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbTpcbiAgICAgICAgICAgIE51bWJlcihjb3Vwb24ubWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtKSB8fCAxLFxuICAgICAgICAgIHByb21vdGlvbl90ZW1wbGF0ZTpcbiAgICAgICAgICAgIGJlbmVmaXRUeXBlID09PSBcImZpeGVkX2Ftb3VudFwiIHx8IGJlbmVmaXRUeXBlID09PSBcInBlcmNlbnRhZ2VcIlxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbl9tZXRob2Q6IHtcbiAgICAgICAgICAgICAgICAgIHRhcmdldF90eXBlOiB0YXJnZXRUeXBlLFxuICAgICAgICAgICAgICAgICAgYWxsb2NhdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VHlwZSA9PT0gXCJvcmRlclwiID8gXCJhY3Jvc3NcIiA6IGNvdXBvbi5hbGxvY2F0aW9uLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIHByb21vdGlvbl9zdGF0dXM6IGNvdXBvbi5wcm9tb3Rpb25fc3RhdHVzLFxuICAgICAgICAgIC4uLihhbGxvd1Byb21vdGlvbk1pcnJvclxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHByb21vdGlvbl9taXJyb3JfbW9kZTpcbiAgICAgICAgICAgICAgICBiZW5lZml0VHlwZSA9PT0gXCJidXlfZ2V0XCIgfHxcbiAgICAgICAgICAgICAgICAgIChiZW5lZml0VHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIiAmJiBjb3Vwb24uYW1vdW50cy5sZW5ndGggPiAxKVxuICAgICAgICAgICAgICAgICAgPyBcIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgOiBjb3Vwb24ucHJvbW90aW9uX21pcnJvcl9tb2RlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0sXG4gICAgICAgIGNhbXBhaWduOiBhbGxvd1Byb21vdGlvbk1pcnJvclxuICAgICAgICAgID8gY2FtcGFpZ24ubW9kZSA9PT0gXCJleGlzdGluZ1wiXG4gICAgICAgICAgICA/IHsgbW9kZTogXCJleGlzdGluZ1wiLCBjYW1wYWlnbl9pZDogY2FtcGFpZ24uY2FtcGFpZ25faWQgfVxuICAgICAgICAgICAgOiBjYW1wYWlnbi5tb2RlID09PSBcIm5ld1wiXG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIG1vZGU6IFwibmV3XCIsXG4gICAgICAgICAgICAgICAgY2FtcGFpZ246IHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IGNhbXBhaWduLm5hbWUsXG4gICAgICAgICAgICAgICAgICBjYW1wYWlnbl9pZGVudGlmaWVyOiBjYW1wYWlnbi5jYW1wYWlnbl9pZGVudGlmaWVyLFxuICAgICAgICAgICAgICAgICAgc3RhcnRzX2F0OiBjYW1wYWlnbi5zdGFydHNfYXRcbiAgICAgICAgICAgICAgICAgICAgPyBuZXcgRGF0ZShjYW1wYWlnbi5zdGFydHNfYXQpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgZW5kc19hdDogY2FtcGFpZ24uZW5kc19hdFxuICAgICAgICAgICAgICAgICAgICA/IG5ldyBEYXRlKGNhbXBhaWduLmVuZHNfYXQpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiB7IG1vZGU6IFwibm9uZVwiIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VsbGVyX2lkOiBwcm9kdWN0LnNlbGxlcl9pZCB8fCBudWxsLFxuICAgICAgICB2YXJpYW50X292ZXJyaWRlczogW10sXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGFwaUZldGNoKFxuICAgICAgICByb3dcbiAgICAgICAgICA/IGAke2FwaUJhc2V9L2NvdXBvbi1wcm9kdWN0cy8ke3Jvdy5wcm9kdWN0LmlkfWBcbiAgICAgICAgICA6IGAke2FwaUJhc2V9L2NvdXBvbi1wcm9kdWN0c2AsXG4gICAgICAgIHtcbiAgICAgICAgICBtZXRob2Q6IHJvdyA/IFwiUEFUQ0hcIiA6IFwiUE9TVFwiLFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICAgICAgICB9LFxuICAgICAgKVxuICAgICAgdG9hc3Quc3VjY2Vzcyhyb3cgPyBcIkNvdXBvbiBwcm9kdWN0IHVwZGF0ZWRcIiA6IFwiQ291cG9uIHByb2R1Y3QgY3JlYXRlZFwiKVxuICAgICAgb25PcGVuQ2hhbmdlKGZhbHNlKVxuICAgICAgYXdhaXQgb25TYXZlZCgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRvYXN0LmVycm9yKFxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgPyBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgOiBcIkZhaWxlZCB0byBzYXZlIGNvdXBvbiBwcm9kdWN0XCIsXG4gICAgICApXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldFNhdmluZyhmYWxzZSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdGVwU3RhdHVzID0gKHN0ZXA6IFdpemFyZFN0ZXApID0+IHtcbiAgICBjb25zdCBpbmRleCA9IHZpc2libGVTdGVwcy5pbmRleE9mKHN0ZXApXG4gICAgaWYgKGluZGV4IDwgY3VycmVudFN0ZXBJbmRleCAmJiBzdGVwVmFsaWRpdHlbc3RlcF0pIHtcbiAgICAgIHJldHVybiBcImNvbXBsZXRlZFwiIGFzIGNvbnN0XG4gICAgfVxuICAgIGlmIChpbmRleCA9PT0gY3VycmVudFN0ZXBJbmRleCkgcmV0dXJuIFwiaW4tcHJvZ3Jlc3NcIiBhcyBjb25zdFxuICAgIHJldHVybiBcIm5vdC1zdGFydGVkXCIgYXMgY29uc3RcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPEZvY3VzTW9kYWwgb3Blbj17b3Blbn0gb25PcGVuQ2hhbmdlPXtvbk9wZW5DaGFuZ2V9PlxuICAgICAgPEZvY3VzTW9kYWwuQ29udGVudCBzdHlsZT17bW9kYWxDb250ZW50U3R5bGV9PlxuICAgICAgICA8Rm9jdXNNb2RhbC5UaXRsZSBzdHlsZT17dmlzdWFsbHlIaWRkZW5TdHlsZX0+XG4gICAgICAgICAge3JvdyA/IFwiRWRpdCBDb3Vwb24gUHJvZHVjdFwiIDogXCJDcmVhdGUgQ291cG9uIFByb2R1Y3RcIn1cbiAgICAgICAgPC9Gb2N1c01vZGFsLlRpdGxlPlxuICAgICAgICA8UHJvZ3Jlc3NUYWJzXG4gICAgICAgICAgdmFsdWU9e2FjdGl2ZVN0ZXB9XG4gICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGVwID0gdmFsdWUgYXMgV2l6YXJkU3RlcFxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB2aXNpYmxlU3RlcHMuaW5kZXhPZihzdGVwKVxuICAgICAgICAgICAgaWYgKCFpc1N0ZXBEaXNhYmxlZChpbmRleCkpIHNldEFjdGl2ZVN0ZXAoc3RlcClcbiAgICAgICAgICB9fVxuICAgICAgICAgIHN0eWxlPXttb2RhbFdpemFyZFN0eWxlfVxuICAgICAgICA+XG4gICAgICAgICAgPEZvY3VzTW9kYWwuSGVhZGVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCItbXktMiB3LWZ1bGwgYm9yZGVyLWxcIj5cbiAgICAgICAgICAgICAgPFByb2dyZXNzVGFicy5MaXN0IGNsYXNzTmFtZT1cImp1c3RpZnktc3RhcnQtc3RhcnQgZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAge3Zpc2libGVTdGVwcy5tYXAoKHN0ZXAsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgICAgICA8UHJvZ3Jlc3NUYWJzLlRyaWdnZXJcbiAgICAgICAgICAgICAgICAgICAga2V5PXtzdGVwfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c3RlcH1cbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzPXtzdGVwU3RhdHVzKHN0ZXApfVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17aXNTdGVwRGlzYWJsZWQoaW5kZXgpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJtYXgtdy1bMjAwcHhdIHRydW5jYXRlXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3N0ZXBbMF0udG9VcHBlckNhc2UoKSArIHN0ZXAuc2xpY2UoMSl9XG4gICAgICAgICAgICAgICAgICA8L1Byb2dyZXNzVGFicy5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICA8L1Byb2dyZXNzVGFicy5MaXN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9Gb2N1c01vZGFsLkhlYWRlcj5cblxuICAgICAgICAgIDxGb2N1c01vZGFsLkJvZHkgY2xhc3NOYW1lPVwib3ZlcmZsb3ctaGlkZGVuIHAtMFwiIHN0eWxlPXttb2RhbEJvZHlTdHlsZX0+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIHN0eWxlPXtcbiAgICAgICAgICAgICAgICBhY3RpdmVTdGVwID09PSBcInByaWNlc1wiXG4gICAgICAgICAgICAgICAgICA/IHsgaGVpZ2h0OiBcIjEwMCVcIiwgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsIHdpZHRoOiBcIjEwMCVcIiB9XG4gICAgICAgICAgICAgICAgICA6IG1vZGFsU2Nyb2xsU3R5bGVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgc3R5bGU9e1xuICAgICAgICAgICAgICAgICAgYWN0aXZlU3RlcCA9PT0gXCJwcmljZXNcIlxuICAgICAgICAgICAgICAgICAgICA/IHsgaGVpZ2h0OiBcIjEwMCVcIiwgd2lkdGg6IFwiMTAwJVwiIH1cbiAgICAgICAgICAgICAgICAgICAgOiBtb2RhbEZvcm1TdHlsZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHthY3RpdmVTdGVwID09PSBcImRldGFpbHNcIiAmJiAoXG4gICAgICAgICAgICAgICAgICA8UHJvZ3Jlc3NUYWJzLkNvbnRlbnQgdmFsdWU9XCJkZXRhaWxzXCIgc3R5bGU9e3N0YWNrU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICA8SGVhZGluZyBsZXZlbD1cImgxXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3JvdyA/IFwiRWRpdCBDb3Vwb24gUHJvZHVjdFwiIDogXCJDcmVhdGUgQ291cG9uIFByb2R1Y3RcIn1cbiAgICAgICAgICAgICAgICAgICAgPC9IZWFkaW5nPlxuICAgICAgICAgICAgICAgICAgICA8RGl2aWRlciAvPlxuICAgICAgICAgICAgICAgICAgICA8U2VjdGlvbiB0aXRsZT1cIkdlbmVyYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt0aHJlZUNvbHVtbkdyaWRTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJUaXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdC50aXRsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIldpbnRlciBqYWNrZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlN1YnRpdGxlXCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0LnN1YnRpdGxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiV2FybSBhbmQgY296eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3QoKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlOiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiSGFuZGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cIlRoZSBVUkwtZnJpZW5kbHkgaWRlbnRpZmllciBmb3IgdGhpcyBwcm9kdWN0LiBJZiBsZWZ0IGVtcHR5LCBNZWR1c2EgZ2VuZXJhdGVzIGl0IGZyb20gdGhlIHRpdGxlLlwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxIYW5kbGVJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0LmhhbmRsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGhhbmRsZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3QoKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIGhhbmRsZSB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkRlc2NyaXB0aW9uXCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3QuZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQSB3YXJtIGFuZCBjb3p5IGphY2tldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdCgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiTWVkaWFcIiBvcHRpb25hbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxNZWRpYVVwbG9hZFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1VwbG9hZGluZz17dXBsb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYT17cHJvZHVjdC5tZWRpYX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25VcGxvYWQ9eyhmaWxlcykgPT4gdm9pZCB1cGxvYWRNZWRpYShmaWxlcyl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uUmVtb3ZlPXsobWVkaWEpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdCgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTogY3VycmVudC5tZWRpYS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZWRpYS5hc3NldF9pZCAmJiBpdGVtLmFzc2V0X2lkICE9PSBtZWRpYS5hc3NldF9pZCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIW1lZGlhLmFzc2V0X2lkICYmIGl0ZW0udXJsICE9PSBtZWRpYS51cmwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlNLVVwiIG9wdGlvbmFsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0LnNrdX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJDT1VQT04tMDAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvU2VjdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPERpdmlkZXIgLz5cbiAgICAgICAgICAgICAgICAgICAgPFB1cmNoYXNlQ29uZGl0aW9uc0ZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgZml4ZWRBbW91bnQ9e2lzQW1vdW50VHlwZX1cbiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb24ucHVyY2hhc2VfY29uZGl0aW9uc31cbiAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlUHVyY2hhc2VDb25kaXRpb25zfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9Qcm9ncmVzc1RhYnMuQ29udGVudD5cbiAgICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgICAge2FjdGl2ZVN0ZXAgPT09IFwib3JnYW5pemVcIiAmJiAoXG4gICAgICAgICAgICAgICAgICA8UHJvZ3Jlc3NUYWJzLkNvbnRlbnQgdmFsdWU9XCJvcmdhbml6ZVwiIHN0eWxlPXtzdGFja1N0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgPFNlY3Rpb24gdGl0bGU9XCJPcmdhbml6ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3BhbmVsU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLXgtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHdlaWdodD1cInBsdXNcIj5EaXNjb3VudGFibGU8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3cgcHJvbW90aW9ucyB0byBkaXNjb3VudCB0aGlzIHByb2R1Y3QncyBzYWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmljZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U3dpdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17cHJvZHVjdC5kaXNjb3VudGFibGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGVja2VkQ2hhbmdlPXsoZGlzY291bnRhYmxlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdCgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY291bnRhYmxlOiBCb29sZWFuKGRpc2NvdW50YWJsZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt0d29Db2x1bW5HcmlkU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAge2FsbG93UHJvbW90aW9uTWlycm9yICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiU2VsbGVyXCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPE9wdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3Quc2VsbGVyX2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5zZWxsZXJzIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhzZWxsZXJfaWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3QoKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIHNlbGxlcl9pZCB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlR5cGVcIiBvcHRpb25hbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPE9wdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0LnR5cGVfaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5wcm9kdWN0X3R5cGVzIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodHlwZV9pZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3QoKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIHR5cGVfaWQgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkNvbGxlY3Rpb25cIiBvcHRpb25hbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPE9wdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0LmNvbGxlY3Rpb25faWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5wcm9kdWN0X2NvbGxlY3Rpb25zIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoY29sbGVjdGlvbl9pZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3QoKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25faWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ2F0ZWdvcnlcIiBvcHRpb25hbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPE9wdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0LmNhdGVnb3J5X2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMucHJvZHVjdF9jYXRlZ29yaWVzIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoY2F0ZWdvcnlfaWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBjYXRlZ29yeV9pZCB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiVGFnXCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxPcHRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdC50YWdfaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5wcm9kdWN0X3RhZ3MgfHwgW119XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh0YWdfaWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCB0YWdfaWQgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9TZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgPC9Qcm9ncmVzc1RhYnMuQ29udGVudD5cbiAgICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgICAge2FjdGl2ZVN0ZXAgPT09IFwiZGV0YWlsc1wiICYmIChcbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgLi4uc3RhY2tTdHlsZSwgbWFyZ2luVG9wOiAyNCB9fT5cbiAgICAgICAgICAgICAgICAgICAgPERpdmlkZXIgLz5cbiAgICAgICAgICAgICAgICAgICAgPFNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkNvdXBvblwiXG4gICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249XCJDb25maWd1cmUgdGhlIGNvdXBvbiBpc3N1ZWQgd2hlbiB0aGlzIHByb2R1Y3QgaXMgcHVyY2hhc2VkLlwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtwYW5lbFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC14LTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCB3ZWlnaHQ9XCJwbHVzXCI+Q291cG9uIGlzc3VhbmNlPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzc3VlIGNvdXBvbnMgd2hlbiBjdXN0b21lcnMgcHVyY2hhc2UgdGhpcyBwcm9kdWN0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTd2l0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtjb3Vwb24uZW5hYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoZWNrZWRDaGFuZ2U9eyhlbmFibGVkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiBCb29sZWFuKGVuYWJsZWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8U2VjdGlvbiB0aXRsZT1cIlR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxSYWRpb0dyb3VwXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb24udHlwZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHR5cGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ291cG9uVHlwZSh0eXBlIGFzIENvdXBvblR5cGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAteS0zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3R5cGVDaG9pY2VzLm1hcCgoY2hvaWNlKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJhZGlvR3JvdXAuQ2hvaWNlQm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2Nob2ljZS52YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjaG9pY2UudmFsdWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17Y2hvaWNlLmxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249e2Nob2ljZS5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvUmFkaW9Hcm91cD5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlY3Rpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8U2VjdGlvbiB0aXRsZT1cIlN0YXR1c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFJhZGlvR3JvdXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbi5wcm9tb3Rpb25fc3RhdHVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsocHJvbW90aW9uX3N0YXR1cykgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uX3N0YXR1czpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uX3N0YXR1cyBhcyBQcm9tb3Rpb25TdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3R3b0NvbHVtbkdyaWRTdHlsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3N0YXR1c0Nob2ljZXMubWFwKChjaG9pY2UpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UmFkaW9Hcm91cC5DaG9pY2VCb3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17Y2hvaWNlLnZhbHVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2Nob2ljZS52YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtjaG9pY2UubGFiZWx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj17Y2hvaWNlLmRlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9SYWRpb0dyb3VwPlxuICAgICAgICAgICAgICAgICAgICAgIDwvU2VjdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICAgIHsoaXNBbW91bnRUeXBlIHx8IGlzUGVyY2VudGFnZVR5cGUpICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWN0aW9uIHRpdGxlPXtpc0Ftb3VudFR5cGUgPyBcIkNvdXBvbiBWYWx1ZXNcIiA6IFwiVmFsdWVcIn0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtpc0Ftb3VudFR5cGUgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjb3Vwb24uYW1vdW50cy5tYXAoKHJvdywgcm93SW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVuY3kgPSBjdXJyZW5jaWVzLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW0pID0+IGl0ZW0uY29kZSA9PT0gcm93LmN1cnJlbmN5X2NvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17cm93LmtleX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInNoYWRvdy1lbGV2YXRpb24tY2FyZC1yZXN0IGJnLXVpLWJnLWNvbXBvbmVudCByb3VuZGVkLW1kIHB4LTQgcHktM1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cm93LmN1cnJlbmN5X2NvZGUudG9VcHBlckNhc2UoKX0gQ291cG9uIFZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9MYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y3VycmVuY3k/Lm5hbWUgfHwgcm93LmN1cnJlbmN5X2NvZGUudG9VcHBlckNhc2UoKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDdXJyZW5jeUFtb3VudEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jaWVzPXtjdXJyZW5jaWVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY3lDb2RlPXtyb3cuY3VycmVuY3lfY29kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtyb3cuYW1vdW50fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhhbW91bnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtb3VudHM6IGN1cnJlbnQuYW1vdW50cy5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbSwgaW5kZXgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID09PSByb3dJbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8geyAuLi5pdGVtLCBhbW91bnQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHshY291cG9uLmFtb3VudHMubGVuZ3RoICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdCBhdCBsZWFzdCBvbmUgZWZmZWN0aXZlIEN1cnJlbmN5IENvZGUgY29uZGl0aW9uIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkNvdXBvbiBWYWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFBlcmNlbnRhZ2VJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLnBlcmNlbnRhZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsocGVyY2VudGFnZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAgICAgICAgICB7aXNJdGVtU2NvcGVkRGlzY291bnQgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VjdGlvbiB0aXRsZT1cIkFsbG9jYXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UmFkaW9Hcm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbi5hbGxvY2F0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KGFsbG9jYXRpb24pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb246IGFsbG9jYXRpb24gYXMgQ291cG9uQWxsb2NhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17dHdvQ29sdW1uR3JpZFN0eWxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxSYWRpb0dyb3VwLkNob2ljZUJveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cImVhY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkVhY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj1cIkFwcGxpZXMgdmFsdWUgb24gZWFjaCBpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UmFkaW9Hcm91cC5DaG9pY2VCb3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJvbmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJPbmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249XCJMaW1pdCBkaXNjb3VudCB0byBtYXggcXVhbnRpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1JhZGlvR3JvdXA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VjdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAgICAgICAgICA8U2VjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJFeHBpcmF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPVwiQ29udHJvbCB3aGVuIGlzc3VlZCBjb3Vwb25zIGV4cGlyZS5cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3R3b0NvbHVtbkdyaWRTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkV4cGlyYXRpb24gcG9saWN5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbi5leHBpcmF0aW9uX3R5cGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsoZXhwaXJhdGlvbl90eXBlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmF0aW9uX3R5cGU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmF0aW9uX3R5cGUgYXMgRXhwaXJhdGlvblBvbGljeVR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwibm9uZVwiPk5vbmU8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJkdXJhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1cmF0aW9uIGFmdGVyIGlzc3VlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImZpeGVkXCI+Rml4ZWQgZGF0ZTwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7Y291cG9uLmV4cGlyYXRpb25fdHlwZSA9PT0gXCJkdXJhdGlvblwiID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkV4cGlyYXRpb24gZGF5c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW49ezF9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb24uZXhwaXJhdGlvbl9kYXlzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmF0aW9uX2RheXM6IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApIDogY291cG9uLmV4cGlyYXRpb25fdHlwZSA9PT0gXCJmaXhlZFwiID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkV4cGlyZXMgYXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLmV4cGlyYXRpb25fZGF0ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJhdGlvbl9kYXRlOiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtjb3Vwb24uZXhwaXJhdGlvbl90eXBlICE9PSBcIm5vbmVcIiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkNhcCBleHBpcmF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLXgtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgLi4ucGFuZWxTdHlsZSwgcGFkZGluZzogXCI4cHggMTJweFwiIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW1wYWlnbiBlbmQgb3IgY2FwIGRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFN3aXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17Y291cG9uLmV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWdufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGVja2VkQ2hhbmdlPXsoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWduLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbjogQm9vbGVhbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWduLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkV4cGlyYXRpb24gY2FwIGRhdGVcIiBvcHRpb25hbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWNvdXBvbi5leHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLmV4cGlyYXRpb25fY2FwX2F0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyYXRpb25fY2FwX2F0OiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TZWN0aW9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgPFNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj1cIkNob29zZSB3aGV0aGVyIGV2ZXJ5IGlzc3VlZCBjb3Vwb24gaXMgdW5pcXVlIG9yIHNoYXJlcyBvbmUgY29kZS5cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3R3b0NvbHVtbkdyaWRTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkNvZGUgc3RyYXRlZ3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLmNvZGVfc3RyYXRlZ3l9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsoY29kZV9zdHJhdGVneSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9zdHJhdGVneTogY29kZV9zdHJhdGVneSBhcyBDb2RlU3RyYXRlZ3ksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwidW5pcXVlX2NvZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmlxdWUgY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJzaGFyZWRfY29kZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoYXJlZCBjb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7Y291cG9uLmNvZGVfc3RyYXRlZ3kgPT09IFwidW5pcXVlX2NvZGVcIiA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDb2RlIHByZWZpeFwiIG9wdGlvbmFsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb24uY29kZV9wcmVmaXh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ09VUE9OXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9wcmVmaXg6IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlNoYXJlZCBjb2RlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbi5zaGFyZWRfY29kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTVU1NRVIxNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9jb2RlOiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvU2VjdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICAgIDxTZWN0aW9uIHRpdGxlPVwiSXNzdWFuY2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3R3b0NvbHVtbkdyaWRTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIk1heCBpc3N1YW5jZSBwZXIgaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW49ezF9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLm1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbTogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7YWxsb3dQcm9tb3Rpb25NaXJyb3IgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbW91bnRUeXBlICYmIGNvdXBvbi5hbW91bnRzLmxlbmd0aCA+IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlByb21vdGlvbiBtaXJyb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb24ucHJvbW90aW9uX21pcnJvcl9tb2RlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtjb3Vwb24udHlwZSA9PT0gXCJidXlfeF9nZXRfeVwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyhwcm9tb3Rpb25fbWlycm9yX21vZGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbl9taXJyb3JfbW9kZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25fbWlycm9yX21vZGUgYXMgTWlycm9yTW9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cIm5vbmVcIj5Ob25lPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cIm1hbnVhbFwiPk1hbnVhbDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJhdXRvXCI+QXV0bzwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlY3Rpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvU2VjdGlvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAgICB7YWxsb3dQcm9tb3Rpb25NaXJyb3IgJiYgYWN0aXZlU3RlcCA9PT0gXCJjYW1wYWlnblwiICYmIChcbiAgICAgICAgICAgICAgICAgIDxQcm9ncmVzc1RhYnMuQ29udGVudCB2YWx1ZT1cImNhbXBhaWduXCIgc3R5bGU9e3N0YWNrU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICA8U2VjdGlvbiB0aXRsZT1cIkNhbXBhaWduXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17dHdvQ29sdW1uR3JpZFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkNhbXBhaWduIG1vZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjYW1wYWlnbi5tb2RlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyhtb2RlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FtcGFpZ24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU6IG1vZGUgYXMgQ2FtcGFpZ25Nb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwibm9uZVwiPk5vIGNhbXBhaWduPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImV4aXN0aW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4aXN0aW5nIGNhbXBhaWduXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwibmV3XCI+TmV3IGNhbXBhaWduPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2FtcGFpZ24ubW9kZSA9PT0gXCJleGlzdGluZ1wiICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiRXhpc3RpbmcgY2FtcGFpZ25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8T3B0aW9uU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2FtcGFpZ24uY2FtcGFpZ25faWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zLmNhbXBhaWducyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoY2FtcGFpZ25faWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENhbXBhaWduKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtcGFpZ25faWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAge2NhbXBhaWduLm1vZGUgPT09IFwibmV3XCIgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIk5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2FtcGFpZ24ubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDYW1wYWlnbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJJZGVudGlmaWVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NhbXBhaWduLmNhbXBhaWduX2lkZW50aWZpZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FtcGFpZ24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtcGFpZ25faWRlbnRpZmllcjogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiU3RhcnRzIGF0XCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NhbXBhaWduLnN0YXJ0c19hdH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDYW1wYWlnbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydHNfYXQ6IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkVuZHMgYXRcIiBvcHRpb25hbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2FtcGFpZ24uZW5kc19hdH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDYW1wYWlnbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRzX2F0OiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L1NlY3Rpb24+XG4gICAgICAgICAgICAgICAgICA8L1Byb2dyZXNzVGFicy5Db250ZW50PlxuICAgICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAgICB7YWN0aXZlU3RlcCA9PT0gXCJwcmljZXNcIiAmJiAoXG4gICAgICAgICAgICAgICAgICA8UHJvZ3Jlc3NUYWJzLkNvbnRlbnQgdmFsdWU9XCJwcmljZXNcIiBzdHlsZT17eyBoZWlnaHQ6IFwiMTAwJVwiIH19PlxuICAgICAgICAgICAgICAgICAgICA8UHJvZHVjdFByaWNlc1RhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVuY2llcz17Y3VycmVuY2llc31cbiAgICAgICAgICAgICAgICAgICAgICBjb3Vwb25WYWx1ZT17Zm9ybWF0Q291cG9uVmFsdWUoY291cG9uLCBjdXJyZW5jaWVzKX1cbiAgICAgICAgICAgICAgICAgICAgICBwcmljZXM9e3Byb2R1Y3QucHJpY2VfYW1vdW50c31cbiAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGN1cnJlbmN5Q29kZSwgdmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmljZV9hbW91bnRzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudC5wcmljZV9hbW91bnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjdXJyZW5jeUNvZGVdOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvUHJvZ3Jlc3NUYWJzLkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L0ZvY3VzTW9kYWwuQm9keT5cblxuICAgICAgICAgIDxGb2N1c01vZGFsLkZvb3RlciBzdHlsZT17eyBmbGV4U2hyaW5rOiAwIH19PlxuICAgICAgICAgICAgPEJ1dHRvbiB2YXJpYW50PVwic2Vjb25kYXJ5XCIgb25DbGljaz17KCkgPT4gb25PcGVuQ2hhbmdlKGZhbHNlKX0+XG4gICAgICAgICAgICAgIENhbmNlbFxuICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICB7Y3VycmVudFN0ZXBJbmRleCA+IDAgJiYgKFxuICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgIHNldEFjdGl2ZVN0ZXAodmlzaWJsZVN0ZXBzW2N1cnJlbnRTdGVwSW5kZXggLSAxXSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBCYWNrXG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHtjdXJyZW50U3RlcEluZGV4IDwgdmlzaWJsZVN0ZXBzLmxlbmd0aCAtIDEgPyAoXG4gICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWFjdGl2ZVN0ZXBDb21wbGV0ZX1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBuZXh0SW5kZXggPSBjdXJyZW50U3RlcEluZGV4ICsgMVxuICAgICAgICAgICAgICAgICAgc2V0RnVydGhlc3RTdGVwSW5kZXgoKGN1cnJlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KGN1cnJlbnQsIG5leHRJbmRleCksXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICBzZXRBY3RpdmVTdGVwKHZpc2libGVTdGVwc1tuZXh0SW5kZXhdKVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBDb250aW51ZVxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWFjdGl2ZVN0ZXBDb21wbGV0ZX1cbiAgICAgICAgICAgICAgICBpc0xvYWRpbmc9e3NhdmluZ31cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB2b2lkIHNhdmUoKX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIFNhdmVcbiAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvRm9jdXNNb2RhbC5Gb290ZXI+XG4gICAgICAgIDwvUHJvZ3Jlc3NUYWJzPlxuICAgICAgPC9Gb2N1c01vZGFsLkNvbnRlbnQ+XG4gICAgPC9Gb2N1c01vZGFsPlxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDb3Vwb25Qcm9kdWN0c1BhZ2Uoe1xuICBhbGxvd1Byb21vdGlvbk1pcnJvciA9IGZhbHNlLFxuICBhcGlCYXNlLFxuICB0aXRsZSxcbn06IHtcbiAgYWxsb3dQcm9tb3Rpb25NaXJyb3I/OiBib29sZWFuXG4gIGFwaUJhc2U6IEFwaUJhc2VcbiAgdGl0bGU6IHN0cmluZ1xufSkge1xuICBjb25zdCBbcHJvZHVjdHMsIHNldFByb2R1Y3RzXSA9IHVzZVN0YXRlPENvdXBvblByb2R1Y3RSb3dbXT4oW10pXG4gIGNvbnN0IFtvcHRpb25zLCBzZXRPcHRpb25zXSA9IHVzZVN0YXRlPE9wdGlvbnNQYXlsb2FkPih7fSlcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSlcbiAgY29uc3QgW2xvYWRFcnJvciwgc2V0TG9hZEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFttb2RhbE9wZW4sIHNldE1vZGFsT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2VkaXRpbmdSb3csIHNldEVkaXRpbmdSb3ddID0gdXNlU3RhdGU8Q291cG9uUHJvZHVjdFJvdyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHByb21wdCA9IHVzZVByb21wdCgpXG4gIGNvbnN0IGNvdXBvbkJhc2UgPSBgJHthcGlCYXNlfS9jb3Vwb24tcHJvZHVjdHNgXG5cbiAgY29uc3QgbG9hZCA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgc2V0TG9hZEVycm9yKG51bGwpXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IFtwcm9kdWN0c1BheWxvYWQsIG9wdGlvbnNQYXlsb2FkXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgYXBpRmV0Y2g8eyBjb3Vwb25fcHJvZHVjdHM6IENvdXBvblByb2R1Y3RSb3dbXSB9Pihjb3Vwb25CYXNlKSxcbiAgICAgICAgYXBpRmV0Y2g8T3B0aW9uc1BheWxvYWQ+KGAke2NvdXBvbkJhc2V9L29wdGlvbnNgKSxcbiAgICAgIF0pXG4gICAgICBzZXRQcm9kdWN0cyhwcm9kdWN0c1BheWxvYWQuY291cG9uX3Byb2R1Y3RzIHx8IFtdKVxuICAgICAgc2V0T3B0aW9ucyhvcHRpb25zUGF5bG9hZCB8fCB7fSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICA/IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICA6IFwiRmFpbGVkIHRvIGxvYWQgY291cG9uIHByb2R1Y3RzXCJcbiAgICAgIHNldExvYWRFcnJvcihtZXNzYWdlKVxuICAgICAgdG9hc3QuZXJyb3IobWVzc2FnZSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICB9XG4gIH0sIFtjb3Vwb25CYXNlXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHZvaWQgbG9hZCgpXG4gIH0sIFtsb2FkXSlcblxuICBjb25zdCByZW1vdmUgPSBhc3luYyAocm93OiBDb3Vwb25Qcm9kdWN0Um93KSA9PiB7XG4gICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgcHJvbXB0KHtcbiAgICAgIHRpdGxlOiBcIlJlbW92ZSBjb3Vwb24gcHJvZHVjdD9cIixcbiAgICAgIGRlc2NyaXB0aW9uOiBgVGhpcyByZW1vdmVzIGNvdXBvbiBpc3N1YW5jZSBmcm9tICR7cm93LnByb2R1Y3QudGl0bGUgfHwgcm93LnByb2R1Y3QuaWRcbiAgICAgICAgfS4gVGhlIHVuZGVybHlpbmcgTWVkdXNhIHByb2R1Y3Qgd2lsbCByZW1haW4gYXZhaWxhYmxlLmAsXG4gICAgICBjb25maXJtVGV4dDogXCJSZW1vdmUgcHJvZHVjdFwiLFxuICAgICAgY2FuY2VsVGV4dDogXCJDYW5jZWxcIixcbiAgICAgIHZhcmlhbnQ6IFwiZGFuZ2VyXCIsXG4gICAgfSlcbiAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgYXBpRmV0Y2goYCR7Y291cG9uQmFzZX0vJHtyb3cucHJvZHVjdC5pZH1gLCB7IG1ldGhvZDogXCJERUxFVEVcIiB9KVxuICAgICAgdG9hc3Quc3VjY2VzcyhcIkNvdXBvbiBjb25maWd1cmF0aW9uIHJlbW92ZWRcIilcbiAgICAgIGF3YWl0IGxvYWQoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0b2FzdC5lcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiRGVsZXRlIGZhaWxlZFwiKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1pcnJvciA9IGFzeW5jIChyb3c6IENvdXBvblByb2R1Y3RSb3cpID0+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYXBpRmV0Y2goXG4gICAgICAgIGAvYWRtaW4vY291cG9uLXByb2R1Y3RzLyR7cm93LnByb2R1Y3QuaWR9L21pcnJvci1wcm9tb3Rpb25gLFxuICAgICAgICB7XG4gICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7fSksXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgICB0b2FzdC5zdWNjZXNzKFwiUHJvbW90aW9uIG1pcnJvciBjcmVhdGVkXCIpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRvYXN0LmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJNaXJyb3IgZmFpbGVkXCIpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8Q29udGFpbmVyIGNsYXNzTmFtZT1cImRpdmlkZS15IHAtMFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHgtNiBweS00XCI+XG4gICAgICAgIDxIZWFkaW5nIGxldmVsPVwiaDFcIj57dGl0bGV9PC9IZWFkaW5nPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC14LTJcIj5cbiAgICAgICAgICA8QnV0dG9uIHNpemU9XCJzbWFsbFwiIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIiBvbkNsaWNrPXsoKSA9PiB2b2lkIGxvYWQoKX0+XG4gICAgICAgICAgICA8QXJyb3dQYXRoIC8+IFJlZnJlc2hcbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICBzZXRFZGl0aW5nUm93KG51bGwpXG4gICAgICAgICAgICAgIHNldE1vZGFsT3Blbih0cnVlKVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8UGx1cyAvPiBDcmVhdGVcbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgIDxDb3Vwb25FbXB0eVN0YXRlIHRpdGxlPVwiTG9hZGluZyBjb3Vwb24gcHJvZHVjdHNcIiAvPlxuICAgICAgKSA6IGxvYWRFcnJvciA/IChcbiAgICAgICAgPENvdXBvbkVtcHR5U3RhdGUgdGl0bGU9e2xvYWRFcnJvcn0gLz5cbiAgICAgICkgOiBwcm9kdWN0cy5sZW5ndGggPyAoXG4gICAgICAgIDxUYWJsZT5cbiAgICAgICAgICA8VGFibGUuSGVhZGVyPlxuICAgICAgICAgICAgPFRhYmxlLlJvdz5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+UHJvZHVjdDwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+U3RhdHVzPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5UeXBlPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5Db2RlPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5DYW1wYWlnbjwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+SXNzdWVkPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbCAvPlxuICAgICAgICAgICAgPC9UYWJsZS5Sb3c+XG4gICAgICAgICAgPC9UYWJsZS5IZWFkZXI+XG4gICAgICAgICAgPFRhYmxlLkJvZHlcbiAgICAgICAgICAgIHN0eWxlPXt7IGJvcmRlckJvdHRvbTogJ25vbmUnIH19PlxuICAgICAgICAgICAge3Byb2R1Y3RzLm1hcCgocm93KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHJvdy5jb3Vwb25fcHJvZHVjdF9jb25maWdcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8VGFibGUuUm93IGtleT17cm93LmlkfVxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgYm9yZGVyQm90dG9tOiAnbm9uZScsIGJhY2tncm91bmQ6ICdub25lJyB9fT5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8VGV4dCB3ZWlnaHQ9XCJwbHVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cm93LnByb2R1Y3QudGl0bGUgfHwgcm93LnByb2R1Y3QuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtyb3cucHJvZHVjdC5oYW5kbGUgfHwgcm93LnByb2R1Y3QuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgICA8U3RhdHVzQmFkZ2VcbiAgICAgICAgICAgICAgICAgICAgICBjb2xvcj17Y291cG9uU3RhdHVzQ29sb3IoY29uZmlnLnByb21vdGlvbl9zdGF0dXMpfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge2NvbmZpZy5wcm9tb3Rpb25fc3RhdHVzIHx8IFwiZHJhZnRcIn1cbiAgICAgICAgICAgICAgICAgICAgPC9TdGF0dXNCYWRnZT5cbiAgICAgICAgICAgICAgICAgIDwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsPntjb3Vwb25UeXBlTGFiZWwoY29uZmlnKX08L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAge2NvbmZpZy5jb2RlX3N0cmF0ZWd5ID09PSBcInNoYXJlZF9jb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICA/IGNvbmZpZy5zaGFyZWRfY29kZSB8fCBcIlNoYXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBgJHtjb25maWcuY29kZV9wcmVmaXggfHwgXCJDT1VQT05cIn0tKmB9XG4gICAgICAgICAgICAgICAgICA8L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD57Y2FtcGFpZ25MYWJlbChjb25maWcpfTwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsPntyb3cuZW50aXRsZW1lbnRzX2NvdW50IHx8IDB9PC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWVuZCBnYXAteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAge2FsbG93UHJvbW90aW9uTWlycm9yICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb25maWcuYW1vdW50cz8ubGVuZ3RoIHx8IDApID4gMVxuICAgICAgICAgICAgICAgICAgICAgICAgKSAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHZvaWQgbWlycm9yKHJvdyl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdGluZ1Jvdyhyb3cpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldE1vZGFsT3Blbih0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8UGVuY2lsU3F1YXJlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJkYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gdm9pZCByZW1vdmUocm93KX1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VHJhc2ggLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgPC9UYWJsZS5Sb3c+XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvVGFibGUuQm9keT5cbiAgICAgICAgPC9UYWJsZT5cbiAgICAgICkgOiAoXG4gICAgICAgIDxDb3Vwb25FbXB0eVN0YXRlXG4gICAgICAgICAgdGl0bGU9XCJObyBjb3Vwb24gcHJvZHVjdHMgZm91bmRcIlxuICAgICAgICAgIGRlc2NyaXB0aW9uPVwiQ3JlYXRlIGEgbmV3IGNvdXBvbiBwcm9kdWN0IHRvIGdldCBzdGFydGVkLlwiXG4gICAgICAgIC8+XG4gICAgICApfVxuXG4gICAgICA8Q291cG9uUHJvZHVjdE1vZGFsXG4gICAgICAgIG9wZW49e21vZGFsT3Blbn1cbiAgICAgICAgcm93PXtlZGl0aW5nUm93fVxuICAgICAgICBhcGlCYXNlPXthcGlCYXNlfVxuICAgICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgICBhbGxvd1Byb21vdGlvbk1pcnJvcj17YWxsb3dQcm9tb3Rpb25NaXJyb3J9XG4gICAgICAgIG9uT3BlbkNoYW5nZT17c2V0TW9kYWxPcGVufVxuICAgICAgICBvblNhdmVkPXtsb2FkfVxuICAgICAgLz5cbiAgICA8L0NvbnRhaW5lcj5cbiAgKVxufVxuIiwgImltcG9ydCB7IFRleHQgfSBmcm9tIFwiQG1lZHVzYWpzL3VpXCJcblxuZXhwb3J0IGZ1bmN0aW9uIENvdXBvbkVtcHR5U3RhdGUoe1xuICBkZXNjcmlwdGlvbixcbiAgdGl0bGUsXG59OiB7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gIHRpdGxlOiBzdHJpbmdcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggdy1mdWxsIGZsZXgtMSBmbGV4LWNvbCBvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBtaW4taC1bMjUwcHhdIHctZnVsbCBmbGV4LTEgZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB4LTYgcHktNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggc2l6ZS1mdWxsIGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtMiB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgIDxUZXh0IHdlaWdodD1cInBsdXNcIj57dGl0bGV9PC9UZXh0PlxuICAgICAgICAgIHtkZXNjcmlwdGlvbiA/IDxUZXh0PntkZXNjcmlwdGlvbn08L1RleHQ+IDogbnVsbH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwgImltcG9ydCB7IENvdXBvbkRldGFpbFBhZ2VWaWV3IH0gZnJvbSBcIi4uLy4uLy4uLy4uL2Rhc2hib2FyZC9jb3Vwb25zL2NvdXBvbi1tYW5hZ2VyXCJcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gVmVuZG9yQ291cG9uRGV0YWlsUGFnZSgpIHtcbiAgcmV0dXJuIDxDb3Vwb25EZXRhaWxQYWdlVmlldyBhcGlCYXNlPVwiL3ZlbmRvclwiIC8+XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBSb3V0ZUNvbmZpZyB9IGZyb20gXCJAbWVyY3VyanMvZGFzaGJvYXJkLXNka1wiXG5pbXBvcnQgeyBSZWNlaXB0UGVyY2VudCB9IGZyb20gXCJAbWVkdXNhanMvaWNvbnNcIlxuaW1wb3J0IHsgQ291cG9uUHJvZHVjdHNQYWdlVmlldyB9IGZyb20gXCIuLi8uLi8uLi8uLi9kYXNoYm9hcmQvY291cG9ucy9jb3Vwb24tbWFuYWdlclwiXG5cbmV4cG9ydCBjb25zdCBjb25maWc6IFJvdXRlQ29uZmlnID0ge1xuICBsYWJlbDogXCJDb3Vwb24gUHJvZHVjdHNcIixcbiAgaWNvbjogUmVjZWlwdFBlcmNlbnQsXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFZlbmRvckNvdXBvblByb2R1Y3RzUGFnZSgpIHtcbiAgcmV0dXJuIDxDb3Vwb25Qcm9kdWN0c1BhZ2VWaWV3IGFwaUJhc2U9XCIvdmVuZG9yXCIgdGl0bGU9XCJDb3Vwb24gUHJvZHVjdHNcIiAvPlxufVxuIiwgImltcG9ydCBpMThuUmVzb3VyY2VzIGZyb20gXCIuL2kxOG5cIlxuaW1wb3J0IENvdXBvbnNQYWdlLCB7IGNvbmZpZyBhcyBjb3Vwb25zQ29uZmlnIH0gZnJvbSBcIi4vcm91dGVzL2NvdXBvbnMvcGFnZVwiXG5pbXBvcnQgQ291cG9uRGV0YWlsUGFnZSBmcm9tIFwiLi9yb3V0ZXMvY291cG9ucy9baWRdL3BhZ2VcIlxuaW1wb3J0IENvdXBvblByb2R1Y3RzUGFnZSwge1xuICBjb25maWcgYXMgY291cG9uUHJvZHVjdHNDb25maWcsXG59IGZyb20gXCIuL3JvdXRlcy9jb3Vwb25zL3Byb2R1Y3RzL3BhZ2VcIlxuXG5jb25zdCByb3V0ZU1vZHVsZSA9IHtcbiAgcm91dGVzOiBbXG4gICAge1xuICAgICAgQ29tcG9uZW50OiBDb3Vwb25zUGFnZSxcbiAgICAgIHBhdGg6IFwiL2NvdXBvbnNcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIENvbXBvbmVudDogQ291cG9uUHJvZHVjdHNQYWdlLFxuICAgICAgcGF0aDogXCIvY291cG9ucy9wcm9kdWN0c1wiLFxuICAgIH0sXG4gICAge1xuICAgICAgQ29tcG9uZW50OiBDb3Vwb25EZXRhaWxQYWdlLFxuICAgICAgcGF0aDogXCIvY291cG9ucy86aWRcIixcbiAgICB9LFxuICBdLFxufVxuXG5jb25zdCBtZW51SXRlbU1vZHVsZSA9IHtcbiAgbWVudUl0ZW1zOiBbXG4gICAge1xuICAgICAgbGFiZWw6IGNvdXBvbnNDb25maWcubGFiZWwsXG4gICAgICBpY29uOiBjb3Vwb25zQ29uZmlnLmljb24sXG4gICAgICBwYXRoOiBcIi9jb3Vwb25zXCIsXG4gICAgICByYW5rOiBjb3Vwb25zQ29uZmlnLnJhbmssXG4gICAgICBuZXN0ZWQ6IGNvdXBvbnNDb25maWcubmVzdGVkLFxuICAgICAgdHJhbnNsYXRpb25OczogY291cG9uc0NvbmZpZy50cmFuc2xhdGlvbk5zLFxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6IGNvdXBvblByb2R1Y3RzQ29uZmlnLmxhYmVsLFxuICAgICAgaWNvbjogY291cG9uUHJvZHVjdHNDb25maWcuaWNvbixcbiAgICAgIHBhdGg6IFwiL2NvdXBvbnMvcHJvZHVjdHNcIixcbiAgICAgIHJhbms6IDExLFxuICAgICAgbmVzdGVkOiBcIi9jb3Vwb25zXCIsXG4gICAgICB0cmFuc2xhdGlvbk5zOiBjb3Vwb25Qcm9kdWN0c0NvbmZpZy50cmFuc2xhdGlvbk5zLFxuICAgIH0sXG4gIF0sXG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgcm91dGVNb2R1bGUsXG4gIG1lbnVJdGVtTW9kdWxlLFxuICBpMThuTW9kdWxlOiBpMThuUmVzb3VyY2VzLFxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBO0FBQUEsRUFDRSxTQUFXO0FBQUEsSUFDVCxNQUFRO0FBQUEsSUFDUixjQUFnQjtBQUFBLEVBQ2xCO0FBQ0Y7OztBQ0hBLElBQU8sZUFBUTtBQUFBLEVBQ2IsSUFBSTtBQUFBLElBQ0YsYUFBYTtBQUFBLEVBQ2Y7QUFDRjs7O0FDTEEsU0FBUyxzQkFBc0I7OztBQ0QvQjtBQUFBLEVBQ0UsZUFBQUE7QUFBQSxFQUNBLGFBQUFDO0FBQUEsRUFDQSxXQUFBQztBQUFBLEVBQ0EsWUFBQUM7QUFBQSxPQUlLO0FBQ1A7QUFBQSxFQUNFLGFBQUFDO0FBQUEsRUFDQSxnQkFBQUM7QUFBQSxFQUNBLFFBQUFDO0FBQUEsRUFDQTtBQUFBLEVBQ0EsU0FBQUM7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRSxVQUFBQztBQUFBLEVBQ0EsYUFBQUM7QUFBQSxFQUNBO0FBQUEsRUFDQSxpQkFBQUM7QUFBQSxFQUNBLGNBQUFDO0FBQUEsRUFDQSxXQUFBQztBQUFBLEVBQ0EsU0FBQUM7QUFBQSxFQUNBLFNBQUFDO0FBQUEsRUFDQSxnQkFBQUM7QUFBQSxFQUNBLFVBQUFDO0FBQUEsRUFDQSxlQUFBQztBQUFBLEVBQ0EsVUFBQUM7QUFBQSxFQUNB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QUNOLFFBQVE7QUFBQSxNQUNSLGVBQWVBLFFBQXFCO0FBQUEsSUFDdEM7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxJQUFPLGlCQUFRO0FBQUEsRUFDYjtBQUFBLEVBQ0E7QUFBQSxFQUNBLFlBQVk7QUFDZDsiLAogICJuYW1lcyI6IFsidXNlQ2FsbGJhY2siLCAidXNlRWZmZWN0IiwgInVzZU1lbW8iLCAidXNlU3RhdGUiLCAiQXJyb3dQYXRoIiwgIlBlbmNpbFNxdWFyZSIsICJQbHVzIiwgIlRyYXNoIiwgIkJ1dHRvbiIsICJDb250YWluZXIiLCAiQ3VycmVuY3lJbnB1dCIsICJGb2N1c01vZGFsIiwgIkhlYWRpbmciLCAiSW5wdXQiLCAiTGFiZWwiLCAiUHJvZ3Jlc3NUYWJzIiwgIlNlbGVjdCIsICJTdGF0dXNCYWRnZSIsICJTd2l0Y2giLCAiVGFibGUiLCAiVGV4dCIsICJUZXh0YXJlYSIsICJ0b2FzdCIsICJ1c2VQcm9tcHQiLCAiVGV4dCIsICJqc3giLCAianN4cyIsICJjb25maWciLCAicm93IiwgIlRleHQiLCAianN4IiwgImpzeHMiLCAiVGV4dCIsICJ2YWx1ZSIsICJ2YWx1ZXMiLCAicGF5bG9hZCIsICJyb3ciLCAiY29uZmlnIiwgIkZyYWdtZW50IiwgImpzeCIsICJqc3hzIiwgImJhY2tlbmRVcmwiLCAiYXBpRXJyb3JNZXNzYWdlIiwgImFwaUZldGNoIiwgImFtb3VudCIsICJjdXJyZW5jeSIsICJqc3hzIiwgImpzeCIsICJUZXh0IiwgIkhlYWRpbmciLCAiQ29udGFpbmVyIiwgIlN0YXR1c0JhZGdlIiwgIkZyYWdtZW50IiwgInVzZVN0YXRlIiwgInVzZUVmZmVjdCIsICJhcGlGZXRjaCIsICJ0b2FzdCIsICJUYWJsZSIsICJ1c2VDYWxsYmFjayIsICJCdXR0b24iLCAiQXJyb3dQYXRoIiwgImpzeCIsICJqc3giLCAiUmVjZWlwdFBlcmNlbnQiLCAianN4IiwgImNvbmZpZyIsICJSZWNlaXB0UGVyY2VudCIsICJjb25maWciXQp9Cg==