@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,3253 @@
1
+ // src/admin/i18n/en.json
2
+ var en_default = {
3
+ coupons: {
4
+ menu: "Coupons",
5
+ productsMenu: "Coupon Products"
6
+ }
7
+ };
8
+
9
+ // src/admin/i18n/index.ts
10
+ var i18n_default = {
11
+ en: {
12
+ translation: en_default
13
+ }
14
+ };
15
+
16
+ // src/admin/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/admin/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 CouponsPage() {
3172
+ return /* @__PURE__ */ jsx4(CouponsPageView, { apiBase: "/admin", title: "Coupons" });
3173
+ }
3174
+
3175
+ // src/admin/routes/coupons/[id]/page.tsx
3176
+ import { jsx as jsx5 } from "react/jsx-runtime";
3177
+ function CouponDetailPage() {
3178
+ return /* @__PURE__ */ jsx5(CouponDetailPageView, { apiBase: "/admin" });
3179
+ }
3180
+
3181
+ // src/admin/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 CouponProductsPage2() {
3189
+ return /* @__PURE__ */ jsx6(
3190
+ CouponProductsPageView,
3191
+ {
3192
+ apiBase: "/admin",
3193
+ title: "Coupon Products",
3194
+ allowPromotionMirror: true
3195
+ }
3196
+ );
3197
+ }
3198
+
3199
+ // src/admin/index.ts
3200
+ var routeModule = {
3201
+ routes: [
3202
+ {
3203
+ Component: CouponsPage,
3204
+ path: "/coupons"
3205
+ },
3206
+ {
3207
+ Component: CouponProductsPage2,
3208
+ path: "/coupons/products"
3209
+ },
3210
+ {
3211
+ Component: CouponDetailPage,
3212
+ path: "/coupons/:id"
3213
+ }
3214
+ ]
3215
+ };
3216
+ var menuItemModule = {
3217
+ menuItems: [
3218
+ {
3219
+ label: config.label,
3220
+ icon: config.icon,
3221
+ path: "/coupons",
3222
+ rank: config.rank,
3223
+ nested: config.nested,
3224
+ translationNs: config.translationNs
3225
+ },
3226
+ {
3227
+ label: config2.label,
3228
+ icon: config2.icon,
3229
+ path: "/coupons/products",
3230
+ rank: 11,
3231
+ nested: "/coupons",
3232
+ translationNs: config2.translationNs
3233
+ }
3234
+ ]
3235
+ };
3236
+ var admin_default = {
3237
+ widgetModule: {
3238
+ widgets: []
3239
+ },
3240
+ routeModule,
3241
+ menuItemModule,
3242
+ formModule: {
3243
+ customFields: {}
3244
+ },
3245
+ displayModule: {
3246
+ displays: {}
3247
+ },
3248
+ i18nModule: i18n_default
3249
+ };
3250
+ export {
3251
+ admin_default as default
3252
+ };
3253
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2FkbWluL2kxOG4vZW4uanNvbiIsICIuLi8uLi8uLi8uLi9zcmMvYWRtaW4vaTE4bi9pbmRleC50cyIsICIuLi8uLi8uLi8uLi9zcmMvYWRtaW4vcm91dGVzL2NvdXBvbnMvcGFnZS50c3giLCAiLi4vLi4vLi4vLi4vc3JjL2Rhc2hib2FyZC9jb3Vwb25zL2NvdXBvbi1tYW5hZ2VyLnRzeCIsICIuLi8uLi8uLi8uLi9zcmMvZGFzaGJvYXJkL2NvdXBvbnMvY291cG9uLXByb2R1Y3RzLXBhZ2UudHN4IiwgIi4uLy4uLy4uLy4uL3NyYy9kYXNoYm9hcmQvY291cG9ucy9lbXB0eS1zdGF0ZS50c3giLCAiLi4vLi4vLi4vLi4vc3JjL2FkbWluL3JvdXRlcy9jb3Vwb25zL1tpZF0vcGFnZS50c3giLCAiLi4vLi4vLi4vLi4vc3JjL2FkbWluL3JvdXRlcy9jb3Vwb25zL3Byb2R1Y3RzL3BhZ2UudHN4IiwgIi4uLy4uLy4uLy4uL3NyYy9hZG1pbi9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsie1xuICBcImNvdXBvbnNcIjoge1xuICAgIFwibWVudVwiOiBcIkNvdXBvbnNcIixcbiAgICBcInByb2R1Y3RzTWVudVwiOiBcIkNvdXBvbiBQcm9kdWN0c1wiXG4gIH1cbn1cbiIsICJpbXBvcnQgZW4gZnJvbSBcIi4vZW4uanNvblwiXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW46IHtcbiAgICB0cmFuc2xhdGlvbjogZW4sXG4gIH0sXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBSb3V0ZUNvbmZpZyB9IGZyb20gXCJAbWVyY3VyanMvZGFzaGJvYXJkLXNka1wiXG5pbXBvcnQgeyBSZWNlaXB0UGVyY2VudCB9IGZyb20gXCJAbWVkdXNhanMvaWNvbnNcIlxuaW1wb3J0IHsgQ291cG9uc1BhZ2VWaWV3IH0gZnJvbSBcIi4uLy4uLy4uL2Rhc2hib2FyZC9jb3Vwb25zL2NvdXBvbi1tYW5hZ2VyXCJcblxuZXhwb3J0IGNvbnN0IGNvbmZpZzogUm91dGVDb25maWcgPSB7XG4gIGxhYmVsOiBcIkNvdXBvbnNcIixcbiAgaWNvbjogUmVjZWlwdFBlcmNlbnQsXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENvdXBvbnNQYWdlKCkge1xuICByZXR1cm4gPENvdXBvbnNQYWdlVmlldyBhcGlCYXNlPVwiL2FkbWluXCIgdGl0bGU9XCJDb3Vwb25zXCIgLz5cbn1cbiIsICJpbXBvcnQge1xuICB1c2VDYWxsYmFjayxcbiAgdXNlRWZmZWN0LFxuICB1c2VNZW1vLFxuICB1c2VTdGF0ZSxcbiAgdHlwZSBDaGFuZ2VFdmVudCxcbiAgdHlwZSBDU1NQcm9wZXJ0aWVzLFxuICB0eXBlIFJlYWN0Tm9kZSxcbn0gZnJvbSBcInJlYWN0XCJcbmltcG9ydCB7XG4gIEFycm93UGF0aCxcbiAgUGVuY2lsU3F1YXJlLFxuICBQbHVzLFxuICBTaG9wcGluZ0NhcnQsXG4gIFRyYXNoLFxuICBUcmlhbmdsZVJpZ2h0TWluaSxcbn0gZnJvbSBcIkBtZWR1c2Fqcy9pY29uc1wiXG5pbXBvcnQge1xuICBCdXR0b24sXG4gIENvbnRhaW5lcixcbiAgQ29weSxcbiAgQ3VycmVuY3lJbnB1dCxcbiAgRm9jdXNNb2RhbCxcbiAgSGVhZGluZyxcbiAgSW5wdXQsXG4gIExhYmVsLFxuICBQcm9ncmVzc1RhYnMsXG4gIFNlbGVjdCxcbiAgU3RhdHVzQmFkZ2UsXG4gIFN3aXRjaCxcbiAgVGFibGUsXG4gIFRhYnMsXG4gIFRleHQsXG4gIFRleHRhcmVhLFxuICB0b2FzdCxcbiAgdXNlUHJvbXB0LFxufSBmcm9tIFwiQG1lZHVzYWpzL3VpXCJcbmltcG9ydCB7IENvdXBvblByb2R1Y3RzUGFnZSB9IGZyb20gXCIuL2NvdXBvbi1wcm9kdWN0cy1wYWdlXCJcbmltcG9ydCB7IENvdXBvbkVtcHR5U3RhdGUgfSBmcm9tIFwiLi9lbXB0eS1zdGF0ZVwiXG5cbmRlY2xhcmUgY29uc3QgX19CQUNLRU5EX1VSTF9fOiBzdHJpbmdcblxudHlwZSBBcGlCYXNlID0gXCIvYWRtaW5cIiB8IFwiL3ZlbmRvclwiXG50eXBlIEJlbmVmaXRUeXBlID0gXCJmaXhlZF9hbW91bnRcIiB8IFwicGVyY2VudGFnZVwiIHwgXCJmcmVlX3NoaXBwaW5nXCIgfCBcImJ1eV9nZXRcIlxudHlwZSBDb2RlU3RyYXRlZ3kgPSBcInVuaXF1ZV9jb2RlXCIgfCBcInNoYXJlZF9jb2RlXCJcbnR5cGUgTWlycm9yTW9kZSA9IFwibm9uZVwiIHwgXCJtYW51YWxcIiB8IFwiYXV0b1wiXG50eXBlIFByb21vdGlvblN0YXR1cyA9IFwiZHJhZnRcIiB8IFwiYWN0aXZlXCIgfCBcImluYWN0aXZlXCJcbnR5cGUgQ2FtcGFpZ25Nb2RlID0gXCJub25lXCIgfCBcImV4aXN0aW5nXCIgfCBcIm5ld1wiXG50eXBlIEV4cGlyYXRpb25Qb2xpY3lUeXBlID0gXCJkdXJhdGlvblwiIHwgXCJmaXhlZFwiXG50eXBlIFdpemFyZFN0ZXAgPSBcImRldGFpbHNcIiB8IFwib3JnYW5pemVcIiB8IFwidmFyaWFudHNcIiB8IFwiY291cG9uXCIgfCBcImNhbXBhaWduXCJcblxudHlwZSBDb3Vwb25Qcm9kdWN0Q29uZmlnID0ge1xuICBpZDogc3RyaW5nXG4gIGVuYWJsZWQ6IGJvb2xlYW5cbiAgcHJvZHVjdF9pZDogc3RyaW5nXG4gIGJlbmVmaXRfdHlwZTogQmVuZWZpdFR5cGVcbiAgYW1vdW50OiBudW1iZXIgfCBudWxsXG4gIHBlcmNlbnRhZ2U6IG51bWJlciB8IG51bGxcbiAgY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbFxuICBjb2RlX3N0cmF0ZWd5OiBDb2RlU3RyYXRlZ3lcbiAgY29kZV9wcmVmaXg6IHN0cmluZyB8IG51bGxcbiAgc2hhcmVkX2NvZGU6IHN0cmluZyB8IG51bGxcbiAgZXhwaXJhdGlvbl9wb2xpY3k6XG4gICAgfCB7XG4gICAgICAgIHR5cGU6IFwiZHVyYXRpb25cIlxuICAgICAgICBkdXJhdGlvbl9kYXlzOiBudW1iZXJcbiAgICAgICAgY2FwX2J5X2NhbXBhaWduPzogYm9vbGVhblxuICAgICAgICBjYXBfYXQ/OiBzdHJpbmcgfCBudWxsXG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6IFwiZml4ZWRcIlxuICAgICAgICBleHBpcmVzX2F0OiBzdHJpbmdcbiAgICAgICAgY2FwX2J5X2NhbXBhaWduPzogYm9vbGVhblxuICAgICAgICBjYXBfYXQ/OiBzdHJpbmcgfCBudWxsXG4gICAgICB9XG4gIG1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbTogbnVtYmVyXG4gIHByb21vdGlvbl9taXJyb3JfbW9kZTogTWlycm9yTW9kZVxuICBwcm9tb3Rpb25fc3RhdHVzPzogUHJvbW90aW9uU3RhdHVzIHwgbnVsbFxuICBjYW1wYWlnbl9tb2RlPzogQ2FtcGFpZ25Nb2RlIHwgbnVsbFxuICBjYW1wYWlnbl9pZD86IHN0cmluZyB8IG51bGxcbiAgY2FtcGFpZ25fc25hcHNob3Q/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGxcbiAgY29uZmlnX3ZlcnNpb246IG51bWJlclxufVxuXG50eXBlIENvdXBvblZhcmlhbnRDb25maWcgPSBQYXJ0aWFsPENvdXBvblByb2R1Y3RDb25maWc+ICYge1xuICBpZDogc3RyaW5nXG4gIHByb2R1Y3RfY29uZmlnX2lkOiBzdHJpbmdcbiAgdmFyaWFudF9pZDogc3RyaW5nXG59XG5cbnR5cGUgUHJvZHVjdFZhcmlhbnQgPSB7XG4gIGlkOiBzdHJpbmdcbiAgdGl0bGU6IHN0cmluZyB8IG51bGxcbiAgc2t1Pzogc3RyaW5nIHwgbnVsbFxuICBwcmljZXM/OiB7IGN1cnJlbmN5X2NvZGU/OiBzdHJpbmc7IGFtb3VudD86IG51bWJlciB9W11cbn1cblxudHlwZSBQcm9kdWN0UmVjb3JkID0ge1xuICBpZDogc3RyaW5nXG4gIHRpdGxlOiBzdHJpbmcgfCBudWxsXG4gIHN1YnRpdGxlPzogc3RyaW5nIHwgbnVsbFxuICBoYW5kbGU6IHN0cmluZyB8IG51bGxcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsXG4gIHN0YXR1czogc3RyaW5nIHwgbnVsbFxuICB0aHVtYm5haWw6IHN0cmluZyB8IG51bGxcbiAgZGlzY291bnRhYmxlPzogYm9vbGVhblxuICB0eXBlX2lkPzogc3RyaW5nIHwgbnVsbFxuICBjb2xsZWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbFxuICBzaGlwcGluZ19wcm9maWxlX2lkPzogc3RyaW5nIHwgbnVsbFxuICB2YXJpYW50cz86IFByb2R1Y3RWYXJpYW50W11cbiAgY2F0ZWdvcmllcz86IHsgaWQ6IHN0cmluZzsgbmFtZT86IHN0cmluZyB8IG51bGwgfVtdXG4gIHRhZ3M/OiB7IGlkOiBzdHJpbmc7IHZhbHVlPzogc3RyaW5nIHwgbnVsbCB9W11cbiAgc2FsZXNfY2hhbm5lbHM/OiB7IGlkOiBzdHJpbmc7IG5hbWU/OiBzdHJpbmcgfCBudWxsIH1bXVxufVxuXG50eXBlIENvdXBvblByb2R1Y3RSb3cgPSB7XG4gIGlkOiBzdHJpbmdcbiAgcHJvZHVjdDogUHJvZHVjdFJlY29yZFxuICBjb3Vwb25fcHJvZHVjdF9jb25maWc6IENvdXBvblByb2R1Y3RDb25maWdcbiAgY291cG9uX3Byb2R1Y3RfdmFyaWFudF9jb25maWdzOiBDb3Vwb25WYXJpYW50Q29uZmlnW11cbiAgZW50aXRsZW1lbnRzX2NvdW50OiBudW1iZXJcbn1cblxudHlwZSBDb3Vwb25FbnRpdGxlbWVudCA9IHtcbiAgaWQ6IHN0cmluZ1xuICBvcmlnaW4/OiBcInB1cmNoYXNlXCIgfCBcImV4dGVybmFsXCJcbiAgY3VzdG9tZXJfaWQ6IHN0cmluZyB8IG51bGxcbiAgZW1haWw6IHN0cmluZyB8IG51bGxcbiAgY29kZTogc3RyaW5nIHwgbnVsbFxuICBzaGFyZWRfY29kZTogc3RyaW5nIHwgbnVsbFxuICBzdGF0dXM6IHN0cmluZ1xuICBwcm9kdWN0X2lkOiBzdHJpbmcgfCBudWxsXG4gIHZhcmlhbnRfaWQ6IHN0cmluZyB8IG51bGxcbiAgb3JkZXJfaWQ6IHN0cmluZyB8IG51bGxcbiAgbGluZV9pdGVtX2lkOiBzdHJpbmcgfCBudWxsXG4gIGlzc3VhbmNlX2lkPzogc3RyaW5nIHwgbnVsbFxuICBjb25maWdfaWQ/OiBzdHJpbmcgfCBudWxsXG4gIHZhcmlhbnRfY29uZmlnX2lkPzogc3RyaW5nIHwgbnVsbFxuICBleHBpcmVzX2F0OiBzdHJpbmcgfCBudWxsXG4gIHJlZGVlbWVkX2F0OiBzdHJpbmcgfCBudWxsXG4gIGNyZWF0ZWRfYXQ/OiBzdHJpbmdcbiAgYmVuZWZpdF9zbmFwc2hvdD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbFxuICBzb3VyY2Vfc25hcHNob3Q/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGxcbiAgZXh0ZXJuYWxfcmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbFxuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbFxuICBzZWxsZXJfdGFyZ2V0cz86IEFycmF5PHtcbiAgICBzZWxsZXJfaWQ6IHN0cmluZ1xuICAgIHNlbGxlcl9tZW1iZXJfaWQ/OiBzdHJpbmcgfCBudWxsXG4gIH0+XG59XG5cbnR5cGUgQ291cG9uSXNzdWFuY2VSZWNvcmQgPSB7XG4gIGlkOiBzdHJpbmdcbiAgc3RhdHVzPzogc3RyaW5nIHwgbnVsbFxuICBxdWFudGl0eT86IG51bWJlciB8IG51bGxcbiAgY29uZmlnX3NuYXBzaG90PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsXG4gIGlzc3VlZF9jb3VudD86IG51bWJlciB8IG51bGxcbiAgZmFpbGVkX2NvdW50PzogbnVtYmVyIHwgbnVsbFxuICBjcmVhdGVkX2F0Pzogc3RyaW5nXG4gIHVwZGF0ZWRfYXQ/OiBzdHJpbmdcbn1cblxudHlwZSBDb3Vwb25PcmRlclN1bW1hcnkgPSB7XG4gIGlkOiBzdHJpbmdcbiAgZGlzcGxheV9pZDogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbFxuICBlbWFpbDogc3RyaW5nIHwgbnVsbFxuICBjdXN0b21lcl9pZDogc3RyaW5nIHwgbnVsbFxuICBjdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsXG4gIHRvdGFsOiBudW1iZXIgfCBudWxsXG4gIGNyZWF0ZWRfYXQ6IHN0cmluZyB8IG51bGxcbn1cblxudHlwZSBDb3Vwb25FbnRpdGxlbWVudERldGFpbCA9IHtcbiAgY3VzdG9tZXJfY291cG9uX2VudGl0bGVtZW50OiBDb3Vwb25FbnRpdGxlbWVudFxuICBjb3Vwb25faXNzdWFuY2U/OiBDb3Vwb25Jc3N1YW5jZVJlY29yZCB8IG51bGxcbiAgb3JkZXI/OiBDb3Vwb25PcmRlclN1bW1hcnkgfCBudWxsXG59XG5cbnR5cGUgT3B0aW9uUmVjb3JkID0ge1xuICBpZDogc3RyaW5nXG4gIG5hbWU/OiBzdHJpbmcgfCBudWxsXG4gIHRpdGxlPzogc3RyaW5nIHwgbnVsbFxuICB2YWx1ZT86IHN0cmluZyB8IG51bGxcbiAgaGFuZGxlPzogc3RyaW5nIHwgbnVsbFxuICBjYW1wYWlnbl9pZGVudGlmaWVyPzogc3RyaW5nIHwgbnVsbFxufVxuXG50eXBlIEN1cnJlbmN5T3B0aW9uID0ge1xuICBjb2RlOiBzdHJpbmdcbiAgbmFtZTogc3RyaW5nXG4gIHN5bWJvbDogc3RyaW5nXG4gIHN5bWJvbF9uYXRpdmU6IHN0cmluZ1xuICBpc19kZWZhdWx0OiBib29sZWFuXG59XG5cbnR5cGUgT3B0aW9uc1BheWxvYWQgPSB7XG4gIGN1cnJlbmNpZXM/OiBDdXJyZW5jeU9wdGlvbltdXG4gIHByb2R1Y3RfdHlwZXM/OiBPcHRpb25SZWNvcmRbXVxuICBwcm9kdWN0X2NvbGxlY3Rpb25zPzogT3B0aW9uUmVjb3JkW11cbiAgcHJvZHVjdF9jYXRlZ29yaWVzPzogT3B0aW9uUmVjb3JkW11cbiAgcHJvZHVjdF90YWdzPzogT3B0aW9uUmVjb3JkW11cbiAgc2FsZXNfY2hhbm5lbHM/OiBPcHRpb25SZWNvcmRbXVxuICBzaGlwcGluZ19wcm9maWxlcz86IE9wdGlvblJlY29yZFtdXG4gIGNhbXBhaWducz86IE9wdGlvblJlY29yZFtdXG4gIHNlbGxlcnM/OiBPcHRpb25SZWNvcmRbXVxufVxuXG50eXBlIFByb2R1Y3RGb3JtU3RhdGUgPSB7XG4gIGlkOiBzdHJpbmdcbiAgdGl0bGU6IHN0cmluZ1xuICBzdWJ0aXRsZTogc3RyaW5nXG4gIGhhbmRsZTogc3RyaW5nXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgdGh1bWJuYWlsOiBzdHJpbmdcbiAgc3RhdHVzOiBzdHJpbmdcbiAgZGlzY291bnRhYmxlOiBib29sZWFuXG4gIHNlbGxlcl9pZDogc3RyaW5nXG4gIHR5cGVfaWQ6IHN0cmluZ1xuICBjb2xsZWN0aW9uX2lkOiBzdHJpbmdcbiAgY2F0ZWdvcnlfaWQ6IHN0cmluZ1xuICB0YWdfaWQ6IHN0cmluZ1xuICBzYWxlc19jaGFubmVsX2lkOiBzdHJpbmdcbiAgdmFyaWFudHM6IFZhcmlhbnRGb3JtU3RhdGVbXVxufVxuXG50eXBlIFZhcmlhbnRGb3JtU3RhdGUgPSB7XG4gIGlkPzogc3RyaW5nXG4gIG92ZXJyaWRlX2NvbmZpZ19pZD86IHN0cmluZ1xuICB0aXRsZTogc3RyaW5nXG4gIHNrdTogc3RyaW5nXG4gIGN1cnJlbmN5X2NvZGU6IHN0cmluZ1xuICBhbW91bnQ6IHN0cmluZ1xuICBvdmVycmlkZV9lbmFibGVkOiBib29sZWFuXG4gIG92ZXJyaWRlX2JlbmVmaXRfdHlwZTogQmVuZWZpdFR5cGVcbiAgb3ZlcnJpZGVfY3VycmVuY3lfY29kZTogc3RyaW5nXG4gIG92ZXJyaWRlX2Ftb3VudDogc3RyaW5nXG4gIG92ZXJyaWRlX3BlcmNlbnRhZ2U6IHN0cmluZ1xufVxuXG50eXBlIENvdXBvbkZvcm1TdGF0ZSA9IHtcbiAgZW5hYmxlZDogYm9vbGVhblxuICBiZW5lZml0X3R5cGU6IEJlbmVmaXRUeXBlXG4gIGFtb3VudDogc3RyaW5nXG4gIHBlcmNlbnRhZ2U6IHN0cmluZ1xuICBjdXJyZW5jeV9jb2RlOiBzdHJpbmdcbiAgY29kZV9zdHJhdGVneTogQ29kZVN0cmF0ZWd5XG4gIGNvZGVfcHJlZml4OiBzdHJpbmdcbiAgc2hhcmVkX2NvZGU6IHN0cmluZ1xuICBleHBpcmF0aW9uX3R5cGU6IEV4cGlyYXRpb25Qb2xpY3lUeXBlXG4gIGV4cGlyYXRpb25fZGF5czogc3RyaW5nXG4gIGV4cGlyYXRpb25fZGF0ZTogc3RyaW5nXG4gIGV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWduOiBib29sZWFuXG4gIGV4cGlyYXRpb25fY2FwX2F0OiBzdHJpbmdcbiAgbWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtOiBzdHJpbmdcbiAgcHJvbW90aW9uX21pcnJvcl9tb2RlOiBNaXJyb3JNb2RlXG4gIHByb21vdGlvbl9zdGF0dXM6IFByb21vdGlvblN0YXR1c1xufVxuXG50eXBlIENhbXBhaWduRm9ybVN0YXRlID0ge1xuICBtb2RlOiBDYW1wYWlnbk1vZGVcbiAgY2FtcGFpZ25faWQ6IHN0cmluZ1xuICBuYW1lOiBzdHJpbmdcbiAgY2FtcGFpZ25faWRlbnRpZmllcjogc3RyaW5nXG4gIHN0YXJ0c19hdDogc3RyaW5nXG4gIGVuZHNfYXQ6IHN0cmluZ1xufVxuXG5jb25zdCBOT05FID0gXCJfX25vbmVfX1wiXG5jb25zdCBzdGVwczogV2l6YXJkU3RlcFtdID0gW1xuICBcImRldGFpbHNcIixcbiAgXCJvcmdhbml6ZVwiLFxuICBcInZhcmlhbnRzXCIsXG4gIFwiY291cG9uXCIsXG4gIFwiY2FtcGFpZ25cIixcbl1cblxuY29uc3QgZW1wdHlWYXJpYW50OiBWYXJpYW50Rm9ybVN0YXRlID0ge1xuICB0aXRsZTogXCJEZWZhdWx0IHZhcmlhbnRcIixcbiAgc2t1OiBcIlwiLFxuICBjdXJyZW5jeV9jb2RlOiBcIlwiLFxuICBhbW91bnQ6IFwiXCIsXG4gIG92ZXJyaWRlX2VuYWJsZWQ6IGZhbHNlLFxuICBvdmVycmlkZV9iZW5lZml0X3R5cGU6IFwiZml4ZWRfYW1vdW50XCIsXG4gIG92ZXJyaWRlX2N1cnJlbmN5X2NvZGU6IFwiXCIsXG4gIG92ZXJyaWRlX2Ftb3VudDogXCJcIixcbiAgb3ZlcnJpZGVfcGVyY2VudGFnZTogXCJcIixcbn1cblxuY29uc3QgZW1wdHlQcm9kdWN0OiBQcm9kdWN0Rm9ybVN0YXRlID0ge1xuICBpZDogXCJcIixcbiAgdGl0bGU6IFwiXCIsXG4gIHN1YnRpdGxlOiBcIlwiLFxuICBoYW5kbGU6IFwiXCIsXG4gIGRlc2NyaXB0aW9uOiBcIlwiLFxuICB0aHVtYm5haWw6IFwiXCIsXG4gIHN0YXR1czogXCJkcmFmdFwiLFxuICBkaXNjb3VudGFibGU6IGZhbHNlLFxuICBzZWxsZXJfaWQ6IFwiXCIsXG4gIHR5cGVfaWQ6IFwiXCIsXG4gIGNvbGxlY3Rpb25faWQ6IFwiXCIsXG4gIGNhdGVnb3J5X2lkOiBcIlwiLFxuICB0YWdfaWQ6IFwiXCIsXG4gIHNhbGVzX2NoYW5uZWxfaWQ6IFwiXCIsXG4gIHZhcmlhbnRzOiBbZW1wdHlWYXJpYW50XSxcbn1cblxuY29uc3QgZW1wdHlDb3Vwb246IENvdXBvbkZvcm1TdGF0ZSA9IHtcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgYmVuZWZpdF90eXBlOiBcImZpeGVkX2Ftb3VudFwiLFxuICBhbW91bnQ6IFwiXCIsXG4gIHBlcmNlbnRhZ2U6IFwiXCIsXG4gIGN1cnJlbmN5X2NvZGU6IFwiXCIsXG4gIGNvZGVfc3RyYXRlZ3k6IFwidW5pcXVlX2NvZGVcIixcbiAgY29kZV9wcmVmaXg6IFwiQ09VUE9OXCIsXG4gIHNoYXJlZF9jb2RlOiBcIlwiLFxuICBleHBpcmF0aW9uX3R5cGU6IFwiZHVyYXRpb25cIixcbiAgZXhwaXJhdGlvbl9kYXlzOiBcIjMwXCIsXG4gIGV4cGlyYXRpb25fZGF0ZTogXCJcIixcbiAgZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ246IHRydWUsXG4gIGV4cGlyYXRpb25fY2FwX2F0OiBcIlwiLFxuICBtYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW06IFwiMVwiLFxuICBwcm9tb3Rpb25fbWlycm9yX21vZGU6IFwibm9uZVwiLFxuICBwcm9tb3Rpb25fc3RhdHVzOiBcImRyYWZ0XCIsXG59XG5cbmNvbnN0IGVtcHR5Q2FtcGFpZ246IENhbXBhaWduRm9ybVN0YXRlID0ge1xuICBtb2RlOiBcIm5vbmVcIixcbiAgY2FtcGFpZ25faWQ6IFwiXCIsXG4gIG5hbWU6IFwiXCIsXG4gIGNhbXBhaWduX2lkZW50aWZpZXI6IFwiXCIsXG4gIHN0YXJ0c19hdDogXCJcIixcbiAgZW5kc19hdDogXCJcIixcbn1cblxuY29uc3QgbW9kYWxDb250ZW50U3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGRpc3BsYXk6IFwiZmxleFwiLFxuICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICBoZWlnaHQ6IFwiMTAwJVwiLFxuICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbn1cblxuY29uc3QgbW9kYWxTdGF0aWNSb3dTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgZmxleFNocmluazogMCxcbn1cblxuY29uc3QgbW9kYWxXaXphcmRTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgZGlzcGxheTogXCJmbGV4XCIsXG4gIGZsZXg6IFwiMSAxIGF1dG9cIixcbiAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgbWluSGVpZ2h0OiAwLFxufVxuXG5jb25zdCBtb2RhbEJvZHlTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgZmxleDogXCIxIDEgYXV0b1wiLFxuICBtaW5IZWlnaHQ6IDAsXG4gIG92ZXJmbG93WTogXCJhdXRvXCIsXG4gIHBhZGRpbmc6IFwiMzJweCAyNHB4XCIsXG59XG5cbmNvbnN0IG1vZGFsRm9ybVN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBtYXJnaW46IFwiMCBhdXRvXCIsXG4gIG1heFdpZHRoOiA5MjAsXG4gIHdpZHRoOiBcIm1pbig5MjBweCwgMTAwJSlcIixcbn1cblxuY29uc3Qgc3RhY2tTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgZGlzcGxheTogXCJmbGV4XCIsXG4gIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gIGdhcDogMTYsXG59XG5cbmNvbnN0IHR3b0NvbHVtbkdyaWRTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgZGlzcGxheTogXCJncmlkXCIsXG4gIGdhcDogMTYsXG4gIGdyaWRUZW1wbGF0ZUNvbHVtbnM6IFwicmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMjYwcHgsIDFmcikpXCIsXG59XG5cbmNvbnN0IHRocmVlQ29sdW1uR3JpZFN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBkaXNwbGF5OiBcImdyaWRcIixcbiAgZ2FwOiAxNixcbiAgZ3JpZFRlbXBsYXRlQ29sdW1uczogXCJyZXBlYXQoYXV0by1maXQsIG1pbm1heCgyMjBweCwgMWZyKSlcIixcbn1cblxuY29uc3QgZm91ckNvbHVtbkdyaWRTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgZGlzcGxheTogXCJncmlkXCIsXG4gIGdhcDogMTYsXG4gIGdyaWRUZW1wbGF0ZUNvbHVtbnM6IFwicmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMTYwcHgsIDFmcikpXCIsXG59XG5cbmNvbnN0IHBhbmVsU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGJvcmRlcjogXCIxcHggc29saWQgdmFyKC0tYm9yZGVyLWJhc2UpXCIsXG4gIGJvcmRlclJhZGl1czogOCxcbiAgcGFkZGluZzogMTYsXG59XG5cbmNvbnN0IHJvd0JldHdlZW5TdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgZGlzcGxheTogXCJmbGV4XCIsXG4gIGdhcDogMTYsXG4gIGp1c3RpZnlDb250ZW50OiBcInNwYWNlLWJldHdlZW5cIixcbn1cblxuZnVuY3Rpb24gYmFja2VuZFVybCgpIHtcbiAgcmV0dXJuIHR5cGVvZiBfX0JBQ0tFTkRfVVJMX18gPT09IFwic3RyaW5nXCJcbiAgICA/IF9fQkFDS0VORF9VUkxfXy5yZXBsYWNlKC9cXC8kLywgXCJcIilcbiAgICA6IFwiXCJcbn1cblxuZnVuY3Rpb24gYXBpRXJyb3JNZXNzYWdlKHBheWxvYWQ6IGFueSwgZmFsbGJhY2s6IHN0cmluZykge1xuICBjb25zdCBjYW5kaWRhdGVzID0gW1xuICAgIHBheWxvYWQ/Lm1lc3NhZ2UsXG4gICAgcGF5bG9hZD8uZXJyb3I/Lm1lc3NhZ2UsXG4gICAgcGF5bG9hZD8uZXJyb3IsXG4gICAgcGF5bG9hZD8uZXJyb3JzPy5bMF0/Lm1lc3NhZ2UsXG4gIF1cbiAgY29uc3QgbWVzc2FnZSA9IGNhbmRpZGF0ZXMuZmluZChcbiAgICAoY2FuZGlkYXRlKSA9PiB0eXBlb2YgY2FuZGlkYXRlID09PSBcInN0cmluZ1wiICYmIGNhbmRpZGF0ZS50cmltKCksXG4gIClcblxuICByZXR1cm4gbWVzc2FnZSB8fCBmYWxsYmFjayB8fCBcIlJlcXVlc3QgZmFpbGVkXCJcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBpRmV0Y2g8VD4oXG4gIHBhdGg6IHN0cmluZyxcbiAgb3B0aW9uczogUmVxdWVzdEluaXQgPSB7fSxcbik6IFByb21pc2U8VD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2JhY2tlbmRVcmwoKX0ke3BhdGh9YCwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIC4uLihvcHRpb25zLmJvZHkgPyB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0gOiB7fSksXG4gICAgICAuLi5vcHRpb25zLmhlYWRlcnMsXG4gICAgfSxcbiAgfSlcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiBudWxsKVxuICAgIHRocm93IG5ldyBFcnJvcihhcGlFcnJvck1lc3NhZ2UocGF5bG9hZCwgcmVzcG9uc2Uuc3RhdHVzVGV4dCkpXG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2UuanNvbigpXG59XG5cbmZ1bmN0aW9uIG51bWJlck9yTnVsbCh2YWx1ZTogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSlcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwYXJzZWQpICYmIHBhcnNlZCA+IDAgPyBwYXJzZWQgOiBudWxsXG59XG5cbmZ1bmN0aW9uIG9wdGlvbkxhYmVsKG9wdGlvbjogT3B0aW9uUmVjb3JkKSB7XG4gIHJldHVybiAoXG4gICAgb3B0aW9uLm5hbWUgfHwgb3B0aW9uLnRpdGxlIHx8IG9wdGlvbi52YWx1ZSB8fCBvcHRpb24uaGFuZGxlIHx8IG9wdGlvbi5pZFxuICApXG59XG5cbmZ1bmN0aW9uIGJlbmVmaXRMYWJlbChcbiAgY29uZmlnOiBQaWNrPFxuICAgIENvdXBvblByb2R1Y3RDb25maWcsXG4gICAgXCJiZW5lZml0X3R5cGVcIiB8IFwiYW1vdW50XCIgfCBcInBlcmNlbnRhZ2VcIiB8IFwiY3VycmVuY3lfY29kZVwiXG4gID4sXG4pIHtcbiAgaWYgKGNvbmZpZy5iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCIpIHtcbiAgICByZXR1cm4gYCR7Y29uZmlnLmFtb3VudCB8fCAwfSAkeyhjb25maWcuY3VycmVuY3lfY29kZSB8fCBcIlwiKS50b1VwcGVyQ2FzZSgpfWBcbiAgfVxuICBpZiAoY29uZmlnLmJlbmVmaXRfdHlwZSA9PT0gXCJwZXJjZW50YWdlXCIpIHtcbiAgICByZXR1cm4gYCR7Y29uZmlnLnBlcmNlbnRhZ2UgfHwgMH0lYFxuICB9XG4gIGlmIChjb25maWcuYmVuZWZpdF90eXBlID09PSBcImZyZWVfc2hpcHBpbmdcIikge1xuICAgIHJldHVybiBcIkZyZWUgc2hpcHBpbmdcIlxuICB9XG4gIHJldHVybiBcIkJ1eSBnZXRcIlxufVxuXG5mdW5jdGlvbiBmb3JtYXREYXRlKHZhbHVlPzogc3RyaW5nIHwgbnVsbCkge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gXCItXCJcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKVxuICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkgcmV0dXJuIFwiLVwiXG4gIHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpXG59XG5cbmZ1bmN0aW9uIGZvcm1hdERhdGVUaW1lKHZhbHVlPzogc3RyaW5nIHwgbnVsbCkge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gXCItXCJcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKVxuICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkgcmV0dXJuIFwiLVwiXG4gIHJldHVybiBkYXRlLnRvTG9jYWxlU3RyaW5nKClcbn1cblxuZnVuY3Rpb24gZm9ybWF0RnVsbERhdGUodmFsdWU/OiBzdHJpbmcgfCBudWxsKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIi1cIlxuICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsdWUpXG4gIGlmIChOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSByZXR1cm4gXCItXCJcbiAgcmV0dXJuIGRhdGUudG9Mb2NhbGVTdHJpbmcodW5kZWZpbmVkLCB7XG4gICAgZGF5OiBcIm51bWVyaWNcIixcbiAgICBob3VyOiBcIm51bWVyaWNcIixcbiAgICBtaW51dGU6IFwiMi1kaWdpdFwiLFxuICAgIG1vbnRoOiBcInNob3J0XCIsXG4gICAgeWVhcjogXCJudW1lcmljXCIsXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGZvcm1hdFJlbGF0aXZlRGF0ZSh2YWx1ZT86IHN0cmluZyB8IG51bGwpIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiLVwiXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgaWYgKE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkpIHJldHVybiBcIi1cIlxuXG4gIGNvbnN0IGRpZmZTZWNvbmRzID0gTWF0aC5yb3VuZCgoZGF0ZS5nZXRUaW1lKCkgLSBEYXRlLm5vdygpKSAvIDEwMDApXG4gIGNvbnN0IGFic1NlY29uZHMgPSBNYXRoLmFicyhkaWZmU2Vjb25kcylcbiAgY29uc3QgdW5pdHM6IEFycmF5PFtJbnRsLlJlbGF0aXZlVGltZUZvcm1hdFVuaXQsIG51bWJlcl0+ID0gW1xuICAgIFtcInllYXJcIiwgNjAgKiA2MCAqIDI0ICogMzY1XSxcbiAgICBbXCJtb250aFwiLCA2MCAqIDYwICogMjQgKiAzMF0sXG4gICAgW1wid2Vla1wiLCA2MCAqIDYwICogMjQgKiA3XSxcbiAgICBbXCJkYXlcIiwgNjAgKiA2MCAqIDI0XSxcbiAgICBbXCJob3VyXCIsIDYwICogNjBdLFxuICAgIFtcIm1pbnV0ZVwiLCA2MF0sXG4gIF1cbiAgY29uc3QgW3VuaXQsIHNlY29uZHNdID1cbiAgICB1bml0cy5maW5kKChbLCBzZWNvbmRzUGVyVW5pdF0pID0+IGFic1NlY29uZHMgPj0gc2Vjb25kc1BlclVuaXQpIHx8IFtdXG5cbiAgaWYgKCF1bml0IHx8ICFzZWNvbmRzKSB7XG4gICAgcmV0dXJuIFwianVzdCBub3dcIlxuICB9XG5cbiAgcmV0dXJuIG5ldyBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdCh1bmRlZmluZWQsIHsgbnVtZXJpYzogXCJhdXRvXCIgfSkuZm9ybWF0KFxuICAgIE1hdGgucm91bmQoZGlmZlNlY29uZHMgLyBzZWNvbmRzKSxcbiAgICB1bml0LFxuICApXG59XG5cbmZ1bmN0aW9uIGZvcm1hdFNuYXBzaG90QW1vdW50KGFtb3VudDogbnVtYmVyIHwgbnVsbCwgY3VycmVuY3k/OiBzdHJpbmcgfCBudWxsKSB7XG4gIGlmIChhbW91bnQgPT0gbnVsbCkgcmV0dXJuIFwiLVwiXG4gIGNvbnN0IGNvZGUgPSBjdXJyZW5jeSA/IGN1cnJlbmN5LnRvVXBwZXJDYXNlKCkgOiBcIlwiXG4gIHJldHVybiBbY29kZSwgYW1vdW50LnRvTG9jYWxlU3RyaW5nKHVuZGVmaW5lZCwgeyBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IDIgfSldXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5qb2luKFwiIFwiKVxufVxuXG5mdW5jdGlvbiB0b0RhdGVUaW1lTG9jYWwodmFsdWU/OiBzdHJpbmcgfCBudWxsKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIlwiXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgaWYgKE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkpIHJldHVybiBcIlwiXG4gIGNvbnN0IGxvY2FsRGF0ZSA9IG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpIC0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpICogNjBfMDAwKVxuICByZXR1cm4gbG9jYWxEYXRlLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTYpXG59XG5cbmZ1bmN0aW9uIGVudGl0bGVtZW50U3RhdHVzQ29sb3Ioc3RhdHVzOiBzdHJpbmcpIHtcbiAgaWYgKHN0YXR1cyA9PT0gXCJpc3N1ZWRcIikgcmV0dXJuIFwiZ3JlZW5cIiBhcyBjb25zdFxuICBpZiAoc3RhdHVzID09PSBcInJlZGVlbWVkXCIpIHJldHVybiBcImJsdWVcIiBhcyBjb25zdFxuICBpZiAoc3RhdHVzID09PSBcImV4cGlyZWRcIiB8fCBzdGF0dXMgPT09IFwiY2FuY2VsZWRcIikgcmV0dXJuIFwiZ3JleVwiIGFzIGNvbnN0XG4gIHJldHVybiBcIm9yYW5nZVwiIGFzIGNvbnN0XG59XG5cbmZ1bmN0aW9uIHByb2R1Y3RTdGF0dXNDb2xvcihzdGF0dXM/OiBzdHJpbmcgfCBudWxsKSB7XG4gIGlmIChzdGF0dXMgPT09IFwicHVibGlzaGVkXCIpIHJldHVybiBcImdyZWVuXCIgYXMgY29uc3RcbiAgaWYgKHN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSByZXR1cm4gXCJyZWRcIiBhcyBjb25zdFxuICBpZiAoc3RhdHVzID09PSBcInByb3Bvc2VkXCIpIHJldHVybiBcIm9yYW5nZVwiIGFzIGNvbnN0XG4gIHJldHVybiBcImdyZXlcIiBhcyBjb25zdFxufVxuXG5mdW5jdGlvbiBzbmFwc2hvdFN0cmluZyhcbiAgc25hcHNob3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAga2V5OiBzdHJpbmcsXG4pIHtcbiAgY29uc3QgdmFsdWUgPSBzbmFwc2hvdD8uW2tleV1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS50cmltKCkpIHJldHVybiB2YWx1ZVxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICByZXR1cm4gXCJcIlxufVxuXG5mdW5jdGlvbiBzbmFwc2hvdE51bWJlcihcbiAgc25hcHNob3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAga2V5OiBzdHJpbmcsXG4pIHtcbiAgY29uc3QgdmFsdWUgPSBzbmFwc2hvdD8uW2tleV1cbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpID8gdmFsdWUgOiBudWxsXG59XG5cbmZ1bmN0aW9uIGpzb25CbG9jayh2YWx1ZTogdW5rbm93bikge1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIFwie31cIlxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpXG59XG5cbmZ1bmN0aW9uIGNvdXBvbkNvZGUoZW50aXRsZW1lbnQ6IENvdXBvbkVudGl0bGVtZW50KSB7XG4gIHJldHVybiBlbnRpdGxlbWVudC5jb2RlIHx8IGVudGl0bGVtZW50LnNoYXJlZF9jb2RlIHx8IFwiLVwiXG59XG5cbmZ1bmN0aW9uIGVudGl0bGVtZW50U291cmNlKGVudGl0bGVtZW50OiBDb3Vwb25FbnRpdGxlbWVudCkge1xuICBpZiAoZW50aXRsZW1lbnQub3JpZ2luID09PSBcImV4dGVybmFsXCIpIHJldHVybiBcIkV4dGVybmFsXCJcbiAgcmV0dXJuIFwiUHVyY2hhc2VcIlxufVxuXG5mdW5jdGlvbiBlbnRpdGxlbWVudFNlbGxlclNjb3BlKGVudGl0bGVtZW50OiBDb3Vwb25FbnRpdGxlbWVudCkge1xuICBjb25zdCBjb3VudCA9IGVudGl0bGVtZW50LnNlbGxlcl90YXJnZXRzPy5sZW5ndGggfHwgMFxuICBpZiAoZW50aXRsZW1lbnQub3JpZ2luICE9PSBcImV4dGVybmFsXCIpIHtcbiAgICBpZiAoIWNvdW50KSByZXR1cm4gXCJQcm9kdWN0IHNlbGxlclwiXG4gICAgcmV0dXJuIGBQcm9kdWN0IHNlbGxlciArICR7Y291bnR9IGxpbmtlZGBcbiAgfVxuICBpZiAoIWNvdW50KSByZXR1cm4gXCJBZG1pbiBvbmx5XCJcbiAgcmV0dXJuIGNvdW50ID09PSAxID8gXCIxIGxpbmtlZCBzZWxsZXJcIiA6IGAke2NvdW50fSBsaW5rZWQgc2VsbGVyc2Bcbn1cblxuZnVuY3Rpb24gb3JkZXJEaXNwbGF5SWQob3JkZXI6IENvdXBvbk9yZGVyU3VtbWFyeSB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgaWYgKCFvcmRlcikgcmV0dXJuIFwiLVwiXG4gIHJldHVybiBvcmRlci5kaXNwbGF5X2lkID09IG51bGwgPyBvcmRlci5pZCA6IGAjJHtvcmRlci5kaXNwbGF5X2lkfWBcbn1cblxuZnVuY3Rpb24gZGFzaGJvYXJkQmFzZVBhdGgoYXBpQmFzZTogQXBpQmFzZSkge1xuICByZXR1cm4gYXBpQmFzZSA9PT0gXCIvdmVuZG9yXCIgPyBcIi9zZWxsZXJcIiA6IFwiL2Rhc2hib2FyZFwiXG59XG5cbmZ1bmN0aW9uIGNvdXBvbkRldGFpbFBhdGgoYXBpQmFzZTogQXBpQmFzZSwgZW50aXRsZW1lbnRJZDogc3RyaW5nKSB7XG4gIHJldHVybiBgJHtkYXNoYm9hcmRCYXNlUGF0aChhcGlCYXNlKX0vY291cG9ucy8ke2VuY29kZVVSSUNvbXBvbmVudChcbiAgICBlbnRpdGxlbWVudElkLFxuICApfWBcbn1cblxuZnVuY3Rpb24gb3JkZXJEZXRhaWxQYXRoKGFwaUJhc2U6IEFwaUJhc2UsIG9yZGVySWQ6IHN0cmluZykge1xuICByZXR1cm4gYCR7ZGFzaGJvYXJkQmFzZVBhdGgoYXBpQmFzZSl9L29yZGVycy8ke2VuY29kZVVSSUNvbXBvbmVudChvcmRlcklkKX1gXG59XG5cbmZ1bmN0aW9uIGN1cnJlbnRDb3Vwb25EZXRhaWxJZChhcGlCYXNlOiBBcGlCYXNlKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIFwiXCJcbiAgfVxuXG4gIGNvbnN0IHByZWZpeCA9IGAke2Rhc2hib2FyZEJhc2VQYXRoKGFwaUJhc2UpfS9jb3Vwb25zL2BcbiAgY29uc3QgcGF0aCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZVxuICBjb25zdCBpbmRleCA9IHBhdGguaW5kZXhPZihwcmVmaXgpXG4gIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gXCJcIlxuICB9XG5cbiAgY29uc3QgaWQgPSBwYXRoLnNsaWNlKGluZGV4ICsgcHJlZml4Lmxlbmd0aCkuc3BsaXQoXCIvXCIpWzBdXG4gIGlmICghaWQgfHwgaWQgPT09IFwicHJvZHVjdHNcIikge1xuICAgIHJldHVybiBcIlwiXG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoaWQpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBpZFxuICB9XG59XG5cbmZ1bmN0aW9uIGJlbmVmaXRTbmFwc2hvdExhYmVsKFxuICBzbmFwc2hvdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIHwgdW5kZWZpbmVkLFxuKSB7XG4gIGNvbnN0IHR5cGUgPSBzbmFwc2hvdFN0cmluZyhzbmFwc2hvdCwgXCJiZW5lZml0X3R5cGVcIilcbiAgaWYgKHR5cGUgPT09IFwiZml4ZWRfYW1vdW50XCIpIHtcbiAgICBjb25zdCBhbW91bnRzID0gQXJyYXkuaXNBcnJheShzbmFwc2hvdD8uYW1vdW50cylcbiAgICAgID8gKHNuYXBzaG90LmFtb3VudHMgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KVxuICAgICAgOiBbXVxuICAgIGlmIChhbW91bnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGFtb3VudHNcbiAgICAgICAgLm1hcCgocm93KSA9PiB7XG4gICAgICAgICAgY29uc3QgYW1vdW50ID0gc25hcHNob3ROdW1iZXIocm93LCBcImFtb3VudFwiKVxuICAgICAgICAgIGNvbnN0IGN1cnJlbmN5ID0gc25hcHNob3RTdHJpbmcocm93LCBcImN1cnJlbmN5X2NvZGVcIikudG9VcHBlckNhc2UoKVxuICAgICAgICAgIHJldHVybiBgJHthbW91bnQgPz8gMH0gJHtjdXJyZW5jeX1gLnRyaW0oKVxuICAgICAgICB9KVxuICAgICAgICAuam9pbihcIiwgXCIpXG4gICAgfVxuXG4gICAgY29uc3QgYW1vdW50ID0gc25hcHNob3ROdW1iZXIoc25hcHNob3QsIFwiYW1vdW50XCIpXG4gICAgY29uc3QgY3VycmVuY3kgPSBzbmFwc2hvdFN0cmluZyhzbmFwc2hvdCwgXCJjdXJyZW5jeV9jb2RlXCIpLnRvVXBwZXJDYXNlKClcbiAgICByZXR1cm4gYCR7YW1vdW50ID8/IDB9ICR7Y3VycmVuY3l9YC50cmltKClcbiAgfVxuXG4gIGlmICh0eXBlID09PSBcInBlcmNlbnRhZ2VcIikge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gc25hcHNob3Q/LnByb21vdGlvbl90ZW1wbGF0ZSBhc1xuICAgICAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgfCBudWxsXG4gICAgICB8IHVuZGVmaW5lZFxuICAgIGNvbnN0IG1ldGhvZCA9IHRlbXBsYXRlPy5hcHBsaWNhdGlvbl9tZXRob2QgYXNcbiAgICAgIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgIHwgbnVsbFxuICAgICAgfCB1bmRlZmluZWRcbiAgICBjb25zdCBzY29wZSA9IHNuYXBzaG90U3RyaW5nKG1ldGhvZCwgXCJ0YXJnZXRfdHlwZVwiKSA9PT0gXCJvcmRlclwiXG4gICAgICA/IFwib3JkZXJcIlxuICAgICAgOiBcInByb2R1Y3RzXCJcbiAgICByZXR1cm4gYCR7c25hcHNob3ROdW1iZXIoc25hcHNob3QsIFwicGVyY2VudGFnZVwiKSA/PyAwfSUgb2ZmICR7c2NvcGV9YFxuICB9XG5cbiAgaWYgKHR5cGUgPT09IFwiZnJlZV9zaGlwcGluZ1wiKSB7XG4gICAgcmV0dXJuIFwiRnJlZSBzaGlwcGluZ1wiXG4gIH1cblxuICBpZiAodHlwZSA9PT0gXCJidXlfZ2V0XCIpIHtcbiAgICByZXR1cm4gXCJCdXkgWCBHZXQgWVwiXG4gIH1cblxuICByZXR1cm4gXCJVbmtub3duXCJcbn1cblxuZnVuY3Rpb24gZXhwaXJhdGlvblBvbGljeUxhYmVsKFxuICBzbmFwc2hvdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIHwgdW5kZWZpbmVkLFxuKSB7XG4gIGNvbnN0IHBvbGljeSA9IHNuYXBzaG90Py5leHBpcmF0aW9uX3BvbGljeSBhc1xuICAgIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICB8IG51bGxcbiAgICB8IHVuZGVmaW5lZFxuICBjb25zdCB0eXBlID0gc25hcHNob3RTdHJpbmcocG9saWN5LCBcInR5cGVcIilcblxuICBpZiAodHlwZSA9PT0gXCJub25lXCIpIHJldHVybiBcIk5vIGV4cGlyYXRpb25cIlxuICBpZiAodHlwZSA9PT0gXCJkdXJhdGlvblwiKSB7XG4gICAgY29uc3QgZGF5cyA9IHNuYXBzaG90TnVtYmVyKHBvbGljeSwgXCJkdXJhdGlvbl9kYXlzXCIpID8/IDBcbiAgICByZXR1cm4gYCR7ZGF5c30gZGF5cyBhZnRlciBpc3N1YW5jZWBcbiAgfVxuICBpZiAodHlwZSA9PT0gXCJmaXhlZFwiKSB7XG4gICAgcmV0dXJuIGBGaXhlZCBkYXRlICR7Zm9ybWF0RGF0ZVRpbWUoc25hcHNob3RTdHJpbmcocG9saWN5LCBcImV4cGlyZXNfYXRcIikpfWBcbiAgfVxuXG4gIHJldHVybiBcIi1cIlxufVxuXG5mdW5jdGlvbiBjYW1wYWlnblNuYXBzaG90TGFiZWwoXG4gIHNuYXBzaG90OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgfCB1bmRlZmluZWQsXG4pIHtcbiAgY29uc3QgY2FtcGFpZ25TbmFwc2hvdCA9IHNuYXBzaG90Py5jYW1wYWlnbl9zbmFwc2hvdCBhc1xuICAgIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICB8IG51bGxcbiAgICB8IHVuZGVmaW5lZFxuICByZXR1cm4gKFxuICAgIHNuYXBzaG90U3RyaW5nKGNhbXBhaWduU25hcHNob3QsIFwibmFtZVwiKSB8fFxuICAgIHNuYXBzaG90U3RyaW5nKGNhbXBhaWduU25hcHNob3QsIFwiY2FtcGFpZ25faWRlbnRpZmllclwiKSB8fFxuICAgIHNuYXBzaG90U3RyaW5nKHNuYXBzaG90LCBcImNhbXBhaWduX2lkXCIpIHx8XG4gICAgXCJOb25lXCJcbiAgKVxufVxuXG5mdW5jdGlvbiBwcm9tb3Rpb25TbmFwc2hvdExhYmVsKFxuICBzbmFwc2hvdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIHwgdW5kZWZpbmVkLFxuKSB7XG4gIGNvbnN0IHRlbXBsYXRlID0gc25hcHNob3Q/LnByb21vdGlvbl90ZW1wbGF0ZSBhc1xuICAgIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICB8IG51bGxcbiAgICB8IHVuZGVmaW5lZFxuICBjb25zdCBtZXRob2QgPSB0ZW1wbGF0ZT8uYXBwbGljYXRpb25fbWV0aG9kIGFzXG4gICAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIHwgbnVsbFxuICAgIHwgdW5kZWZpbmVkXG4gIGNvbnN0IHRhcmdldCA9IHNuYXBzaG90U3RyaW5nKG1ldGhvZCwgXCJ0YXJnZXRfdHlwZVwiKVxuICBjb25zdCBhbGxvY2F0aW9uID0gc25hcHNob3RTdHJpbmcobWV0aG9kLCBcImFsbG9jYXRpb25cIilcblxuICByZXR1cm4gW3RhcmdldCwgYWxsb2NhdGlvbl0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCIgLyBcIikgfHwgXCJOb25lXCJcbn1cblxuZnVuY3Rpb24gY2FtcGFpZ25MYWJlbChjb25maWc6IENvdXBvblByb2R1Y3RDb25maWcpIHtcbiAgY29uc3QgbmFtZSA9IGNvbmZpZy5jYW1wYWlnbl9zbmFwc2hvdD8ubmFtZVxuICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3RyaW5nXCIgJiYgbmFtZSkge1xuICAgIHJldHVybiBuYW1lXG4gIH1cblxuICByZXR1cm4gY29uZmlnLmNhbXBhaWduX2lkIHx8IFwiTm9uZVwiXG59XG5cbmZ1bmN0aW9uIGZvcm1Gcm9tUm93KHJvdzogQ291cG9uUHJvZHVjdFJvdywgZGVmYXVsdEN1cnJlbmN5Q29kZTogc3RyaW5nKSB7XG4gIGNvbnN0IHByb2R1Y3QgPSByb3cucHJvZHVjdCB8fCAoe30gYXMgUHJvZHVjdFJlY29yZClcbiAgY29uc3QgY29uZmlnID0gcm93LmNvdXBvbl9wcm9kdWN0X2NvbmZpZ1xuICBjb25zdCB2YXJpYW50Q29uZmlnQnlWYXJpYW50SWQgPSBuZXcgTWFwKFxuICAgIChyb3cuY291cG9uX3Byb2R1Y3RfdmFyaWFudF9jb25maWdzIHx8IFtdKS5tYXAoKHZhcmlhbnRDb25maWcpID0+IFtcbiAgICAgIHZhcmlhbnRDb25maWcudmFyaWFudF9pZCxcbiAgICAgIHZhcmlhbnRDb25maWcsXG4gICAgXSksXG4gIClcbiAgY29uc3QgZHVyYXRpb25EYXlzID1cbiAgICBjb25maWcuZXhwaXJhdGlvbl9wb2xpY3k/LnR5cGUgPT09IFwiZHVyYXRpb25cIlxuICAgICAgPyBjb25maWcuZXhwaXJhdGlvbl9wb2xpY3kuZHVyYXRpb25fZGF5c1xuICAgICAgOiAzMFxuXG4gIHJldHVybiB7XG4gICAgcHJvZHVjdDoge1xuICAgICAgLi4uZW1wdHlQcm9kdWN0LFxuICAgICAgaWQ6IHByb2R1Y3QuaWQgfHwgXCJcIixcbiAgICAgIHRpdGxlOiBwcm9kdWN0LnRpdGxlIHx8IFwiXCIsXG4gICAgICBzdWJ0aXRsZTogcHJvZHVjdC5zdWJ0aXRsZSB8fCBcIlwiLFxuICAgICAgaGFuZGxlOiBwcm9kdWN0LmhhbmRsZSB8fCBcIlwiLFxuICAgICAgZGVzY3JpcHRpb246IHByb2R1Y3QuZGVzY3JpcHRpb24gfHwgXCJcIixcbiAgICAgIHRodW1ibmFpbDogcHJvZHVjdC50aHVtYm5haWwgfHwgXCJcIixcbiAgICAgIHN0YXR1czogcHJvZHVjdC5zdGF0dXMgfHwgXCJkcmFmdFwiLFxuICAgICAgZGlzY291bnRhYmxlOiBCb29sZWFuKHByb2R1Y3QuZGlzY291bnRhYmxlKSxcbiAgICAgIHR5cGVfaWQ6IHByb2R1Y3QudHlwZV9pZCB8fCBcIlwiLFxuICAgICAgY29sbGVjdGlvbl9pZDogcHJvZHVjdC5jb2xsZWN0aW9uX2lkIHx8IFwiXCIsXG4gICAgICBjYXRlZ29yeV9pZDogcHJvZHVjdC5jYXRlZ29yaWVzPy5bMF0/LmlkIHx8IFwiXCIsXG4gICAgICB0YWdfaWQ6IHByb2R1Y3QudGFncz8uWzBdPy5pZCB8fCBcIlwiLFxuICAgICAgc2FsZXNfY2hhbm5lbF9pZDogcHJvZHVjdC5zYWxlc19jaGFubmVscz8uWzBdPy5pZCB8fCBcIlwiLFxuICAgICAgdmFyaWFudHM6IChwcm9kdWN0LnZhcmlhbnRzPy5sZW5ndGggPyBwcm9kdWN0LnZhcmlhbnRzIDogW10pLm1hcChcbiAgICAgICAgKHZhcmlhbnQpID0+IHtcbiAgICAgICAgICBjb25zdCBvdmVycmlkZSA9IHZhcmlhbnRDb25maWdCeVZhcmlhbnRJZC5nZXQodmFyaWFudC5pZClcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uZW1wdHlWYXJpYW50LFxuICAgICAgICAgICAgaWQ6IHZhcmlhbnQuaWQsXG4gICAgICAgICAgICBvdmVycmlkZV9jb25maWdfaWQ6IG92ZXJyaWRlPy5pZCxcbiAgICAgICAgICAgIHRpdGxlOiB2YXJpYW50LnRpdGxlIHx8IFwiXCIsXG4gICAgICAgICAgICBza3U6IHZhcmlhbnQuc2t1IHx8IFwiXCIsXG4gICAgICAgICAgICBjdXJyZW5jeV9jb2RlOlxuICAgICAgICAgICAgICB2YXJpYW50LnByaWNlcz8uWzBdPy5jdXJyZW5jeV9jb2RlIHx8XG4gICAgICAgICAgICAgIG92ZXJyaWRlPy5jdXJyZW5jeV9jb2RlIHx8XG4gICAgICAgICAgICAgIGNvbmZpZy5jdXJyZW5jeV9jb2RlIHx8XG4gICAgICAgICAgICAgIGRlZmF1bHRDdXJyZW5jeUNvZGUsXG4gICAgICAgICAgICBhbW91bnQ6XG4gICAgICAgICAgICAgIHZhcmlhbnQucHJpY2VzPy5bMF0/LmFtb3VudCA9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBcIlwiXG4gICAgICAgICAgICAgICAgOiBTdHJpbmcodmFyaWFudC5wcmljZXM/LlswXT8uYW1vdW50KSxcbiAgICAgICAgICAgIG92ZXJyaWRlX2VuYWJsZWQ6IG92ZXJyaWRlID8gb3ZlcnJpZGUuZW5hYmxlZCAhPT0gZmFsc2UgOiBmYWxzZSxcbiAgICAgICAgICAgIG92ZXJyaWRlX2JlbmVmaXRfdHlwZTpcbiAgICAgICAgICAgICAgb3ZlcnJpZGU/LmJlbmVmaXRfdHlwZSB8fCBjb25maWcuYmVuZWZpdF90eXBlIHx8IFwiZml4ZWRfYW1vdW50XCIsXG4gICAgICAgICAgICBvdmVycmlkZV9jdXJyZW5jeV9jb2RlOlxuICAgICAgICAgICAgICBvdmVycmlkZT8uY3VycmVuY3lfY29kZSB8fFxuICAgICAgICAgICAgICBjb25maWcuY3VycmVuY3lfY29kZSB8fFxuICAgICAgICAgICAgICBkZWZhdWx0Q3VycmVuY3lDb2RlLFxuICAgICAgICAgICAgb3ZlcnJpZGVfYW1vdW50OlxuICAgICAgICAgICAgICBvdmVycmlkZT8uYW1vdW50ID09IG51bGwgPyBcIlwiIDogU3RyaW5nKG92ZXJyaWRlLmFtb3VudCksXG4gICAgICAgICAgICBvdmVycmlkZV9wZXJjZW50YWdlOlxuICAgICAgICAgICAgICBvdmVycmlkZT8ucGVyY2VudGFnZSA9PSBudWxsID8gXCJcIiA6IFN0cmluZyhvdmVycmlkZS5wZXJjZW50YWdlKSxcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApLFxuICAgIH0sXG4gICAgY291cG9uOiB7XG4gICAgICAuLi5lbXB0eUNvdXBvbixcbiAgICAgIGVuYWJsZWQ6IGNvbmZpZy5lbmFibGVkLFxuICAgICAgYmVuZWZpdF90eXBlOiBjb25maWcuYmVuZWZpdF90eXBlLFxuICAgICAgYW1vdW50OiBjb25maWcuYW1vdW50ID09IG51bGwgPyBcIlwiIDogU3RyaW5nKGNvbmZpZy5hbW91bnQpLFxuICAgICAgcGVyY2VudGFnZTogY29uZmlnLnBlcmNlbnRhZ2UgPT0gbnVsbCA/IFwiXCIgOiBTdHJpbmcoY29uZmlnLnBlcmNlbnRhZ2UpLFxuICAgICAgY3VycmVuY3lfY29kZTogY29uZmlnLmN1cnJlbmN5X2NvZGUgfHwgZGVmYXVsdEN1cnJlbmN5Q29kZSxcbiAgICAgIGNvZGVfc3RyYXRlZ3k6IGNvbmZpZy5jb2RlX3N0cmF0ZWd5LFxuICAgICAgY29kZV9wcmVmaXg6IGNvbmZpZy5jb2RlX3ByZWZpeCB8fCBcIlwiLFxuICAgICAgc2hhcmVkX2NvZGU6IGNvbmZpZy5zaGFyZWRfY29kZSB8fCBcIlwiLFxuICAgICAgZXhwaXJhdGlvbl90eXBlOiBjb25maWcuZXhwaXJhdGlvbl9wb2xpY3k/LnR5cGUgfHwgXCJkdXJhdGlvblwiLFxuICAgICAgZXhwaXJhdGlvbl9kYXlzOiBTdHJpbmcoZHVyYXRpb25EYXlzKSxcbiAgICAgIGV4cGlyYXRpb25fZGF0ZTpcbiAgICAgICAgY29uZmlnLmV4cGlyYXRpb25fcG9saWN5Py50eXBlID09PSBcImZpeGVkXCJcbiAgICAgICAgICA/IHRvRGF0ZVRpbWVMb2NhbChjb25maWcuZXhwaXJhdGlvbl9wb2xpY3kuZXhwaXJlc19hdClcbiAgICAgICAgICA6IFwiXCIsXG4gICAgICBleHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbjpcbiAgICAgICAgY29uZmlnLmV4cGlyYXRpb25fcG9saWN5Py5jYXBfYnlfY2FtcGFpZ24gIT09IGZhbHNlLFxuICAgICAgZXhwaXJhdGlvbl9jYXBfYXQ6IGNvbmZpZy5leHBpcmF0aW9uX3BvbGljeT8uY2FwX2F0XG4gICAgICAgID8gdG9EYXRlVGltZUxvY2FsKGNvbmZpZy5leHBpcmF0aW9uX3BvbGljeS5jYXBfYXQpXG4gICAgICAgIDogXCJcIixcbiAgICAgIG1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbTogU3RyaW5nKFxuICAgICAgICBjb25maWcubWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtIHx8IDEsXG4gICAgICApLFxuICAgICAgcHJvbW90aW9uX21pcnJvcl9tb2RlOiBjb25maWcucHJvbW90aW9uX21pcnJvcl9tb2RlIHx8IFwibm9uZVwiLFxuICAgICAgcHJvbW90aW9uX3N0YXR1czogY29uZmlnLnByb21vdGlvbl9zdGF0dXMgfHwgXCJkcmFmdFwiLFxuICAgIH0sXG4gICAgY2FtcGFpZ246IHtcbiAgICAgIC4uLmVtcHR5Q2FtcGFpZ24sXG4gICAgICBtb2RlOiBjb25maWcuY2FtcGFpZ25faWQgPyBcImV4aXN0aW5nXCIgOiBcIm5vbmVcIixcbiAgICAgIGNhbXBhaWduX2lkOiBjb25maWcuY2FtcGFpZ25faWQgfHwgXCJcIixcbiAgICB9LFxuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ291cG9uUGF5bG9hZChcbiAgY291cG9uOiBDb3Vwb25Gb3JtU3RhdGUsXG4gIGFsbG93UHJvbW90aW9uTWlycm9yOiBib29sZWFuLFxuKSB7XG4gIHJldHVybiB7XG4gICAgZW5hYmxlZDogY291cG9uLmVuYWJsZWQsXG4gICAgYmVuZWZpdF90eXBlOiBjb3Vwb24uYmVuZWZpdF90eXBlLFxuICAgIGFtb3VudDpcbiAgICAgIGNvdXBvbi5iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCJcbiAgICAgICAgPyBudW1iZXJPck51bGwoY291cG9uLmFtb3VudClcbiAgICAgICAgOiBudWxsLFxuICAgIHBlcmNlbnRhZ2U6XG4gICAgICBjb3Vwb24uYmVuZWZpdF90eXBlID09PSBcInBlcmNlbnRhZ2VcIlxuICAgICAgICA/IG51bWJlck9yTnVsbChjb3Vwb24ucGVyY2VudGFnZSlcbiAgICAgICAgOiBudWxsLFxuICAgIGN1cnJlbmN5X2NvZGU6XG4gICAgICBjb3Vwb24uYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiXG4gICAgICAgID8gY291cG9uLmN1cnJlbmN5X2NvZGUudHJpbSgpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgOiBudWxsLFxuICAgIGNvZGVfc3RyYXRlZ3k6IGNvdXBvbi5jb2RlX3N0cmF0ZWd5LFxuICAgIGNvZGVfcHJlZml4OlxuICAgICAgY291cG9uLmNvZGVfc3RyYXRlZ3kgPT09IFwidW5pcXVlX2NvZGVcIlxuICAgICAgICA/IGNvdXBvbi5jb2RlX3ByZWZpeC50cmltKCkgfHwgXCJDT1VQT05cIlxuICAgICAgICA6IG51bGwsXG4gICAgc2hhcmVkX2NvZGU6XG4gICAgICBjb3Vwb24uY29kZV9zdHJhdGVneSA9PT0gXCJzaGFyZWRfY29kZVwiID8gY291cG9uLnNoYXJlZF9jb2RlLnRyaW0oKSA6IG51bGwsXG4gICAgZXhwaXJhdGlvbl9wb2xpY3k6XG4gICAgICBjb3Vwb24uZXhwaXJhdGlvbl90eXBlID09PSBcImZpeGVkXCJcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB0eXBlOiBcImZpeGVkXCIgYXMgY29uc3QsXG4gICAgICAgICAgICBleHBpcmVzX2F0OiBuZXcgRGF0ZShjb3Vwb24uZXhwaXJhdGlvbl9kYXRlKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgY2FwX2J5X2NhbXBhaWduOiBjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ24sXG4gICAgICAgICAgICBjYXBfYXQ6IGNvdXBvbi5leHBpcmF0aW9uX2NhcF9hdFxuICAgICAgICAgICAgICA/IG5ldyBEYXRlKGNvdXBvbi5leHBpcmF0aW9uX2NhcF9hdCkudG9JU09TdHJpbmcoKVxuICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiZHVyYXRpb25cIiBhcyBjb25zdCxcbiAgICAgICAgICAgIGR1cmF0aW9uX2RheXM6IE51bWJlcihjb3Vwb24uZXhwaXJhdGlvbl9kYXlzKSB8fCAzMCxcbiAgICAgICAgICAgIGNhcF9ieV9jYW1wYWlnbjogY291cG9uLmV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWduLFxuICAgICAgICAgICAgY2FwX2F0OiBjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYXRcbiAgICAgICAgICAgICAgPyBuZXcgRGF0ZShjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYXQpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIH0sXG4gICAgbWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtOlxuICAgICAgTnVtYmVyKGNvdXBvbi5tYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW0pIHx8IDEsXG4gICAgLi4uKGFsbG93UHJvbW90aW9uTWlycm9yXG4gICAgICA/IHtcbiAgICAgICAgICBwcm9tb3Rpb25fbWlycm9yX21vZGU6IGNvdXBvbi5wcm9tb3Rpb25fbWlycm9yX21vZGUsXG4gICAgICAgICAgcHJvbW90aW9uX3N0YXR1czogY291cG9uLnByb21vdGlvbl9zdGF0dXMsXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ2FtcGFpZ25QYXlsb2FkKFxuICBjYW1wYWlnbjogQ2FtcGFpZ25Gb3JtU3RhdGUsXG4gIGFsbG93Q2FtcGFpZ246IGJvb2xlYW4sXG4pIHtcbiAgaWYgKCFhbGxvd0NhbXBhaWduKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG4gIGlmIChjYW1wYWlnbi5tb2RlID09PSBcImV4aXN0aW5nXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZTogXCJleGlzdGluZ1wiLFxuICAgICAgY2FtcGFpZ25faWQ6IGNhbXBhaWduLmNhbXBhaWduX2lkIHx8IG51bGwsXG4gICAgfVxuICB9XG4gIGlmIChjYW1wYWlnbi5tb2RlID09PSBcIm5ld1wiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGU6IFwibmV3XCIsXG4gICAgICBjYW1wYWlnbjoge1xuICAgICAgICBuYW1lOiBjYW1wYWlnbi5uYW1lLFxuICAgICAgICBjYW1wYWlnbl9pZGVudGlmaWVyOiBjYW1wYWlnbi5jYW1wYWlnbl9pZGVudGlmaWVyLFxuICAgICAgICBzdGFydHNfYXQ6IGNhbXBhaWduLnN0YXJ0c19hdFxuICAgICAgICAgID8gbmV3IERhdGUoY2FtcGFpZ24uc3RhcnRzX2F0KS50b0lTT1N0cmluZygpXG4gICAgICAgICAgOiBudWxsLFxuICAgICAgICBlbmRzX2F0OiBjYW1wYWlnbi5lbmRzX2F0XG4gICAgICAgICAgPyBuZXcgRGF0ZShjYW1wYWlnbi5lbmRzX2F0KS50b0lTT1N0cmluZygpXG4gICAgICAgICAgOiBudWxsLFxuICAgICAgfSxcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgbW9kZTogXCJub25lXCIgfVxufVxuXG5mdW5jdGlvbiBzdGVwU3RhdHVzKHN0ZXA6IFdpemFyZFN0ZXAsIGFjdGl2ZTogV2l6YXJkU3RlcCkge1xuICBjb25zdCBzdGVwSW5kZXggPSBzdGVwcy5pbmRleE9mKHN0ZXApXG4gIGNvbnN0IGFjdGl2ZUluZGV4ID0gc3RlcHMuaW5kZXhPZihhY3RpdmUpXG4gIGlmIChzdGVwSW5kZXggPCBhY3RpdmVJbmRleCkgcmV0dXJuIFwiY29tcGxldGVkXCJcbiAgaWYgKHN0ZXBJbmRleCA9PT0gYWN0aXZlSW5kZXgpIHJldHVybiBcImluLXByb2dyZXNzXCJcbiAgcmV0dXJuIFwibm90LXN0YXJ0ZWRcIlxufVxuXG5mdW5jdGlvbiBGaWVsZCh7IGxhYmVsLCBjaGlsZHJlbiB9OiB7IGxhYmVsOiBzdHJpbmc7IGNoaWxkcmVuOiBSZWFjdE5vZGUgfSkge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAteS0xXCIgc3R5bGU9e3sgbWluV2lkdGg6IDAgfX0+XG4gICAgICA8TGFiZWw+e2xhYmVsfTwvTGFiZWw+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZnVuY3Rpb24gY3VycmVuY3lEZWNpbWFsRGlnaXRzKGNvZGU6IHN0cmluZykge1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQoXCJlblwiLCB7XG4gICAgICBzdHlsZTogXCJjdXJyZW5jeVwiLFxuICAgICAgY3VycmVuY3k6IGNvZGUudG9VcHBlckNhc2UoKSxcbiAgICB9KS5yZXNvbHZlZE9wdGlvbnMoKS5tYXhpbXVtRnJhY3Rpb25EaWdpdHNcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIDJcbiAgfVxufVxuXG5mdW5jdGlvbiBjdXJyZW5jeVN5bWJvbChjb2RlOiBzdHJpbmcpIHtcbiAgaWYgKCFjb2RlKSByZXR1cm4gXCJcIlxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIChcbiAgICAgIG5ldyBJbnRsLk51bWJlckZvcm1hdChcImVuXCIsIHtcbiAgICAgICAgc3R5bGU6IFwiY3VycmVuY3lcIixcbiAgICAgICAgY3VycmVuY3k6IGNvZGUudG9VcHBlckNhc2UoKSxcbiAgICAgICAgY3VycmVuY3lEaXNwbGF5OiBcIm5hcnJvd1N5bWJvbFwiLFxuICAgICAgfSlcbiAgICAgICAgLmZvcm1hdFRvUGFydHMoMClcbiAgICAgICAgLmZpbmQoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gXCJjdXJyZW5jeVwiKT8udmFsdWUgfHwgY29kZS50b1VwcGVyQ2FzZSgpXG4gICAgKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gY29kZS50b1VwcGVyQ2FzZSgpXG4gIH1cbn1cblxuZnVuY3Rpb24gQ3VycmVuY3lTZWxlY3Qoe1xuICBjdXJyZW5jaWVzLFxuICBkaXNhYmxlZCxcbiAgb25DaGFuZ2UsXG4gIHZhbHVlLFxufToge1xuICBjdXJyZW5jaWVzOiBDdXJyZW5jeU9wdGlvbltdXG4gIGRpc2FibGVkPzogYm9vbGVhblxuICBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWRcbiAgdmFsdWU6IHN0cmluZ1xufSkge1xuICByZXR1cm4gKFxuICAgIDxTZWxlY3RcbiAgICAgIHZhbHVlPXt2YWx1ZSB8fCB1bmRlZmluZWR9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWQgfHwgIWN1cnJlbmNpZXMubGVuZ3RofVxuICAgICAgb25WYWx1ZUNoYW5nZT17b25DaGFuZ2V9XG4gICAgPlxuICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICA8U2VsZWN0LlZhbHVlXG4gICAgICAgICAgcGxhY2Vob2xkZXI9e1xuICAgICAgICAgICAgY3VycmVuY2llcy5sZW5ndGggPyBcIlNlbGVjdCBjdXJyZW5jeVwiIDogXCJObyBjdXJyZW5jaWVzIGF2YWlsYWJsZVwiXG4gICAgICAgICAgfVxuICAgICAgICAvPlxuICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAge2N1cnJlbmNpZXMubWFwKChjdXJyZW5jeSkgPT4gKFxuICAgICAgICAgIDxTZWxlY3QuSXRlbSBrZXk9e2N1cnJlbmN5LmNvZGV9IHZhbHVlPXtjdXJyZW5jeS5jb2RlfT5cbiAgICAgICAgICAgIHtjdXJyZW5jeS5uYW1lfSAoe2N1cnJlbmN5LmNvZGUudG9VcHBlckNhc2UoKX0pXG4gICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgKSl9XG4gICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgIDwvU2VsZWN0PlxuICApXG59XG5cbmZ1bmN0aW9uIEN1cnJlbmN5QW1vdW50SW5wdXQoe1xuICBjdXJyZW5jaWVzLFxuICBjdXJyZW5jeUNvZGUsXG4gIGRpc2FibGVkLFxuICBvbkNoYW5nZSxcbiAgdmFsdWUsXG59OiB7XG4gIGN1cnJlbmNpZXM6IEN1cnJlbmN5T3B0aW9uW11cbiAgY3VycmVuY3lDb2RlOiBzdHJpbmdcbiAgZGlzYWJsZWQ/OiBib29sZWFuXG4gIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZFxuICB2YWx1ZTogc3RyaW5nXG59KSB7XG4gIGNvbnN0IGN1cnJlbmN5ID0gY3VycmVuY2llcy5maW5kKChpdGVtKSA9PiBpdGVtLmNvZGUgPT09IGN1cnJlbmN5Q29kZSlcbiAgY29uc3QgY29kZSA9IGN1cnJlbmN5Q29kZS50b1VwcGVyQ2FzZSgpXG4gIGNvbnN0IGRlY2ltYWxzID0gY3VycmVuY3lEZWNpbWFsRGlnaXRzKGNvZGUgfHwgXCJVU0RcIilcblxuICByZXR1cm4gKFxuICAgIDxDdXJyZW5jeUlucHV0XG4gICAgICBjb2RlPXtjb2RlIHx8IFwiVVNEXCJ9XG4gICAgICBzeW1ib2w9e1xuICAgICAgICBjdXJyZW5jeT8uc3ltYm9sX25hdGl2ZSB8fFxuICAgICAgICBjdXJyZW5jeT8uc3ltYm9sIHx8XG4gICAgICAgIGN1cnJlbmN5U3ltYm9sKGNvZGUgfHwgXCJVU0RcIilcbiAgICAgIH1cbiAgICAgIG1pbj17MH1cbiAgICAgIGRlY2ltYWxTY2FsZT17ZGVjaW1hbHN9XG4gICAgICBkZWNpbWFsc0xpbWl0PXtkZWNpbWFsc31cbiAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZCB8fCAhY3VycmVuY3lDb2RlfVxuICAgICAgb25WYWx1ZUNoYW5nZT17KG5leHRWYWx1ZSkgPT4gb25DaGFuZ2UobmV4dFZhbHVlIHx8IFwiXCIpfVxuICAgIC8+XG4gIClcbn1cblxuY29uc3QgZW50aXRsZW1lbnRGaWx0ZXJzID0gW1xuICB7IGxhYmVsOiBcIkFsbFwiLCB2YWx1ZTogXCJhbGxcIiB9LFxuICB7IGxhYmVsOiBcIklzc3VlZFwiLCB2YWx1ZTogXCJpc3N1ZWRcIiB9LFxuICB7IGxhYmVsOiBcIlJlZGVlbWVkXCIsIHZhbHVlOiBcInJlZGVlbWVkXCIgfSxcbiAgeyBsYWJlbDogXCJFeHBpcmVkXCIsIHZhbHVlOiBcImV4cGlyZWRcIiB9LFxuICB7IGxhYmVsOiBcIkNhbmNlbGVkXCIsIHZhbHVlOiBcImNhbmNlbGVkXCIgfSxcbl0gYXMgY29uc3RcblxudHlwZSBFbnRpdGxlbWVudEZpbHRlciA9ICh0eXBlb2YgZW50aXRsZW1lbnRGaWx0ZXJzKVtudW1iZXJdW1widmFsdWVcIl1cblxuZnVuY3Rpb24gU25hcHNob3RCbG9jayh7IHRpdGxlLCB2YWx1ZSB9OiB7IHRpdGxlOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGV0YWlscyBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBwLTNcIj5cbiAgICAgIDxzdW1tYXJ5IGNsYXNzTmFtZT1cImN1cnNvci1wb2ludGVyIHRleHQtdWktZmctYmFzZSB0eHQtc21hbGwtcGx1c1wiPlxuICAgICAgICB7dGl0bGV9XG4gICAgICA8L3N1bW1hcnk+XG4gICAgICA8cHJlXG4gICAgICAgIGNsYXNzTmFtZT1cIm10LTMgcm91bmRlZC1tZCBiZy11aS1iZy1zdWJ0bGUgcC0zIHRleHQtdWktZmctc3VidGxlIHR4dC1jb21wYWN0LXhzbWFsbFwiXG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgbWF4SGVpZ2h0OiAyMjAsXG4gICAgICAgICAgb3ZlcmZsb3c6IFwiYXV0b1wiLFxuICAgICAgICAgIHdoaXRlU3BhY2U6IFwicHJlLXdyYXBcIixcbiAgICAgICAgICB3b3JkQnJlYWs6IFwiYnJlYWstd29yZFwiLFxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7anNvbkJsb2NrKHZhbHVlKX1cbiAgICAgIDwvcHJlPlxuICAgIDwvZGV0YWlscz5cbiAgKVxufVxuXG5mdW5jdGlvbiBUd29Db2x1bW5MYXlvdXQoe1xuICBmaXJzdENvbCxcbiAgc2Vjb25kQ29sLFxufToge1xuICBmaXJzdENvbDogUmVhY3ROb2RlXG4gIHNlY29uZENvbDogUmVhY3ROb2RlXG59KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC14LTQgZ2FwLXktMyB4bDpmbGV4LXJvdyB4bDppdGVtcy1zdGFydFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHctZnVsbCBmbGV4LWNvbCBnYXAteS0zXCI+e2ZpcnN0Q29sfTwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHctZnVsbCBtYXgtdy1bMTAwJV0gZmxleC1jb2wgZ2FwLXktMyB4bDptdC0wIHhsOm1heC13LVs0NDBweF1cIj5cbiAgICAgICAge3NlY29uZENvbH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApXG59XG5cbmZ1bmN0aW9uIFNlY3Rpb25Sb3coe1xuICB0aXRsZSxcbiAgdmFsdWUsXG59OiB7XG4gIHRpdGxlOiBzdHJpbmdcbiAgdmFsdWU6IFJlYWN0Tm9kZVxufSkge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1zdWJ0bGUgZ3JpZCBncmlkLWNvbHMtMiBpdGVtcy1jZW50ZXIgZ2FwLXgtNCBweC02IHB5LTRcIj5cbiAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIHdlaWdodD1cInBsdXNcIiBsZWFkaW5nPVwiY29tcGFjdFwiPlxuICAgICAgICB7dGl0bGV9XG4gICAgICA8L1RleHQ+XG4gICAgICB7dHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHZhbHVlID09IG51bGwgPyAoXG4gICAgICAgIDxUZXh0XG4gICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICBsZWFkaW5nPVwiY29tcGFjdFwiXG4gICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1wcmV0dHkgd2hpdGVzcGFjZS1wcmUtbGluZVwiXG4gICAgICAgID5cbiAgICAgICAgICB7dmFsdWUgfHwgXCItXCJ9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICkgOiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLXctMFwiPnt2YWx1ZX08L2Rpdj5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZnVuY3Rpb24gV2lkZ2V0SGVhZGVyKHsgdGl0bGUgfTogeyB0aXRsZTogc3RyaW5nIH0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBweC02IHB5LTRcIj5cbiAgICAgIDxIZWFkaW5nIGxldmVsPVwiaDJcIj57dGl0bGV9PC9IZWFkaW5nPlxuICAgIDwvZGl2PlxuICApXG59XG5cbmZ1bmN0aW9uIFNpZGViYXJMaW5rKHtcbiAgaHJlZixcbiAgbGFiZWwsXG4gIGRlc2NyaXB0aW9uLFxuICBpY29uLFxufToge1xuICBocmVmOiBzdHJpbmdcbiAgbGFiZWw6IHN0cmluZ1xuICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gIGljb24/OiBSZWFjdE5vZGVcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8YSBocmVmPXtocmVmfSBjbGFzc05hbWU9XCJncm91cCBvdXRsaW5lLW5vbmVcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtMiBweC0yIHBiLTJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzaGFkb3ctZWxldmF0aW9uLWNhcmQtcmVzdCBiZy11aS1iZy1jb21wb25lbnQgdHJhbnNpdGlvbi1mZyBob3ZlcjpiZy11aS1iZy1jb21wb25lbnQtaG92ZXIgYWN0aXZlOmJnLXVpLWJnLWNvbXBvbmVudC1wcmVzc2VkIGdyb3VwLWZvY3VzLXZpc2libGU6c2hhZG93LWJvcmRlcnMtaW50ZXJhY3RpdmUtd2l0aC1hY3RpdmUgcm91bmRlZC1tZCBweC00IHB5LTJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC00XCI+XG4gICAgICAgICAgICB7aWNvbiAmJiA8ZGl2PntpY29ufTwvZGl2Pn1cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LTEgZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgbGVhZGluZz1cImNvbXBhY3RcIiB3ZWlnaHQ9XCJwbHVzXCI+XG4gICAgICAgICAgICAgICAge2xhYmVsfVxuICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgIDxUZXh0XG4gICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICBsZWFkaW5nPVwiY29tcGFjdFwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1zdWJ0bGVcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2Rlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPFRyaWFuZ2xlUmlnaHRNaW5pIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9hPlxuICApXG59XG5cbmZ1bmN0aW9uIFN1bW1hcnlXaWRnZXQoe1xuICBsYWJlbCxcbiAgdmFsdWUsXG4gIHRvbmUgPSBcImdyZWVuXCIsXG59OiB7XG4gIGxhYmVsOiBzdHJpbmdcbiAgdmFsdWU6IHN0cmluZ1xuICB0b25lPzogXCJncmVlblwiIHwgXCJuZXV0cmFsXCJcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8Q29udGFpbmVyIGNsYXNzTmFtZT1cInB4LTYgcHktNFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLXN1YnRsZSBmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC0zXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9e2BoLTggdy0xIHJvdW5kZWQtZnVsbCAke1xuICAgICAgICAgICAgdG9uZSA9PT0gXCJncmVlblwiXG4gICAgICAgICAgICAgID8gXCJiZy11aS10YWctZ3JlZW4taWNvblwiXG4gICAgICAgICAgICAgIDogXCJiZy11aS10YWctbmV1dHJhbC1pY29uXCJcbiAgICAgICAgICB9YH1cbiAgICAgICAgLz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtaW4tdy0wXCI+XG4gICAgICAgICAgPFRleHQgd2VpZ2h0PVwicGx1c1wiIHNpemU9XCJzbWFsbFwiIGNsYXNzTmFtZT1cInRleHQtdWktZmctc3VidGxlXCI+XG4gICAgICAgICAgICB7bGFiZWx9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIDxUZXh0XG4gICAgICAgICAgICB3ZWlnaHQ9XCJwbHVzXCJcbiAgICAgICAgICAgIHNpemU9XCJ4bGFyZ2VcIlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidGFidWxhci1udW1zIHRleHQtdWktZmctYmFzZSBicmVhay13b3Jkc1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3ZhbHVlfVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L0NvbnRhaW5lcj5cbiAgKVxufVxuXG5mdW5jdGlvbiBDb3Vwb25HZW5lcmFsU2VjdGlvbih7IGRldGFpbCB9OiB7IGRldGFpbDogQ291cG9uRW50aXRsZW1lbnREZXRhaWwgfSkge1xuICBjb25zdCBlbnRpdGxlbWVudCA9IGRldGFpbC5jdXN0b21lcl9jb3Vwb25fZW50aXRsZW1lbnRcbiAgY29uc3QgaXNzdWFuY2UgPSBkZXRhaWwuY291cG9uX2lzc3VhbmNlIHx8IG51bGxcbiAgY29uc3QgYmVuZWZpdFNuYXBzaG90ID0gZW50aXRsZW1lbnQuYmVuZWZpdF9zbmFwc2hvdCB8fCBudWxsXG4gIGNvbnN0IHNvdXJjZVNuYXBzaG90ID0gZW50aXRsZW1lbnQuc291cmNlX3NuYXBzaG90IHx8IG51bGxcbiAgY29uc3QgY29kZSA9IGNvdXBvbkNvZGUoZW50aXRsZW1lbnQpXG4gIGNvbnN0IGV4dGVybmFsID0gZW50aXRsZW1lbnQub3JpZ2luID09PSBcImV4dGVybmFsXCJcbiAgY29uc3QgcHJvZHVjdExhYmVsID1cbiAgICBzbmFwc2hvdFN0cmluZyhzb3VyY2VTbmFwc2hvdCwgXCJ0aXRsZVwiKSB8fFxuICAgIHNuYXBzaG90U3RyaW5nKHNvdXJjZVNuYXBzaG90LCBcInNvdXJjZVwiKSB8fFxuICAgIGVudGl0bGVtZW50LnByb2R1Y3RfaWQgfHxcbiAgICBcIkV4dGVybmFsXCJcbiAgY29uc3QgdmFyaWFudExhYmVsID1cbiAgICBzbmFwc2hvdFN0cmluZyhzb3VyY2VTbmFwc2hvdCwgXCJ2YXJpYW50X2lkXCIpIHx8IGVudGl0bGVtZW50LnZhcmlhbnRfaWQgfHwgXCItXCJcbiAgY29uc3QgaXNzdWVkRGF0ZSA9IGVudGl0bGVtZW50LmNyZWF0ZWRfYXQgfHwgaXNzdWFuY2U/LmNyZWF0ZWRfYXQgfHwgbnVsbFxuXG4gIHJldHVybiAoXG4gICAgPENvbnRhaW5lciBjbGFzc05hbWU9XCJkaXZpZGUteSBwLTBcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB4LTYgcHktNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1pbi13LTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC14LTFcIj5cbiAgICAgICAgICAgIDxIZWFkaW5nIGNsYXNzTmFtZT1cImJyZWFrLWFsbFwiPiN7Y29kZX08L0hlYWRpbmc+XG4gICAgICAgICAgICB7Y29kZSAhPT0gXCItXCIgJiYgKFxuICAgICAgICAgICAgICA8Q29weSBjb250ZW50PXtjb2RlfSBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCIgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1zdWJ0bGVcIj5cbiAgICAgICAgICAgIHtmb3JtYXRGdWxsRGF0ZShpc3N1ZWREYXRlKX1cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8U3RhdHVzQmFkZ2UgY29sb3I9e2VudGl0bGVtZW50U3RhdHVzQ29sb3IoZW50aXRsZW1lbnQuc3RhdHVzKX0+XG4gICAgICAgICAge2VudGl0bGVtZW50LnN0YXR1c31cbiAgICAgICAgPC9TdGF0dXNCYWRnZT5cbiAgICAgIDwvZGl2PlxuICAgICAgPFNlY3Rpb25Sb3cgdGl0bGU9XCJEYXRlIGlzc3VlZFwiIHZhbHVlPXtmb3JtYXRSZWxhdGl2ZURhdGUoaXNzdWVkRGF0ZSl9IC8+XG4gICAgICA8U2VjdGlvblJvd1xuICAgICAgICB0aXRsZT1cIkN1c3RvbWVyXCJcbiAgICAgICAgdmFsdWU9e2VudGl0bGVtZW50LmVtYWlsIHx8IGVudGl0bGVtZW50LmN1c3RvbWVyX2lkIHx8IFwiLVwifVxuICAgICAgLz5cbiAgICAgIDxTZWN0aW9uUm93IHRpdGxlPVwiT3JpZ2luXCIgdmFsdWU9e2VudGl0bGVtZW50U291cmNlKGVudGl0bGVtZW50KX0gLz5cbiAgICAgIDxTZWN0aW9uUm93XG4gICAgICAgIHRpdGxlPXtleHRlcm5hbCA/IFwiU291cmNlXCIgOiBcIkNvdXBvbiBwcm9kdWN0XCJ9XG4gICAgICAgIHZhbHVlPXtwcm9kdWN0TGFiZWx9XG4gICAgICAvPlxuICAgICAgPFNlY3Rpb25Sb3cgdGl0bGU9XCJTZWxsZXIgc2NvcGVcIiB2YWx1ZT17ZW50aXRsZW1lbnRTZWxsZXJTY29wZShlbnRpdGxlbWVudCl9IC8+XG4gICAgICB7IWV4dGVybmFsICYmIDxTZWN0aW9uUm93IHRpdGxlPVwiVmFyaWFudFwiIHZhbHVlPXt2YXJpYW50TGFiZWx9IC8+fVxuICAgICAgeyFleHRlcm5hbCAmJiAoXG4gICAgICAgIDxTZWN0aW9uUm93XG4gICAgICAgICAgdGl0bGU9XCJRdWFudGl0eVwiXG4gICAgICAgICAgdmFsdWU9e1N0cmluZyhcbiAgICAgICAgICAgIHNuYXBzaG90TnVtYmVyKHNvdXJjZVNuYXBzaG90LCBcInF1YW50aXR5XCIpID8/IGlzc3VhbmNlPy5xdWFudGl0eSA/PyAxLFxuICAgICAgICAgICl9XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgICAgPFNlY3Rpb25Sb3dcbiAgICAgICAgdGl0bGU9XCJCZW5lZml0XCJcbiAgICAgICAgdmFsdWU9e2JlbmVmaXRTbmFwc2hvdExhYmVsKGJlbmVmaXRTbmFwc2hvdCl9XG4gICAgICAvPlxuICAgICAgPFNlY3Rpb25Sb3dcbiAgICAgICAgdGl0bGU9XCJFeHBpcmF0aW9uIHBvbGljeVwiXG4gICAgICAgIHZhbHVlPXtleHBpcmF0aW9uUG9saWN5TGFiZWwoYmVuZWZpdFNuYXBzaG90KX1cbiAgICAgIC8+XG4gICAgICA8U2VjdGlvblJvdyB0aXRsZT1cIkV4cGlyYXRpb24gRGF0ZVwiIHZhbHVlPXtmb3JtYXREYXRlKGVudGl0bGVtZW50LmV4cGlyZXNfYXQpfSAvPlxuICAgICAgPFNlY3Rpb25Sb3cgdGl0bGU9XCJSZWRlZW1lZCBEYXRlXCIgdmFsdWU9e2Zvcm1hdERhdGUoZW50aXRsZW1lbnQucmVkZWVtZWRfYXQpfSAvPlxuICAgIDwvQ29udGFpbmVyPlxuICApXG59XG5cbmZ1bmN0aW9uIFJlbGF0ZWRPcmRlclNlY3Rpb24oe1xuICBhcGlCYXNlLFxuICBkZXRhaWwsXG59OiB7XG4gIGFwaUJhc2U6IEFwaUJhc2VcbiAgZGV0YWlsOiBDb3Vwb25FbnRpdGxlbWVudERldGFpbFxufSkge1xuICBjb25zdCBlbnRpdGxlbWVudCA9IGRldGFpbC5jdXN0b21lcl9jb3Vwb25fZW50aXRsZW1lbnRcbiAgY29uc3Qgb3JkZXIgPSBkZXRhaWwub3JkZXIgfHwgbnVsbFxuICBjb25zdCBvcmRlcklkID0gb3JkZXI/LmlkIHx8IGVudGl0bGVtZW50Lm9yZGVyX2lkXG4gIGlmICghb3JkZXJJZCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxDb250YWluZXIgY2xhc3NOYW1lPVwicC0wXCI+XG4gICAgICA8V2lkZ2V0SGVhZGVyIHRpdGxlPVwiUmVsYXRlZCBPcmRlclwiIC8+XG4gICAgICA8U2lkZWJhckxpbmtcbiAgICAgICAgaHJlZj17b3JkZXJEZXRhaWxQYXRoKGFwaUJhc2UsIG9yZGVySWQpfVxuICAgICAgICBsYWJlbD17b3JkZXIgPyBvcmRlckRpc3BsYXlJZChvcmRlcikgOiBvcmRlcklkfVxuICAgICAgICBkZXNjcmlwdGlvbj17XG4gICAgICAgICAgb3JkZXI/LmNyZWF0ZWRfYXRcbiAgICAgICAgICAgID8gYE9yZGVyIHBsYWNlZCAke2Zvcm1hdFJlbGF0aXZlRGF0ZShvcmRlci5jcmVhdGVkX2F0KX1gXG4gICAgICAgICAgICA6IFwiUHVyY2hhc2VkIGNvdXBvbiBvcmRlclwiXG4gICAgICAgIH1cbiAgICAgICAgaWNvbj17PFNob3BwaW5nQ2FydCAvPn1cbiAgICAgIC8+XG4gICAgPC9Db250YWluZXI+XG4gIClcbn1cblxuZnVuY3Rpb24gQ291cG9uU25hcHNob3RzU2VjdGlvbih7XG4gIGRldGFpbCxcbn06IHtcbiAgZGV0YWlsOiBDb3Vwb25FbnRpdGxlbWVudERldGFpbFxufSkge1xuICBjb25zdCBlbnRpdGxlbWVudCA9IGRldGFpbC5jdXN0b21lcl9jb3Vwb25fZW50aXRsZW1lbnRcbiAgY29uc3QgaXNzdWFuY2UgPSBkZXRhaWwuY291cG9uX2lzc3VhbmNlIHx8IG51bGxcblxuICByZXR1cm4gKFxuICAgIDxDb250YWluZXIgY2xhc3NOYW1lPVwicC0wXCI+XG4gICAgICA8V2lkZ2V0SGVhZGVyIHRpdGxlPVwiSlNPTlwiIC8+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLXktMyBweC02IHBiLTZcIj5cbiAgICAgICAgPFNuYXBzaG90QmxvY2tcbiAgICAgICAgICB0aXRsZT1cIkJlbmVmaXQgc25hcHNob3RcIlxuICAgICAgICAgIHZhbHVlPXtlbnRpdGxlbWVudC5iZW5lZml0X3NuYXBzaG90fVxuICAgICAgICAvPlxuICAgICAgICA8U25hcHNob3RCbG9ja1xuICAgICAgICAgIHRpdGxlPVwiU291cmNlIHNuYXBzaG90XCJcbiAgICAgICAgICB2YWx1ZT17ZW50aXRsZW1lbnQuc291cmNlX3NuYXBzaG90fVxuICAgICAgICAvPlxuICAgICAgICA8U25hcHNob3RCbG9ja1xuICAgICAgICAgIHRpdGxlPVwiSXNzdWFuY2UgY29uZmlnIHNuYXBzaG90XCJcbiAgICAgICAgICB2YWx1ZT17aXNzdWFuY2U/LmNvbmZpZ19zbmFwc2hvdH1cbiAgICAgICAgLz5cbiAgICAgICAgPFNuYXBzaG90QmxvY2sgdGl0bGU9XCJTZWxsZXIgdGFyZ2V0c1wiIHZhbHVlPXtlbnRpdGxlbWVudC5zZWxsZXJfdGFyZ2V0c30gLz5cbiAgICAgICAgPFNuYXBzaG90QmxvY2sgdGl0bGU9XCJNZXRhZGF0YVwiIHZhbHVlPXtlbnRpdGxlbWVudC5tZXRhZGF0YX0gLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvQ29udGFpbmVyPlxuICApXG59XG5cbmZ1bmN0aW9uIENvdXBvblN1bW1hcnlTZWN0aW9ucyh7XG4gIGRldGFpbCxcbn06IHtcbiAgZGV0YWlsOiBDb3Vwb25FbnRpdGxlbWVudERldGFpbFxufSkge1xuICBjb25zdCBlbnRpdGxlbWVudCA9IGRldGFpbC5jdXN0b21lcl9jb3Vwb25fZW50aXRsZW1lbnRcbiAgY29uc3QgaXNzdWFuY2UgPSBkZXRhaWwuY291cG9uX2lzc3VhbmNlIHx8IG51bGxcbiAgY29uc3QgYmVuZWZpdFNuYXBzaG90ID0gZW50aXRsZW1lbnQuYmVuZWZpdF9zbmFwc2hvdCB8fCBudWxsXG4gIGNvbnN0IHNvdXJjZVNuYXBzaG90ID0gZW50aXRsZW1lbnQuc291cmNlX3NuYXBzaG90IHx8IG51bGxcbiAgY29uc3Qgb3JkZXIgPSBkZXRhaWwub3JkZXIgfHwgbnVsbFxuICBjb25zdCBsaW5lVG90YWwgPSBzbmFwc2hvdE51bWJlcihzb3VyY2VTbmFwc2hvdCwgXCJ0b3RhbFwiKVxuICBjb25zdCBleHRlcm5hbCA9IGVudGl0bGVtZW50Lm9yaWdpbiA9PT0gXCJleHRlcm5hbFwiXG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPFN1bW1hcnlXaWRnZXRcbiAgICAgICAgbGFiZWw9XCJCZW5lZml0XCJcbiAgICAgICAgdmFsdWU9e2JlbmVmaXRTbmFwc2hvdExhYmVsKGJlbmVmaXRTbmFwc2hvdCl9XG4gICAgICAvPlxuICAgICAgeyFleHRlcm5hbCAmJiAoXG4gICAgICAgIDxTdW1tYXJ5V2lkZ2V0XG4gICAgICAgICAgbGFiZWw9XCJMaW5lIFRvdGFsXCJcbiAgICAgICAgICB2YWx1ZT17Zm9ybWF0U25hcHNob3RBbW91bnQobGluZVRvdGFsLCBvcmRlcj8uY3VycmVuY3lfY29kZSl9XG4gICAgICAgICAgdG9uZT1cIm5ldXRyYWxcIlxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAgIHshZXh0ZXJuYWwgJiYgKFxuICAgICAgICA8Q29udGFpbmVyIGNsYXNzTmFtZT1cImRpdmlkZS15IHAtMFwiPlxuICAgICAgICAgIDxXaWRnZXRIZWFkZXIgdGl0bGU9XCJDYW1wYWlnblwiIC8+XG4gICAgICAgICAgPFNlY3Rpb25Sb3cgdGl0bGU9XCJDYW1wYWlnblwiIHZhbHVlPXtjYW1wYWlnblNuYXBzaG90TGFiZWwoYmVuZWZpdFNuYXBzaG90KX0gLz5cbiAgICAgICAgICA8U2VjdGlvblJvdyB0aXRsZT1cIlByb21vdGlvblwiIHZhbHVlPXtwcm9tb3Rpb25TbmFwc2hvdExhYmVsKGJlbmVmaXRTbmFwc2hvdCl9IC8+XG4gICAgICAgICAgPFNlY3Rpb25Sb3dcbiAgICAgICAgICAgIHRpdGxlPVwiUHJvbW90aW9uIHN0YXR1c1wiXG4gICAgICAgICAgICB2YWx1ZT17c25hcHNob3RTdHJpbmcoYmVuZWZpdFNuYXBzaG90LCBcInByb21vdGlvbl9zdGF0dXNcIikgfHwgXCItXCJ9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9Db250YWluZXI+XG4gICAgICApfVxuICAgICAgeyFleHRlcm5hbCAmJiAoXG4gICAgICAgIDxDb250YWluZXIgY2xhc3NOYW1lPVwiZGl2aWRlLXkgcC0wXCI+XG4gICAgICAgICAgPFdpZGdldEhlYWRlciB0aXRsZT1cIklzc3VhbmNlXCIgLz5cbiAgICAgICAgICA8U2VjdGlvblJvdyB0aXRsZT1cIlN0YXR1c1wiIHZhbHVlPXtpc3N1YW5jZT8uc3RhdHVzIHx8IFwiLVwifSAvPlxuICAgICAgICAgIDxTZWN0aW9uUm93XG4gICAgICAgICAgICB0aXRsZT1cIklzc3VlZCAvIGZhaWxlZFwiXG4gICAgICAgICAgICB2YWx1ZT17XG4gICAgICAgICAgICAgIGlzc3VhbmNlXG4gICAgICAgICAgICAgICAgPyBgJHtpc3N1YW5jZS5pc3N1ZWRfY291bnQgPz8gMH0gLyAke2lzc3VhbmNlLmZhaWxlZF9jb3VudCA/PyAwfWBcbiAgICAgICAgICAgICAgICA6IFwiLVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8U2VjdGlvblJvdyB0aXRsZT1cIkNvbmZpZ1wiIHZhbHVlPXtlbnRpdGxlbWVudC5jb25maWdfaWQgfHwgXCItXCJ9IC8+XG4gICAgICAgICAgPFNlY3Rpb25Sb3dcbiAgICAgICAgICAgIHRpdGxlPVwiVmFyaWFudCBjb25maWdcIlxuICAgICAgICAgICAgdmFsdWU9e2VudGl0bGVtZW50LnZhcmlhbnRfY29uZmlnX2lkIHx8IFwiLVwifVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvQ29udGFpbmVyPlxuICAgICAgKX1cbiAgICA8Lz5cbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gQ291cG9uRGV0YWlsUGFnZVZpZXcoeyBhcGlCYXNlIH06IHsgYXBpQmFzZTogQXBpQmFzZSB9KSB7XG4gIGNvbnN0IGlkID0gY3VycmVudENvdXBvbkRldGFpbElkKGFwaUJhc2UpXG4gIGNvbnN0IFtkZXRhaWwsIHNldERldGFpbF0gPSB1c2VTdGF0ZTxDb3Vwb25FbnRpdGxlbWVudERldGFpbCB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKHRydWUpXG4gIGNvbnN0IFtsb2FkRXJyb3IsIHNldExvYWRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IGFjdGl2ZSA9IHRydWVcbiAgICBhc3luYyBmdW5jdGlvbiBsb2FkKCkge1xuICAgICAgaWYgKCFpZCkge1xuICAgICAgICBzZXRMb2FkRXJyb3IoXCJNaXNzaW5nIGNvdXBvbiBpZFwiKVxuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgc2V0TG9hZGluZyh0cnVlKVxuICAgICAgc2V0TG9hZEVycm9yKG51bGwpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBhcGlGZXRjaDxDb3Vwb25FbnRpdGxlbWVudERldGFpbD4oXG4gICAgICAgICAgYCR7YXBpQmFzZX0vY291cG9uLXByb2R1Y3RzL2VudGl0bGVtZW50cy8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9YCxcbiAgICAgICAgKVxuICAgICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgICAgc2V0RGV0YWlsKHBheWxvYWQpXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgID8gZXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgOiBcIkZhaWxlZCB0byBsb2FkIGNvdXBvbiBkZXRhaWxzXCJcbiAgICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICAgIHNldExvYWRFcnJvcihtZXNzYWdlKVxuICAgICAgICAgIHRvYXN0LmVycm9yKG1lc3NhZ2UpXG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdm9pZCBsb2FkKClcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBhY3RpdmUgPSBmYWxzZVxuICAgIH1cbiAgfSwgW2FwaUJhc2UsIGlkXSlcblxuICBpZiAobG9hZGluZykge1xuICAgIHJldHVybiA8Q291cG9uRW1wdHlTdGF0ZSB0aXRsZT1cIkxvYWRpbmcgY291cG9uXCIgLz5cbiAgfVxuXG4gIGlmIChsb2FkRXJyb3IpIHtcbiAgICByZXR1cm4gPENvdXBvbkVtcHR5U3RhdGUgdGl0bGU9e2xvYWRFcnJvcn0gLz5cbiAgfVxuXG4gIGlmICghZGV0YWlsKSB7XG4gICAgcmV0dXJuIDxDb3Vwb25FbXB0eVN0YXRlIHRpdGxlPVwiQ291cG9uIG5vdCBmb3VuZFwiIC8+XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxUd29Db2x1bW5MYXlvdXRcbiAgICAgIGZpcnN0Q29sPXtcbiAgICAgICAgPD5cbiAgICAgICAgICA8Q291cG9uR2VuZXJhbFNlY3Rpb24gZGV0YWlsPXtkZXRhaWx9IC8+XG4gICAgICAgICAgPFJlbGF0ZWRPcmRlclNlY3Rpb24gYXBpQmFzZT17YXBpQmFzZX0gZGV0YWlsPXtkZXRhaWx9IC8+XG4gICAgICAgICAgPENvdXBvblNuYXBzaG90c1NlY3Rpb24gZGV0YWlsPXtkZXRhaWx9IC8+XG4gICAgICAgIDwvPlxuICAgICAgfVxuICAgICAgc2Vjb25kQ29sPXs8Q291cG9uU3VtbWFyeVNlY3Rpb25zIGRldGFpbD17ZGV0YWlsfSAvPn1cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIEVudGl0bGVtZW50c1RhYmxlKHtcbiAgZW50aXRsZW1lbnRzLFxuICBsb2FkaW5nLFxuICBlcnJvcixcbiAgb25PcGVuLFxufToge1xuICBlbnRpdGxlbWVudHM6IENvdXBvbkVudGl0bGVtZW50W11cbiAgbG9hZGluZzogYm9vbGVhblxuICBlcnJvcjogc3RyaW5nIHwgbnVsbFxuICBvbk9wZW46IChlbnRpdGxlbWVudDogQ291cG9uRW50aXRsZW1lbnQpID0+IHZvaWRcbn0pIHtcbiAgaWYgKGxvYWRpbmcpIHtcbiAgICByZXR1cm4gPENvdXBvbkVtcHR5U3RhdGUgdGl0bGU9XCJMb2FkaW5nIGNvdXBvbnNcIiAvPlxuICB9XG4gIGlmIChlcnJvcikge1xuICAgIHJldHVybiA8Q291cG9uRW1wdHlTdGF0ZSB0aXRsZT17ZXJyb3J9IC8+XG4gIH1cbiAgaWYgKCFlbnRpdGxlbWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxDb3Vwb25FbXB0eVN0YXRlXG4gICAgICAgIHRpdGxlPVwiTm8gY291cG9ucyBmb3VuZFwiXG4gICAgICAgIGRlc2NyaXB0aW9uPVwiUHVyY2hhc2VkIGNvdXBvbnMgd2lsbCBhcHBlYXIgaGVyZSBhZnRlciB0aGV5IGFyZSBpc3N1ZWQuXCJcbiAgICAgIC8+XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8VGFibGU+XG4gICAgICA8VGFibGUuSGVhZGVyPlxuICAgICAgICA8VGFibGUuUm93PlxuICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPlN0YXR1czwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5Db2RlPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPkRhdGUgaXNzdWVkPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPk9yZGVyPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPkN1c3RvbWVyPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPk9yaWdpbjwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5TZWxsZXIgc2NvcGU8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+U291cmNlPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPkV4cGlyZXM8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgIDwvVGFibGUuUm93PlxuICAgICAgPC9UYWJsZS5IZWFkZXI+XG4gICAgICA8VGFibGUuQm9keT5cbiAgICAgICAge2VudGl0bGVtZW50cy5tYXAoKGl0ZW0pID0+IChcbiAgICAgICAgICA8VGFibGUuUm93XG4gICAgICAgICAgICBrZXk9e2l0ZW0uaWR9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJjdXJzb3ItcG9pbnRlciBob3ZlcjpiZy11aS1iZy1zdWJ0bGVcIlxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gb25PcGVuKGl0ZW0pfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxUYWJsZS5DZWxsPlxuICAgICAgICAgICAgICA8U3RhdHVzQmFkZ2UgY29sb3I9e2VudGl0bGVtZW50U3RhdHVzQ29sb3IoaXRlbS5zdGF0dXMpfT5cbiAgICAgICAgICAgICAgICB7aXRlbS5zdGF0dXN9XG4gICAgICAgICAgICAgIDwvU3RhdHVzQmFkZ2U+XG4gICAgICAgICAgICA8L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICA8VGFibGUuQ2VsbD57aXRlbS5jb2RlIHx8IGl0ZW0uc2hhcmVkX2NvZGUgfHwgXCItXCJ9PC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgPFRhYmxlLkNlbGwgdGl0bGU9e2Zvcm1hdEZ1bGxEYXRlKGl0ZW0uY3JlYXRlZF9hdCl9PlxuICAgICAgICAgICAgICB7Zm9ybWF0UmVsYXRpdmVEYXRlKGl0ZW0uY3JlYXRlZF9hdCl9XG4gICAgICAgICAgICA8L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICA8VGFibGUuQ2VsbD57aXRlbS5vcmRlcl9pZCB8fCBcIi1cIn08L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICA8VGFibGUuQ2VsbD57aXRlbS5lbWFpbCB8fCBpdGVtLmN1c3RvbWVyX2lkIHx8IFwiLVwifTwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgIDxUYWJsZS5DZWxsPntlbnRpdGxlbWVudFNvdXJjZShpdGVtKX08L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICA8VGFibGUuQ2VsbD57ZW50aXRsZW1lbnRTZWxsZXJTY29wZShpdGVtKX08L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICA8VGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAge3NuYXBzaG90U3RyaW5nKGl0ZW0uc291cmNlX3NuYXBzaG90LCBcInRpdGxlXCIpIHx8XG4gICAgICAgICAgICAgICAgc25hcHNob3RTdHJpbmcoaXRlbS5zb3VyY2Vfc25hcHNob3QsIFwic291cmNlXCIpIHx8XG4gICAgICAgICAgICAgICAgaXRlbS5wcm9kdWN0X2lkIHx8XG4gICAgICAgICAgICAgICAgXCJFeHRlcm5hbFwifVxuICAgICAgICAgICAgPC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgPFRhYmxlLkNlbGw+e2Zvcm1hdERhdGUoaXRlbS5leHBpcmVzX2F0KX08L1RhYmxlLkNlbGw+XG4gICAgICAgICAgPC9UYWJsZS5Sb3c+XG4gICAgICAgICkpfVxuICAgICAgPC9UYWJsZS5Cb2R5PlxuICAgIDwvVGFibGU+XG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENvdXBvbnNQYWdlVmlldyh7XG4gIGFwaUJhc2UsXG4gIHRpdGxlLFxufToge1xuICBhcGlCYXNlOiBBcGlCYXNlXG4gIHRpdGxlOiBzdHJpbmdcbn0pIHtcbiAgY29uc3QgW2VudGl0bGVtZW50cywgc2V0RW50aXRsZW1lbnRzXSA9IHVzZVN0YXRlPENvdXBvbkVudGl0bGVtZW50W10+KFtdKVxuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKVxuICBjb25zdCBbbG9hZEVycm9yLCBzZXRMb2FkRXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW2ZpbHRlciwgc2V0RmlsdGVyXSA9IHVzZVN0YXRlPEVudGl0bGVtZW50RmlsdGVyPihcImFsbFwiKVxuXG4gIGNvbnN0IGxvYWQgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgc2V0TG9hZGluZyh0cnVlKVxuICAgIHNldExvYWRFcnJvcihudWxsKVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgYXBpRmV0Y2g8e1xuICAgICAgICBjdXN0b21lcl9jb3Vwb25fZW50aXRsZW1lbnRzOiBDb3Vwb25FbnRpdGxlbWVudFtdXG4gICAgICB9PihgJHthcGlCYXNlfS9jb3Vwb24tcHJvZHVjdHMvZW50aXRsZW1lbnRzYClcbiAgICAgIHNldEVudGl0bGVtZW50cyhwYXlsb2FkLmN1c3RvbWVyX2NvdXBvbl9lbnRpdGxlbWVudHMgfHwgW10pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiRmFpbGVkIHRvIGxvYWQgY291cG9uc1wiXG4gICAgICBzZXRMb2FkRXJyb3IobWVzc2FnZSlcbiAgICAgIHRvYXN0LmVycm9yKG1lc3NhZ2UpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgfVxuICB9LCBbYXBpQmFzZV0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICB2b2lkIGxvYWQoKVxuICB9LCBbbG9hZF0pXG5cbiAgY29uc3Qgb3BlbkRldGFpbCA9IHVzZUNhbGxiYWNrKFxuICAgIChlbnRpdGxlbWVudDogQ291cG9uRW50aXRsZW1lbnQpID0+IHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oY291cG9uRGV0YWlsUGF0aChhcGlCYXNlLCBlbnRpdGxlbWVudC5pZCkpXG4gICAgfSxcbiAgICBbYXBpQmFzZV0sXG4gIClcblxuICByZXR1cm4gKFxuICAgIDxDb250YWluZXIgY2xhc3NOYW1lPVwiZGl2aWRlLXkgcC0wXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBweC02IHB5LTRcIj5cbiAgICAgICAgPEhlYWRpbmcgbGV2ZWw9XCJoMVwiPnt0aXRsZX08L0hlYWRpbmc+XG4gICAgICAgIDxCdXR0b24gc2l6ZT1cInNtYWxsXCIgdmFyaWFudD1cInNlY29uZGFyeVwiIG9uQ2xpY2s9eygpID0+IHZvaWQgbG9hZCgpfT5cbiAgICAgICAgICA8QXJyb3dQYXRoIC8+XG4gICAgICAgICAgUmVmcmVzaFxuICAgICAgICA8L0J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPFRhYnNcbiAgICAgICAgdmFsdWU9e2ZpbHRlcn1cbiAgICAgICAgb25WYWx1ZUNoYW5nZT17KHZhbHVlKSA9PiBzZXRGaWx0ZXIodmFsdWUgYXMgRW50aXRsZW1lbnRGaWx0ZXIpfVxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInB4LTYgcHktMiBib3JkZXItYlwiPlxuICAgICAgICAgIDxUYWJzLkxpc3Q+XG4gICAgICAgICAgICB7ZW50aXRsZW1lbnRGaWx0ZXJzLm1hcCgoaXRlbSkgPT4gKFxuICAgICAgICAgICAgICA8VGFicy5UcmlnZ2VyIGtleT17aXRlbS52YWx1ZX0gdmFsdWU9e2l0ZW0udmFsdWV9PlxuICAgICAgICAgICAgICAgIHtpdGVtLmxhYmVsfVxuICAgICAgICAgICAgICA8L1RhYnMuVHJpZ2dlcj5cbiAgICAgICAgICAgICkpfVxuICAgICAgICAgIDwvVGFicy5MaXN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAge2VudGl0bGVtZW50RmlsdGVycy5tYXAoKGl0ZW0pID0+IChcbiAgICAgICAgICA8VGFicy5Db250ZW50IGtleT17aXRlbS52YWx1ZX0gdmFsdWU9e2l0ZW0udmFsdWV9PlxuICAgICAgICAgICAgPEVudGl0bGVtZW50c1RhYmxlXG4gICAgICAgICAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICAgICAgICAgIGVycm9yPXtsb2FkRXJyb3J9XG4gICAgICAgICAgICAgIG9uT3Blbj17b3BlbkRldGFpbH1cbiAgICAgICAgICAgICAgZW50aXRsZW1lbnRzPXtcbiAgICAgICAgICAgICAgICBpdGVtLnZhbHVlID09PSBcImFsbFwiXG4gICAgICAgICAgICAgICAgICA/IGVudGl0bGVtZW50c1xuICAgICAgICAgICAgICAgICAgOiBlbnRpdGxlbWVudHMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgIChlbnRpdGxlbWVudCkgPT4gZW50aXRsZW1lbnQuc3RhdHVzID09PSBpdGVtLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9UYWJzLkNvbnRlbnQ+XG4gICAgICAgICkpfVxuICAgICAgPC9UYWJzPlxuICAgIDwvQ29udGFpbmVyPlxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDb3Vwb25Qcm9kdWN0c1BhZ2VWaWV3KHtcbiAgYXBpQmFzZSxcbiAgdGl0bGUsXG4gIGFsbG93UHJvbW90aW9uTWlycm9yID0gZmFsc2UsXG59OiB7XG4gIGFwaUJhc2U6IEFwaUJhc2VcbiAgdGl0bGU6IHN0cmluZ1xuICBhbGxvd1Byb21vdGlvbk1pcnJvcj86IGJvb2xlYW5cbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8Q291cG9uUHJvZHVjdHNQYWdlXG4gICAgICBhcGlCYXNlPXthcGlCYXNlfVxuICAgICAgdGl0bGU9e3RpdGxlfVxuICAgICAgYWxsb3dQcm9tb3Rpb25NaXJyb3I9e2FsbG93UHJvbW90aW9uTWlycm9yfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gTGVnYWN5Q291cG9uUHJvZHVjdHNQYWdlVmlldyh7XG4gIGFwaUJhc2UsXG4gIHRpdGxlLFxuICBhbGxvd1Byb21vdGlvbk1pcnJvciA9IGZhbHNlLFxufToge1xuICBhcGlCYXNlOiBBcGlCYXNlXG4gIHRpdGxlOiBzdHJpbmdcbiAgYWxsb3dQcm9tb3Rpb25NaXJyb3I/OiBib29sZWFuXG59KSB7XG4gIGNvbnN0IFtwcm9kdWN0cywgc2V0UHJvZHVjdHNdID0gdXNlU3RhdGU8Q291cG9uUHJvZHVjdFJvd1tdPihbXSlcbiAgY29uc3QgW29wdGlvbnMsIHNldE9wdGlvbnNdID0gdXNlU3RhdGU8T3B0aW9uc1BheWxvYWQ+KHt9KVxuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKVxuICBjb25zdCBbbG9hZEVycm9yLCBzZXRMb2FkRXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW21vZGFsT3Blbiwgc2V0TW9kYWxPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbc2F2aW5nLCBzZXRTYXZpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFthY3RpdmVTdGVwLCBzZXRBY3RpdmVTdGVwXSA9IHVzZVN0YXRlPFdpemFyZFN0ZXA+KFwiZGV0YWlsc1wiKVxuICBjb25zdCBbcHJvZHVjdEZvcm0sIHNldFByb2R1Y3RGb3JtXSA9IHVzZVN0YXRlPFByb2R1Y3RGb3JtU3RhdGU+KGVtcHR5UHJvZHVjdClcbiAgY29uc3QgW2NvdXBvbkZvcm0sIHNldENvdXBvbkZvcm1dID0gdXNlU3RhdGU8Q291cG9uRm9ybVN0YXRlPihlbXB0eUNvdXBvbilcbiAgY29uc3QgW2NhbXBhaWduRm9ybSwgc2V0Q2FtcGFpZ25Gb3JtXSA9XG4gICAgdXNlU3RhdGU8Q2FtcGFpZ25Gb3JtU3RhdGU+KGVtcHR5Q2FtcGFpZ24pXG4gIGNvbnN0IHByb21wdCA9IHVzZVByb21wdCgpXG5cbiAgY29uc3QgY291cG9uQmFzZSA9IGAke2FwaUJhc2V9L2NvdXBvbi1wcm9kdWN0c2BcblxuICBjb25zdCBsb2FkID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIHNldExvYWRpbmcodHJ1ZSlcbiAgICBzZXRMb2FkRXJyb3IobnVsbClcbiAgICB0cnkge1xuICAgICAgY29uc3QgW3Byb2R1Y3RzUGF5bG9hZCwgb3B0aW9uc1BheWxvYWRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBhcGlGZXRjaDx7IGNvdXBvbl9wcm9kdWN0czogQ291cG9uUHJvZHVjdFJvd1tdIH0+KGNvdXBvbkJhc2UpLFxuICAgICAgICBhcGlGZXRjaDxPcHRpb25zUGF5bG9hZD4oYCR7Y291cG9uQmFzZX0vb3B0aW9uc2ApLFxuICAgICAgXSlcbiAgICAgIHNldFByb2R1Y3RzKHByb2R1Y3RzUGF5bG9hZC5jb3Vwb25fcHJvZHVjdHMgfHwgW10pXG4gICAgICBzZXRPcHRpb25zKG9wdGlvbnNQYXlsb2FkIHx8IHt9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgID8gZXJyb3IubWVzc2FnZVxuICAgICAgICAgIDogXCJGYWlsZWQgdG8gbG9hZCBjb3Vwb24gcHJvZHVjdHNcIlxuICAgICAgc2V0TG9hZEVycm9yKG1lc3NhZ2UpXG4gICAgICB0b2FzdC5lcnJvcihtZXNzYWdlKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgIH1cbiAgfSwgW2NvdXBvbkJhc2VdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgdm9pZCBsb2FkKClcbiAgfSwgW2xvYWRdKVxuXG4gIGNvbnN0IG9wdGlvbkRlZmF1bHRzID0gdXNlTWVtbyhcbiAgICAoKSA9PiAoe1xuICAgICAgc2FsZXNfY2hhbm5lbF9pZDogb3B0aW9ucy5zYWxlc19jaGFubmVscz8uWzBdPy5pZCB8fCBcIlwiLFxuICAgICAgY3VycmVuY3lfY29kZTpcbiAgICAgICAgb3B0aW9ucy5jdXJyZW5jaWVzPy5maW5kKChjdXJyZW5jeSkgPT4gY3VycmVuY3kuaXNfZGVmYXVsdCk/LmNvZGUgfHxcbiAgICAgICAgb3B0aW9ucy5jdXJyZW5jaWVzPy5bMF0/LmNvZGUgfHxcbiAgICAgICAgXCJcIixcbiAgICB9KSxcbiAgICBbb3B0aW9uc10sXG4gIClcblxuICBjb25zdCBjdXJyZW5jaWVzID0gb3B0aW9ucy5jdXJyZW5jaWVzIHx8IFtdXG4gIGNvbnN0IHN1cHBvcnRlZEN1cnJlbmN5Q29kZXMgPSB1c2VNZW1vKFxuICAgICgpID0+IG5ldyBTZXQoY3VycmVuY2llcy5tYXAoKGN1cnJlbmN5KSA9PiBjdXJyZW5jeS5jb2RlKSksXG4gICAgW2N1cnJlbmNpZXNdLFxuICApXG5cbiAgY29uc3QgdXBkYXRlUHJvZHVjdCA9XG4gICAgKGZpZWxkOiBrZXlvZiBQcm9kdWN0Rm9ybVN0YXRlKSA9PlxuICAgIChldmVudDogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ+KSA9PiB7XG4gICAgICBzZXRQcm9kdWN0Rm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgW2ZpZWxkXTogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgfSkpXG4gICAgfVxuXG4gIGNvbnN0IHVwZGF0ZUNvdXBvbiA9XG4gICAgKGZpZWxkOiBrZXlvZiBDb3Vwb25Gb3JtU3RhdGUpID0+XG4gICAgKGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgc2V0Q291cG9uRm9ybSgoY3VycmVudCkgPT4gKHsgLi4uY3VycmVudCwgW2ZpZWxkXTogZXZlbnQudGFyZ2V0LnZhbHVlIH0pKVxuICAgIH1cblxuICBjb25zdCB1cGRhdGVDYW1wYWlnbiA9XG4gICAgKGZpZWxkOiBrZXlvZiBDYW1wYWlnbkZvcm1TdGF0ZSkgPT5cbiAgICAoZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBzZXRDYW1wYWlnbkZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgIFtmaWVsZF06IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgIH0pKVxuICAgIH1cblxuICBmdW5jdGlvbiBvcGVuQ3JlYXRlKCkge1xuICAgIGNvbnN0IGN1cnJlbmN5Q29kZSA9IG9wdGlvbkRlZmF1bHRzLmN1cnJlbmN5X2NvZGVcbiAgICBzZXRQcm9kdWN0Rm9ybSh7XG4gICAgICAuLi5lbXB0eVByb2R1Y3QsXG4gICAgICAuLi5vcHRpb25EZWZhdWx0cyxcbiAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5lbXB0eVZhcmlhbnQsXG4gICAgICAgICAgY3VycmVuY3lfY29kZTogY3VycmVuY3lDb2RlLFxuICAgICAgICAgIG92ZXJyaWRlX2N1cnJlbmN5X2NvZGU6IGN1cnJlbmN5Q29kZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSlcbiAgICBzZXRDb3Vwb25Gb3JtKHsgLi4uZW1wdHlDb3Vwb24sIGN1cnJlbmN5X2NvZGU6IGN1cnJlbmN5Q29kZSB9KVxuICAgIHNldENhbXBhaWduRm9ybShlbXB0eUNhbXBhaWduKVxuICAgIHNldEFjdGl2ZVN0ZXAoXCJkZXRhaWxzXCIpXG4gICAgc2V0TW9kYWxPcGVuKHRydWUpXG4gIH1cblxuICBmdW5jdGlvbiBvcGVuRWRpdChyb3c6IENvdXBvblByb2R1Y3RSb3cpIHtcbiAgICBjb25zdCBmb3JtcyA9IGZvcm1Gcm9tUm93KHJvdywgb3B0aW9uRGVmYXVsdHMuY3VycmVuY3lfY29kZSlcbiAgICBzZXRQcm9kdWN0Rm9ybSh7XG4gICAgICAuLi5mb3Jtcy5wcm9kdWN0LFxuICAgICAgdmFyaWFudHM6IGZvcm1zLnByb2R1Y3QudmFyaWFudHMubGVuZ3RoXG4gICAgICAgID8gZm9ybXMucHJvZHVjdC52YXJpYW50c1xuICAgICAgICA6IFt7IC4uLmVtcHR5VmFyaWFudCB9XSxcbiAgICB9KVxuICAgIHNldENvdXBvbkZvcm0oZm9ybXMuY291cG9uKVxuICAgIHNldENhbXBhaWduRm9ybShmb3Jtcy5jYW1wYWlnbilcbiAgICBzZXRBY3RpdmVTdGVwKFwiZGV0YWlsc1wiKVxuICAgIHNldE1vZGFsT3Blbih0cnVlKVxuICB9XG5cbiAgZnVuY3Rpb24gc2V0VmFyaWFudChpbmRleDogbnVtYmVyLCBwYXRjaDogUGFydGlhbDxWYXJpYW50Rm9ybVN0YXRlPikge1xuICAgIHNldFByb2R1Y3RGb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgLi4uY3VycmVudCxcbiAgICAgIHZhcmlhbnRzOiBjdXJyZW50LnZhcmlhbnRzLm1hcCgodmFyaWFudCwgdmFyaWFudEluZGV4KSA9PlxuICAgICAgICB2YXJpYW50SW5kZXggPT09IGluZGV4ID8geyAuLi52YXJpYW50LCAuLi5wYXRjaCB9IDogdmFyaWFudCxcbiAgICAgICksXG4gICAgfSkpXG4gIH1cblxuICBmdW5jdGlvbiBhZGRWYXJpYW50KCkge1xuICAgIGNvbnN0IGN1cnJlbmN5Q29kZSA9XG4gICAgICBjb3Vwb25Gb3JtLmN1cnJlbmN5X2NvZGUgfHwgb3B0aW9uRGVmYXVsdHMuY3VycmVuY3lfY29kZVxuICAgIHNldFByb2R1Y3RGb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgLi4uY3VycmVudCxcbiAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgIC4uLmN1cnJlbnQudmFyaWFudHMsXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5lbXB0eVZhcmlhbnQsXG4gICAgICAgICAgY3VycmVuY3lfY29kZTogY3VycmVuY3lDb2RlLFxuICAgICAgICAgIG92ZXJyaWRlX2N1cnJlbmN5X2NvZGU6IGN1cnJlbmN5Q29kZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSkpXG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVWYXJpYW50KGluZGV4OiBudW1iZXIpIHtcbiAgICBzZXRQcm9kdWN0Rm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICB2YXJpYW50czogY3VycmVudC52YXJpYW50cy5maWx0ZXIoXG4gICAgICAgIChfLCB2YXJpYW50SW5kZXgpID0+IHZhcmlhbnRJbmRleCAhPT0gaW5kZXgsXG4gICAgICApLFxuICAgIH0pKVxuICB9XG5cbiAgZnVuY3Rpb24gcHJvZHVjdFBheWxvYWQoaW5jbHVkZVZhcmlhbnRzOiBib29sZWFuKSB7XG4gICAgY29uc3QgcHJvZHVjdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICB0aXRsZTogcHJvZHVjdEZvcm0udGl0bGUsXG4gICAgICBzdWJ0aXRsZTogcHJvZHVjdEZvcm0uc3VidGl0bGUgfHwgbnVsbCxcbiAgICAgIGhhbmRsZTogcHJvZHVjdEZvcm0uaGFuZGxlIHx8IG51bGwsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvZHVjdEZvcm0uZGVzY3JpcHRpb24gfHwgbnVsbCxcbiAgICAgIHN0YXR1czogcHJvZHVjdEZvcm0uc3RhdHVzLFxuICAgICAgdGh1bWJuYWlsOiBwcm9kdWN0Rm9ybS50aHVtYm5haWwgfHwgbnVsbCxcbiAgICAgIGRpc2NvdW50YWJsZTogcHJvZHVjdEZvcm0uZGlzY291bnRhYmxlLFxuICAgICAgdHlwZV9pZDogcHJvZHVjdEZvcm0udHlwZV9pZCB8fCBudWxsLFxuICAgICAgY29sbGVjdGlvbl9pZDogcHJvZHVjdEZvcm0uY29sbGVjdGlvbl9pZCB8fCBudWxsLFxuICAgICAgY2F0ZWdvcmllczogcHJvZHVjdEZvcm0uY2F0ZWdvcnlfaWRcbiAgICAgICAgPyBbeyBpZDogcHJvZHVjdEZvcm0uY2F0ZWdvcnlfaWQgfV1cbiAgICAgICAgOiBbXSxcbiAgICAgIHRhZ3M6IHByb2R1Y3RGb3JtLnRhZ19pZCA/IFt7IGlkOiBwcm9kdWN0Rm9ybS50YWdfaWQgfV0gOiBbXSxcbiAgICAgIHNhbGVzX2NoYW5uZWxzOiBwcm9kdWN0Rm9ybS5zYWxlc19jaGFubmVsX2lkXG4gICAgICAgID8gW3sgaWQ6IHByb2R1Y3RGb3JtLnNhbGVzX2NoYW5uZWxfaWQgfV1cbiAgICAgICAgOiBbXSxcbiAgICB9XG5cbiAgICBpZiAoaW5jbHVkZVZhcmlhbnRzKSB7XG4gICAgICBwcm9kdWN0LnZhcmlhbnRzID0gcHJvZHVjdEZvcm0udmFyaWFudHMubWFwKCh2YXJpYW50KSA9PiAoe1xuICAgICAgICB0aXRsZTogdmFyaWFudC50aXRsZSxcbiAgICAgICAgc2t1OiB2YXJpYW50LnNrdSB8fCBudWxsLFxuICAgICAgICBtYW5hZ2VfaW52ZW50b3J5OiBmYWxzZSxcbiAgICAgICAgYWxsb3dfYmFja29yZGVyOiB0cnVlLFxuICAgICAgICBwcmljZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjdXJyZW5jeV9jb2RlOiB2YXJpYW50LmN1cnJlbmN5X2NvZGUudHJpbSgpLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICBhbW91bnQ6IE51bWJlcih2YXJpYW50LmFtb3VudCkgfHwgMCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHByb2R1Y3RcbiAgfVxuXG4gIGZ1bmN0aW9uIHZhcmlhbnRPdmVycmlkZXMoKSB7XG4gICAgcmV0dXJuIHByb2R1Y3RGb3JtLnZhcmlhbnRzXG4gICAgICAubWFwKCh2YXJpYW50LCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoIXZhcmlhbnQub3ZlcnJpZGVfZW5hYmxlZCkgcmV0dXJuIG51bGxcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2YXJpYW50X2luZGV4OiBpbmRleCxcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIGJlbmVmaXRfdHlwZTogdmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGUsXG4gICAgICAgICAgYW1vdW50OlxuICAgICAgICAgICAgdmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCJcbiAgICAgICAgICAgICAgPyBudW1iZXJPck51bGwodmFyaWFudC5vdmVycmlkZV9hbW91bnQpXG4gICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBwZXJjZW50YWdlOlxuICAgICAgICAgICAgdmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGUgPT09IFwicGVyY2VudGFnZVwiXG4gICAgICAgICAgICAgID8gbnVtYmVyT3JOdWxsKHZhcmlhbnQub3ZlcnJpZGVfcGVyY2VudGFnZSlcbiAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIGN1cnJlbmN5X2NvZGU6XG4gICAgICAgICAgICB2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIlxuICAgICAgICAgICAgICA/IHZhcmlhbnQub3ZlcnJpZGVfY3VycmVuY3lfY29kZS50cmltKCkudG9Mb3dlckNhc2UoKSB8fFxuICAgICAgICAgICAgICAgIGNvdXBvbkZvcm0uY3VycmVuY3lfY29kZVxuICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gIH1cblxuICBmdW5jdGlvbiB2YWxpZGF0ZUZvcm0oKSB7XG4gICAgaWYgKCFwcm9kdWN0Rm9ybS50aXRsZS50cmltKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlByb2R1Y3QgdGl0bGUgaXMgcmVxdWlyZWRcIilcbiAgICB9XG4gICAgaWYgKCFwcm9kdWN0Rm9ybS5pZCAmJiAhcHJvZHVjdEZvcm0udmFyaWFudHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdCBsZWFzdCBvbmUgcHJvZHVjdCB2YXJpYW50IGlzIHJlcXVpcmVkXCIpXG4gICAgfVxuICAgIGlmICghY3VycmVuY2llcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkFkZCBhIHN1cHBvcnRlZCBjdXJyZW5jeSB0byB0aGUgc3RvcmUgYmVmb3JlIGNvbnRpbnVpbmdcIilcbiAgICB9XG4gICAgaWYgKCFwcm9kdWN0Rm9ybS5pZCkge1xuICAgICAgZm9yIChjb25zdCB2YXJpYW50IG9mIHByb2R1Y3RGb3JtLnZhcmlhbnRzKSB7XG4gICAgICAgIGlmICghc3VwcG9ydGVkQ3VycmVuY3lDb2Rlcy5oYXModmFyaWFudC5jdXJyZW5jeV9jb2RlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2VsZWN0IGFuIGF2YWlsYWJsZSBjdXJyZW5jeSBmb3IgJHt2YXJpYW50LnRpdGxlfWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgY291cG9uRm9ybS5iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCIgJiZcbiAgICAgIG51bWJlck9yTnVsbChjb3Vwb25Gb3JtLmFtb3VudCkgPT0gbnVsbFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSBwb3NpdGl2ZSBjb3Vwb24gYW1vdW50IGlzIHJlcXVpcmVkXCIpXG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNvdXBvbkZvcm0uYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiICYmXG4gICAgICAhc3VwcG9ydGVkQ3VycmVuY3lDb2Rlcy5oYXMoY291cG9uRm9ybS5jdXJyZW5jeV9jb2RlKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2VsZWN0IGFuIGF2YWlsYWJsZSBjb3Vwb24gY3VycmVuY3lcIilcbiAgICB9XG4gICAgaWYgKGNvdXBvbkZvcm0uYmVuZWZpdF90eXBlID09PSBcInBlcmNlbnRhZ2VcIikge1xuICAgICAgY29uc3QgcGVyY2VudGFnZSA9IG51bWJlck9yTnVsbChjb3Vwb25Gb3JtLnBlcmNlbnRhZ2UpXG4gICAgICBpZiAocGVyY2VudGFnZSA9PSBudWxsIHx8IHBlcmNlbnRhZ2UgPiAxMDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291cG9uIHBlcmNlbnRhZ2UgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwMFwiKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBjb3Vwb25Gb3JtLmNvZGVfc3RyYXRlZ3kgPT09IFwic2hhcmVkX2NvZGVcIiAmJlxuICAgICAgIWNvdXBvbkZvcm0uc2hhcmVkX2NvZGUudHJpbSgpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIHNoYXJlZCBjb3Vwb24gY29kZSBpcyByZXF1aXJlZFwiKVxuICAgIH1cbiAgICBpZiAoY291cG9uRm9ybS5leHBpcmF0aW9uX3R5cGUgPT09IFwiZml4ZWRcIikge1xuICAgICAgY29uc3QgZXhwaXJhdGlvbiA9IG5ldyBEYXRlKGNvdXBvbkZvcm0uZXhwaXJhdGlvbl9kYXRlKVxuICAgICAgaWYgKCFjb3Vwb25Gb3JtLmV4cGlyYXRpb25fZGF0ZSB8fCBOdW1iZXIuaXNOYU4oZXhwaXJhdGlvbi5nZXRUaW1lKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgdmFsaWQgZml4ZWQgZXhwaXJhdGlvbiBkYXRlIGlzIHJlcXVpcmVkXCIpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb3Vwb25Gb3JtLmV4cGlyYXRpb25fY2FwX2F0KSB7XG4gICAgICBjb25zdCBleHBpcmF0aW9uQ2FwID0gbmV3IERhdGUoY291cG9uRm9ybS5leHBpcmF0aW9uX2NhcF9hdClcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4oZXhwaXJhdGlvbkNhcC5nZXRUaW1lKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgdmFsaWQgZXhwaXJhdGlvbiBjYXAgZGF0ZSBpcyByZXF1aXJlZFwiKVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHZhcmlhbnQgb2YgcHJvZHVjdEZvcm0udmFyaWFudHMpIHtcbiAgICAgIGlmICghdmFyaWFudC5vdmVycmlkZV9lbmFibGVkKSBjb250aW51ZVxuICAgICAgaWYgKFxuICAgICAgICB2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIiAmJlxuICAgICAgICBudW1iZXJPck51bGwodmFyaWFudC5vdmVycmlkZV9hbW91bnQpID09IG51bGxcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEEgcG9zaXRpdmUgY291cG9uIGFtb3VudCBpcyByZXF1aXJlZCBmb3IgJHt2YXJpYW50LnRpdGxlfWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCIgJiZcbiAgICAgICAgIXN1cHBvcnRlZEN1cnJlbmN5Q29kZXMuaGFzKHZhcmlhbnQub3ZlcnJpZGVfY3VycmVuY3lfY29kZSlcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFNlbGVjdCBhbiBhdmFpbGFibGUgY291cG9uIGN1cnJlbmN5IGZvciAke3ZhcmlhbnQudGl0bGV9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWYgKHZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlID09PSBcInBlcmNlbnRhZ2VcIikge1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gbnVtYmVyT3JOdWxsKHZhcmlhbnQub3ZlcnJpZGVfcGVyY2VudGFnZSlcbiAgICAgICAgaWYgKHBlcmNlbnRhZ2UgPT0gbnVsbCB8fCBwZXJjZW50YWdlID4gMTAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENvdXBvbiBwZXJjZW50YWdlIGZvciAke3ZhcmlhbnQudGl0bGV9IG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMDBgLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBhbGxvd1Byb21vdGlvbk1pcnJvciAmJlxuICAgICAgY2FtcGFpZ25Gb3JtLm1vZGUgPT09IFwiZXhpc3RpbmdcIiAmJlxuICAgICAgIWNhbXBhaWduRm9ybS5jYW1wYWlnbl9pZFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2VsZWN0IGFuIGV4aXN0aW5nIGNhbXBhaWduXCIpXG4gICAgfVxuICAgIGlmIChcbiAgICAgIGFsbG93UHJvbW90aW9uTWlycm9yICYmXG4gICAgICBjYW1wYWlnbkZvcm0ubW9kZSA9PT0gXCJuZXdcIiAmJlxuICAgICAgKCFjYW1wYWlnbkZvcm0ubmFtZS50cmltKCkgfHwgIWNhbXBhaWduRm9ybS5jYW1wYWlnbl9pZGVudGlmaWVyLnRyaW0oKSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbXBhaWduIG5hbWUgYW5kIGlkZW50aWZpZXIgYXJlIHJlcXVpcmVkXCIpXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc3luY1ZhcmlhbnRPdmVycmlkZXMocHJvZHVjdElkOiBzdHJpbmcpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHByb2R1Y3RGb3JtLnZhcmlhbnRzLm1hcChhc3luYyAodmFyaWFudCkgPT4ge1xuICAgICAgICBpZiAoIXZhcmlhbnQuaWQpIHJldHVyblxuXG4gICAgICAgIGlmICghdmFyaWFudC5vdmVycmlkZV9lbmFibGVkKSB7XG4gICAgICAgICAgaWYgKHZhcmlhbnQub3ZlcnJpZGVfY29uZmlnX2lkKSB7XG4gICAgICAgICAgICBhd2FpdCBhcGlGZXRjaChgJHtjb3Vwb25CYXNlfS8ke3Byb2R1Y3RJZH0vdmFyaWFudHNgLCB7XG4gICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICB2YXJpYW50X2lkOiB2YXJpYW50LmlkLFxuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgYXBpRmV0Y2goYCR7Y291cG9uQmFzZX0vJHtwcm9kdWN0SWR9L3ZhcmlhbnRzYCwge1xuICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgdmFyaWFudF9pZDogdmFyaWFudC5pZCxcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICBiZW5lZml0X3R5cGU6IHZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlLFxuICAgICAgICAgICAgYW1vdW50OlxuICAgICAgICAgICAgICB2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIlxuICAgICAgICAgICAgICAgID8gbnVtYmVyT3JOdWxsKHZhcmlhbnQub3ZlcnJpZGVfYW1vdW50KVxuICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgIHBlcmNlbnRhZ2U6XG4gICAgICAgICAgICAgIHZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlID09PSBcInBlcmNlbnRhZ2VcIlxuICAgICAgICAgICAgICAgID8gbnVtYmVyT3JOdWxsKHZhcmlhbnQub3ZlcnJpZGVfcGVyY2VudGFnZSlcbiAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICBjdXJyZW5jeV9jb2RlOlxuICAgICAgICAgICAgICB2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIlxuICAgICAgICAgICAgICAgID8gdmFyaWFudC5vdmVycmlkZV9jdXJyZW5jeV9jb2RlLnRyaW0oKS50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICAgICAgICAgICAgICBjb3Vwb25Gb3JtLmN1cnJlbmN5X2NvZGUudHJpbSgpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pXG4gICAgICB9KSxcbiAgICApXG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzYXZlUHJvZHVjdCgpIHtcbiAgICBzZXRTYXZpbmcodHJ1ZSlcbiAgICB0cnkge1xuICAgICAgdmFsaWRhdGVGb3JtKClcbiAgICAgIGNvbnN0IGlzRWRpdCA9IEJvb2xlYW4ocHJvZHVjdEZvcm0uaWQpXG4gICAgICBjb25zdCBwYXRoID0gaXNFZGl0ID8gYCR7Y291cG9uQmFzZX0vJHtwcm9kdWN0Rm9ybS5pZH1gIDogY291cG9uQmFzZVxuICAgICAgY29uc3QgbWV0aG9kID0gaXNFZGl0ID8gXCJQQVRDSFwiIDogXCJQT1NUXCJcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgIHByb2R1Y3Q6IHByb2R1Y3RQYXlsb2FkKCFpc0VkaXQpLFxuICAgICAgICBjb3Vwb246IGJ1aWxkQ291cG9uUGF5bG9hZChjb3Vwb25Gb3JtLCBhbGxvd1Byb21vdGlvbk1pcnJvciksXG4gICAgICAgIGNhbXBhaWduOiBidWlsZENhbXBhaWduUGF5bG9hZChjYW1wYWlnbkZvcm0sIGFsbG93UHJvbW90aW9uTWlycm9yKSxcbiAgICAgICAgc2VsbGVyX2lkOiBwcm9kdWN0Rm9ybS5zZWxsZXJfaWQgfHwgbnVsbCxcbiAgICAgICAgdmFyaWFudF9vdmVycmlkZXM6IGlzRWRpdCA/IFtdIDogdmFyaWFudE92ZXJyaWRlcygpLFxuICAgICAgfVxuXG4gICAgICBhd2FpdCBhcGlGZXRjaChwYXRoLCB7XG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksXG4gICAgICB9KVxuICAgICAgaWYgKGlzRWRpdCkge1xuICAgICAgICBhd2FpdCBzeW5jVmFyaWFudE92ZXJyaWRlcyhwcm9kdWN0Rm9ybS5pZClcbiAgICAgIH1cbiAgICAgIHRvYXN0LnN1Y2Nlc3MoXG4gICAgICAgIGlzRWRpdCA/IFwiQ291cG9uIHByb2R1Y3QgdXBkYXRlZFwiIDogXCJDb3Vwb24gcHJvZHVjdCBjcmVhdGVkXCIsXG4gICAgICApXG4gICAgICBzZXRNb2RhbE9wZW4oZmFsc2UpXG4gICAgICBhd2FpdCBsb2FkKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdG9hc3QuZXJyb3IoXG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICA/IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICA6IFwiRmFpbGVkIHRvIHNhdmUgY291cG9uIHByb2R1Y3RcIixcbiAgICAgIClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0U2F2aW5nKGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVByb2R1Y3Qocm93OiBDb3Vwb25Qcm9kdWN0Um93KSB7XG4gICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgcHJvbXB0KHtcbiAgICAgIHRpdGxlOiBcIlJlbW92ZSBjb3Vwb24gcHJvZHVjdD9cIixcbiAgICAgIGRlc2NyaXB0aW9uOiBgVGhpcyByZW1vdmVzIGNvdXBvbiBpc3N1YW5jZSBmcm9tICR7XG4gICAgICAgIHJvdy5wcm9kdWN0LnRpdGxlIHx8IHJvdy5wcm9kdWN0LmlkXG4gICAgICB9LiBUaGUgdW5kZXJseWluZyBNZWR1c2EgcHJvZHVjdCB3aWxsIHJlbWFpbiBhdmFpbGFibGUuYCxcbiAgICAgIGNvbmZpcm1UZXh0OiBcIlJlbW92ZSBwcm9kdWN0XCIsXG4gICAgICBjYW5jZWxUZXh0OiBcIkNhbmNlbFwiLFxuICAgICAgdmFyaWFudDogXCJkYW5nZXJcIixcbiAgICB9KVxuICAgIGlmICghY29uZmlybWVkKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhcGlGZXRjaChgJHtjb3Vwb25CYXNlfS8ke3Jvdy5wcm9kdWN0LmlkfWAsIHsgbWV0aG9kOiBcIkRFTEVURVwiIH0pXG4gICAgICB0b2FzdC5zdWNjZXNzKFwiQ291cG9uIGNvbmZpZ3VyYXRpb24gcmVtb3ZlZFwiKVxuICAgICAgYXdhaXQgbG9hZCgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRvYXN0LmVycm9yKFxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgPyBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgOiBcIkZhaWxlZCB0byByZW1vdmUgY291cG9uIHByb2R1Y3RcIixcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBtaXJyb3JQcm9tb3Rpb24ocm93OiBDb3Vwb25Qcm9kdWN0Um93KSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFwaUZldGNoKFxuICAgICAgICBgL2FkbWluL2NvdXBvbi1wcm9kdWN0cy8ke3Jvdy5wcm9kdWN0LmlkfS9taXJyb3ItcHJvbW90aW9uYCxcbiAgICAgICAge1xuICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe30pLFxuICAgICAgICB9LFxuICAgICAgKVxuICAgICAgdG9hc3Quc3VjY2VzcyhcIlByb21vdGlvbiBtaXJyb3IgY3JlYXRlZFwiKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0b2FzdC5lcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiTWlycm9yIGZhaWxlZFwiKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRTdGVwSW5kZXggPSBzdGVwcy5pbmRleE9mKGFjdGl2ZVN0ZXApXG4gIGNvbnN0IGNhbkdvQmFjayA9IGN1cnJlbnRTdGVwSW5kZXggPiAwXG4gIGNvbnN0IGNhbkdvTmV4dCA9IGN1cnJlbnRTdGVwSW5kZXggPCBzdGVwcy5sZW5ndGggLSAxXG4gIGNvbnN0IHNob3dDYW1wYWlnblN0ZXAgPSBhbGxvd1Byb21vdGlvbk1pcnJvclxuICBjb25zdCB2aXNpYmxlU3RlcHMgPSBzaG93Q2FtcGFpZ25TdGVwXG4gICAgPyBzdGVwc1xuICAgIDogc3RlcHMuZmlsdGVyKChzdGVwKSA9PiBzdGVwICE9PSBcImNhbXBhaWduXCIpXG5cbiAgcmV0dXJuIChcbiAgICA8Q29udGFpbmVyIGNsYXNzTmFtZT1cImRpdmlkZS15IHAtMFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHgtNiBweS00XCI+XG4gICAgICAgIDxIZWFkaW5nIGxldmVsPVwiaDFcIj57dGl0bGV9PC9IZWFkaW5nPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC14LTJcIj5cbiAgICAgICAgICA8QnV0dG9uIHNpemU9XCJzbWFsbFwiIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIiBvbkNsaWNrPXsoKSA9PiB2b2lkIGxvYWQoKX0+XG4gICAgICAgICAgICA8QXJyb3dQYXRoIC8+XG4gICAgICAgICAgICBSZWZyZXNoXG4gICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgPEJ1dHRvbiBzaXplPVwic21hbGxcIiBvbkNsaWNrPXtvcGVuQ3JlYXRlfT5cbiAgICAgICAgICAgIDxQbHVzIC8+XG4gICAgICAgICAgICBDcmVhdGVcbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIHtsb2FkaW5nID8gKFxuICAgICAgICA8Q291cG9uRW1wdHlTdGF0ZSB0aXRsZT1cIkxvYWRpbmcgY291cG9uIHByb2R1Y3RzXCIgLz5cbiAgICAgICkgOiBsb2FkRXJyb3IgPyAoXG4gICAgICAgIDxDb3Vwb25FbXB0eVN0YXRlIHRpdGxlPXtsb2FkRXJyb3J9IC8+XG4gICAgICApIDogcHJvZHVjdHMubGVuZ3RoID8gKFxuICAgICAgICA8VGFibGU+XG4gICAgICAgICAgPFRhYmxlLkhlYWRlcj5cbiAgICAgICAgICAgIDxUYWJsZS5Sb3c+XG4gICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPlByb2R1Y3Q8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPlN0YXR1czwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+QmVuZWZpdDwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+Q29kZTwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+Q2FtcGFpZ248L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPklzc3VlZDwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGwgLz5cbiAgICAgICAgICAgIDwvVGFibGUuUm93PlxuICAgICAgICAgIDwvVGFibGUuSGVhZGVyPlxuICAgICAgICAgIDxUYWJsZS5Cb2R5PlxuICAgICAgICAgICAge3Byb2R1Y3RzLm1hcCgocm93KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHJvdy5jb3Vwb25fcHJvZHVjdF9jb25maWdcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8VGFibGUuUm93IGtleT17cm93LmlkfT5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8VGV4dCB3ZWlnaHQ9XCJwbHVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cm93LnByb2R1Y3QudGl0bGUgfHwgcm93LnByb2R1Y3QuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtyb3cucHJvZHVjdC5oYW5kbGUgfHwgcm93LnByb2R1Y3QuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgICA8U3RhdHVzQmFkZ2UgY29sb3I9e3Byb2R1Y3RTdGF0dXNDb2xvcihyb3cucHJvZHVjdC5zdGF0dXMpfT5cbiAgICAgICAgICAgICAgICAgICAgICB7cm93LnByb2R1Y3Quc3RhdHVzIHx8IFwiZHJhZnRcIn1cbiAgICAgICAgICAgICAgICAgICAgPC9TdGF0dXNCYWRnZT5cbiAgICAgICAgICAgICAgICAgIDwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsPntiZW5lZml0TGFiZWwoY29uZmlnKX08L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAge2NvbmZpZy5jb2RlX3N0cmF0ZWd5ID09PSBcInNoYXJlZF9jb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICA/IGNvbmZpZy5zaGFyZWRfY29kZSB8fCBcIi1cIlxuICAgICAgICAgICAgICAgICAgICAgIDogY29uZmlnLmNvZGVfcHJlZml4IHx8IFwiQ09VUE9OXCJ9XG4gICAgICAgICAgICAgICAgICA8L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD57Y2FtcGFpZ25MYWJlbChjb25maWcpfTwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsPntyb3cuZW50aXRsZW1lbnRzX2NvdW50IHx8IDB9PC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWVuZCBnYXAteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAge2FsbG93UHJvbW90aW9uTWlycm9yICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHZvaWQgbWlycm9yUHJvbW90aW9uKHJvdyl9XG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIE1pcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvcGVuRWRpdChyb3cpfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxQZW5jaWxTcXVhcmUgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIEVkaXRcbiAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImRhbmdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB2b2lkIGRlbGV0ZVByb2R1Y3Qocm93KX1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VHJhc2ggLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZSBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgPC9UYWJsZS5Sb3c+XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvVGFibGUuQm9keT5cbiAgICAgICAgPC9UYWJsZT5cbiAgICAgICkgOiAoXG4gICAgICAgIDxDb3Vwb25FbXB0eVN0YXRlXG4gICAgICAgICAgdGl0bGU9XCJObyBjb3Vwb24gcHJvZHVjdHMgZm91bmRcIlxuICAgICAgICAgIGRlc2NyaXB0aW9uPVwiQ3JlYXRlIGEgbmV3IGNvdXBvbiBwcm9kdWN0IHRvIGdldCBzdGFydGVkLlwiXG4gICAgICAgIC8+XG4gICAgICApfVxuXG4gICAgICA8Rm9jdXNNb2RhbCBvcGVuPXttb2RhbE9wZW59IG9uT3BlbkNoYW5nZT17c2V0TW9kYWxPcGVufT5cbiAgICAgICAgPEZvY3VzTW9kYWwuQ29udGVudCBzdHlsZT17bW9kYWxDb250ZW50U3R5bGV9PlxuICAgICAgICAgIDxGb2N1c01vZGFsLkhlYWRlciBzdHlsZT17bW9kYWxTdGF0aWNSb3dTdHlsZX0+XG4gICAgICAgICAgICA8Rm9jdXNNb2RhbC5UaXRsZT5cbiAgICAgICAgICAgICAge3Byb2R1Y3RGb3JtLmlkID8gXCJFZGl0IENvdXBvbiBQcm9kdWN0XCIgOiBcIkNyZWF0ZSBDb3Vwb24gUHJvZHVjdFwifVxuICAgICAgICAgICAgPC9Gb2N1c01vZGFsLlRpdGxlPlxuICAgICAgICAgIDwvRm9jdXNNb2RhbC5IZWFkZXI+XG4gICAgICAgICAgPFByb2dyZXNzVGFic1xuICAgICAgICAgICAgdmFsdWU9e2FjdGl2ZVN0ZXB9XG4gICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsodmFsdWUpID0+IHNldEFjdGl2ZVN0ZXAodmFsdWUgYXMgV2l6YXJkU3RlcCl9XG4gICAgICAgICAgICBzdHlsZT17bW9kYWxXaXphcmRTdHlsZX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8UHJvZ3Jlc3NUYWJzLkxpc3QgY2xhc3NOYW1lPVwiYm9yZGVyLWJcIiBzdHlsZT17bW9kYWxTdGF0aWNSb3dTdHlsZX0+XG4gICAgICAgICAgICAgIHt2aXNpYmxlU3RlcHMubWFwKChzdGVwKSA9PiAoXG4gICAgICAgICAgICAgICAgPFByb2dyZXNzVGFicy5UcmlnZ2VyXG4gICAgICAgICAgICAgICAgICBrZXk9e3N0ZXB9XG4gICAgICAgICAgICAgICAgICB2YWx1ZT17c3RlcH1cbiAgICAgICAgICAgICAgICAgIHN0YXR1cz17c3RlcFN0YXR1cyhzdGVwLCBhY3RpdmVTdGVwKX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7c3RlcCA9PT0gXCJkZXRhaWxzXCJcbiAgICAgICAgICAgICAgICAgICAgPyBcIkRldGFpbHNcIlxuICAgICAgICAgICAgICAgICAgICA6IHN0ZXAgPT09IFwib3JnYW5pemVcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJPcmdhbml6ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBzdGVwID09PSBcInZhcmlhbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCJWYXJpYW50c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHN0ZXAgPT09IFwiY291cG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcIkNvdXBvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJDYW1wYWlnblwifVxuICAgICAgICAgICAgICAgIDwvUHJvZ3Jlc3NUYWJzLlRyaWdnZXI+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9Qcm9ncmVzc1RhYnMuTGlzdD5cbiAgICAgICAgICAgIDxGb2N1c01vZGFsLkJvZHkgc3R5bGU9e21vZGFsQm9keVN0eWxlfT5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT17bW9kYWxGb3JtU3R5bGV9PlxuICAgICAgICAgICAgICAgIDxQcm9ncmVzc1RhYnMuQ29udGVudCB2YWx1ZT1cImRldGFpbHNcIiBzdHlsZT17c3RhY2tTdHlsZX0+XG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt0aHJlZUNvbHVtbkdyaWRTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdEZvcm0udGl0bGV9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlUHJvZHVjdChcInRpdGxlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlN1YnRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdEZvcm0uc3VidGl0bGV9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlUHJvZHVjdChcInN1YnRpdGxlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkhhbmRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3RGb3JtLmhhbmRsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVQcm9kdWN0KFwiaGFuZGxlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3N0YWNrU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJEZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxUZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3RGb3JtLmRlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZVByb2R1Y3QoXCJkZXNjcmlwdGlvblwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJNZWRpYSBVUkxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0Rm9ybS50aHVtYm5haWx9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlUHJvZHVjdChcInRodW1ibmFpbFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9Qcm9ncmVzc1RhYnMuQ29udGVudD5cblxuICAgICAgICAgICAgICAgIDxQcm9ncmVzc1RhYnMuQ29udGVudCB2YWx1ZT1cIm9yZ2FuaXplXCIgc3R5bGU9e3N0YWNrU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17dHdvQ29sdW1uR3JpZFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiU3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3RGb3JtLnN0YXR1c31cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdEZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImRyYWZ0XCI+RHJhZnQ8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJwdWJsaXNoZWRcIj5QdWJsaXNoZWQ8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJwcm9wb3NlZFwiPlByb3Bvc2VkPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwicmVqZWN0ZWRcIj5SZWplY3RlZDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICB7YXBpQmFzZSA9PT0gXCIvYWRtaW5cIiAmJiAhcHJvZHVjdEZvcm0uaWQgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlNlbGxlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPE9wdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdEZvcm0uc2VsbGVyX2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zLnNlbGxlcnMgfHwgW119XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdEZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsbGVyX2lkOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJUeXBlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPE9wdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3RGb3JtLnR5cGVfaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zLnByb2R1Y3RfdHlwZXMgfHwgW119XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0Rm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfaWQ6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDb2xsZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPE9wdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3RGb3JtLmNvbGxlY3Rpb25faWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zLnByb2R1Y3RfY29sbGVjdGlvbnMgfHwgW119XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0Rm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25faWQ6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDYXRlZ29yeVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxPcHRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0Rm9ybS5jYXRlZ29yeV9pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMucHJvZHVjdF9jYXRlZ29yaWVzIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdEZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9pZDogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlRhZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxPcHRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0Rm9ybS50YWdfaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zLnByb2R1Y3RfdGFncyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3RGb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnX2lkOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiU2FsZXMgY2hhbm5lbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxPcHRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0Rm9ybS5zYWxlc19jaGFubmVsX2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5zYWxlc19jaGFubmVscyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3RGb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FsZXNfY2hhbm5lbF9pZDogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3BhbmVsU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtyb3dCZXR3ZWVuU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCB3ZWlnaHQ9XCJwbHVzXCI+RGlzY291bnRhYmxlPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNjb3VudHMgY2FuIGFwcGx5IHRvIHRoaXMgcHJvZHVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxTd2l0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3Byb2R1Y3RGb3JtLmRpc2NvdW50YWJsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hlY2tlZENoYW5nZT17KGNoZWNrZWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3RGb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY291bnRhYmxlOiBCb29sZWFuKGNoZWNrZWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvUHJvZ3Jlc3NUYWJzLkNvbnRlbnQ+XG5cbiAgICAgICAgICAgICAgICA8UHJvZ3Jlc3NUYWJzLkNvbnRlbnQgdmFsdWU9XCJ2YXJpYW50c1wiIHN0eWxlPXtzdGFja1N0eWxlfT5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3Jvd0JldHdlZW5TdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgIDxIZWFkaW5nIGxldmVsPVwiaDJcIj5WYXJpYW50czwvSGVhZGluZz5cbiAgICAgICAgICAgICAgICAgICAgeyFwcm9kdWN0Rm9ybS5pZCAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17YWRkVmFyaWFudH1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8UGx1cyAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgQWRkIHZhcmlhbnRcbiAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC15LTRcIj5cbiAgICAgICAgICAgICAgICAgICAge3Byb2R1Y3RGb3JtLnZhcmlhbnRzLm1hcCgodmFyaWFudCwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGtleT17YCR7dmFyaWFudC5pZCB8fCBpbmRleH1gfSBzdHlsZT17cGFuZWxTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtmb3VyQ29sdW1uR3JpZFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiVGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt2YXJpYW50LnRpdGxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e0Jvb2xlYW4ocHJvZHVjdEZvcm0uaWQpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFyaWFudChpbmRleCwgeyB0aXRsZTogZXZlbnQudGFyZ2V0LnZhbHVlIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiU0tVXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dmFyaWFudC5za3V9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17Qm9vbGVhbihwcm9kdWN0Rm9ybS5pZCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYXJpYW50KGluZGV4LCB7IHNrdTogZXZlbnQudGFyZ2V0LnZhbHVlIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ3VycmVuY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q3VycmVuY3lTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmNpZXM9e2N1cnJlbmNpZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dmFyaWFudC5jdXJyZW5jeV9jb2RlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e0Jvb2xlYW4ocHJvZHVjdEZvcm0uaWQpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhjdXJyZW5jeV9jb2RlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYXJpYW50KGluZGV4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY3lfY29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJQcmljZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDdXJyZW5jeUFtb3VudElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jaWVzPXtjdXJyZW5jaWVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY3lDb2RlPXt2YXJpYW50LmN1cnJlbmN5X2NvZGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dmFyaWFudC5hbW91bnR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17Qm9vbGVhbihwcm9kdWN0Rm9ybS5pZCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGFtb3VudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFyaWFudChpbmRleCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyVG9wOiBcIjFweCBzb2xpZCB2YXIoLS1ib3JkZXItYmFzZSlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6IDE2LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdUb3A6IDE2LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtyb3dCZXR3ZWVuU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHdlaWdodD1cInBsdXNcIj5Db3Vwb24gYmVuZWZpdCBvdmVycmlkZTwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U3dpdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXt2YXJpYW50Lm92ZXJyaWRlX2VuYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoZWNrZWRDaGFuZ2U9eyhjaGVja2VkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYXJpYW50KGluZGV4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVfZW5hYmxlZDogQm9vbGVhbihjaGVja2VkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3ZhcmlhbnQub3ZlcnJpZGVfZW5hYmxlZCAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgLi4uZm91ckNvbHVtbkdyaWRTdHlsZSwgbWFyZ2luVG9wOiAxMiB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkJlbmVmaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYXJpYW50KGluZGV4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlX2JlbmVmaXRfdHlwZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBhcyBCZW5lZml0VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiZml4ZWRfYW1vdW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeGVkIGFtb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cInBlcmNlbnRhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyY2VudGFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImZyZWVfc2hpcHBpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlZSBzaGlwcGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDdXJyZW5jeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q3VycmVuY3lTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jaWVzPXtjdXJyZW5jaWVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt2YXJpYW50Lm92ZXJyaWRlX2N1cnJlbmN5X2NvZGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGUgIT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImZpeGVkX2Ftb3VudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsob3ZlcnJpZGVfY3VycmVuY3lfY29kZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhcmlhbnQoaW5kZXgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVfY3VycmVuY3lfY29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkFtb3VudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q3VycmVuY3lBbW91bnRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmNpZXM9e2N1cnJlbmNpZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY3lDb2RlPXt2YXJpYW50Lm92ZXJyaWRlX2N1cnJlbmN5X2NvZGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3ZhcmlhbnQub3ZlcnJpZGVfYW1vdW50fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlICE9PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmaXhlZF9hbW91bnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KG92ZXJyaWRlX2Ftb3VudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhcmlhbnQoaW5kZXgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVfYW1vdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiUGVyY2VudGFnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dmFyaWFudC5vdmVycmlkZV9wZXJjZW50YWdlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlICE9PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJwZXJjZW50YWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhcmlhbnQoaW5kZXgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVfcGVyY2VudGFnZTogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IXByb2R1Y3RGb3JtLmlkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdEZvcm0udmFyaWFudHMubGVuZ3RoID4gMSAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm10LTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17eyBtYXJnaW5Ub3A6IDE2IH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJkYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiByZW1vdmVWYXJpYW50KGluZGV4KX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIHZhcmlhbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L1Byb2dyZXNzVGFicy5Db250ZW50PlxuXG4gICAgICAgICAgICAgICAgPFByb2dyZXNzVGFicy5Db250ZW50IHZhbHVlPVwiY291cG9uXCIgc3R5bGU9e3N0YWNrU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17cGFuZWxTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3Jvd0JldHdlZW5TdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHdlaWdodD1cInBsdXNcIj5Db3Vwb24gaXNzdWFuY2U8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIElzc3VlIGNvdXBvbnMgd2hlbiBjdXN0b21lcnMgcHVyY2hhc2UgdGhpcyBwcm9kdWN0XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPFN3aXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17Y291cG9uRm9ybS5lbmFibGVkfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGVja2VkQ2hhbmdlPXsoY2hlY2tlZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uRm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IEJvb2xlYW4oY2hlY2tlZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt0d29Db2x1bW5HcmlkU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJCZW5lZml0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbkZvcm0uYmVuZWZpdF90eXBlfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb25Gb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVuZWZpdF90eXBlOiB2YWx1ZSBhcyBCZW5lZml0VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJmaXhlZF9hbW91bnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXhlZCBhbW91bnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwicGVyY2VudGFnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmNlbnRhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiZnJlZV9zaGlwcGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWUgc2hpcHBpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIHthbGxvd1Byb21vdGlvbk1pcnJvciAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiUHJvbW90aW9uIHN0YXR1c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uRm9ybS5wcm9tb3Rpb25fc3RhdHVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uRm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25fc3RhdHVzOiB2YWx1ZSBhcyBQcm9tb3Rpb25TdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImRyYWZ0XCI+RHJhZnQ8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImFjdGl2ZVwiPkFjdGl2ZTwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiaW5hY3RpdmVcIj5JbmFjdGl2ZTwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJBbW91bnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8Q3VycmVuY3lBbW91bnRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY2llcz17Y3VycmVuY2llc31cbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5Q29kZT17Y291cG9uRm9ybS5jdXJyZW5jeV9jb2RlfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2NvdXBvbkZvcm0uYmVuZWZpdF90eXBlICE9PSBcImZpeGVkX2Ftb3VudFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbkZvcm0uYW1vdW50fVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhhbW91bnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbkZvcm0oKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIGFtb3VudCB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJQZXJjZW50YWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtjb3Vwb25Gb3JtLmJlbmVmaXRfdHlwZSAhPT0gXCJwZXJjZW50YWdlXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uRm9ybS5wZXJjZW50YWdlfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZUNvdXBvbihcInBlcmNlbnRhZ2VcIil9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ3VycmVuY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8Q3VycmVuY3lTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmNpZXM9e2N1cnJlbmNpZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uRm9ybS5jdXJyZW5jeV9jb2RlfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2NvdXBvbkZvcm0uYmVuZWZpdF90eXBlICE9PSBcImZpeGVkX2Ftb3VudFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhjdXJyZW5jeV9jb2RlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb25Gb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY3lfY29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiRXhwaXJhdGlvbiBwb2xpY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uRm9ybS5leHBpcmF0aW9uX3R5cGV9XG4gICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbkZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmF0aW9uX3R5cGU6IHZhbHVlIGFzIEV4cGlyYXRpb25Qb2xpY3lUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImR1cmF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRHVyYXRpb24gYWZ0ZXIgaXNzdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiZml4ZWRcIj5GaXhlZCBkYXRlPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIHtjb3Vwb25Gb3JtLmV4cGlyYXRpb25fdHlwZSA9PT0gXCJkdXJhdGlvblwiID8gKFxuICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkV4cGlyYXRpb24gZGF5c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBtaW49ezF9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLmV4cGlyYXRpb25fZGF5c31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZUNvdXBvbihcImV4cGlyYXRpb25fZGF5c1wiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJFeHBpcmVzIGF0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbkZvcm0uZXhwaXJhdGlvbl9kYXRlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlQ291cG9uKFwiZXhwaXJhdGlvbl9kYXRlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDYXAgZXhwaXJhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3Jvd0JldHdlZW5TdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIENhbXBhaWduIGVuZCBvciBjYXAgZGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPFN3aXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtjb3Vwb25Gb3JtLmV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWdufVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoZWNrZWRDaGFuZ2U9eyhjaGVja2VkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbkZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ246IEJvb2xlYW4oY2hlY2tlZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkV4cGlyYXRpb24gY2FwIGRhdGUgKG9wdGlvbmFsKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshY291cG9uRm9ybS5leHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbn1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLmV4cGlyYXRpb25fY2FwX2F0fVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZUNvdXBvbihcImV4cGlyYXRpb25fY2FwX2F0XCIpfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkNvZGUgc3RyYXRlZ3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uRm9ybS5jb2RlX3N0cmF0ZWd5fVxuICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb25Gb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9zdHJhdGVneTogdmFsdWUgYXMgQ29kZVN0cmF0ZWd5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cInVuaXF1ZV9jb2RlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pcXVlIGNvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwic2hhcmVkX2NvZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFyZWQgY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ29kZSBwcmVmaXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtjb3Vwb25Gb3JtLmNvZGVfc3RyYXRlZ3kgIT09IFwidW5pcXVlX2NvZGVcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLmNvZGVfcHJlZml4fVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZUNvdXBvbihcImNvZGVfcHJlZml4XCIpfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlNoYXJlZCBjb2RlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17Y291cG9uRm9ybS5jb2RlX3N0cmF0ZWd5ICE9PSBcInNoYXJlZF9jb2RlXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uRm9ybS5zaGFyZWRfY29kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVDb3Vwb24oXCJzaGFyZWRfY29kZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJNYXggaXNzdWFuY2UgcGVyIGl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbkZvcm0ubWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZUNvdXBvbihcIm1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICB7YWxsb3dQcm9tb3Rpb25NaXJyb3IgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlByb21vdGlvbiBtaXJyb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbkZvcm0ucHJvbW90aW9uX21pcnJvcl9tb2RlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uRm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25fbWlycm9yX21vZGU6IHZhbHVlIGFzIE1pcnJvck1vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cIm5vbmVcIj5Ob25lPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJtYW51YWxcIj5NYW51YWw8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImF1dG9cIj5BdXRvPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L1Byb2dyZXNzVGFicy5Db250ZW50PlxuXG4gICAgICAgICAgICAgICAge2FsbG93UHJvbW90aW9uTWlycm9yICYmIChcbiAgICAgICAgICAgICAgICAgIDxQcm9ncmVzc1RhYnMuQ29udGVudCB2YWx1ZT1cImNhbXBhaWduXCIgc3R5bGU9e3N0YWNrU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt0d29Db2x1bW5HcmlkU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkNhbXBhaWduXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjYW1wYWlnbkZvcm0ubW9kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENhbXBhaWduRm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiB2YWx1ZSBhcyBDYW1wYWlnbk1vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cIm5vbmVcIj5ObyBjYW1wYWlnbjwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiZXhpc3RpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4aXN0aW5nIGNhbXBhaWduXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJuZXdcIj5OZXcgY2FtcGFpZ248L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICB7Y2FtcGFpZ25Gb3JtLm1vZGUgPT09IFwiZXhpc3RpbmdcIiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJFeGlzdGluZyBjYW1wYWlnblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8T3B0aW9uU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NhbXBhaWduRm9ybS5jYW1wYWlnbl9pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zLmNhbXBhaWducyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FtcGFpZ25Gb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1wYWlnbl9pZDogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAge2NhbXBhaWduRm9ybS5tb2RlID09PSBcIm5ld1wiICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIk5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjYW1wYWlnbkZvcm0ubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVDYW1wYWlnbihcIm5hbWVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiSWRlbnRpZmllclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NhbXBhaWduRm9ybS5jYW1wYWlnbl9pZGVudGlmaWVyfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZUNhbXBhaWduKFwiY2FtcGFpZ25faWRlbnRpZmllclwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJTdGFydHMgYXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2FtcGFpZ25Gb3JtLnN0YXJ0c19hdH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVDYW1wYWlnbihcInN0YXJ0c19hdFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJFbmRzIGF0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NhbXBhaWduRm9ybS5lbmRzX2F0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZUNhbXBhaWduKFwiZW5kc19hdFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L1Byb2dyZXNzVGFicy5Db250ZW50PlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9Gb2N1c01vZGFsLkJvZHk+XG4gICAgICAgICAgPC9Qcm9ncmVzc1RhYnM+XG4gICAgICAgICAgPEZvY3VzTW9kYWwuRm9vdGVyIHN0eWxlPXttb2RhbFN0YXRpY1Jvd1N0eWxlfT5cbiAgICAgICAgICAgIDxCdXR0b24gdmFyaWFudD1cInNlY29uZGFyeVwiIG9uQ2xpY2s9eygpID0+IHNldE1vZGFsT3BlbihmYWxzZSl9PlxuICAgICAgICAgICAgICBDYW5jZWxcbiAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAge2NhbkdvQmFjayAmJiAoXG4gICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICB2YXJpYW50PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgc2V0QWN0aXZlU3RlcCh2aXNpYmxlU3RlcHNbY3VycmVudFN0ZXBJbmRleCAtIDFdKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEJhY2tcbiAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAge2NhbkdvTmV4dCAmJlxuICAgICAgICAgICAgYWN0aXZlU3RlcCAhPT0gdmlzaWJsZVN0ZXBzW3Zpc2libGVTdGVwcy5sZW5ndGggLSAxXSA/IChcbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgICBzZXRBY3RpdmVTdGVwKHZpc2libGVTdGVwc1tjdXJyZW50U3RlcEluZGV4ICsgMV0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQ29udGludWVcbiAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICA8QnV0dG9uIGlzTG9hZGluZz17c2F2aW5nfSBvbkNsaWNrPXsoKSA9PiB2b2lkIHNhdmVQcm9kdWN0KCl9PlxuICAgICAgICAgICAgICAgIFNhdmVcbiAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvRm9jdXNNb2RhbC5Gb290ZXI+XG4gICAgICAgIDwvRm9jdXNNb2RhbC5Db250ZW50PlxuICAgICAgPC9Gb2N1c01vZGFsPlxuICAgIDwvQ29udGFpbmVyPlxuICApXG59XG5cbmZ1bmN0aW9uIE9wdGlvblNlbGVjdCh7XG4gIHZhbHVlLFxuICBvcHRpb25zLFxuICBvbkNoYW5nZSxcbn06IHtcbiAgdmFsdWU6IHN0cmluZ1xuICBvcHRpb25zOiBPcHRpb25SZWNvcmRbXVxuICBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWRcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8U2VsZWN0XG4gICAgICB2YWx1ZT17dmFsdWUgfHwgTk9ORX1cbiAgICAgIG9uVmFsdWVDaGFuZ2U9eyhuZXh0KSA9PiBvbkNoYW5nZShuZXh0ID09PSBOT05FID8gXCJcIiA6IG5leHQpfVxuICAgID5cbiAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPXtOT05FfT5Ob25lPC9TZWxlY3QuSXRlbT5cbiAgICAgICAge29wdGlvbnMubWFwKChvcHRpb24pID0+IChcbiAgICAgICAgICA8U2VsZWN0Lkl0ZW0ga2V5PXtvcHRpb24uaWR9IHZhbHVlPXtvcHRpb24uaWR9PlxuICAgICAgICAgICAge29wdGlvbkxhYmVsKG9wdGlvbil9XG4gICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgKSl9XG4gICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgIDwvU2VsZWN0PlxuICApXG59XG4iLCAiaW1wb3J0IHtcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbiAgdHlwZSBDaGFuZ2VFdmVudCxcbiAgdHlwZSBDU1NQcm9wZXJ0aWVzLFxuICB0eXBlIERyYWdFdmVudCxcbiAgdHlwZSBSZWFjdE5vZGUsXG59IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQge1xuICBBZGp1c3RtZW50cyxcbiAgQXJyb3dQYXRoLFxuICBBcnJvd1VwVHJheSxcbiAgSW5mb3JtYXRpb25DaXJjbGUsXG4gIFBlbmNpbFNxdWFyZSxcbiAgUGx1cyxcbiAgVGF4RXhjbHVzaXZlLFxuICBUYXhJbmNsdXNpdmUsXG4gIFRyYXNoLFxuICBYTWFya01pbmksXG59IGZyb20gXCJAbWVkdXNhanMvaWNvbnNcIlxuaW1wb3J0IHtcbiAgQnV0dG9uLFxuICBDaGVja2JveCxcbiAgQ29udGFpbmVyLFxuICBDdXJyZW5jeUlucHV0LFxuICBEaXZpZGVyLFxuICBEcm9wZG93bk1lbnUsXG4gIERyYXdlcixcbiAgRm9jdXNNb2RhbCxcbiAgSGVhZGluZyxcbiAgSW5wdXQsXG4gIExhYmVsLFxuICBQcm9ncmVzc1RhYnMsXG4gIFJhZGlvR3JvdXAsXG4gIFNlbGVjdCxcbiAgU3RhdHVzQmFkZ2UsXG4gIFN3aXRjaCxcbiAgVGFibGUsXG4gIFRleHQsXG4gIFRleHRhcmVhLFxuICBUb29sdGlwLFxuICB0b2FzdCxcbiAgdXNlUHJvbXB0LFxufSBmcm9tIFwiQG1lZHVzYWpzL3VpXCJcbmltcG9ydCB7IENvdXBvbkVtcHR5U3RhdGUgfSBmcm9tIFwiLi9lbXB0eS1zdGF0ZVwiXG5cbmRlY2xhcmUgY29uc3QgX19CQUNLRU5EX1VSTF9fOiBzdHJpbmdcblxudHlwZSBBcGlCYXNlID0gXCIvYWRtaW5cIiB8IFwiL3ZlbmRvclwiXG50eXBlIEJlbmVmaXRUeXBlID0gXCJmaXhlZF9hbW91bnRcIiB8IFwicGVyY2VudGFnZVwiIHwgXCJmcmVlX3NoaXBwaW5nXCIgfCBcImJ1eV9nZXRcIlxudHlwZSBDb3Vwb25UeXBlID1cbiAgfCBcImFtb3VudF9vZmZfcHJvZHVjdHNcIlxuICB8IFwiYW1vdW50X29mZl9vcmRlclwiXG4gIHwgXCJwZXJjZW50YWdlX29mZl9wcm9kdWN0XCJcbiAgfCBcInBlcmNlbnRhZ2Vfb2ZmX29yZGVyXCJcbiAgfCBcImJ1eV94X2dldF95XCJcbiAgfCBcImZyZWVfc2hpcHBpbmdcIlxudHlwZSBDb2RlU3RyYXRlZ3kgPSBcInVuaXF1ZV9jb2RlXCIgfCBcInNoYXJlZF9jb2RlXCJcbnR5cGUgTWlycm9yTW9kZSA9IFwibm9uZVwiIHwgXCJtYW51YWxcIiB8IFwiYXV0b1wiXG50eXBlIFByb21vdGlvblN0YXR1cyA9IFwiZHJhZnRcIiB8IFwiYWN0aXZlXCIgfCBcImluYWN0aXZlXCJcbnR5cGUgQ2FtcGFpZ25Nb2RlID0gXCJub25lXCIgfCBcImV4aXN0aW5nXCIgfCBcIm5ld1wiXG50eXBlIEV4cGlyYXRpb25Qb2xpY3lUeXBlID0gXCJub25lXCIgfCBcImR1cmF0aW9uXCIgfCBcImZpeGVkXCJcbnR5cGUgQ291cG9uQWxsb2NhdGlvbiA9IFwiZWFjaFwiIHwgXCJvbmNlXCJcbnR5cGUgV2l6YXJkU3RlcCA9IFwiZGV0YWlsc1wiIHwgXCJvcmdhbml6ZVwiIHwgXCJjYW1wYWlnblwiIHwgXCJwcmljZXNcIlxudHlwZSBQdXJjaGFzZUNvbmRpdGlvbkF0dHJpYnV0ZSA9XG4gIHwgXCJjdXN0b21lci5ncm91cHMuaWRcIlxuICB8IFwicmVnaW9uLmlkXCJcbiAgfCBcInNoaXBwaW5nX2FkZHJlc3MuY291bnRyeV9jb2RlXCJcbiAgfCBcInNhbGVzX2NoYW5uZWxfaWRcIlxuICB8IFwiY3VycmVuY3lfY29kZVwiXG50eXBlIFB1cmNoYXNlQ29uZGl0aW9uT3BlcmF0b3IgPSBcImluXCIgfCBcImVxXCIgfCBcIm5lXCJcblxudHlwZSBQdXJjaGFzZUNvbmRpdGlvbkZvcm0gPSB7XG4gIGtleTogc3RyaW5nXG4gIGF0dHJpYnV0ZTogUHVyY2hhc2VDb25kaXRpb25BdHRyaWJ1dGUgfCBcIlwiXG4gIG9wZXJhdG9yOiBQdXJjaGFzZUNvbmRpdGlvbk9wZXJhdG9yIHwgXCJcIlxuICB2YWx1ZXM6IHN0cmluZ1tdXG59XG5cbnR5cGUgT3B0aW9uUmVjb3JkID0ge1xuICBpZDogc3RyaW5nXG4gIG5hbWU/OiBzdHJpbmcgfCBudWxsXG4gIHRpdGxlPzogc3RyaW5nIHwgbnVsbFxuICB2YWx1ZT86IHN0cmluZyB8IG51bGxcbiAgaGFuZGxlPzogc3RyaW5nIHwgbnVsbFxuICBjYW1wYWlnbl9pZGVudGlmaWVyPzogc3RyaW5nIHwgbnVsbFxuICBkaXNwbGF5X25hbWU/OiBzdHJpbmcgfCBudWxsXG4gIGlzb18yPzogc3RyaW5nIHwgbnVsbFxufVxuXG50eXBlIEN1cnJlbmN5T3B0aW9uID0ge1xuICBjb2RlOiBzdHJpbmdcbiAgbmFtZTogc3RyaW5nXG4gIHN5bWJvbDogc3RyaW5nXG4gIHN5bWJvbF9uYXRpdmU6IHN0cmluZ1xuICBpc19kZWZhdWx0OiBib29sZWFuXG4gIGlzX3RheF9pbmNsdXNpdmU/OiBib29sZWFuXG59XG5cbnR5cGUgT3B0aW9uc1BheWxvYWQgPSB7XG4gIGN1cnJlbmNpZXM/OiBDdXJyZW5jeU9wdGlvbltdXG4gIHByb2R1Y3RfdHlwZXM/OiBPcHRpb25SZWNvcmRbXVxuICBwcm9kdWN0X2NvbGxlY3Rpb25zPzogT3B0aW9uUmVjb3JkW11cbiAgcHJvZHVjdF9jYXRlZ29yaWVzPzogT3B0aW9uUmVjb3JkW11cbiAgcHJvZHVjdF90YWdzPzogT3B0aW9uUmVjb3JkW11cbiAgc2FsZXNfY2hhbm5lbHM/OiBPcHRpb25SZWNvcmRbXVxuICBzaGlwcGluZ19wcm9maWxlcz86IE9wdGlvblJlY29yZFtdXG4gIGNhbXBhaWducz86IE9wdGlvblJlY29yZFtdXG4gIHNlbGxlcnM/OiBPcHRpb25SZWNvcmRbXVxuICBjdXN0b21lcl9ncm91cHM/OiBPcHRpb25SZWNvcmRbXVxuICByZWdpb25zPzogT3B0aW9uUmVjb3JkW11cbiAgY291bnRyaWVzPzogT3B0aW9uUmVjb3JkW11cbn1cblxudHlwZSBDb3Vwb25Qcm9kdWN0Q29uZmlnID0ge1xuICBpZDogc3RyaW5nXG4gIGVuYWJsZWQ6IGJvb2xlYW5cbiAgcHJvZHVjdF9pZDogc3RyaW5nXG4gIGJlbmVmaXRfdHlwZTogQmVuZWZpdFR5cGVcbiAgcHVyY2hhc2VfY29uZGl0aW9ucz86IEFycmF5PHtcbiAgICBhdHRyaWJ1dGU6IFB1cmNoYXNlQ29uZGl0aW9uQXR0cmlidXRlXG4gICAgb3BlcmF0b3I6IFB1cmNoYXNlQ29uZGl0aW9uT3BlcmF0b3JcbiAgICB2YWx1ZXM6IHN0cmluZ1tdXG4gIH0+IHwgbnVsbFxuICBhbW91bnRzPzogeyBjdXJyZW5jeV9jb2RlOiBzdHJpbmc7IGFtb3VudDogbnVtYmVyIH1bXSB8IG51bGxcbiAgYW1vdW50OiBudW1iZXIgfCBudWxsXG4gIHBlcmNlbnRhZ2U6IG51bWJlciB8IG51bGxcbiAgY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbFxuICBjb2RlX3N0cmF0ZWd5OiBDb2RlU3RyYXRlZ3lcbiAgY29kZV9wcmVmaXg6IHN0cmluZyB8IG51bGxcbiAgc2hhcmVkX2NvZGU6IHN0cmluZyB8IG51bGxcbiAgZXhwaXJhdGlvbl9wb2xpY3k6XG4gIHwgeyB0eXBlOiBcIm5vbmVcIiB9XG4gIHwge1xuICAgIHR5cGU6IFwiZHVyYXRpb25cIlxuICAgIGR1cmF0aW9uX2RheXM6IG51bWJlclxuICAgIGNhcF9ieV9jYW1wYWlnbj86IGJvb2xlYW5cbiAgICBjYXBfYXQ/OiBzdHJpbmcgfCBudWxsXG4gIH1cbiAgfCB7XG4gICAgdHlwZTogXCJmaXhlZFwiXG4gICAgZXhwaXJlc19hdDogc3RyaW5nXG4gICAgY2FwX2J5X2NhbXBhaWduPzogYm9vbGVhblxuICAgIGNhcF9hdD86IHN0cmluZyB8IG51bGxcbiAgfVxuICBtYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW06IG51bWJlclxuICBwcm9tb3Rpb25fbWlycm9yX21vZGU6IE1pcnJvck1vZGVcbiAgcHJvbW90aW9uX3N0YXR1cz86IFByb21vdGlvblN0YXR1cyB8IG51bGxcbiAgcHJvbW90aW9uX3RlbXBsYXRlPzogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGxcbiAgY2FtcGFpZ25faWQ/OiBzdHJpbmcgfCBudWxsXG4gIGNhbXBhaWduX3NuYXBzaG90PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsXG59XG5cbnR5cGUgUHJvZHVjdFJlY29yZCA9IHtcbiAgaWQ6IHN0cmluZ1xuICB0aXRsZTogc3RyaW5nIHwgbnVsbFxuICBzdWJ0aXRsZT86IHN0cmluZyB8IG51bGxcbiAgaGFuZGxlOiBzdHJpbmcgfCBudWxsXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbFxuICBzdGF0dXM6IHN0cmluZyB8IG51bGxcbiAgdGh1bWJuYWlsOiBzdHJpbmcgfCBudWxsXG4gIHRodW1ibmFpbF9hc3NldF9pZD86IHN0cmluZyB8IG51bGxcbiAgaW1hZ2VzPzogeyBpZD86IHN0cmluZzsgdXJsPzogc3RyaW5nIHwgbnVsbDsgYXNzZXRfaWQ/OiBzdHJpbmcgfCBudWxsIH1bXVxuICBkaXNjb3VudGFibGU/OiBib29sZWFuXG4gIHR5cGVfaWQ/OiBzdHJpbmcgfCBudWxsXG4gIGNvbGxlY3Rpb25faWQ/OiBzdHJpbmcgfCBudWxsXG4gIHNoaXBwaW5nX3Byb2ZpbGVfaWQ/OiBzdHJpbmcgfCBudWxsXG4gIHZhcmlhbnRzPzoge1xuICAgIGlkOiBzdHJpbmdcbiAgICBza3U/OiBzdHJpbmcgfCBudWxsXG4gICAgcHJpY2VzPzogeyBjdXJyZW5jeV9jb2RlPzogc3RyaW5nOyBhbW91bnQ/OiBudW1iZXIgfVtdXG4gIH1bXVxuICBjYXRlZ29yaWVzPzogeyBpZDogc3RyaW5nIH1bXVxuICB0YWdzPzogeyBpZDogc3RyaW5nIH1bXVxuICBzYWxlc19jaGFubmVscz86IHsgaWQ6IHN0cmluZzsgbmFtZT86IHN0cmluZyB8IG51bGwgfVtdXG59XG5cbnR5cGUgUHJvZHVjdE1lZGlhID0ge1xuICB1cmw6IHN0cmluZ1xuICBhc3NldF9pZD86IHN0cmluZ1xufVxuXG50eXBlIENvdXBvblByb2R1Y3RSb3cgPSB7XG4gIGlkOiBzdHJpbmdcbiAgcHJvZHVjdDogUHJvZHVjdFJlY29yZFxuICBjb3Vwb25fcHJvZHVjdF9jb25maWc6IENvdXBvblByb2R1Y3RDb25maWdcbiAgZW50aXRsZW1lbnRzX2NvdW50OiBudW1iZXJcbn1cblxudHlwZSBQcm9kdWN0Rm9ybVN0YXRlID0ge1xuICB0aXRsZTogc3RyaW5nXG4gIHN1YnRpdGxlOiBzdHJpbmdcbiAgaGFuZGxlOiBzdHJpbmdcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xuICBtZWRpYTogUHJvZHVjdE1lZGlhW11cbiAgc2t1OiBzdHJpbmdcbiAgcHJpY2VfYW1vdW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBzdGF0dXM6IHN0cmluZ1xuICBkaXNjb3VudGFibGU6IGJvb2xlYW5cbiAgc2VsbGVyX2lkOiBzdHJpbmdcbiAgdHlwZV9pZDogc3RyaW5nXG4gIGNvbGxlY3Rpb25faWQ6IHN0cmluZ1xuICBjYXRlZ29yeV9pZDogc3RyaW5nXG4gIHRhZ19pZDogc3RyaW5nXG59XG5cbnR5cGUgQ291cG9uRm9ybVN0YXRlID0ge1xuICBlbmFibGVkOiBib29sZWFuXG4gIHR5cGU6IENvdXBvblR5cGVcbiAgcHVyY2hhc2VfY29uZGl0aW9uczogUHVyY2hhc2VDb25kaXRpb25Gb3JtW11cbiAgYW1vdW50czogQ291cG9uQW1vdW50Rm9ybVJvd1tdXG4gIHBlcmNlbnRhZ2U6IHN0cmluZ1xuICBhbGxvY2F0aW9uOiBDb3Vwb25BbGxvY2F0aW9uXG4gIGNvZGVfc3RyYXRlZ3k6IENvZGVTdHJhdGVneVxuICBjb2RlX3ByZWZpeDogc3RyaW5nXG4gIHNoYXJlZF9jb2RlOiBzdHJpbmdcbiAgZXhwaXJhdGlvbl90eXBlOiBFeHBpcmF0aW9uUG9saWN5VHlwZVxuICBleHBpcmF0aW9uX2RheXM6IHN0cmluZ1xuICBleHBpcmF0aW9uX2RhdGU6IHN0cmluZ1xuICBleHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbjogYm9vbGVhblxuICBleHBpcmF0aW9uX2NhcF9hdDogc3RyaW5nXG4gIG1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbTogc3RyaW5nXG4gIHByb21vdGlvbl9taXJyb3JfbW9kZTogTWlycm9yTW9kZVxuICBwcm9tb3Rpb25fc3RhdHVzOiBQcm9tb3Rpb25TdGF0dXNcbn1cblxudHlwZSBDb3Vwb25BbW91bnRGb3JtUm93ID0ge1xuICBrZXk6IHN0cmluZ1xuICBjdXJyZW5jeV9jb2RlOiBzdHJpbmdcbiAgYW1vdW50OiBzdHJpbmdcbn1cblxudHlwZSBDYW1wYWlnbkZvcm1TdGF0ZSA9IHtcbiAgbW9kZTogQ2FtcGFpZ25Nb2RlXG4gIGNhbXBhaWduX2lkOiBzdHJpbmdcbiAgbmFtZTogc3RyaW5nXG4gIGNhbXBhaWduX2lkZW50aWZpZXI6IHN0cmluZ1xuICBzdGFydHNfYXQ6IHN0cmluZ1xuICBlbmRzX2F0OiBzdHJpbmdcbn1cblxuY29uc3QgTk9ORSA9IFwiX19ub25lX19cIlxuY29uc3QgYWxsU3RlcHM6IFdpemFyZFN0ZXBbXSA9IFtcImRldGFpbHNcIiwgXCJvcmdhbml6ZVwiLCBcImNhbXBhaWduXCIsIFwicHJpY2VzXCJdXG5cbmNvbnN0IGNvbmRpdGlvbkF0dHJpYnV0ZXM6IEFycmF5PHtcbiAgdmFsdWU6IFB1cmNoYXNlQ29uZGl0aW9uQXR0cmlidXRlXG4gIGxhYmVsOiBzdHJpbmdcbn0+ID0gW1xuICB7IHZhbHVlOiBcImN1c3RvbWVyLmdyb3Vwcy5pZFwiLCBsYWJlbDogXCJDdXN0b21lciBHcm91cFwiIH0sXG4gIHsgdmFsdWU6IFwicmVnaW9uLmlkXCIsIGxhYmVsOiBcIlJlZ2lvblwiIH0sXG4gIHsgdmFsdWU6IFwic2hpcHBpbmdfYWRkcmVzcy5jb3VudHJ5X2NvZGVcIiwgbGFiZWw6IFwiQ291bnRyeVwiIH0sXG4gIHsgdmFsdWU6IFwic2FsZXNfY2hhbm5lbF9pZFwiLCBsYWJlbDogXCJTYWxlcyBDaGFubmVsXCIgfSxcbiAgeyB2YWx1ZTogXCJjdXJyZW5jeV9jb2RlXCIsIGxhYmVsOiBcIkN1cnJlbmN5IENvZGVcIiB9LFxuXVxuXG5jb25zdCBjb25kaXRpb25PcGVyYXRvcnM6IEFycmF5PHtcbiAgdmFsdWU6IFB1cmNoYXNlQ29uZGl0aW9uT3BlcmF0b3JcbiAgbGFiZWw6IHN0cmluZ1xufT4gPSBbXG4gIHsgdmFsdWU6IFwiaW5cIiwgbGFiZWw6IFwiSW5cIiB9LFxuICB7IHZhbHVlOiBcImVxXCIsIGxhYmVsOiBcIkVxdWFsc1wiIH0sXG4gIHsgdmFsdWU6IFwibmVcIiwgbGFiZWw6IFwiTm90IEluXCIgfSxcbl1cblxuZXhwb3J0IGNvbnN0IHR5cGVDaG9pY2VzOiB7XG4gIHZhbHVlOiBDb3Vwb25UeXBlXG4gIGxhYmVsOiBzdHJpbmdcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xufVtdID0gW1xuICAgIHtcbiAgICAgIHZhbHVlOiBcImFtb3VudF9vZmZfcHJvZHVjdHNcIixcbiAgICAgIGxhYmVsOiBcIkFtb3VudCBvZmYgcHJvZHVjdHNcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkRpc2NvdW50IHNwZWNpZmljIHByb2R1Y3RzIG9yIGEgY29sbGVjdGlvbiBvZiBwcm9kdWN0c1wiLFxuICAgIH0sXG4gICAge1xuICAgICAgdmFsdWU6IFwiYW1vdW50X29mZl9vcmRlclwiLFxuICAgICAgbGFiZWw6IFwiQW1vdW50IG9mZiBvcmRlclwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiRGlzY291bnQgdGhlIHRvdGFsIG9yZGVyIGFtb3VudFwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdmFsdWU6IFwicGVyY2VudGFnZV9vZmZfcHJvZHVjdFwiLFxuICAgICAgbGFiZWw6IFwiUGVyY2VudGFnZSBvZmYgcHJvZHVjdFwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiRGlzY291bnQgYSBwZXJjZW50YWdlIG9mZiBzZWxlY3RlZCBwcm9kdWN0c1wiLFxuICAgIH0sXG4gICAge1xuICAgICAgdmFsdWU6IFwicGVyY2VudGFnZV9vZmZfb3JkZXJcIixcbiAgICAgIGxhYmVsOiBcIlBlcmNlbnRhZ2Ugb2ZmIG9yZGVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJEaXNjb3VudCBhIHBlcmNlbnRhZ2Ugb2ZmIHRoZSB0b3RhbCBvcmRlciBhbW91bnRcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHZhbHVlOiBcImJ1eV94X2dldF95XCIsXG4gICAgICBsYWJlbDogXCJCdXkgWCBHZXQgWVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiSXNzdWUgYSBCdXkgWCBHZXQgWSBjb3Vwb24gZW50aXRsZW1lbnRcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHZhbHVlOiBcImZyZWVfc2hpcHBpbmdcIixcbiAgICAgIGxhYmVsOiBcIkZyZWUgc2hpcHBpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkFwcGx5IGEgMTAwJSBkaXNjb3VudCB0byBzaGlwcGluZyBmZWVzXCIsXG4gICAgfSxcbiAgXVxuXG5jb25zdCBzdGF0dXNDaG9pY2VzOiB7XG4gIHZhbHVlOiBQcm9tb3Rpb25TdGF0dXNcbiAgbGFiZWw6IHN0cmluZ1xuICBkZXNjcmlwdGlvbjogc3RyaW5nXG59W10gPSBbXG4gICAge1xuICAgICAgdmFsdWU6IFwiZHJhZnRcIixcbiAgICAgIGxhYmVsOiBcIkRyYWZ0XCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJDdXN0b21lcnMgd2lsbCBub3QgYmUgYWJsZSB0byB1c2UgdGhlIGNvZGUgeWV0XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB2YWx1ZTogXCJhY3RpdmVcIixcbiAgICAgIGxhYmVsOiBcIkFjdGl2ZVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiQ3VzdG9tZXJzIHdpbGwgYmUgYWJsZSB0byB1c2UgdGhlIGNvZGVcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHZhbHVlOiBcImluYWN0aXZlXCIsXG4gICAgICBsYWJlbDogXCJJbmFjdGl2ZVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiS2VlcCB0aGUgcHJvbW90aW9uIHVuYXZhaWxhYmxlIHVudGlsIHJlYWN0aXZhdGVkXCIsXG4gICAgfSxcbiAgXVxuXG5mdW5jdGlvbiBiYWNrZW5kVXJsKCkge1xuICByZXR1cm4gdHlwZW9mIF9fQkFDS0VORF9VUkxfXyA9PT0gXCJzdHJpbmdcIlxuICAgID8gX19CQUNLRU5EX1VSTF9fLnJlcGxhY2UoL1xcLyQvLCBcIlwiKVxuICAgIDogXCJcIlxufVxuXG5mdW5jdGlvbiBhcGlFcnJvck1lc3NhZ2UocGF5bG9hZDogYW55LCBmYWxsYmFjazogc3RyaW5nKSB7XG4gIHJldHVybiAoXG4gICAgW3BheWxvYWQ/Lm1lc3NhZ2UsIHBheWxvYWQ/LmVycm9yPy5tZXNzYWdlLCBwYXlsb2FkPy5lcnJvcl0uZmluZChcbiAgICAgIChjYW5kaWRhdGUpID0+IHR5cGVvZiBjYW5kaWRhdGUgPT09IFwic3RyaW5nXCIgJiYgY2FuZGlkYXRlLnRyaW0oKSxcbiAgICApIHx8XG4gICAgZmFsbGJhY2sgfHxcbiAgICBcIlJlcXVlc3QgZmFpbGVkXCJcbiAgKVxufVxuXG5hc3luYyBmdW5jdGlvbiBhcGlGZXRjaDxUPihcbiAgcGF0aDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHt9LFxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YmFja2VuZFVybCgpfSR7cGF0aH1gLCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXG4gICAgaGVhZGVyczoge1xuICAgICAgLi4uKG9wdGlvbnMuYm9keSA/IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSA6IHt9KSxcbiAgICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcbiAgICB9LFxuICB9KVxuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+IG51bGwpXG4gICAgdGhyb3cgbmV3IEVycm9yKGFwaUVycm9yTWVzc2FnZShwYXlsb2FkLCByZXNwb25zZS5zdGF0dXNUZXh0KSlcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZS5qc29uKClcbn1cblxuZnVuY3Rpb24gb3B0aW9uTGFiZWwob3B0aW9uOiBPcHRpb25SZWNvcmQpIHtcbiAgcmV0dXJuIChcbiAgICBvcHRpb24ubmFtZSB8fCBvcHRpb24udGl0bGUgfHwgb3B0aW9uLnZhbHVlIHx8IG9wdGlvbi5oYW5kbGUgfHwgb3B0aW9uLmlkXG4gIClcbn1cblxuZnVuY3Rpb24gbnVtYmVyT3JOdWxsKHZhbHVlOiBzdHJpbmcpIHtcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHZhbHVlKVxuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgJiYgcGFyc2VkID4gMCA/IHBhcnNlZCA6IG51bGxcbn1cblxuZnVuY3Rpb24gbm9uTmVnYXRpdmVOdW1iZXJPck51bGwodmFsdWU6IHN0cmluZykge1xuICBpZiAoIXZhbHVlLnRyaW0oKSkgcmV0dXJuIG51bGxcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHZhbHVlKVxuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgJiYgcGFyc2VkID49IDAgPyBwYXJzZWQgOiBudWxsXG59XG5cbmZ1bmN0aW9uIHRvRGF0ZVRpbWVMb2NhbCh2YWx1ZT86IHN0cmluZyB8IG51bGwpIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiXCJcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKVxuICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkgcmV0dXJuIFwiXCJcbiAgY29uc3QgbG9jYWxEYXRlID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkgLSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MF8wMDApXG4gIHJldHVybiBsb2NhbERhdGUudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxNilcbn1cblxuZnVuY3Rpb24gY3VycmVuY3lEZWNpbWFsRGlnaXRzKGNvZGU6IHN0cmluZykge1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQoXCJlblwiLCB7XG4gICAgICBzdHlsZTogXCJjdXJyZW5jeVwiLFxuICAgICAgY3VycmVuY3k6IGNvZGUudG9VcHBlckNhc2UoKSxcbiAgICB9KS5yZXNvbHZlZE9wdGlvbnMoKS5tYXhpbXVtRnJhY3Rpb25EaWdpdHNcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIDJcbiAgfVxufVxuXG5mdW5jdGlvbiBjdXJyZW5jeVN5bWJvbChjb2RlOiBzdHJpbmcpIHtcbiAgaWYgKCFjb2RlKSByZXR1cm4gXCJcIlxuICB0cnkge1xuICAgIHJldHVybiAoXG4gICAgICBuZXcgSW50bC5OdW1iZXJGb3JtYXQoXCJlblwiLCB7XG4gICAgICAgIHN0eWxlOiBcImN1cnJlbmN5XCIsXG4gICAgICAgIGN1cnJlbmN5OiBjb2RlLnRvVXBwZXJDYXNlKCksXG4gICAgICAgIGN1cnJlbmN5RGlzcGxheTogXCJuYXJyb3dTeW1ib2xcIixcbiAgICAgIH0pXG4gICAgICAgIC5mb3JtYXRUb1BhcnRzKDApXG4gICAgICAgIC5maW5kKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09IFwiY3VycmVuY3lcIik/LnZhbHVlIHx8IGNvZGUudG9VcHBlckNhc2UoKVxuICAgIClcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGNvZGUudG9VcHBlckNhc2UoKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3Vwb25UeXBlRnJvbUNvbmZpZyhjb25maWc6IENvdXBvblByb2R1Y3RDb25maWcpOiBDb3Vwb25UeXBlIHtcbiAgaWYgKGNvbmZpZy5iZW5lZml0X3R5cGUgPT09IFwicGVyY2VudGFnZVwiKSB7XG4gICAgcmV0dXJuIGNvbmZpZy5wcm9tb3Rpb25fdGVtcGxhdGU/LmFwcGxpY2F0aW9uX21ldGhvZD8udGFyZ2V0X3R5cGUgPT09IFwib3JkZXJcIlxuICAgICAgPyBcInBlcmNlbnRhZ2Vfb2ZmX29yZGVyXCJcbiAgICAgIDogXCJwZXJjZW50YWdlX29mZl9wcm9kdWN0XCJcbiAgfVxuICBpZiAoY29uZmlnLmJlbmVmaXRfdHlwZSA9PT0gXCJidXlfZ2V0XCIpIHJldHVybiBcImJ1eV94X2dldF95XCJcbiAgaWYgKGNvbmZpZy5iZW5lZml0X3R5cGUgPT09IFwiZnJlZV9zaGlwcGluZ1wiKSByZXR1cm4gXCJmcmVlX3NoaXBwaW5nXCJcblxuICByZXR1cm4gY29uZmlnLnByb21vdGlvbl90ZW1wbGF0ZT8uYXBwbGljYXRpb25fbWV0aG9kPy50YXJnZXRfdHlwZSA9PT0gXCJvcmRlclwiXG4gICAgPyBcImFtb3VudF9vZmZfb3JkZXJcIlxuICAgIDogXCJhbW91bnRfb2ZmX3Byb2R1Y3RzXCJcbn1cblxuZnVuY3Rpb24gYmVuZWZpdFR5cGVGcm9tQ291cG9uVHlwZSh0eXBlOiBDb3Vwb25UeXBlKTogQmVuZWZpdFR5cGUge1xuICBpZiAoXG4gICAgdHlwZSA9PT0gXCJwZXJjZW50YWdlX29mZl9wcm9kdWN0XCIgfHxcbiAgICB0eXBlID09PSBcInBlcmNlbnRhZ2Vfb2ZmX29yZGVyXCJcbiAgKSByZXR1cm4gXCJwZXJjZW50YWdlXCJcbiAgaWYgKHR5cGUgPT09IFwiYnV5X3hfZ2V0X3lcIikgcmV0dXJuIFwiYnV5X2dldFwiXG4gIGlmICh0eXBlID09PSBcImZyZWVfc2hpcHBpbmdcIikgcmV0dXJuIFwiZnJlZV9zaGlwcGluZ1wiXG4gIHJldHVybiBcImZpeGVkX2Ftb3VudFwiXG59XG5cbmZ1bmN0aW9uIGNvdXBvblR5cGVMYWJlbChjb25maWc6IENvdXBvblByb2R1Y3RDb25maWcpIHtcbiAgcmV0dXJuIHR5cGVDaG9pY2VzLmZpbmQoXG4gICAgKGNob2ljZSkgPT4gY2hvaWNlLnZhbHVlID09PSBjb3Vwb25UeXBlRnJvbUNvbmZpZyhjb25maWcpLFxuICApPy5sYWJlbFxufVxuXG5mdW5jdGlvbiBjb3Vwb25TdGF0dXNDb2xvcihzdGF0dXM/OiBQcm9tb3Rpb25TdGF0dXMgfCBudWxsKSB7XG4gIGlmIChzdGF0dXMgPT09IFwiYWN0aXZlXCIpIHJldHVybiBcImdyZWVuXCIgYXMgY29uc3RcbiAgaWYgKHN0YXR1cyA9PT0gXCJpbmFjdGl2ZVwiKSByZXR1cm4gXCJvcmFuZ2VcIiBhcyBjb25zdFxuICByZXR1cm4gXCJncmV5XCIgYXMgY29uc3Rcbn1cblxuZnVuY3Rpb24gcHJvZHVjdFN0YXR1c0Zyb21Db3Vwb25TdGF0dXMoc3RhdHVzOiBQcm9tb3Rpb25TdGF0dXMpIHtcbiAgcmV0dXJuIHN0YXR1cyA9PT0gXCJhY3RpdmVcIiA/IFwicHVibGlzaGVkXCIgOiBcImRyYWZ0XCJcbn1cblxuZnVuY3Rpb24gY2FtcGFpZ25MYWJlbChjb25maWc6IENvdXBvblByb2R1Y3RDb25maWcpIHtcbiAgY29uc3QgbmFtZSA9IGNvbmZpZy5jYW1wYWlnbl9zbmFwc2hvdD8ubmFtZVxuICByZXR1cm4gdHlwZW9mIG5hbWUgPT09IFwic3RyaW5nXCIgJiYgbmFtZSA/IG5hbWUgOiBjb25maWcuY2FtcGFpZ25faWQgfHwgXCJOb25lXCJcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEN1cnJlbmN5KG9wdGlvbnM6IE9wdGlvbnNQYXlsb2FkKSB7XG4gIHJldHVybiAoXG4gICAgb3B0aW9ucy5jdXJyZW5jaWVzPy5maW5kKChjdXJyZW5jeSkgPT4gY3VycmVuY3kuaXNfZGVmYXVsdCk/LmNvZGUgfHxcbiAgICBvcHRpb25zLmN1cnJlbmNpZXM/LlswXT8uY29kZSB8fFxuICAgIFwiXCJcbiAgKVxufVxuXG5mdW5jdGlvbiBjb25kaXRpb25LZXkocHJlZml4ID0gXCJjb25kaXRpb25cIikge1xuICByZXR1cm4gYCR7cHJlZml4fS0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCl9YFxufVxuXG5mdW5jdGlvbiBpc0Ftb3VudENvdXBvblR5cGUodHlwZTogQ291cG9uVHlwZSkge1xuICByZXR1cm4gdHlwZSA9PT0gXCJhbW91bnRfb2ZmX3Byb2R1Y3RzXCIgfHwgdHlwZSA9PT0gXCJhbW91bnRfb2ZmX29yZGVyXCJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVmZmVjdGl2ZUNvdXBvbkN1cnJlbmNpZXMoXG4gIGNvbmRpdGlvbnM6IFB1cmNoYXNlQ29uZGl0aW9uRm9ybVtdLFxuICBjdXJyZW5jaWVzOiBDdXJyZW5jeU9wdGlvbltdLFxuKSB7XG4gIGNvbnN0IGNvbmRpdGlvbiA9IGNvbmRpdGlvbnMuZmluZChcbiAgICAoaXRlbSkgPT4gaXRlbS5hdHRyaWJ1dGUgPT09IFwiY3VycmVuY3lfY29kZVwiLFxuICApXG4gIGlmICghY29uZGl0aW9uIHx8ICFjb25kaXRpb24ub3BlcmF0b3IpIHJldHVybiBbXVxuICBjb25zdCBzZWxlY3RlZCA9IG5ldyBTZXQoY29uZGl0aW9uLnZhbHVlcylcbiAgY29uc3Qgc3VwcG9ydGVkID0gY3VycmVuY2llcy5tYXAoKGN1cnJlbmN5KSA9PiBjdXJyZW5jeS5jb2RlKVxuXG4gIHJldHVybiBjb25kaXRpb24ub3BlcmF0b3IgPT09IFwibmVcIlxuICAgID8gc3VwcG9ydGVkLmZpbHRlcigoY29kZSkgPT4gIXNlbGVjdGVkLmhhcyhjb2RlKSlcbiAgICA6IHN1cHBvcnRlZC5maWx0ZXIoKGNvZGUpID0+IHNlbGVjdGVkLmhhcyhjb2RlKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlY29uY2lsZUNvdXBvbkFtb3VudHMoXG4gIGN1cnJlbnQ6IENvdXBvbkFtb3VudEZvcm1Sb3dbXSxcbiAgY3VycmVuY3lDb2Rlczogc3RyaW5nW10sXG4pIHtcbiAgY29uc3QgYnlDdXJyZW5jeSA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBjdXJyZW50Lm1hcCgocm93KSA9PiBbcm93LmN1cnJlbmN5X2NvZGUsIHJvd10pLFxuICApXG4gIHJldHVybiBjdXJyZW5jeUNvZGVzLm1hcCgoY3VycmVuY3lDb2RlKSA9PiAoe1xuICAgIGtleTogYnlDdXJyZW5jeVtjdXJyZW5jeUNvZGVdPy5rZXkgfHwgY29uZGl0aW9uS2V5KFwiY291cG9uLXZhbHVlXCIpLFxuICAgIGN1cnJlbmN5X2NvZGU6IGN1cnJlbmN5Q29kZSxcbiAgICBhbW91bnQ6IGJ5Q3VycmVuY3lbY3VycmVuY3lDb2RlXT8uYW1vdW50IHx8IFwiXCIsXG4gIH0pKVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0UHVyY2hhc2VDb25kaXRpb25zKG9wdGlvbnM6IE9wdGlvbnNQYXlsb2FkKSB7XG4gIGNvbnN0IGN1cnJlbmN5Q29kZSA9IGRlZmF1bHRDdXJyZW5jeShvcHRpb25zKVxuICByZXR1cm4gY3VycmVuY3lDb2RlXG4gICAgPyBbXG4gICAgICB7XG4gICAgICAgIGtleTogY29uZGl0aW9uS2V5KFwiY3VycmVuY3lcIiksXG4gICAgICAgIGF0dHJpYnV0ZTogXCJjdXJyZW5jeV9jb2RlXCIgYXMgY29uc3QsXG4gICAgICAgIG9wZXJhdG9yOiBcImVxXCIgYXMgY29uc3QsXG4gICAgICAgIHZhbHVlczogW2N1cnJlbmN5Q29kZV0sXG4gICAgICB9LFxuICAgIF1cbiAgICA6IFtdXG59XG5cbmZ1bmN0aW9uIGVtcHR5UHJvZHVjdChvcHRpb25zOiBPcHRpb25zUGF5bG9hZCk6IFByb2R1Y3RGb3JtU3RhdGUge1xuICByZXR1cm4ge1xuICAgIHRpdGxlOiBcIlwiLFxuICAgIHN1YnRpdGxlOiBcIlwiLFxuICAgIGhhbmRsZTogXCJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJcIixcbiAgICBtZWRpYTogW10sXG4gICAgc2t1OiBcIlwiLFxuICAgIHByaWNlX2Ftb3VudHM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIChvcHRpb25zLmN1cnJlbmNpZXMgfHwgW10pLm1hcCgoY3VycmVuY3kpID0+IFtjdXJyZW5jeS5jb2RlLCBcIlwiXSksXG4gICAgKSxcbiAgICBzdGF0dXM6IFwiZHJhZnRcIixcbiAgICBkaXNjb3VudGFibGU6IGZhbHNlLFxuICAgIHNlbGxlcl9pZDogXCJcIixcbiAgICB0eXBlX2lkOiBcIlwiLFxuICAgIGNvbGxlY3Rpb25faWQ6IFwiXCIsXG4gICAgY2F0ZWdvcnlfaWQ6IFwiXCIsXG4gICAgdGFnX2lkOiBcIlwiLFxuICB9XG59XG5cbmZ1bmN0aW9uIGVtcHR5Q291cG9uKG9wdGlvbnM6IE9wdGlvbnNQYXlsb2FkKTogQ291cG9uRm9ybVN0YXRlIHtcbiAgY29uc3QgY3VycmVuY3lDb2RlID0gZGVmYXVsdEN1cnJlbmN5KG9wdGlvbnMpXG4gIGNvbnN0IHB1cmNoYXNlQ29uZGl0aW9ucyA9IGRlZmF1bHRQdXJjaGFzZUNvbmRpdGlvbnMob3B0aW9ucylcbiAgcmV0dXJuIHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIHR5cGU6IFwiYW1vdW50X29mZl9wcm9kdWN0c1wiLFxuICAgIHB1cmNoYXNlX2NvbmRpdGlvbnM6IHB1cmNoYXNlQ29uZGl0aW9ucyxcbiAgICBhbW91bnRzOiBjdXJyZW5jeUNvZGVcbiAgICAgID8gW1xuICAgICAgICB7XG4gICAgICAgICAga2V5OiBcImNvdXBvbi12YWx1ZS1kZWZhdWx0XCIsXG4gICAgICAgICAgY3VycmVuY3lfY29kZTogY3VycmVuY3lDb2RlLFxuICAgICAgICAgIGFtb3VudDogXCJcIixcbiAgICAgICAgfSxcbiAgICAgIF1cbiAgICAgIDogW10sXG4gICAgcGVyY2VudGFnZTogXCJcIixcbiAgICBhbGxvY2F0aW9uOiBcImVhY2hcIixcbiAgICBjb2RlX3N0cmF0ZWd5OiBcInVuaXF1ZV9jb2RlXCIsXG4gICAgY29kZV9wcmVmaXg6IFwiQ09VUE9OXCIsXG4gICAgc2hhcmVkX2NvZGU6IFwiXCIsXG4gICAgZXhwaXJhdGlvbl90eXBlOiBcImR1cmF0aW9uXCIsXG4gICAgZXhwaXJhdGlvbl9kYXlzOiBcIjMwXCIsXG4gICAgZXhwaXJhdGlvbl9kYXRlOiBcIlwiLFxuICAgIGV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWduOiB0cnVlLFxuICAgIGV4cGlyYXRpb25fY2FwX2F0OiBcIlwiLFxuICAgIG1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbTogXCIxXCIsXG4gICAgcHJvbW90aW9uX21pcnJvcl9tb2RlOiBcIm5vbmVcIixcbiAgICBwcm9tb3Rpb25fc3RhdHVzOiBcImRyYWZ0XCIsXG4gIH1cbn1cblxuY29uc3QgZW1wdHlDYW1wYWlnbjogQ2FtcGFpZ25Gb3JtU3RhdGUgPSB7XG4gIG1vZGU6IFwibm9uZVwiLFxuICBjYW1wYWlnbl9pZDogXCJcIixcbiAgbmFtZTogXCJcIixcbiAgY2FtcGFpZ25faWRlbnRpZmllcjogXCJcIixcbiAgc3RhcnRzX2F0OiBcIlwiLFxuICBlbmRzX2F0OiBcIlwiLFxufVxuXG5mdW5jdGlvbiBmb3Jtc0Zyb21Sb3coXG4gIHJvdzogQ291cG9uUHJvZHVjdFJvdyxcbiAgb3B0aW9uczogT3B0aW9uc1BheWxvYWQsXG4pOiB7XG4gIHByb2R1Y3Q6IFByb2R1Y3RGb3JtU3RhdGVcbiAgY291cG9uOiBDb3Vwb25Gb3JtU3RhdGVcbiAgY2FtcGFpZ246IENhbXBhaWduRm9ybVN0YXRlXG59IHtcbiAgY29uc3QgcHJvZHVjdCA9IHJvdy5wcm9kdWN0XG4gIGNvbnN0IGNvbmZpZyA9IHJvdy5jb3Vwb25fcHJvZHVjdF9jb25maWdcbiAgY29uc3QgdmFyaWFudCA9IHByb2R1Y3QudmFyaWFudHM/LlswXVxuICBjb25zdCBwcmljZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgKHZhcmlhbnQ/LnByaWNlcyB8fCBbXSlcbiAgICAgIC5maWx0ZXIoKHByaWNlKSA9PiBwcmljZS5jdXJyZW5jeV9jb2RlKVxuICAgICAgLm1hcCgocHJpY2UpID0+IFtcbiAgICAgICAgU3RyaW5nKHByaWNlLmN1cnJlbmN5X2NvZGUpLnRvTG93ZXJDYXNlKCksXG4gICAgICAgIHByaWNlLmFtb3VudCA9PSBudWxsID8gXCJcIiA6IFN0cmluZyhwcmljZS5hbW91bnQpLFxuICAgICAgXSksXG4gIClcbiAgY29uc3QgbWVkaWEgPSBBcnJheS5mcm9tKFxuICAgIG5ldyBNYXAoXG4gICAgICBbXG4gICAgICAgIC4uLihwcm9kdWN0LnRodW1ibmFpbFxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdXJsOiBwcm9kdWN0LnRodW1ibmFpbCxcbiAgICAgICAgICAgICAgICBhc3NldF9pZDogcHJvZHVjdC50aHVtYm5haWxfYXNzZXRfaWQgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXVxuICAgICAgICAgIDogW10pLFxuICAgICAgICAuLi4ocHJvZHVjdC5pbWFnZXMgfHwgW10pXG4gICAgICAgICAgLmZpbHRlcigoaW1hZ2UpID0+IGltYWdlLnVybClcbiAgICAgICAgICAubWFwKChpbWFnZSkgPT4gKHtcbiAgICAgICAgICAgIHVybDogU3RyaW5nKGltYWdlLnVybCksXG4gICAgICAgICAgICBhc3NldF9pZDogaW1hZ2UuYXNzZXRfaWQgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgIH0pKSxcbiAgICAgIF0ubWFwKChpdGVtKSA9PiBbaXRlbS51cmwsIGl0ZW1dKSxcbiAgICApLnZhbHVlcygpLFxuICApXG4gIGNvbnN0IGNvbmZpZ3VyZWRBbW91bnRzID1cbiAgICBBcnJheS5pc0FycmF5KGNvbmZpZy5hbW91bnRzKSAmJiBjb25maWcuYW1vdW50cy5sZW5ndGhcbiAgICAgID8gY29uZmlnLmFtb3VudHNcbiAgICAgIDogY29uZmlnLmFtb3VudCAhPSBudWxsICYmIGNvbmZpZy5jdXJyZW5jeV9jb2RlXG4gICAgICAgID8gW3sgYW1vdW50OiBjb25maWcuYW1vdW50LCBjdXJyZW5jeV9jb2RlOiBjb25maWcuY3VycmVuY3lfY29kZSB9XVxuICAgICAgICA6IFtdXG4gIGNvbnN0IGNvbmZpZ3VyZWRDb25kaXRpb25zID0gKGNvbmZpZy5wdXJjaGFzZV9jb25kaXRpb25zIHx8IFtdKS5tYXAoXG4gICAgKGNvbmRpdGlvbiwgaW5kZXgpID0+ICh7XG4gICAgICBrZXk6IGBjb25kaXRpb24tJHtpbmRleH1gLFxuICAgICAgYXR0cmlidXRlOiBjb25kaXRpb24uYXR0cmlidXRlLFxuICAgICAgb3BlcmF0b3I6IGNvbmRpdGlvbi5vcGVyYXRvcixcbiAgICAgIHZhbHVlczogY29uZGl0aW9uLnZhbHVlcy5tYXAoKHZhbHVlKSA9PlxuICAgICAgICBjb25kaXRpb24uYXR0cmlidXRlID09PSBcImN1cnJlbmN5X2NvZGVcIiB8fFxuICAgICAgICAgIGNvbmRpdGlvbi5hdHRyaWJ1dGUgPT09IFwic2hpcHBpbmdfYWRkcmVzcy5jb3VudHJ5X2NvZGVcIlxuICAgICAgICAgID8gdmFsdWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgIDogdmFsdWUsXG4gICAgICApLFxuICAgIH0pLFxuICApXG4gIGlmIChcbiAgICAhY29uZmlndXJlZENvbmRpdGlvbnMuc29tZShcbiAgICAgIChjb25kaXRpb24pID0+IGNvbmRpdGlvbi5hdHRyaWJ1dGUgPT09IFwiY3VycmVuY3lfY29kZVwiLFxuICAgICkgJiZcbiAgICBjb25maWcuYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiICYmXG4gICAgY29uZmlndXJlZEFtb3VudHMubGVuZ3RoXG4gICkge1xuICAgIGNvbmZpZ3VyZWRDb25kaXRpb25zLnB1c2goe1xuICAgICAga2V5OiBcImNvbmRpdGlvbi1sZWdhY3ktY3VycmVuY3lcIixcbiAgICAgIGF0dHJpYnV0ZTogXCJjdXJyZW5jeV9jb2RlXCIsXG4gICAgICBvcGVyYXRvcjogY29uZmlndXJlZEFtb3VudHMubGVuZ3RoID09PSAxID8gXCJlcVwiIDogXCJpblwiLFxuICAgICAgdmFsdWVzOiBjb25maWd1cmVkQW1vdW50cy5tYXAoKGFtb3VudCkgPT5cbiAgICAgICAgYW1vdW50LmN1cnJlbmN5X2NvZGUudG9Mb3dlckNhc2UoKSxcbiAgICAgICksXG4gICAgfSlcbiAgfVxuICBpZiAoXG4gICAgIWNvbmZpZ3VyZWRDb25kaXRpb25zLnNvbWUoXG4gICAgICAoY29uZGl0aW9uKSA9PiBjb25kaXRpb24uYXR0cmlidXRlID09PSBcInNhbGVzX2NoYW5uZWxfaWRcIixcbiAgICApICYmXG4gICAgcHJvZHVjdC5zYWxlc19jaGFubmVscz8ubGVuZ3RoXG4gICkge1xuICAgIGNvbmZpZ3VyZWRDb25kaXRpb25zLnB1c2goe1xuICAgICAga2V5OiBcImNvbmRpdGlvbi1sZWdhY3ktc2FsZXMtY2hhbm5lbFwiLFxuICAgICAgYXR0cmlidXRlOiBcInNhbGVzX2NoYW5uZWxfaWRcIixcbiAgICAgIG9wZXJhdG9yOiBwcm9kdWN0LnNhbGVzX2NoYW5uZWxzLmxlbmd0aCA9PT0gMSA/IFwiZXFcIiA6IFwiaW5cIixcbiAgICAgIHZhbHVlczogcHJvZHVjdC5zYWxlc19jaGFubmVscy5tYXAoKGNoYW5uZWwpID0+IGNoYW5uZWwuaWQpLFxuICAgIH0pXG4gIH1cbiAgY29uc3QgZXhwaXJhdGlvblBvbGljeSA9IGNvbmZpZy5leHBpcmF0aW9uX3BvbGljeVxuICBjb25zdCBjb25maWd1cmVkQW1vdW50Um93cyA9IGNvbmZpZ3VyZWRBbW91bnRzLm1hcCgocm93LCBpbmRleCkgPT4gKHtcbiAgICBrZXk6IGBjb3Vwb24tdmFsdWUtJHtpbmRleH1gLFxuICAgIGFtb3VudDogU3RyaW5nKHJvdy5hbW91bnQpLFxuICAgIGN1cnJlbmN5X2NvZGU6IHJvdy5jdXJyZW5jeV9jb2RlLnRvTG93ZXJDYXNlKCksXG4gIH0pKVxuICBjb25zdCBhbW91bnRSb3dzID1cbiAgICBjb25maWcuYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiXG4gICAgICA/IHJlY29uY2lsZUNvdXBvbkFtb3VudHMoXG4gICAgICAgIGNvbmZpZ3VyZWRBbW91bnRSb3dzLFxuICAgICAgICBlZmZlY3RpdmVDb3Vwb25DdXJyZW5jaWVzKGNvbmZpZ3VyZWRDb25kaXRpb25zLCBvcHRpb25zLmN1cnJlbmNpZXMgfHwgW10pLFxuICAgICAgKVxuICAgICAgOiBjb25maWd1cmVkQW1vdW50Um93c1xuXG4gIHJldHVybiB7XG4gICAgcHJvZHVjdDoge1xuICAgICAgLi4uZW1wdHlQcm9kdWN0KG9wdGlvbnMpLFxuICAgICAgdGl0bGU6IHByb2R1Y3QudGl0bGUgfHwgXCJcIixcbiAgICAgIHN1YnRpdGxlOiBwcm9kdWN0LnN1YnRpdGxlIHx8IFwiXCIsXG4gICAgICBoYW5kbGU6IHByb2R1Y3QuaGFuZGxlIHx8IFwiXCIsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvZHVjdC5kZXNjcmlwdGlvbiB8fCBcIlwiLFxuICAgICAgbWVkaWEsXG4gICAgICBza3U6IHZhcmlhbnQ/LnNrdSB8fCBcIlwiLFxuICAgICAgcHJpY2VfYW1vdW50czoge1xuICAgICAgICAuLi5lbXB0eVByb2R1Y3Qob3B0aW9ucykucHJpY2VfYW1vdW50cyxcbiAgICAgICAgLi4ucHJpY2VzLFxuICAgICAgfSxcbiAgICAgIHN0YXR1czogcHJvZHVjdC5zdGF0dXMgfHwgXCJkcmFmdFwiLFxuICAgICAgZGlzY291bnRhYmxlOiBCb29sZWFuKHByb2R1Y3QuZGlzY291bnRhYmxlKSxcbiAgICAgIHR5cGVfaWQ6IHByb2R1Y3QudHlwZV9pZCB8fCBcIlwiLFxuICAgICAgY29sbGVjdGlvbl9pZDogcHJvZHVjdC5jb2xsZWN0aW9uX2lkIHx8IFwiXCIsXG4gICAgICBjYXRlZ29yeV9pZDogcHJvZHVjdC5jYXRlZ29yaWVzPy5bMF0/LmlkIHx8IFwiXCIsXG4gICAgICB0YWdfaWQ6IHByb2R1Y3QudGFncz8uWzBdPy5pZCB8fCBcIlwiLFxuICAgIH0sXG4gICAgY291cG9uOiB7XG4gICAgICAuLi5lbXB0eUNvdXBvbihvcHRpb25zKSxcbiAgICAgIGVuYWJsZWQ6IGNvbmZpZy5lbmFibGVkLFxuICAgICAgdHlwZTogY291cG9uVHlwZUZyb21Db25maWcoY29uZmlnKSxcbiAgICAgIHB1cmNoYXNlX2NvbmRpdGlvbnM6IGNvbmZpZ3VyZWRDb25kaXRpb25zLFxuICAgICAgYW1vdW50czpcbiAgICAgICAgY29uZmlnLmJlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIlxuICAgICAgICAgID8gYW1vdW50Um93c1xuICAgICAgICAgIDogYW1vdW50Um93cy5sZW5ndGhcbiAgICAgICAgICAgID8gYW1vdW50Um93c1xuICAgICAgICAgICAgOiBlbXB0eUNvdXBvbihvcHRpb25zKS5hbW91bnRzLFxuICAgICAgcGVyY2VudGFnZTogY29uZmlnLnBlcmNlbnRhZ2UgPT0gbnVsbCA/IFwiXCIgOiBTdHJpbmcoY29uZmlnLnBlcmNlbnRhZ2UpLFxuICAgICAgYWxsb2NhdGlvbjpcbiAgICAgICAgY29uZmlnLnByb21vdGlvbl90ZW1wbGF0ZT8uYXBwbGljYXRpb25fbWV0aG9kPy5hbGxvY2F0aW9uID09PSBcIm9uY2VcIlxuICAgICAgICAgID8gKFwib25jZVwiIGFzIGNvbnN0KVxuICAgICAgICAgIDogKFwiZWFjaFwiIGFzIGNvbnN0KSxcbiAgICAgIGNvZGVfc3RyYXRlZ3k6IGNvbmZpZy5jb2RlX3N0cmF0ZWd5LFxuICAgICAgY29kZV9wcmVmaXg6IGNvbmZpZy5jb2RlX3ByZWZpeCB8fCBcIlwiLFxuICAgICAgc2hhcmVkX2NvZGU6IGNvbmZpZy5zaGFyZWRfY29kZSB8fCBcIlwiLFxuICAgICAgZXhwaXJhdGlvbl90eXBlOiBjb25maWcuZXhwaXJhdGlvbl9wb2xpY3k/LnR5cGUgfHwgXCJkdXJhdGlvblwiLFxuICAgICAgZXhwaXJhdGlvbl9kYXlzOlxuICAgICAgICBjb25maWcuZXhwaXJhdGlvbl9wb2xpY3k/LnR5cGUgPT09IFwiZHVyYXRpb25cIlxuICAgICAgICAgID8gU3RyaW5nKGNvbmZpZy5leHBpcmF0aW9uX3BvbGljeS5kdXJhdGlvbl9kYXlzKVxuICAgICAgICAgIDogXCIzMFwiLFxuICAgICAgZXhwaXJhdGlvbl9kYXRlOlxuICAgICAgICBjb25maWcuZXhwaXJhdGlvbl9wb2xpY3k/LnR5cGUgPT09IFwiZml4ZWRcIlxuICAgICAgICAgID8gdG9EYXRlVGltZUxvY2FsKGNvbmZpZy5leHBpcmF0aW9uX3BvbGljeS5leHBpcmVzX2F0KVxuICAgICAgICAgIDogXCJcIixcbiAgICAgIGV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWduOlxuICAgICAgICBleHBpcmF0aW9uUG9saWN5LnR5cGUgPT09IFwibm9uZVwiIHx8XG4gICAgICAgIGV4cGlyYXRpb25Qb2xpY3kuY2FwX2J5X2NhbXBhaWduICE9PSBmYWxzZSxcbiAgICAgIGV4cGlyYXRpb25fY2FwX2F0OlxuICAgICAgICBleHBpcmF0aW9uUG9saWN5LnR5cGUgPT09IFwibm9uZVwiXG4gICAgICAgICAgPyBcIlwiXG4gICAgICAgICAgOiB0b0RhdGVUaW1lTG9jYWwoZXhwaXJhdGlvblBvbGljeS5jYXBfYXQpLFxuICAgICAgbWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtOiBTdHJpbmcoXG4gICAgICAgIGNvbmZpZy5tYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW0gfHwgMSxcbiAgICAgICksXG4gICAgICBwcm9tb3Rpb25fbWlycm9yX21vZGU6IGNvbmZpZy5wcm9tb3Rpb25fbWlycm9yX21vZGUgfHwgXCJub25lXCIsXG4gICAgICBwcm9tb3Rpb25fc3RhdHVzOiBjb25maWcucHJvbW90aW9uX3N0YXR1cyB8fCBcImRyYWZ0XCIsXG4gICAgfSxcbiAgICBjYW1wYWlnbjoge1xuICAgICAgLi4uZW1wdHlDYW1wYWlnbixcbiAgICAgIG1vZGU6IGNvbmZpZy5jYW1wYWlnbl9pZCA/IChcImV4aXN0aW5nXCIgYXMgY29uc3QpIDogKFwibm9uZVwiIGFzIGNvbnN0KSxcbiAgICAgIGNhbXBhaWduX2lkOiBjb25maWcuY2FtcGFpZ25faWQgfHwgXCJcIixcbiAgICB9LFxuICB9XG59XG5cbmNvbnN0IG1vZGFsQ29udGVudFN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBkaXNwbGF5OiBcImZsZXhcIixcbiAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG59XG5cbmNvbnN0IG1vZGFsV2l6YXJkU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGRpc3BsYXk6IFwiZmxleFwiLFxuICBmbGV4OiBcIjEgMSBhdXRvXCIsXG4gIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gIG1pbkhlaWdodDogMCxcbiAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG59XG5cbmNvbnN0IHZpc3VhbGx5SGlkZGVuU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGNsaXA6IFwicmVjdCgwIDAgMCAwKVwiLFxuICBjbGlwUGF0aDogXCJpbnNldCg1MCUpXCIsXG4gIGhlaWdodDogMSxcbiAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gIHdoaXRlU3BhY2U6IFwibm93cmFwXCIsXG4gIHdpZHRoOiAxLFxufVxuXG5jb25zdCBtb2RhbEJvZHlTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgZmxleDogXCIxIDEgYXV0b1wiLFxuICBtaW5IZWlnaHQ6IDAsXG4gIHBhZGRpbmc6IDAsXG59XG5cbmNvbnN0IG1vZGFsU2Nyb2xsU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGhlaWdodDogXCIxMDAlXCIsXG4gIG92ZXJmbG93WTogXCJhdXRvXCIsXG4gIHBhZGRpbmc6IFwiNjRweCAyNHB4IDExMnB4XCIsXG4gIHdpZHRoOiBcIjEwMCVcIixcbn1cblxuY29uc3QgbW9kYWxGb3JtU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIG1hcmdpbjogXCIwIGF1dG9cIixcbiAgbWF4V2lkdGg6IDcyMCxcbiAgd2lkdGg6IFwibWluKDcyMHB4LCAxMDAlKVwiLFxufVxuXG5jb25zdCBzdGFja1N0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBkaXNwbGF5OiBcImZsZXhcIixcbiAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgZ2FwOiAyNCxcbn1cblxuY29uc3QgdHdvQ29sdW1uR3JpZFN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBkaXNwbGF5OiBcImdyaWRcIixcbiAgZ2FwOiAxNixcbiAgZ3JpZFRlbXBsYXRlQ29sdW1uczogXCJyZXBlYXQoYXV0by1maXQsIG1pbm1heCgyNjBweCwgMWZyKSlcIixcbn1cblxuY29uc3QgdGhyZWVDb2x1bW5HcmlkU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGRpc3BsYXk6IFwiZ3JpZFwiLFxuICBnYXA6IDE2LFxuICBncmlkVGVtcGxhdGVDb2x1bW5zOiBcInJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDE4MHB4LCAxZnIpKVwiLFxufVxuXG5jb25zdCBwYW5lbFN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBib3JkZXI6IFwiMXB4IHNvbGlkIHZhcigtLWJvcmRlci1iYXNlKVwiLFxuICBib3JkZXJSYWRpdXM6IDgsXG4gIHBhZGRpbmc6IDE2LFxufVxuXG5mdW5jdGlvbiBGaWVsZCh7XG4gIGNoaWxkcmVuLFxuICBsYWJlbCxcbiAgb3B0aW9uYWwsXG4gIHRvb2x0aXAsXG59OiB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGVcbiAgbGFiZWw6IHN0cmluZ1xuICBvcHRpb25hbD86IGJvb2xlYW5cbiAgdG9vbHRpcD86IHN0cmluZ1xufSkge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAteS0xXCIgc3R5bGU9e3sgbWluV2lkdGg6IDAgfX0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC14LTFcIj5cbiAgICAgICAgPExhYmVsPntsYWJlbH08L0xhYmVsPlxuICAgICAgICB7dG9vbHRpcCAmJiAoXG4gICAgICAgICAgPFRvb2x0aXAgY29udGVudD17dG9vbHRpcH0+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtgJHtsYWJlbH0gaW5mb3JtYXRpb25gfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEluZm9ybWF0aW9uQ2lyY2xlIC8+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICl9XG4gICAgICAgIHtvcHRpb25hbCAmJiAoXG4gICAgICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgICAgKE9wdGlvbmFsKVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvZGl2PlxuICApXG59XG5cbmZ1bmN0aW9uIFNlY3Rpb24oe1xuICBjaGlsZHJlbixcbiAgZGVzY3JpcHRpb24sXG4gIHRpdGxlLFxufToge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gIHRpdGxlOiBzdHJpbmdcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC15LTRcIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxIZWFkaW5nIGxldmVsPVwiaDJcIj57dGl0bGV9PC9IZWFkaW5nPlxuICAgICAgICB7ZGVzY3JpcHRpb24gJiYgKFxuICAgICAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5cbiAgICAgICAgICAgIHtkZXNjcmlwdGlvbn1cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L3NlY3Rpb24+XG4gIClcbn1cblxuZnVuY3Rpb24gT3B0aW9uU2VsZWN0KHtcbiAgb25DaGFuZ2UsXG4gIG9wdGlvbnMsXG4gIHZhbHVlLFxufToge1xuICBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWRcbiAgb3B0aW9uczogT3B0aW9uUmVjb3JkW11cbiAgdmFsdWU6IHN0cmluZ1xufSkge1xuICByZXR1cm4gKFxuICAgIDxTZWxlY3RcbiAgICAgIHZhbHVlPXt2YWx1ZSB8fCBOT05FfVxuICAgICAgb25WYWx1ZUNoYW5nZT17KG5leHQpID0+IG9uQ2hhbmdlKG5leHQgPT09IE5PTkUgPyBcIlwiIDogbmV4dCl9XG4gICAgPlxuICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICA8U2VsZWN0LlZhbHVlIC8+XG4gICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9e05PTkV9Pk5vbmU8L1NlbGVjdC5JdGVtPlxuICAgICAgICB7b3B0aW9ucy5tYXAoKG9wdGlvbikgPT4gKFxuICAgICAgICAgIDxTZWxlY3QuSXRlbSBrZXk9e29wdGlvbi5pZH0gdmFsdWU9e29wdGlvbi5pZH0+XG4gICAgICAgICAgICB7b3B0aW9uTGFiZWwob3B0aW9uKX1cbiAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICApKX1cbiAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgPC9TZWxlY3Q+XG4gIClcbn1cblxuZnVuY3Rpb24gQ3VycmVuY3lTZWxlY3Qoe1xuICBjdXJyZW5jaWVzLFxuICBvbkNoYW5nZSxcbiAgdmFsdWUsXG59OiB7XG4gIGN1cnJlbmNpZXM6IEN1cnJlbmN5T3B0aW9uW11cbiAgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG4gIHZhbHVlOiBzdHJpbmdcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8U2VsZWN0XG4gICAgICB2YWx1ZT17dmFsdWUgfHwgdW5kZWZpbmVkfVxuICAgICAgZGlzYWJsZWQ9eyFjdXJyZW5jaWVzLmxlbmd0aH1cbiAgICAgIG9uVmFsdWVDaGFuZ2U9e29uQ2hhbmdlfVxuICAgID5cbiAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgPFNlbGVjdC5WYWx1ZVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtcbiAgICAgICAgICAgIGN1cnJlbmNpZXMubGVuZ3RoID8gXCJTZWxlY3QgY3VycmVuY3lcIiA6IFwiTm8gY3VycmVuY2llcyBhdmFpbGFibGVcIlxuICAgICAgICAgIH1cbiAgICAgICAgLz5cbiAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgIHtjdXJyZW5jaWVzLm1hcCgoY3VycmVuY3kpID0+IChcbiAgICAgICAgICA8U2VsZWN0Lkl0ZW0ga2V5PXtjdXJyZW5jeS5jb2RlfSB2YWx1ZT17Y3VycmVuY3kuY29kZX0+XG4gICAgICAgICAgICB7Y3VycmVuY3kubmFtZX0gKHtjdXJyZW5jeS5jb2RlLnRvVXBwZXJDYXNlKCl9KVxuICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICkpfVxuICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICA8L1NlbGVjdD5cbiAgKVxufVxuXG5mdW5jdGlvbiBDdXJyZW5jeUFtb3VudEZpZWxkKHtcbiAgY3VycmVuY2llcyxcbiAgY3VycmVuY3lDb2RlLFxuICBvbkNoYW5nZSxcbiAgdmFsdWUsXG59OiB7XG4gIGN1cnJlbmNpZXM6IEN1cnJlbmN5T3B0aW9uW11cbiAgY3VycmVuY3lDb2RlOiBzdHJpbmdcbiAgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG4gIHZhbHVlOiBzdHJpbmdcbn0pIHtcbiAgY29uc3QgY3VycmVuY3kgPSBjdXJyZW5jaWVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uY29kZSA9PT0gY3VycmVuY3lDb2RlKVxuICBjb25zdCBjb2RlID0gY3VycmVuY3lDb2RlLnRvVXBwZXJDYXNlKClcbiAgY29uc3QgZGVjaW1hbHMgPSBjdXJyZW5jeURlY2ltYWxEaWdpdHMoY29kZSB8fCBcIlVTRFwiKVxuICByZXR1cm4gKFxuICAgIDxDdXJyZW5jeUlucHV0XG4gICAgICBjb2RlPXtjb2RlIHx8IFwiVVNEXCJ9XG4gICAgICBzeW1ib2w9e1xuICAgICAgICBjdXJyZW5jeT8uc3ltYm9sX25hdGl2ZSB8fFxuICAgICAgICBjdXJyZW5jeT8uc3ltYm9sIHx8XG4gICAgICAgIGN1cnJlbmN5U3ltYm9sKGNvZGUgfHwgXCJVU0RcIilcbiAgICAgIH1cbiAgICAgIG1pbj17MH1cbiAgICAgIGRlY2ltYWxTY2FsZT17ZGVjaW1hbHN9XG4gICAgICBkZWNpbWFsc0xpbWl0PXtkZWNpbWFsc31cbiAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgIGRpc2FibGVkPXshY3VycmVuY3lDb2RlfVxuICAgICAgb25WYWx1ZUNoYW5nZT17KG5leHRWYWx1ZSkgPT4gb25DaGFuZ2UobmV4dFZhbHVlIHx8IFwiXCIpfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gUGVyY2VudGFnZUlucHV0KHtcbiAgb25DaGFuZ2UsXG4gIHZhbHVlLFxufToge1xuICBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWRcbiAgdmFsdWU6IHN0cmluZ1xufSkge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCB3LWZ1bGwgaXRlbXMtc3RyZXRjaFwiIHN0eWxlPXt7IHdpZHRoOiBcIjEwMCVcIiB9fT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPVwiYmctdWktYmctZmllbGQgdGV4dC11aS1mZy1tdXRlZCBmbGV4IGl0ZW1zLWNlbnRlciBib3JkZXJcIlxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIGJvcmRlckNvbG9yOiBcInZhcigtLWJvcmRlci1iYXNlKVwiLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogXCI2cHggMCAwIDZweFwiLFxuICAgICAgICAgIGJvcmRlclJpZ2h0OiAwLFxuICAgICAgICAgIHBhZGRpbmc6IFwiMCAxMnB4XCIsXG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgICVcbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9XCJtaW4tdy0wIGZsZXgtMVwiXG4gICAgICAgIHN0eWxlPXt7IGZsZXg6IFwiMSAxIDAlXCIsIG1pbldpZHRoOiAwIH19XG4gICAgICA+XG4gICAgICAgIDxJbnB1dFxuICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbFwiXG4gICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgbWluPXsxfVxuICAgICAgICAgIG1heD17MTAwfVxuICAgICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjAgNnB4IDZweCAwXCIsXG4gICAgICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgICAgfX1cbiAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PiBvbkNoYW5nZShldmVudC50YXJnZXQudmFsdWUpfVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZnVuY3Rpb24gSGFuZGxlSW5wdXQoe1xuICBvbkNoYW5nZSxcbiAgdmFsdWUsXG59OiB7XG4gIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZFxuICB2YWx1ZTogc3RyaW5nXG59KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZVwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkIHBvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgaW5zZXQteS0wIGxlZnQtMCB6LTEwIGZsZXggbWluLXctOCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYm9yZGVyLXIgcHgtMi41XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInR4dC1jb21wYWN0LXNtYWxsIGZvbnQtbWVkaXVtXCI+Lzwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPElucHV0XG4gICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgcGxhY2Vob2xkZXI9XCJ3aW50ZXItamFja2V0XCJcbiAgICAgICAgc3R5bGU9e3sgcGFkZGluZ0xlZnQ6IDM0IH19XG4gICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+IG9uQ2hhbmdlKGV2ZW50LnRhcmdldC52YWx1ZSl9XG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApXG59XG5cbmZ1bmN0aW9uIE1lZGlhVXBsb2FkKHtcbiAgaXNVcGxvYWRpbmcsXG4gIG1lZGlhLFxuICBvblJlbW92ZSxcbiAgb25VcGxvYWQsXG59OiB7XG4gIGlzVXBsb2FkaW5nOiBib29sZWFuXG4gIG1lZGlhOiBQcm9kdWN0TWVkaWFbXVxuICBvblJlbW92ZTogKG1lZGlhOiBQcm9kdWN0TWVkaWEpID0+IHZvaWRcbiAgb25VcGxvYWQ6IChmaWxlczogRmlsZVtdKSA9PiB2b2lkXG59KSB7XG4gIGNvbnN0IGlucHV0UmVmID0gdXNlUmVmPEhUTUxJbnB1dEVsZW1lbnQ+KG51bGwpXG4gIGNvbnN0IGFjY2VwdCA9XG4gICAgXCJpbWFnZS9qcGVnLGltYWdlL3BuZyxpbWFnZS9naWYsaW1hZ2Uvd2VicCxpbWFnZS9oZWljLGltYWdlL3N2Zyt4bWxcIlxuXG4gIGNvbnN0IGhhbmRsZUZpbGVzID0gKGZpbGVzOiBGaWxlTGlzdCB8IG51bGwpID0+IHtcbiAgICBpZiAoIWZpbGVzPy5sZW5ndGgpIHJldHVyblxuICAgIG9uVXBsb2FkKEFycmF5LmZyb20oZmlsZXMpKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlRHJvcCA9IChldmVudDogRHJhZ0V2ZW50PEhUTUxCdXR0b25FbGVtZW50PikgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICBoYW5kbGVGaWxlcyhldmVudC5kYXRhVHJhbnNmZXIuZmlsZXMpXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAteS0zXCI+XG4gICAgICB7bWVkaWEubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9XCJncmlkIGdhcC0zXCJcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgZ3JpZFRlbXBsYXRlQ29sdW1uczogXCJyZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoMTIwcHgsIDFmcikpXCIsXG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIHttZWRpYS5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGtleT17aXRlbS5hc3NldF9pZCB8fCBpdGVtLnVybH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicmVsYXRpdmUgb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtbWQgYm9yZGVyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgIHNyYz17aXRlbS51cmx9XG4gICAgICAgICAgICAgICAgYWx0PVwiXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTMyIHctZnVsbCBvYmplY3QtY292ZXJcIlxuICAgICAgICAgICAgICAgIHN0eWxlPXt7IGhlaWdodDogMTI4IH19XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQteC0wIGJvdHRvbS0wIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBiZy1ibGFjay82MCBweC0yIHB5LTFcIj5cbiAgICAgICAgICAgICAgICA8VGV4dCBzaXplPVwieHNtYWxsXCIgc3R5bGU9e3sgY29sb3I6IFwid2hpdGVcIiB9fT5cbiAgICAgICAgICAgICAgICAgIHtpbmRleCA9PT0gMCA/IFwiVGh1bWJuYWlsXCIgOiBgSW1hZ2UgJHtpbmRleCArIDF9YH1cbiAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUmVtb3ZlIGltYWdlXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IGNvbG9yOiBcIndoaXRlXCIgfX1cbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG9uUmVtb3ZlKGl0ZW0pfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxYTWFya01pbmkgLz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgICAgPGlucHV0XG4gICAgICAgIHJlZj17aW5wdXRSZWZ9XG4gICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgaGlkZGVuXG4gICAgICAgIG11bHRpcGxlXG4gICAgICAgIGFjY2VwdD17YWNjZXB0fVxuICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PiB7XG4gICAgICAgICAgaGFuZGxlRmlsZXMoZXZlbnQudGFyZ2V0LmZpbGVzKVxuICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IFwiXCJcbiAgICAgICAgfX1cbiAgICAgIC8+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBkaXNhYmxlZD17aXNVcGxvYWRpbmd9XG4gICAgICAgIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWQgZmxleCB3LWZ1bGwgZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC15LTIgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWRhc2hlZCBwLThcIlxuICAgICAgICBzdHlsZT17eyBtaW5IZWlnaHQ6IDE0OCB9fVxuICAgICAgICBvbkNsaWNrPXsoKSA9PiBpbnB1dFJlZi5jdXJyZW50Py5jbGljaygpfVxuICAgICAgICBvbkRyYWdPdmVyPXsoZXZlbnQpID0+IGV2ZW50LnByZXZlbnREZWZhdWx0KCl9XG4gICAgICAgIG9uRHJvcD17aGFuZGxlRHJvcH1cbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC11aS1mZy1iYXNlIGZsZXggaXRlbXMtY2VudGVyIGdhcC14LTJcIj5cbiAgICAgICAgICA8QXJyb3dVcFRyYXkgLz5cbiAgICAgICAgICB7aXNVcGxvYWRpbmcgPyBcIlVwbG9hZGluZyBpbWFnZXMuLi5cIiA6IFwiVXBsb2FkIGltYWdlc1wifVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5cbiAgICAgICAgICBEcmFnIGFuZCBkcm9wIGltYWdlcyBoZXJlIG9yIGNsaWNrIHRvIHVwbG9hZC5cbiAgICAgICAgPC9UZXh0PlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIClcbn1cblxudHlwZSBDb25kaXRpb25WYWx1ZU9wdGlvbiA9IHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9XG5cbmZ1bmN0aW9uIGNvbmRpdGlvblZhbHVlT3B0aW9ucyhcbiAgYXR0cmlidXRlOiBQdXJjaGFzZUNvbmRpdGlvbkF0dHJpYnV0ZSB8IFwiXCIsXG4gIG9wdGlvbnM6IE9wdGlvbnNQYXlsb2FkLFxuKTogQ29uZGl0aW9uVmFsdWVPcHRpb25bXSB7XG4gIGlmIChhdHRyaWJ1dGUgPT09IFwiY3VycmVuY3lfY29kZVwiKSB7XG4gICAgcmV0dXJuIChvcHRpb25zLmN1cnJlbmNpZXMgfHwgW10pLm1hcCgoY3VycmVuY3kpID0+ICh7XG4gICAgICB2YWx1ZTogY3VycmVuY3kuY29kZSxcbiAgICAgIGxhYmVsOiBgJHtjdXJyZW5jeS5uYW1lfSAoJHtjdXJyZW5jeS5jb2RlLnRvVXBwZXJDYXNlKCl9KWAsXG4gICAgfSkpXG4gIH1cbiAgaWYgKGF0dHJpYnV0ZSA9PT0gXCJzaGlwcGluZ19hZGRyZXNzLmNvdW50cnlfY29kZVwiKSB7XG4gICAgcmV0dXJuIChvcHRpb25zLmNvdW50cmllcyB8fCBbXSkubWFwKChjb3VudHJ5KSA9PiAoe1xuICAgICAgdmFsdWU6IFN0cmluZyhjb3VudHJ5Lmlzb18yIHx8IGNvdW50cnkuaWQpLnRvTG93ZXJDYXNlKCksXG4gICAgICBsYWJlbDogY291bnRyeS5kaXNwbGF5X25hbWUgfHwgY291bnRyeS5uYW1lIHx8IGNvdW50cnkuaWQsXG4gICAgfSkpXG4gIH1cblxuICBjb25zdCByZWNvcmRzID1cbiAgICBhdHRyaWJ1dGUgPT09IFwiY3VzdG9tZXIuZ3JvdXBzLmlkXCJcbiAgICAgID8gb3B0aW9ucy5jdXN0b21lcl9ncm91cHNcbiAgICAgIDogYXR0cmlidXRlID09PSBcInJlZ2lvbi5pZFwiXG4gICAgICAgID8gb3B0aW9ucy5yZWdpb25zXG4gICAgICAgIDogYXR0cmlidXRlID09PSBcInNhbGVzX2NoYW5uZWxfaWRcIlxuICAgICAgICAgID8gb3B0aW9ucy5zYWxlc19jaGFubmVsc1xuICAgICAgICAgIDogW11cbiAgcmV0dXJuIChyZWNvcmRzIHx8IFtdKS5tYXAoKHJlY29yZCkgPT4gKHtcbiAgICB2YWx1ZTogcmVjb3JkLmlkLFxuICAgIGxhYmVsOiBvcHRpb25MYWJlbChyZWNvcmQpLFxuICB9KSlcbn1cblxuZnVuY3Rpb24gTXVsdGlDb25kaXRpb25WYWx1ZXMoe1xuICBhdHRyaWJ1dGUsXG4gIG9uQ2hhbmdlLFxuICBvcHRpb25zLFxuICB2YWx1ZSxcbn06IHtcbiAgYXR0cmlidXRlOiBQdXJjaGFzZUNvbmRpdGlvbkF0dHJpYnV0ZVxuICBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmdbXSkgPT4gdm9pZFxuICBvcHRpb25zOiBDb25kaXRpb25WYWx1ZU9wdGlvbltdXG4gIHZhbHVlOiBzdHJpbmdbXVxufSkge1xuICBjb25zdCBbb3Blbiwgc2V0T3Blbl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2RyYWZ0LCBzZXREcmFmdF0gPSB1c2VTdGF0ZSh2YWx1ZSlcbiAgY29uc3QgW3NlYXJjaCwgc2V0U2VhcmNoXSA9IHVzZVN0YXRlKFwiXCIpXG4gIGNvbnN0IGxhYmVscyA9IE9iamVjdC5mcm9tRW50cmllcyhvcHRpb25zLm1hcCgob3B0aW9uKSA9PiBbb3B0aW9uLnZhbHVlLCBvcHRpb24ubGFiZWxdKSlcbiAgY29uc3QgZmlsdGVyZWQgPSBvcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PlxuICAgIG9wdGlvbi5sYWJlbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaC50cmltKCkudG9Mb3dlckNhc2UoKSksXG4gIClcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8QnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICB2YXJpYW50PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIGp1c3RpZnktc3RhcnRcIlxuICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgc2V0RHJhZnQodmFsdWUpXG4gICAgICAgICAgc2V0U2VhcmNoKFwiXCIpXG4gICAgICAgICAgc2V0T3Blbih0cnVlKVxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7dmFsdWUubGVuZ3RoXG4gICAgICAgICAgPyB2YWx1ZS5sZW5ndGggPT09IDFcbiAgICAgICAgICAgID8gbGFiZWxzW3ZhbHVlWzBdXSB8fCB2YWx1ZVswXVxuICAgICAgICAgICAgOiBgJHt2YWx1ZS5sZW5ndGh9IHZhbHVlcyBzZWxlY3RlZGBcbiAgICAgICAgICA6IFwiU2VsZWN0IHZhbHVlc1wifVxuICAgICAgPC9CdXR0b24+XG4gICAgICB7dmFsdWUubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMiBmbGV4IGZsZXgtd3JhcCBnYXAtMVwiPlxuICAgICAgICAgIHt2YWx1ZS5tYXAoKGl0ZW0pID0+IChcbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIGtleT17aXRlbX1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmctdWktYmctY29tcG9uZW50IHRleHQtdWktZmctc3VidGxlIGZsZXggaXRlbXMtY2VudGVyIGdhcC14LTEgcm91bmRlZC1tZCBib3JkZXIgcHgtMiBweS0xIHRleHQteHNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7bGFiZWxzW2l0ZW1dIHx8IGl0ZW19XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtgUmVtb3ZlICR7bGFiZWxzW2l0ZW1dIHx8IGl0ZW19YH1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvbkNoYW5nZSh2YWx1ZS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeSAhPT0gaXRlbSkpfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPFhNYXJrTWluaSAvPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgICAgPERyYXdlciBvcGVuPXtvcGVufSBvbk9wZW5DaGFuZ2U9e3NldE9wZW59PlxuICAgICAgICA8RHJhd2VyLkNvbnRlbnQ+XG4gICAgICAgICAgPERyYXdlci5IZWFkZXI+XG4gICAgICAgICAgICA8RHJhd2VyLlRpdGxlPlxuICAgICAgICAgICAgICBTZWxlY3Qge2NvbmRpdGlvbkF0dHJpYnV0ZXMuZmluZCgoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gYXR0cmlidXRlKT8ubGFiZWx9XG4gICAgICAgICAgICA8L0RyYXdlci5UaXRsZT5cbiAgICAgICAgICA8L0RyYXdlci5IZWFkZXI+XG4gICAgICAgICAgPERyYXdlci5Cb2R5IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLXktMyBvdmVyZmxvdy15LWF1dG9cIj5cbiAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICB2YWx1ZT17c2VhcmNofVxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCB2YWx1ZXNcIlxuICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PiBzZXRTZWFyY2goZXZlbnQudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB7ZmlsdGVyZWQubGVuZ3RoID8gKFxuICAgICAgICAgICAgICBmaWx0ZXJlZC5tYXAoKG9wdGlvbikgPT4gKFxuICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAga2V5PXtvcHRpb24udmFsdWV9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGN1cnNvci1wb2ludGVyIGl0ZW1zLWNlbnRlciBnYXAteC0zIHJvdW5kZWQtbWQgYm9yZGVyIHAtM1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e2RyYWZ0LmluY2x1ZGVzKG9wdGlvbi52YWx1ZSl9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hlY2tlZENoYW5nZT17KGNoZWNrZWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgc2V0RHJhZnQoKGN1cnJlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5jdXJyZW50LCBvcHRpb24udmFsdWVdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjdXJyZW50LmZpbHRlcigodmFsdWUpID0+IHZhbHVlICE9PSBvcHRpb24udmFsdWUpLFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDxUZXh0PntvcHRpb24ubGFiZWx9PC9UZXh0PlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICkpXG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICA8VGV4dCBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+Tm8gbWF0Y2hpbmcgdmFsdWVzLjwvVGV4dD5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9EcmF3ZXIuQm9keT5cbiAgICAgICAgICA8RHJhd2VyLkZvb3Rlcj5cbiAgICAgICAgICAgIDxCdXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIiBvbkNsaWNrPXsoKSA9PiBzZXRPcGVuKGZhbHNlKX0+XG4gICAgICAgICAgICAgIENhbmNlbFxuICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBkaXNhYmxlZD17IWRyYWZ0Lmxlbmd0aH1cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgIG9uQ2hhbmdlKGRyYWZ0KVxuICAgICAgICAgICAgICAgIHNldE9wZW4oZmFsc2UpXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIEFwcGx5XG4gICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICA8L0RyYXdlci5Gb290ZXI+XG4gICAgICAgIDwvRHJhd2VyLkNvbnRlbnQ+XG4gICAgICA8L0RyYXdlcj5cbiAgICA8Lz5cbiAgKVxufVxuXG5mdW5jdGlvbiBQdXJjaGFzZUNvbmRpdGlvbnNGaWVsZCh7XG4gIGZpeGVkQW1vdW50LFxuICBvbkNoYW5nZSxcbiAgb3B0aW9ucyxcbiAgdmFsdWUsXG59OiB7XG4gIGZpeGVkQW1vdW50OiBib29sZWFuXG4gIG9uQ2hhbmdlOiAoY29uZGl0aW9uczogUHVyY2hhc2VDb25kaXRpb25Gb3JtW10pID0+IHZvaWRcbiAgb3B0aW9uczogT3B0aW9uc1BheWxvYWRcbiAgdmFsdWU6IFB1cmNoYXNlQ29uZGl0aW9uRm9ybVtdXG59KSB7XG4gIGNvbnN0IHNlbGVjdGVkQXR0cmlidXRlcyA9IG5ldyBTZXQoXG4gICAgdmFsdWUubWFwKChjb25kaXRpb24pID0+IGNvbmRpdGlvbi5hdHRyaWJ1dGUpLmZpbHRlcihCb29sZWFuKSxcbiAgKVxuXG4gIGNvbnN0IHJlcGxhY2UgPSAoa2V5OiBzdHJpbmcsIHVwZGF0ZTogUGFydGlhbDxQdXJjaGFzZUNvbmRpdGlvbkZvcm0+KSA9PlxuICAgIG9uQ2hhbmdlKFxuICAgICAgdmFsdWUubWFwKChjb25kaXRpb24pID0+XG4gICAgICAgIGNvbmRpdGlvbi5rZXkgPT09IGtleSA/IHsgLi4uY29uZGl0aW9uLCAuLi51cGRhdGUgfSA6IGNvbmRpdGlvbixcbiAgICAgICksXG4gICAgKVxuXG4gIHJldHVybiAoXG4gICAgPFNlY3Rpb25cbiAgICAgIHRpdGxlPVwiV2hvIGNhbiBwdXJjaGFzZSB0aGlzIGNvdXBvbj9cIlxuICAgICAgZGVzY3JpcHRpb249XCJDb3Vwb24gcHJvZHVjdHMgY2FuIGJlIHB1cmNoYXNlZCBieSBhbGwgY3VzdG9tZXJzIHdoZW4gbm8gY29uZGl0aW9ucyBhcmUgY29uZmlndXJlZC4gQ29uZGl0aW9ucyBhcmUgY29tYmluZWQgd2l0aCBBTkQuXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLXktM1wiPlxuICAgICAgICB7dmFsdWUubWFwKChjb25kaXRpb24sIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWVzID0gY29uZGl0aW9uVmFsdWVPcHRpb25zKGNvbmRpdGlvbi5hdHRyaWJ1dGUsIG9wdGlvbnMpXG4gICAgICAgICAgY29uc3QgY3VycmVuY3lSZXF1aXJlZCA9XG4gICAgICAgICAgICBmaXhlZEFtb3VudCAmJiBjb25kaXRpb24uYXR0cmlidXRlID09PSBcImN1cnJlbmN5X2NvZGVcIlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGtleT17Y29uZGl0aW9uLmtleX0+XG4gICAgICAgICAgICAgIHtpbmRleCA+IDAgJiYgKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZCBmbGV4IGgtOCBpdGVtcy1jZW50ZXIgdGV4dC14cyBmb250LW1lZGl1bVwiPlxuICAgICAgICAgICAgICAgICAgQU5EXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3BhbmVsU3R5bGV9IGNsYXNzTmFtZT1cInJlbGF0aXZlIGZsZXggZmxleC1jb2wgZ2FwLXktM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1zdGFydCBnYXAteC0yXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvbmRpdGlvbi5hdHRyaWJ1dGUgfHwgdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtjdXJyZW5jeVJlcXVpcmVkfVxuICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyhhdHRyaWJ1dGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlKGNvbmRpdGlvbi5rZXksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlOiBhdHRyaWJ1dGUgYXMgUHVyY2hhc2VDb25kaXRpb25BdHRyaWJ1dGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGF0dHJpYnV0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICB7Y29uZGl0aW9uQXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdHRyaWJ1dGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUudmFsdWUgPT09IGNvbmRpdGlvbi5hdHRyaWJ1dGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZEF0dHJpYnV0ZXMuaGFzKGF0dHJpYnV0ZS52YWx1ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoYXR0cmlidXRlKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIGtleT17YXR0cmlidXRlLnZhbHVlfSB2YWx1ZT17YXR0cmlidXRlLnZhbHVlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHthdHRyaWJ1dGUubGFiZWx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJ0cmFuc3BhcmVudFwiXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtjdXJyZW5jeVJlcXVpcmVkfVxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUmVtb3ZlIGNvbmRpdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2UodmFsdWUuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmtleSAhPT0gY29uZGl0aW9uLmtleSkpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPFhNYXJrTWluaSAvPlxuICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17dHdvQ29sdW1uR3JpZFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvbmRpdGlvbi5vcGVyYXRvciB8fCB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshY29uZGl0aW9uLmF0dHJpYnV0ZX1cbiAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KG9wZXJhdG9yKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UoY29uZGl0aW9uLmtleSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IG9wZXJhdG9yIGFzIFB1cmNoYXNlQ29uZGl0aW9uT3BlcmF0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yID09PSBcImVxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbmRpdGlvbi52YWx1ZXMuc2xpY2UoMCwgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbmRpdGlvbi52YWx1ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSBwbGFjZWhvbGRlcj1cIlNlbGVjdCBvcGVyYXRvclwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICB7Y29uZGl0aW9uT3BlcmF0b3JzLm1hcCgob3BlcmF0b3IpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSBrZXk9e29wZXJhdG9yLnZhbHVlfSB2YWx1ZT17b3BlcmF0b3IudmFsdWV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7b3BlcmF0b3IubGFiZWx9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XG4gICAgICAgICAgICAgICAgICB7Y29uZGl0aW9uLmF0dHJpYnV0ZSAmJiBjb25kaXRpb24ub3BlcmF0b3IgPT09IFwiZXFcIiA/IChcbiAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb25kaXRpb24udmFsdWVzWzBdIHx8IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsoc2VsZWN0ZWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlKGNvbmRpdGlvbi5rZXksIHsgdmFsdWVzOiBbc2VsZWN0ZWRdIH0pXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSBwbGFjZWhvbGRlcj1cIlNlbGVjdCB2YWx1ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICB7dmFsdWVzLm1hcCgob3B0aW9uKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSBrZXk9e29wdGlvbi52YWx1ZX0gdmFsdWU9e29wdGlvbi52YWx1ZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge29wdGlvbi5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgKSA6IGNvbmRpdGlvbi5hdHRyaWJ1dGUgJiYgY29uZGl0aW9uLm9wZXJhdG9yID8gKFxuICAgICAgICAgICAgICAgICAgICA8TXVsdGlDb25kaXRpb25WYWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGU9e2NvbmRpdGlvbi5hdHRyaWJ1dGV9XG4gICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17dmFsdWVzfVxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb25kaXRpb24udmFsdWVzfVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWVzKSA9PiByZXBsYWNlKGNvbmRpdGlvbi5rZXksIHsgdmFsdWVzIH0pfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInNlY29uZGFyeVwiIGRpc2FibGVkIGNsYXNzTmFtZT1cInctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIClcbiAgICAgICAgfSl9XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLXgtMlwiPlxuICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICBkaXNhYmxlZD17c2VsZWN0ZWRBdHRyaWJ1dGVzLnNpemUgPj0gY29uZGl0aW9uQXR0cmlidXRlcy5sZW5ndGh9XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICBvbkNoYW5nZShbXG4gICAgICAgICAgICAgICAgLi4udmFsdWUsXG4gICAgICAgICAgICAgICAgeyBrZXk6IGNvbmRpdGlvbktleSgpLCBhdHRyaWJ1dGU6IFwiXCIsIG9wZXJhdG9yOiBcIlwiLCB2YWx1ZXM6IFtdIH0sXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPFBsdXMgLz4gQWRkIGNvbmRpdGlvblxuICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgdmFyaWFudD1cInRyYW5zcGFyZW50XCJcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgIG9uQ2hhbmdlKGZpeGVkQW1vdW50ID8gZGVmYXVsdFB1cmNoYXNlQ29uZGl0aW9ucyhvcHRpb25zKSA6IFtdKVxuICAgICAgICAgICAgfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIENsZWFyIGFsbFxuICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvU2VjdGlvbj5cbiAgKVxufVxuXG5mdW5jdGlvbiBQcm9kdWN0UHJpY2VzVGFibGUoe1xuICBjdXJyZW5jaWVzLFxuICBjb3Vwb25WYWx1ZSxcbiAgb25DaGFuZ2UsXG4gIHByaWNlcyxcbn06IHtcbiAgY3VycmVuY2llczogQ3VycmVuY3lPcHRpb25bXVxuICBjb3Vwb25WYWx1ZTogc3RyaW5nXG4gIG9uQ2hhbmdlOiAoY3VycmVuY3lDb2RlOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IHZvaWRcbiAgcHJpY2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG59KSB7XG4gIGNvbnN0IFt2aXNpYmxlQ3VycmVuY2llcywgc2V0VmlzaWJsZUN1cnJlbmNpZXNdID0gdXNlU3RhdGU8c3RyaW5nW10+KCgpID0+XG4gICAgY3VycmVuY2llcy5tYXAoKGN1cnJlbmN5KSA9PiBjdXJyZW5jeS5jb2RlKSxcbiAgKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0VmlzaWJsZUN1cnJlbmNpZXMoKGN1cnJlbnQpID0+IHtcbiAgICAgIGNvbnN0IGF2YWlsYWJsZSA9IG5ldyBTZXQoY3VycmVuY2llcy5tYXAoKGN1cnJlbmN5KSA9PiBjdXJyZW5jeS5jb2RlKSlcbiAgICAgIGNvbnN0IHJldGFpbmVkID0gY3VycmVudC5maWx0ZXIoKGNvZGUpID0+IGF2YWlsYWJsZS5oYXMoY29kZSkpXG4gICAgICBjb25zdCBhZGRlZCA9IGN1cnJlbmNpZXNcbiAgICAgICAgLm1hcCgoY3VycmVuY3kpID0+IGN1cnJlbmN5LmNvZGUpXG4gICAgICAgIC5maWx0ZXIoKGNvZGUpID0+ICFjdXJyZW50LmluY2x1ZGVzKGNvZGUpKVxuICAgICAgcmV0dXJuIFsuLi5yZXRhaW5lZCwgLi4uYWRkZWRdXG4gICAgfSlcbiAgfSwgW2N1cnJlbmNpZXNdKVxuXG4gIGNvbnN0IHNob3duQ3VycmVuY2llcyA9IGN1cnJlbmNpZXMuZmlsdGVyKChjdXJyZW5jeSkgPT5cbiAgICB2aXNpYmxlQ3VycmVuY2llcy5pbmNsdWRlcyhjdXJyZW5jeS5jb2RlKSxcbiAgKVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHNpemUtZnVsbCBmbGV4LWNvbCBkaXZpZGUteSBvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctdWktYmctc3VidGxlIGZsZXggc2l6ZS1mdWxsIGZsZXgtY29sXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctdWktYmctYmFzZSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLWIgcC00XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC0yXCI+XG4gICAgICAgICAgICA8RHJvcGRvd25NZW51PlxuICAgICAgICAgICAgICA8RHJvcGRvd25NZW51LlRyaWdnZXIgYXNDaGlsZD5cbiAgICAgICAgICAgICAgICA8QnV0dG9uIHR5cGU9XCJidXR0b25cIiBzaXplPVwic21hbGxcIiB2YXJpYW50PVwic2Vjb25kYXJ5XCI+XG4gICAgICAgICAgICAgICAgICA8QWRqdXN0bWVudHMgLz5cbiAgICAgICAgICAgICAgICAgIFZpZXdcbiAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5Db250ZW50IGFsaWduPVwic3RhcnRcIj5cbiAgICAgICAgICAgICAgICB7Y3VycmVuY2llcy5tYXAoKGN1cnJlbmN5KSA9PiAoXG4gICAgICAgICAgICAgICAgICA8RHJvcGRvd25NZW51LkNoZWNrYm94SXRlbVxuICAgICAgICAgICAgICAgICAgICBrZXk9e2N1cnJlbmN5LmNvZGV9XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3Zpc2libGVDdXJyZW5jaWVzLmluY2x1ZGVzKGN1cnJlbmN5LmNvZGUpfVxuICAgICAgICAgICAgICAgICAgICBvbkNoZWNrZWRDaGFuZ2U9eyhjaGVja2VkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIHNldFZpc2libGVDdXJyZW5jaWVzKChjdXJyZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFycmF5LmZyb20obmV3IFNldChbLi4uY3VycmVudCwgY3VycmVuY3kuY29kZV0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGN1cnJlbnQuZmlsdGVyKChjb2RlKSA9PiBjb2RlICE9PSBjdXJyZW5jeS5jb2RlKSxcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgUHJpY2Uge2N1cnJlbmN5LmNvZGUudG9VcHBlckNhc2UoKX1cbiAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51LkNoZWNrYm94SXRlbT5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuQ29udGVudD5cbiAgICAgICAgICAgIDwvRHJvcGRvd25NZW51PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLXgtMlwiIC8+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2l6ZS1mdWxsIG92ZXJmbG93LWF1dG9cIj5cbiAgICAgICAgICA8VGFibGVcbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIGJvcmRlckNvbGxhcHNlOiBcImNvbGxhcHNlXCIsXG4gICAgICAgICAgICAgIHRhYmxlTGF5b3V0OiBcImZpeGVkXCIsXG4gICAgICAgICAgICAgIHdpZHRoOiBcIm1heC1jb250ZW50XCJcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPFRhYmxlLkhlYWRlciBzdHlsZT17eyBib3JkZXJUb3A6IFwibm9uZVwiIH19PlxuICAgICAgICAgICAgICA8VGFibGUuUm93IHN0eWxlPXt7IGhlaWdodDogNDAgfX0+XG4gICAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGxcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IFwidmFyKC0tYmctYmFzZSlcIixcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tOiBcIjFweCBzb2xpZCB2YXIoLS1ib3JkZXItYmFzZSlcIixcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkIHZhcigtLWJvcmRlci1iYXNlKVwiLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDQwLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogMjAwLFxuICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogMjAwLFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIjAgMTZweFwiLFxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogXCJzdGlja3lcIixcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgekluZGV4OiAxLFxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBDb3Vwb24gVmFsdWVcbiAgICAgICAgICAgICAgICA8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgICAgICAge3Nob3duQ3VycmVuY2llcy5tYXAoKGN1cnJlbmN5KSA9PiAoXG4gICAgICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbFxuICAgICAgICAgICAgICAgICAgICBrZXk9e2N1cnJlbmN5LmNvZGV9XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogXCJ2YXIoLS1iZy1iYXNlKVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbTogXCIxcHggc29saWQgdmFyKC0tYm9yZGVyLWJhc2UpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkIHZhcigtLWJvcmRlci1iYXNlKVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogNDAsXG4gICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogMjAwLFxuICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMCAxNnB4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidHJ1bmNhdGVcIiB0aXRsZT17YFByaWNlICR7Y3VycmVuY3kuY29kZS50b1VwcGVyQ2FzZSgpfWB9PlxuICAgICAgICAgICAgICAgICAgICAgICAgUHJpY2Uge2N1cnJlbmN5LmNvZGUudG9VcHBlckNhc2UoKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAge2N1cnJlbmN5LmlzX3RheF9pbmNsdXNpdmUgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8VGF4SW5jbHVzaXZlIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWQgc2hyaW5rLTBcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8VGF4RXhjbHVzaXZlIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWQgc2hyaW5rLTBcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICA8L1RhYmxlLlJvdz5cbiAgICAgICAgICAgIDwvVGFibGUuSGVhZGVyPlxuICAgICAgICAgICAgPFRhYmxlLkJvZHk+XG4gICAgICAgICAgICAgIDxUYWJsZS5Sb3cgY2xhc3NOYW1lPVwiYmctdWktYmctc3VidGxlXCIgc3R5bGU9e3sgaGVpZ2h0OiA0MCB9fT5cbiAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbFxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogXCJ2YXIoLS1iZy1zdWJ0bGUpXCIsXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbTogXCIxcHggc29saWQgdmFyKC0tYm9yZGVyLWJhc2UpXCIsXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCB2YXIoLS1ib3JkZXItYmFzZSlcIixcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiA0MCxcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogXCIwIDE2cHhcIixcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IFwic3RpY2t5XCIsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgIHpJbmRleDogMSxcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYmxvY2sgdHJ1bmNhdGVcIj57Y291cG9uVmFsdWV9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICB7c2hvd25DdXJyZW5jaWVzLm1hcCgoY3VycmVuY3kpID0+IChcbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsXG4gICAgICAgICAgICAgICAgICAgIGtleT17Y3VycmVuY3kuY29kZX1cbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBcInZhcigtLWJnLWJhc2UpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tOiBcIjFweCBzb2xpZCB2YXIoLS1ib3JkZXItYmFzZSlcIixcbiAgICAgICAgICAgICAgICAgICAgICBib3JkZXJSaWdodDogXCIxcHggc29saWQgdmFyKC0tYm9yZGVyLWJhc2UpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiA0MCxcbiAgICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogMjAwLFxuICAgICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8VGFibGVQcmljZUlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVuY3k9e2N1cnJlbmN5fVxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcmljZXNbY3VycmVuY3kuY29kZV0gfHwgXCJcIn1cbiAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiBvbkNoYW5nZShjdXJyZW5jeS5jb2RlLCB2YWx1ZSl9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgIDwvVGFibGUuUm93PlxuICAgICAgICAgICAgPC9UYWJsZS5Cb2R5PlxuICAgICAgICAgIDwvVGFibGU+XG5cbiAgICAgICAgICB7IWN1cnJlbmNpZXMubGVuZ3RoICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC00XCI+XG4gICAgICAgICAgICAgIDxUZXh0IGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICBBZGQgYSBzdXBwb3J0ZWQgY3VycmVuY3kgdG8gdGhlIHN0b3JlIGJlZm9yZSBzZXR0aW5nIHByaWNlcy5cbiAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0Q291cG9uVmFsdWUoXG4gIGNvdXBvbjogUGljazxDb3Vwb25Gb3JtU3RhdGUsIFwiYW1vdW50c1wiIHwgXCJwZXJjZW50YWdlXCIgfCBcInR5cGVcIj4sXG4gIGN1cnJlbmNpZXM6IFBpY2s8Q3VycmVuY3lPcHRpb24sIFwiY29kZVwiIHwgXCJpc19kZWZhdWx0XCI+W10sXG4pIHtcbiAgaWYgKFxuICAgIGNvdXBvbi50eXBlID09PSBcImFtb3VudF9vZmZfcHJvZHVjdHNcIiB8fFxuICAgIGNvdXBvbi50eXBlID09PSBcImFtb3VudF9vZmZfb3JkZXJcIlxuICApIHtcbiAgICBjb25zdCBkZWZhdWx0Q29kZSA9XG4gICAgICBjdXJyZW5jaWVzLmZpbmQoKGN1cnJlbmN5KSA9PiBjdXJyZW5jeS5pc19kZWZhdWx0KT8uY29kZSB8fFxuICAgICAgY3VycmVuY2llc1swXT8uY29kZVxuICAgIGNvbnN0IHByaW1hcnkgPVxuICAgICAgY291cG9uLmFtb3VudHMuZmluZCgocm93KSA9PiByb3cuY3VycmVuY3lfY29kZSA9PT0gZGVmYXVsdENvZGUpIHx8XG4gICAgICBjb3Vwb24uYW1vdW50c1swXVxuICAgIGNvbnN0IGFtb3VudCA9IG51bWJlck9yTnVsbChwcmltYXJ5Py5hbW91bnQpXG4gICAgaWYgKGFtb3VudCA9PSBudWxsKSByZXR1cm4gXCJcdTIwMTRcIlxuICAgIGNvbnN0IGFkZGl0aW9uYWwgPSBNYXRoLm1heCgwLCBjb3Vwb24uYW1vdW50cy5sZW5ndGggLSAxKVxuICAgIGNvbnN0IGZvcm1hdHRlZCA9IGAke2Ftb3VudH0ke3ByaW1hcnkuY3VycmVuY3lfY29kZS50b1VwcGVyQ2FzZSgpfWBcbiAgICByZXR1cm4gYWRkaXRpb25hbCA/IGAke2Zvcm1hdHRlZH0gKyR7YWRkaXRpb25hbH1gIDogZm9ybWF0dGVkXG4gIH1cblxuICBpZiAoXG4gICAgY291cG9uLnR5cGUgPT09IFwicGVyY2VudGFnZV9vZmZfcHJvZHVjdFwiIHx8XG4gICAgY291cG9uLnR5cGUgPT09IFwicGVyY2VudGFnZV9vZmZfb3JkZXJcIlxuICApIHtcbiAgICBjb25zdCBwZXJjZW50YWdlID0gbnVtYmVyT3JOdWxsKGNvdXBvbi5wZXJjZW50YWdlKVxuICAgIGlmIChwZXJjZW50YWdlID09IG51bGwpIHJldHVybiBcIlx1MjAxNFwiXG4gICAgcmV0dXJuIGNvdXBvbi50eXBlID09PSBcInBlcmNlbnRhZ2Vfb2ZmX29yZGVyXCJcbiAgICAgID8gYCR7cGVyY2VudGFnZX0lIG9mZiBvcmRlcmBcbiAgICAgIDogYCR7cGVyY2VudGFnZX0lIG9mZiBwcm9kdWN0c2BcbiAgfVxuXG4gIHJldHVybiBjb3Vwb24udHlwZSA9PT0gXCJmcmVlX3NoaXBwaW5nXCIgPyBcIkZyZWUgc2hpcHBpbmdcIiA6IFwiQnV5IFggR2V0IFlcIlxufVxuXG5mdW5jdGlvbiBUYWJsZVByaWNlSW5wdXQoe1xuICBjdXJyZW5jeSxcbiAgb25DaGFuZ2UsXG4gIHZhbHVlLFxufToge1xuICBjdXJyZW5jeTogQ3VycmVuY3lPcHRpb25cbiAgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG4gIHZhbHVlOiBzdHJpbmdcbn0pIHtcbiAgY29uc3Qgc3ltYm9sID1cbiAgICBjdXJyZW5jeS5zeW1ib2xfbmF0aXZlIHx8XG4gICAgY3VycmVuY3kuc3ltYm9sIHx8XG4gICAgY3VycmVuY3lTeW1ib2woY3VycmVuY3kuY29kZSB8fCBcIlVTRFwiKVxuXG4gIHJldHVybiAoXG4gICAgPGxhYmVsXG4gICAgICBjbGFzc05hbWU9XCJiZy11aS1iZy1iYXNlIGhvdmVyOmJnLXVpLWJnLXN1YnRsZSBmb2N1cy13aXRoaW46c2hhZG93LWJvcmRlcnMtaW50ZXJhY3RpdmUtd2l0aC1hY3RpdmUgdGV4dC11aS1mZy1iYXNlXCJcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICAgIGJvcmRlclJhZGl1czogMCxcbiAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgIGhlaWdodDogNDAsXG4gICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgICAgIHdpZHRoOiAyMDAsXG4gICAgICB9fVxuICAgID5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIlxuICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICBzdHlsZT17eyBmbGV4OiBcIjAgMCA0MHB4XCIsIHBhZGRpbmdMZWZ0OiAxNiB9fVxuICAgICAgPlxuICAgICAgICB7c3ltYm9sfVxuICAgICAgPC9zcGFuPlxuICAgICAgPGlucHV0XG4gICAgICAgIGFyaWEtbGFiZWw9e2BQcmljZSAke2N1cnJlbmN5LmNvZGUudG9VcHBlckNhc2UoKX1gfVxuICAgICAgICBpbnB1dE1vZGU9XCJkZWNpbWFsXCJcbiAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PiBvbkNoYW5nZShldmVudC50YXJnZXQudmFsdWUpfVxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIGFwcGVhcmFuY2U6IFwibm9uZVwiLFxuICAgICAgICAgIGJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgICBib3JkZXI6IDAsXG4gICAgICAgICAgYm9yZGVyUmFkaXVzOiAwLFxuICAgICAgICAgIGZsZXg6IFwiMSAxIGF1dG9cIixcbiAgICAgICAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgICBtaW5XaWR0aDogMCxcbiAgICAgICAgICBvdXRsaW5lOiBcIm5vbmVcIixcbiAgICAgICAgICBwYWRkaW5nOiBcIjAgMTZweCAwIDBcIixcbiAgICAgICAgICB0ZXh0QWxpZ246IFwicmlnaHRcIixcbiAgICAgICAgfX1cbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgLz5cbiAgICA8L2xhYmVsPlxuICApXG59XG5cbmZ1bmN0aW9uIENvdXBvblByb2R1Y3RNb2RhbCh7XG4gIGFsbG93UHJvbW90aW9uTWlycm9yLFxuICBhcGlCYXNlLFxuICBvbk9wZW5DaGFuZ2UsXG4gIG9uU2F2ZWQsXG4gIG9wZW4sXG4gIG9wdGlvbnMsXG4gIHJvdyxcbn06IHtcbiAgYWxsb3dQcm9tb3Rpb25NaXJyb3I6IGJvb2xlYW5cbiAgYXBpQmFzZTogQXBpQmFzZVxuICBvbk9wZW5DaGFuZ2U6IChvcGVuOiBib29sZWFuKSA9PiB2b2lkXG4gIG9uU2F2ZWQ6ICgpID0+IFByb21pc2U8dm9pZD5cbiAgb3BlbjogYm9vbGVhblxuICBvcHRpb25zOiBPcHRpb25zUGF5bG9hZFxuICByb3c6IENvdXBvblByb2R1Y3RSb3cgfCBudWxsXG59KSB7XG4gIGNvbnN0IFthY3RpdmVTdGVwLCBzZXRBY3RpdmVTdGVwXSA9IHVzZVN0YXRlPFdpemFyZFN0ZXA+KFwiZGV0YWlsc1wiKVxuICBjb25zdCBbcHJvZHVjdCwgc2V0UHJvZHVjdF0gPSB1c2VTdGF0ZTxQcm9kdWN0Rm9ybVN0YXRlPigoKSA9PlxuICAgIGVtcHR5UHJvZHVjdChvcHRpb25zKSxcbiAgKVxuICBjb25zdCBbY291cG9uLCBzZXRDb3Vwb25dID0gdXNlU3RhdGU8Q291cG9uRm9ybVN0YXRlPigoKSA9PlxuICAgIGVtcHR5Q291cG9uKG9wdGlvbnMpLFxuICApXG4gIGNvbnN0IFtjYW1wYWlnbiwgc2V0Q2FtcGFpZ25dID0gdXNlU3RhdGU8Q2FtcGFpZ25Gb3JtU3RhdGU+KGVtcHR5Q2FtcGFpZ24pXG4gIGNvbnN0IFtzYXZpbmcsIHNldFNhdmluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3VwbG9hZGluZywgc2V0VXBsb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbZnVydGhlc3RTdGVwSW5kZXgsIHNldEZ1cnRoZXN0U3RlcEluZGV4XSA9IHVzZVN0YXRlKDApXG5cbiAgY29uc3QgdmlzaWJsZVN0ZXBzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgYWxsb3dQcm9tb3Rpb25NaXJyb3JcbiAgICAgICAgPyBhbGxTdGVwc1xuICAgICAgICA6IGFsbFN0ZXBzLmZpbHRlcigoc3RlcCkgPT4gc3RlcCAhPT0gXCJjYW1wYWlnblwiKSxcbiAgICBbYWxsb3dQcm9tb3Rpb25NaXJyb3JdLFxuICApXG4gIGNvbnN0IGN1cnJlbnRTdGVwSW5kZXggPSB2aXNpYmxlU3RlcHMuaW5kZXhPZihhY3RpdmVTdGVwKVxuICBjb25zdCBjdXJyZW5jaWVzID0gb3B0aW9ucy5jdXJyZW5jaWVzIHx8IFtdXG4gIGNvbnN0IHN1cHBvcnRlZEN1cnJlbmN5Q29kZXMgPSB1c2VNZW1vKFxuICAgICgpID0+IG5ldyBTZXQoY3VycmVuY2llcy5tYXAoKGN1cnJlbmN5KSA9PiBjdXJyZW5jeS5jb2RlKSksXG4gICAgW2N1cnJlbmNpZXNdLFxuICApXG4gIGNvbnN0IGlzQW1vdW50VHlwZSA9XG4gICAgY291cG9uLnR5cGUgPT09IFwiYW1vdW50X29mZl9wcm9kdWN0c1wiIHx8IGNvdXBvbi50eXBlID09PSBcImFtb3VudF9vZmZfb3JkZXJcIlxuICBjb25zdCBpc1BlcmNlbnRhZ2VUeXBlID1cbiAgICBjb3Vwb24udHlwZSA9PT0gXCJwZXJjZW50YWdlX29mZl9wcm9kdWN0XCIgfHxcbiAgICBjb3Vwb24udHlwZSA9PT0gXCJwZXJjZW50YWdlX29mZl9vcmRlclwiXG4gIGNvbnN0IGlzSXRlbVNjb3BlZERpc2NvdW50ID1cbiAgICBjb3Vwb24udHlwZSA9PT0gXCJhbW91bnRfb2ZmX3Byb2R1Y3RzXCIgfHxcbiAgICBjb3Vwb24udHlwZSA9PT0gXCJwZXJjZW50YWdlX29mZl9wcm9kdWN0XCJcbiAgY29uc3QgZWZmZWN0aXZlQ3VycmVuY2llcyA9IHVzZU1lbW8oXG4gICAgKCkgPT4gZWZmZWN0aXZlQ291cG9uQ3VycmVuY2llcyhjb3Vwb24ucHVyY2hhc2VfY29uZGl0aW9ucywgY3VycmVuY2llcyksXG4gICAgW2NvdXBvbi5wdXJjaGFzZV9jb25kaXRpb25zLCBjdXJyZW5jaWVzXSxcbiAgKVxuICBjb25zdCBwcm9kdWN0UHJpY2VzID0gY3VycmVuY2llcy5mbGF0TWFwKChjdXJyZW5jeSkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gcHJvZHVjdC5wcmljZV9hbW91bnRzW2N1cnJlbmN5LmNvZGVdIHx8IFwiXCJcbiAgICBjb25zdCBhbW91bnQgPSBub25OZWdhdGl2ZU51bWJlck9yTnVsbCh2YWx1ZSlcbiAgICByZXR1cm4gYW1vdW50ID09IG51bGwgPyBbXSA6IFt7IGN1cnJlbmN5X2NvZGU6IGN1cnJlbmN5LmNvZGUsIGFtb3VudCB9XVxuICB9KVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFvcGVuKSByZXR1cm5cbiAgICBjb25zdCBmb3JtcyA9IHJvd1xuICAgICAgPyBmb3Jtc0Zyb21Sb3cocm93LCBvcHRpb25zKVxuICAgICAgOiB7XG4gICAgICAgIHByb2R1Y3Q6IGVtcHR5UHJvZHVjdChvcHRpb25zKSxcbiAgICAgICAgY291cG9uOiBlbXB0eUNvdXBvbihvcHRpb25zKSxcbiAgICAgICAgY2FtcGFpZ246IGVtcHR5Q2FtcGFpZ24sXG4gICAgICB9XG4gICAgc2V0UHJvZHVjdChmb3Jtcy5wcm9kdWN0KVxuICAgIHNldENvdXBvbihmb3Jtcy5jb3Vwb24pXG4gICAgc2V0Q2FtcGFpZ24oZm9ybXMuY2FtcGFpZ24pXG4gICAgc2V0QWN0aXZlU3RlcChcImRldGFpbHNcIilcbiAgICBzZXRGdXJ0aGVzdFN0ZXBJbmRleCgwKVxuICB9LCBbb3Blbiwgcm93LCBvcHRpb25zXSlcblxuICBjb25zdCB1cGRhdGVQdXJjaGFzZUNvbmRpdGlvbnMgPSAoXG4gICAgcHVyY2hhc2VDb25kaXRpb25zOiBQdXJjaGFzZUNvbmRpdGlvbkZvcm1bXSxcbiAgKSA9PiB7XG4gICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgLi4uY3VycmVudCxcbiAgICAgIHB1cmNoYXNlX2NvbmRpdGlvbnM6IHB1cmNoYXNlQ29uZGl0aW9ucyxcbiAgICAgIGFtb3VudHM6IGlzQW1vdW50Q291cG9uVHlwZShjdXJyZW50LnR5cGUpXG4gICAgICAgID8gcmVjb25jaWxlQ291cG9uQW1vdW50cyhcbiAgICAgICAgICBjdXJyZW50LmFtb3VudHMsXG4gICAgICAgICAgZWZmZWN0aXZlQ291cG9uQ3VycmVuY2llcyhwdXJjaGFzZUNvbmRpdGlvbnMsIGN1cnJlbmNpZXMpLFxuICAgICAgICApXG4gICAgICAgIDogY3VycmVudC5hbW91bnRzLFxuICAgIH0pKVxuICB9XG5cbiAgY29uc3QgdXBkYXRlQ291cG9uVHlwZSA9ICh0eXBlOiBDb3Vwb25UeXBlKSA9PiB7XG4gICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiB7XG4gICAgICBsZXQgcHVyY2hhc2VDb25kaXRpb25zID0gY3VycmVudC5wdXJjaGFzZV9jb25kaXRpb25zXG4gICAgICBpZiAoXG4gICAgICAgIGlzQW1vdW50Q291cG9uVHlwZSh0eXBlKSAmJlxuICAgICAgICAhcHVyY2hhc2VDb25kaXRpb25zLnNvbWUoXG4gICAgICAgICAgKGNvbmRpdGlvbikgPT4gY29uZGl0aW9uLmF0dHJpYnV0ZSA9PT0gXCJjdXJyZW5jeV9jb2RlXCIsXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBwdXJjaGFzZUNvbmRpdGlvbnMgPSBbXG4gICAgICAgICAgLi4ucHVyY2hhc2VDb25kaXRpb25zLFxuICAgICAgICAgIC4uLmRlZmF1bHRQdXJjaGFzZUNvbmRpdGlvbnMob3B0aW9ucyksXG4gICAgICAgIF1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHB1cmNoYXNlX2NvbmRpdGlvbnM6IHB1cmNoYXNlQ29uZGl0aW9ucyxcbiAgICAgICAgYW1vdW50czogaXNBbW91bnRDb3Vwb25UeXBlKHR5cGUpXG4gICAgICAgICAgPyByZWNvbmNpbGVDb3Vwb25BbW91bnRzKFxuICAgICAgICAgICAgY3VycmVudC5hbW91bnRzLFxuICAgICAgICAgICAgZWZmZWN0aXZlQ291cG9uQ3VycmVuY2llcyhwdXJjaGFzZUNvbmRpdGlvbnMsIGN1cnJlbmNpZXMpLFxuICAgICAgICAgIClcbiAgICAgICAgICA6IGN1cnJlbnQuYW1vdW50cyxcbiAgICAgICAgcHJvbW90aW9uX21pcnJvcl9tb2RlOlxuICAgICAgICAgIHR5cGUgPT09IFwiYnV5X3hfZ2V0X3lcIiA/IFwibm9uZVwiIDogY3VycmVudC5wcm9tb3Rpb25fbWlycm9yX21vZGUsXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IHVwbG9hZE1lZGlhID0gYXN5bmMgKGZpbGVzOiBGaWxlW10pID0+IHtcbiAgICBpZiAoIWZpbGVzLmxlbmd0aCkgcmV0dXJuXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGZpbGVzLmZvckVhY2goKGZpbGUpID0+IGZvcm1EYXRhLmFwcGVuZChcImZpbGVzXCIsIGZpbGUpKVxuICAgIGlmIChhcGlCYXNlID09PSBcIi9hZG1pblwiICYmIHByb2R1Y3Quc2VsbGVyX2lkKSB7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoXCJzZWxsZXJfaWRcIiwgcHJvZHVjdC5zZWxsZXJfaWQpXG4gICAgfVxuICAgIHNldFVwbG9hZGluZyh0cnVlKVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICBgJHtiYWNrZW5kVXJsKCl9JHthcGlCYXNlfS9jb3Vwb24tcHJvZHVjdHMvdXBsb2Fkc2AsXG4gICAgICAgIHtcbiAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgIGJvZHk6IGZvcm1EYXRhLFxuICAgICAgICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiBudWxsKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYXBpRXJyb3JNZXNzYWdlKHBheWxvYWQsIHJlc3BvbnNlLnN0YXR1c1RleHQpKVxuICAgICAgfVxuICAgICAgY29uc3QgcGF5bG9hZCA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHtcbiAgICAgICAgZmlsZXM/OiB7IGFzc2V0X2lkPzogc3RyaW5nOyB1cmw/OiBzdHJpbmcgfVtdXG4gICAgICB9XG4gICAgICBjb25zdCB1cGxvYWRlZCA9IChwYXlsb2FkLmZpbGVzIHx8IFtdKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChmaWxlKTogZmlsZSBpcyB7IGFzc2V0X2lkOiBzdHJpbmc7IHVybDogc3RyaW5nIH0gPT5cbiAgICAgICAgICAgIEJvb2xlYW4oZmlsZS5hc3NldF9pZCAmJiBmaWxlLnVybCksXG4gICAgICAgIClcbiAgICAgICAgLm1hcCgoZmlsZSkgPT4gKHsgYXNzZXRfaWQ6IGZpbGUuYXNzZXRfaWQsIHVybDogZmlsZS51cmwgfSkpXG4gICAgICBpZiAoIXVwbG9hZGVkLmxlbmd0aClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHVwbG9hZCBkaWQgbm90IHJldHVybiBhbiBpbWFnZSBVUkxcIilcbiAgICAgIHNldFByb2R1Y3QoKGN1cnJlbnQpID0+ICh7XG4gICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgIG1lZGlhOiBBcnJheS5mcm9tKFxuICAgICAgICAgIG5ldyBNYXAoXG4gICAgICAgICAgICBbLi4uY3VycmVudC5tZWRpYSwgLi4udXBsb2FkZWRdLm1hcCgoaXRlbSkgPT4gW2l0ZW0udXJsLCBpdGVtXSksXG4gICAgICAgICAgKS52YWx1ZXMoKSxcbiAgICAgICAgKSxcbiAgICAgIH0pKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0b2FzdC5lcnJvcihcbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIkltYWdlIHVwbG9hZCBmYWlsZWRcIixcbiAgICAgIClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0VXBsb2FkaW5nKGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRldGFpbHNDb21wbGV0ZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghcHJvZHVjdC50aXRsZS50cmltKCkpIHJldHVybiBmYWxzZVxuICAgIGlmICghY3VycmVuY2llcy5sZW5ndGgpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gICAgZm9yIChjb25zdCBjb25kaXRpb24gb2YgY291cG9uLnB1cmNoYXNlX2NvbmRpdGlvbnMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWNvbmRpdGlvbi5hdHRyaWJ1dGUgfHxcbiAgICAgICAgIWNvbmRpdGlvbi5vcGVyYXRvciB8fFxuICAgICAgICAhY29uZGl0aW9uLnZhbHVlcy5sZW5ndGggfHxcbiAgICAgICAgKGNvbmRpdGlvbi5vcGVyYXRvciA9PT0gXCJlcVwiICYmIGNvbmRpdGlvbi52YWx1ZXMubGVuZ3RoICE9PSAxKSB8fFxuICAgICAgICBhdHRyaWJ1dGVzLmhhcyhjb25kaXRpb24uYXR0cmlidXRlKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgICAgYXR0cmlidXRlcy5hZGQoY29uZGl0aW9uLmF0dHJpYnV0ZSlcbiAgICB9XG5cbiAgICBpZiAoaXNBbW91bnRUeXBlKSB7XG4gICAgICBpZiAoIWF0dHJpYnV0ZXMuaGFzKFwiY3VycmVuY3lfY29kZVwiKSkgcmV0dXJuIGZhbHNlXG4gICAgICBpZiAoIWNvdXBvbi5hbW91bnRzLmxlbmd0aCkgcmV0dXJuIGZhbHNlXG4gICAgICBpZiAoY291cG9uLmFtb3VudHMubGVuZ3RoICE9PSBlZmZlY3RpdmVDdXJyZW5jaWVzLmxlbmd0aCkgcmV0dXJuIGZhbHNlXG4gICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KClcbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIGNvdXBvbi5hbW91bnRzKSB7XG4gICAgICAgIGlmICghc3VwcG9ydGVkQ3VycmVuY3lDb2Rlcy5oYXMocm93LmN1cnJlbmN5X2NvZGUpKSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKHNlZW4uaGFzKHJvdy5jdXJyZW5jeV9jb2RlKSkgcmV0dXJuIGZhbHNlXG4gICAgICAgIGlmIChudW1iZXJPck51bGwocm93LmFtb3VudCkgPT0gbnVsbCkgcmV0dXJuIGZhbHNlXG4gICAgICAgIHNlZW4uYWRkKHJvdy5jdXJyZW5jeV9jb2RlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1BlcmNlbnRhZ2VUeXBlKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG51bWJlck9yTnVsbChjb3Vwb24ucGVyY2VudGFnZSlcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID4gMTAwKSByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoY291cG9uLmNvZGVfc3RyYXRlZ3kgPT09IFwic2hhcmVkX2NvZGVcIiAmJiAhY291cG9uLnNoYXJlZF9jb2RlLnRyaW0oKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKGNvdXBvbi5leHBpcmF0aW9uX3R5cGUgPT09IFwiZHVyYXRpb25cIikge1xuICAgICAgY29uc3QgZGF5cyA9IE51bWJlcihjb3Vwb24uZXhwaXJhdGlvbl9kYXlzKVxuICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGRheXMpIHx8IGRheXMgPCAxKSByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2UgaWYgKGNvdXBvbi5leHBpcmF0aW9uX3R5cGUgPT09IFwiZml4ZWRcIikge1xuICAgICAgY29uc3QgZXhwaXJhdGlvbiA9IG5ldyBEYXRlKGNvdXBvbi5leHBpcmF0aW9uX2RhdGUpXG4gICAgICBpZiAoIWNvdXBvbi5leHBpcmF0aW9uX2RhdGUgfHwgTnVtYmVyLmlzTmFOKGV4cGlyYXRpb24uZ2V0VGltZSgpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY291cG9uLmV4cGlyYXRpb25fdHlwZSAhPT0gXCJub25lXCIgJiYgY291cG9uLmV4cGlyYXRpb25fY2FwX2F0KSB7XG4gICAgICBjb25zdCBjYXAgPSBuZXcgRGF0ZShjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYXQpXG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKGNhcC5nZXRUaW1lKCkpKSByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCBtYXhJc3N1YW5jZSA9IE51bWJlcihjb3Vwb24ubWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtKVxuICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKG1heElzc3VhbmNlKSAmJiBtYXhJc3N1YW5jZSA+IDBcbiAgfSwgW1xuICAgIGNvdXBvbixcbiAgICBjdXJyZW5jaWVzLmxlbmd0aCxcbiAgICBlZmZlY3RpdmVDdXJyZW5jaWVzLmxlbmd0aCxcbiAgICBpc0Ftb3VudFR5cGUsXG4gICAgaXNQZXJjZW50YWdlVHlwZSxcbiAgICBwcm9kdWN0LnRpdGxlLFxuICAgIHN1cHBvcnRlZEN1cnJlbmN5Q29kZXMsXG4gIF0pXG5cbiAgY29uc3QgY2FtcGFpZ25Db21wbGV0ZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghYWxsb3dQcm9tb3Rpb25NaXJyb3IgfHwgY2FtcGFpZ24ubW9kZSA9PT0gXCJub25lXCIpIHJldHVybiB0cnVlXG4gICAgaWYgKGNhbXBhaWduLm1vZGUgPT09IFwiZXhpc3RpbmdcIikgcmV0dXJuIEJvb2xlYW4oY2FtcGFpZ24uY2FtcGFpZ25faWQpXG4gICAgaWYgKCFjYW1wYWlnbi5uYW1lLnRyaW0oKSB8fCAhY2FtcGFpZ24uY2FtcGFpZ25faWRlbnRpZmllci50cmltKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiBbY2FtcGFpZ24uc3RhcnRzX2F0LCBjYW1wYWlnbi5lbmRzX2F0XS5ldmVyeSgodmFsdWUpID0+IHtcbiAgICAgIGlmICghdmFsdWUpIHJldHVybiB0cnVlXG4gICAgICByZXR1cm4gIU51bWJlci5pc05hTihuZXcgRGF0ZSh2YWx1ZSkuZ2V0VGltZSgpKVxuICAgIH0pXG4gIH0sIFthbGxvd1Byb21vdGlvbk1pcnJvciwgY2FtcGFpZ25dKVxuXG4gIGNvbnN0IHByaWNlc0NvbXBsZXRlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFjdXJyZW5jaWVzLmxlbmd0aCB8fCAhcHJvZHVjdFByaWNlcy5sZW5ndGgpIHJldHVybiBmYWxzZVxuICAgIHJldHVybiBjdXJyZW5jaWVzLmV2ZXJ5KChjdXJyZW5jeSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBwcm9kdWN0LnByaWNlX2Ftb3VudHNbY3VycmVuY3kuY29kZV0gfHwgXCJcIlxuICAgICAgcmV0dXJuICF2YWx1ZS50cmltKCkgfHwgbm9uTmVnYXRpdmVOdW1iZXJPck51bGwodmFsdWUpICE9IG51bGxcbiAgICB9KVxuICB9LCBbY3VycmVuY2llcywgcHJvZHVjdC5wcmljZV9hbW91bnRzLCBwcm9kdWN0UHJpY2VzLmxlbmd0aF0pXG5cbiAgY29uc3Qgc3RlcFZhbGlkaXR5ID0gdXNlTWVtbzxSZWNvcmQ8V2l6YXJkU3RlcCwgYm9vbGVhbj4+KFxuICAgICgpID0+ICh7XG4gICAgICBkZXRhaWxzOiBkZXRhaWxzQ29tcGxldGUsXG4gICAgICBvcmdhbml6ZTogdHJ1ZSxcbiAgICAgIGNhbXBhaWduOiBjYW1wYWlnbkNvbXBsZXRlLFxuICAgICAgcHJpY2VzOiBwcmljZXNDb21wbGV0ZSxcbiAgICB9KSxcbiAgICBbY2FtcGFpZ25Db21wbGV0ZSwgZGV0YWlsc0NvbXBsZXRlLCBwcmljZXNDb21wbGV0ZV0sXG4gIClcblxuICBjb25zdCBhY3RpdmVTdGVwQ29tcGxldGUgPSBzdGVwVmFsaWRpdHlbYWN0aXZlU3RlcF1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghb3BlbiB8fCAhYWN0aXZlU3RlcENvbXBsZXRlKSByZXR1cm5cbiAgICBzZXRGdXJ0aGVzdFN0ZXBJbmRleCgoY3VycmVudCkgPT5cbiAgICAgIE1hdGgubWF4KFxuICAgICAgICBjdXJyZW50LFxuICAgICAgICBNYXRoLm1pbihjdXJyZW50U3RlcEluZGV4ICsgMSwgdmlzaWJsZVN0ZXBzLmxlbmd0aCAtIDEpLFxuICAgICAgKSxcbiAgICApXG4gIH0sIFthY3RpdmVTdGVwQ29tcGxldGUsIGN1cnJlbnRTdGVwSW5kZXgsIG9wZW4sIHZpc2libGVTdGVwcy5sZW5ndGhdKVxuXG4gIGNvbnN0IGlzU3RlcERpc2FibGVkID0gKGluZGV4OiBudW1iZXIpID0+XG4gICAgaW5kZXggPiBmdXJ0aGVzdFN0ZXBJbmRleCB8fFxuICAgIHZpc2libGVTdGVwcy5zbGljZSgwLCBpbmRleCkuc29tZSgocHJldmlvdXMpID0+ICFzdGVwVmFsaWRpdHlbcHJldmlvdXNdKVxuXG4gIGNvbnN0IHZhbGlkYXRlID0gKCkgPT4ge1xuICAgIGlmICghcHJvZHVjdC50aXRsZS50cmltKCkpIHRocm93IG5ldyBFcnJvcihcIlByb2R1Y3QgdGl0bGUgaXMgcmVxdWlyZWRcIilcbiAgICBpZiAoIWN1cnJlbmNpZXMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBZGQgYSBzdXBwb3J0ZWQgY3VycmVuY3kgdG8gdGhlIHN0b3JlIGJlZm9yZSBjb250aW51aW5nXCIpXG4gICAgfVxuICAgIGNvbnN0IGludmFsaWRQcmljZSA9IGN1cnJlbmNpZXMuc29tZSgoY3VycmVuY3kpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gcHJvZHVjdC5wcmljZV9hbW91bnRzW2N1cnJlbmN5LmNvZGVdIHx8IFwiXCJcbiAgICAgIHJldHVybiB2YWx1ZS50cmltKCkgJiYgbm9uTmVnYXRpdmVOdW1iZXJPck51bGwodmFsdWUpID09IG51bGxcbiAgICB9KVxuICAgIGlmIChpbnZhbGlkUHJpY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlByb2R1Y3QgcHJpY2VzIG11c3QgYmUgMCBvciBtb3JlXCIpXG4gICAgfVxuICAgIGlmICghcHJvZHVjdFByaWNlcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkFkZCBhdCBsZWFzdCBvbmUgcHJvZHVjdCBwcmljZVwiKVxuICAgIH1cbiAgICBpZiAoaXNBbW91bnRUeXBlKSB7XG4gICAgICBpZiAoIWNvdXBvbi5hbW91bnRzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBZGQgYXQgbGVhc3Qgb25lIGNvdXBvbiB2YWx1ZVwiKVxuICAgICAgfVxuICAgICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gICAgICBjb25zdCBjdXJyZW5jeUNvbmRpdGlvbiA9IGNvdXBvbi5wdXJjaGFzZV9jb25kaXRpb25zLmZpbmQoXG4gICAgICAgIChjb25kaXRpb24pID0+IGNvbmRpdGlvbi5hdHRyaWJ1dGUgPT09IFwiY3VycmVuY3lfY29kZVwiLFxuICAgICAgKVxuICAgICAgaWYgKCFjdXJyZW5jeUNvbmRpdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBZGQgYSBDdXJyZW5jeSBDb2RlIHB1cmNoYXNlIGNvbmRpdGlvblwiKVxuICAgICAgfVxuICAgICAgaWYgKGNvdXBvbi5hbW91bnRzLmxlbmd0aCAhPT0gZWZmZWN0aXZlQ3VycmVuY2llcy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiQ291cG9uIHZhbHVlcyBtdXN0IG1hdGNoIGV2ZXJ5IGVmZmVjdGl2ZSBjdXJyZW5jeSBjb25kaXRpb24gdmFsdWVcIixcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCByb3cgb2YgY291cG9uLmFtb3VudHMpIHtcbiAgICAgICAgaWYgKCFzdXBwb3J0ZWRDdXJyZW5jeUNvZGVzLmhhcyhyb3cuY3VycmVuY3lfY29kZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZWxlY3QgYW4gYXZhaWxhYmxlIGNvdXBvbiBjdXJyZW5jeVwiKVxuICAgICAgICB9XG4gICAgICAgIGlmIChzZWVuLmhhcyhyb3cuY3VycmVuY3lfY29kZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3Vwb24gdmFsdWUgY3VycmVuY2llcyBjYW5ub3QgYmUgZHVwbGljYXRlZFwiKVxuICAgICAgICB9XG4gICAgICAgIGlmIChudW1iZXJPck51bGwocm93LmFtb3VudCkgPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdXBvbiB2YWx1ZXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMFwiKVxuICAgICAgICB9XG4gICAgICAgIHNlZW4uYWRkKHJvdy5jdXJyZW5jeV9jb2RlKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzZWVuQXR0cmlidXRlcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gICAgZm9yIChjb25zdCBjb25kaXRpb24gb2YgY291cG9uLnB1cmNoYXNlX2NvbmRpdGlvbnMpIHtcbiAgICAgIGlmICghY29uZGl0aW9uLmF0dHJpYnV0ZSB8fCAhY29uZGl0aW9uLm9wZXJhdG9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbXBsZXRlIGV2ZXJ5IHB1cmNoYXNlIGNvbmRpdGlvblwiKVxuICAgICAgfVxuICAgICAgaWYgKCFjb25kaXRpb24udmFsdWVzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZWxlY3QgYXQgbGVhc3Qgb25lIHZhbHVlIGZvciBldmVyeSBwdXJjaGFzZSBjb25kaXRpb25cIilcbiAgICAgIH1cbiAgICAgIGlmIChjb25kaXRpb24ub3BlcmF0b3IgPT09IFwiZXFcIiAmJiBjb25kaXRpb24udmFsdWVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcXVhbHMgY29uZGl0aW9ucyByZXF1aXJlIGV4YWN0bHkgb25lIHZhbHVlXCIpXG4gICAgICB9XG4gICAgICBpZiAoc2VlbkF0dHJpYnV0ZXMuaGFzKGNvbmRpdGlvbi5hdHRyaWJ1dGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlB1cmNoYXNlIGNvbmRpdGlvbiBhdHRyaWJ1dGVzIGNhbm5vdCBiZSBkdXBsaWNhdGVkXCIpXG4gICAgICB9XG4gICAgICBzZWVuQXR0cmlidXRlcy5hZGQoY29uZGl0aW9uLmF0dHJpYnV0ZSlcbiAgICB9XG4gICAgaWYgKGlzUGVyY2VudGFnZVR5cGUpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gbnVtYmVyT3JOdWxsKGNvdXBvbi5wZXJjZW50YWdlKVxuICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPiAxMDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291cG9uIHZhbHVlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMDAgcGVyY2VudFwiKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY291cG9uLmNvZGVfc3RyYXRlZ3kgPT09IFwic2hhcmVkX2NvZGVcIiAmJiAhY291cG9uLnNoYXJlZF9jb2RlLnRyaW0oKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSBzaGFyZWQgY291cG9uIGNvZGUgaXMgcmVxdWlyZWRcIilcbiAgICB9XG4gICAgaWYgKGNvdXBvbi5leHBpcmF0aW9uX3R5cGUgPT09IFwiZml4ZWRcIikge1xuICAgICAgY29uc3QgZXhwaXJhdGlvbiA9IG5ldyBEYXRlKGNvdXBvbi5leHBpcmF0aW9uX2RhdGUpXG4gICAgICBpZiAoIWNvdXBvbi5leHBpcmF0aW9uX2RhdGUgfHwgTnVtYmVyLmlzTmFOKGV4cGlyYXRpb24uZ2V0VGltZSgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIHZhbGlkIGZpeGVkIGV4cGlyYXRpb24gZGF0ZSBpcyByZXF1aXJlZFwiKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY291cG9uLmV4cGlyYXRpb25fdHlwZSAhPT0gXCJub25lXCIgJiYgY291cG9uLmV4cGlyYXRpb25fY2FwX2F0KSB7XG4gICAgICBjb25zdCBjYXAgPSBuZXcgRGF0ZShjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYXQpXG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKGNhcC5nZXRUaW1lKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgdmFsaWQgZXhwaXJhdGlvbiBjYXAgZGF0ZSBpcyByZXF1aXJlZFwiKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2FtcGFpZ24ubW9kZSA9PT0gXCJleGlzdGluZ1wiICYmICFjYW1wYWlnbi5jYW1wYWlnbl9pZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2VsZWN0IGFuIGV4aXN0aW5nIGNhbXBhaWduXCIpXG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNhbXBhaWduLm1vZGUgPT09IFwibmV3XCIgJiZcbiAgICAgICghY2FtcGFpZ24ubmFtZS50cmltKCkgfHwgIWNhbXBhaWduLmNhbXBhaWduX2lkZW50aWZpZXIudHJpbSgpKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FtcGFpZ24gbmFtZSBhbmQgaWRlbnRpZmllciBhcmUgcmVxdWlyZWRcIilcbiAgICB9XG4gIH1cblxuICBjb25zdCBzYXZlID0gYXN5bmMgKCkgPT4ge1xuICAgIHNldFNhdmluZyh0cnVlKVxuICAgIHRyeSB7XG4gICAgICB2YWxpZGF0ZSgpXG4gICAgICBjb25zdCBiZW5lZml0VHlwZSA9IGJlbmVmaXRUeXBlRnJvbUNvdXBvblR5cGUoY291cG9uLnR5cGUpXG4gICAgICBjb25zdCB0YXJnZXRUeXBlID1cbiAgICAgICAgY291cG9uLnR5cGUgPT09IFwiYW1vdW50X29mZl9vcmRlclwiIHx8XG4gICAgICAgIGNvdXBvbi50eXBlID09PSBcInBlcmNlbnRhZ2Vfb2ZmX29yZGVyXCJcbiAgICAgICAgICA/IFwib3JkZXJcIlxuICAgICAgICAgIDogXCJpdGVtc1wiXG4gICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICBwcm9kdWN0OiB7XG4gICAgICAgICAgdGl0bGU6IHByb2R1Y3QudGl0bGUudHJpbSgpLFxuICAgICAgICAgIHN1YnRpdGxlOiBwcm9kdWN0LnN1YnRpdGxlLnRyaW0oKSB8fCBudWxsLFxuICAgICAgICAgIGhhbmRsZTogcHJvZHVjdC5oYW5kbGUudHJpbSgpIHx8IG51bGwsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHByb2R1Y3QuZGVzY3JpcHRpb24udHJpbSgpIHx8IG51bGwsXG4gICAgICAgICAgc3RhdHVzOiBwcm9kdWN0U3RhdHVzRnJvbUNvdXBvblN0YXR1cyhjb3Vwb24ucHJvbW90aW9uX3N0YXR1cyksXG4gICAgICAgICAgdGh1bWJuYWlsOiBwcm9kdWN0Lm1lZGlhWzBdPy51cmwgfHwgbnVsbCxcbiAgICAgICAgICB0aHVtYm5haWxfYXNzZXRfaWQ6IHByb2R1Y3QubWVkaWFbMF0/LmFzc2V0X2lkIHx8IG51bGwsXG4gICAgICAgICAgaW1hZ2VzOiBwcm9kdWN0Lm1lZGlhLnNsaWNlKDEpLm1hcCgobWVkaWEpID0+ICh7XG4gICAgICAgICAgICB1cmw6IG1lZGlhLnVybCxcbiAgICAgICAgICAgIC4uLihtZWRpYS5hc3NldF9pZCA/IHsgYXNzZXRfaWQ6IG1lZGlhLmFzc2V0X2lkIH0gOiB7fSksXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIGRpc2NvdW50YWJsZTogcHJvZHVjdC5kaXNjb3VudGFibGUsXG4gICAgICAgICAgdHlwZV9pZDogcHJvZHVjdC50eXBlX2lkIHx8IG51bGwsXG4gICAgICAgICAgY29sbGVjdGlvbl9pZDogcHJvZHVjdC5jb2xsZWN0aW9uX2lkIHx8IG51bGwsXG4gICAgICAgICAgY2F0ZWdvcmllczogcHJvZHVjdC5jYXRlZ29yeV9pZCA/IFt7IGlkOiBwcm9kdWN0LmNhdGVnb3J5X2lkIH1dIDogW10sXG4gICAgICAgICAgdGFnczogcHJvZHVjdC50YWdfaWQgPyBbeyBpZDogcHJvZHVjdC50YWdfaWQgfV0gOiBbXSxcbiAgICAgICAgICB2YXJpYW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0aXRsZTogXCJEZWZhdWx0XCIsXG4gICAgICAgICAgICAgIHNrdTogcHJvZHVjdC5za3UudHJpbSgpIHx8IG51bGwsXG4gICAgICAgICAgICAgIG1hbmFnZV9pbnZlbnRvcnk6IGZhbHNlLFxuICAgICAgICAgICAgICBhbGxvd19iYWNrb3JkZXI6IHRydWUsXG4gICAgICAgICAgICAgIHByaWNlczogcHJvZHVjdFByaWNlcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgY291cG9uOiB7XG4gICAgICAgICAgZW5hYmxlZDogY291cG9uLmVuYWJsZWQsXG4gICAgICAgICAgYmVuZWZpdF90eXBlOiBiZW5lZml0VHlwZSxcbiAgICAgICAgICBwdXJjaGFzZV9jb25kaXRpb25zOiBjb3Vwb24ucHVyY2hhc2VfY29uZGl0aW9ucy5tYXAoKGNvbmRpdGlvbikgPT4gKHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZTogY29uZGl0aW9uLmF0dHJpYnV0ZSxcbiAgICAgICAgICAgIG9wZXJhdG9yOiBjb25kaXRpb24ub3BlcmF0b3IsXG4gICAgICAgICAgICB2YWx1ZXM6IGNvbmRpdGlvbi52YWx1ZXMsXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIGFtb3VudHM6IGlzQW1vdW50VHlwZVxuICAgICAgICAgICAgPyBjb3Vwb24uYW1vdW50cy5tYXAoKHJvdykgPT4gKHtcbiAgICAgICAgICAgICAgYW1vdW50OiBudW1iZXJPck51bGwocm93LmFtb3VudCksXG4gICAgICAgICAgICAgIGN1cnJlbmN5X2NvZGU6IHJvdy5jdXJyZW5jeV9jb2RlLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgYW1vdW50OiBudWxsLFxuICAgICAgICAgIHBlcmNlbnRhZ2U6IGlzUGVyY2VudGFnZVR5cGUgPyBudW1iZXJPck51bGwoY291cG9uLnBlcmNlbnRhZ2UpIDogbnVsbCxcbiAgICAgICAgICBjdXJyZW5jeV9jb2RlOiBudWxsLFxuICAgICAgICAgIGNvZGVfc3RyYXRlZ3k6IGNvdXBvbi5jb2RlX3N0cmF0ZWd5LFxuICAgICAgICAgIGNvZGVfcHJlZml4OlxuICAgICAgICAgICAgY291cG9uLmNvZGVfc3RyYXRlZ3kgPT09IFwidW5pcXVlX2NvZGVcIlxuICAgICAgICAgICAgICA/IGNvdXBvbi5jb2RlX3ByZWZpeC50cmltKCkgfHwgXCJDT1VQT05cIlxuICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgc2hhcmVkX2NvZGU6XG4gICAgICAgICAgICBjb3Vwb24uY29kZV9zdHJhdGVneSA9PT0gXCJzaGFyZWRfY29kZVwiXG4gICAgICAgICAgICAgID8gY291cG9uLnNoYXJlZF9jb2RlLnRyaW0oKVxuICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgZXhwaXJhdGlvbl9wb2xpY3k6XG4gICAgICAgICAgICBjb3Vwb24uZXhwaXJhdGlvbl90eXBlID09PSBcIm5vbmVcIlxuICAgICAgICAgICAgICA/IHsgdHlwZTogXCJub25lXCIgfVxuICAgICAgICAgICAgICA6IGNvdXBvbi5leHBpcmF0aW9uX3R5cGUgPT09IFwiZml4ZWRcIlxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJmaXhlZFwiLFxuICAgICAgICAgICAgICAgICAgZXhwaXJlc19hdDogbmV3IERhdGUoY291cG9uLmV4cGlyYXRpb25fZGF0ZSkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgIGNhcF9ieV9jYW1wYWlnbjogY291cG9uLmV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWduLFxuICAgICAgICAgICAgICAgICAgY2FwX2F0OiBjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYXRcbiAgICAgICAgICAgICAgICAgICAgPyBuZXcgRGF0ZShjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYXQpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZHVyYXRpb25cIixcbiAgICAgICAgICAgICAgICAgIGR1cmF0aW9uX2RheXM6IE51bWJlcihjb3Vwb24uZXhwaXJhdGlvbl9kYXlzKSB8fCAzMCxcbiAgICAgICAgICAgICAgICAgIGNhcF9ieV9jYW1wYWlnbjogY291cG9uLmV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWduLFxuICAgICAgICAgICAgICAgICAgY2FwX2F0OiBjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYXRcbiAgICAgICAgICAgICAgICAgICAgPyBuZXcgRGF0ZShjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYXQpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgbWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtOlxuICAgICAgICAgICAgTnVtYmVyKGNvdXBvbi5tYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW0pIHx8IDEsXG4gICAgICAgICAgcHJvbW90aW9uX3RlbXBsYXRlOlxuICAgICAgICAgICAgYmVuZWZpdFR5cGUgPT09IFwiZml4ZWRfYW1vdW50XCIgfHwgYmVuZWZpdFR5cGUgPT09IFwicGVyY2VudGFnZVwiXG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uX21ldGhvZDoge1xuICAgICAgICAgICAgICAgICAgdGFyZ2V0X3R5cGU6IHRhcmdldFR5cGUsXG4gICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uOlxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRUeXBlID09PSBcIm9yZGVyXCIgPyBcImFjcm9zc1wiIDogY291cG9uLmFsbG9jYXRpb24sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgcHJvbW90aW9uX3N0YXR1czogY291cG9uLnByb21vdGlvbl9zdGF0dXMsXG4gICAgICAgICAgLi4uKGFsbG93UHJvbW90aW9uTWlycm9yXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgcHJvbW90aW9uX21pcnJvcl9tb2RlOlxuICAgICAgICAgICAgICAgIGJlbmVmaXRUeXBlID09PSBcImJ1eV9nZXRcIiB8fFxuICAgICAgICAgICAgICAgICAgKGJlbmVmaXRUeXBlID09PSBcImZpeGVkX2Ftb3VudFwiICYmIGNvdXBvbi5hbW91bnRzLmxlbmd0aCA+IDEpXG4gICAgICAgICAgICAgICAgICA/IFwibm9uZVwiXG4gICAgICAgICAgICAgICAgICA6IGNvdXBvbi5wcm9tb3Rpb25fbWlycm9yX21vZGUsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgICAgY2FtcGFpZ246IGFsbG93UHJvbW90aW9uTWlycm9yXG4gICAgICAgICAgPyBjYW1wYWlnbi5tb2RlID09PSBcImV4aXN0aW5nXCJcbiAgICAgICAgICAgID8geyBtb2RlOiBcImV4aXN0aW5nXCIsIGNhbXBhaWduX2lkOiBjYW1wYWlnbi5jYW1wYWlnbl9pZCB9XG4gICAgICAgICAgICA6IGNhbXBhaWduLm1vZGUgPT09IFwibmV3XCJcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgbW9kZTogXCJuZXdcIixcbiAgICAgICAgICAgICAgICBjYW1wYWlnbjoge1xuICAgICAgICAgICAgICAgICAgbmFtZTogY2FtcGFpZ24ubmFtZSxcbiAgICAgICAgICAgICAgICAgIGNhbXBhaWduX2lkZW50aWZpZXI6IGNhbXBhaWduLmNhbXBhaWduX2lkZW50aWZpZXIsXG4gICAgICAgICAgICAgICAgICBzdGFydHNfYXQ6IGNhbXBhaWduLnN0YXJ0c19hdFxuICAgICAgICAgICAgICAgICAgICA/IG5ldyBEYXRlKGNhbXBhaWduLnN0YXJ0c19hdCkudG9JU09TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgICBlbmRzX2F0OiBjYW1wYWlnbi5lbmRzX2F0XG4gICAgICAgICAgICAgICAgICAgID8gbmV3IERhdGUoY2FtcGFpZ24uZW5kc19hdCkudG9JU09TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHsgbW9kZTogXCJub25lXCIgfVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBzZWxsZXJfaWQ6IHByb2R1Y3Quc2VsbGVyX2lkIHx8IG51bGwsXG4gICAgICAgIHZhcmlhbnRfb3ZlcnJpZGVzOiBbXSxcbiAgICAgIH1cblxuICAgICAgYXdhaXQgYXBpRmV0Y2goXG4gICAgICAgIHJvd1xuICAgICAgICAgID8gYCR7YXBpQmFzZX0vY291cG9uLXByb2R1Y3RzLyR7cm93LnByb2R1Y3QuaWR9YFxuICAgICAgICAgIDogYCR7YXBpQmFzZX0vY291cG9uLXByb2R1Y3RzYCxcbiAgICAgICAge1xuICAgICAgICAgIG1ldGhvZDogcm93ID8gXCJQQVRDSFwiIDogXCJQT1NUXCIsXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgICB0b2FzdC5zdWNjZXNzKHJvdyA/IFwiQ291cG9uIHByb2R1Y3QgdXBkYXRlZFwiIDogXCJDb3Vwb24gcHJvZHVjdCBjcmVhdGVkXCIpXG4gICAgICBvbk9wZW5DaGFuZ2UoZmFsc2UpXG4gICAgICBhd2FpdCBvblNhdmVkKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdG9hc3QuZXJyb3IoXG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICA/IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICA6IFwiRmFpbGVkIHRvIHNhdmUgY291cG9uIHByb2R1Y3RcIixcbiAgICAgIClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0U2F2aW5nKGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN0ZXBTdGF0dXMgPSAoc3RlcDogV2l6YXJkU3RlcCkgPT4ge1xuICAgIGNvbnN0IGluZGV4ID0gdmlzaWJsZVN0ZXBzLmluZGV4T2Yoc3RlcClcbiAgICBpZiAoaW5kZXggPCBjdXJyZW50U3RlcEluZGV4ICYmIHN0ZXBWYWxpZGl0eVtzdGVwXSkge1xuICAgICAgcmV0dXJuIFwiY29tcGxldGVkXCIgYXMgY29uc3RcbiAgICB9XG4gICAgaWYgKGluZGV4ID09PSBjdXJyZW50U3RlcEluZGV4KSByZXR1cm4gXCJpbi1wcm9ncmVzc1wiIGFzIGNvbnN0XG4gICAgcmV0dXJuIFwibm90LXN0YXJ0ZWRcIiBhcyBjb25zdFxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8Rm9jdXNNb2RhbCBvcGVuPXtvcGVufSBvbk9wZW5DaGFuZ2U9e29uT3BlbkNoYW5nZX0+XG4gICAgICA8Rm9jdXNNb2RhbC5Db250ZW50IHN0eWxlPXttb2RhbENvbnRlbnRTdHlsZX0+XG4gICAgICAgIDxGb2N1c01vZGFsLlRpdGxlIHN0eWxlPXt2aXN1YWxseUhpZGRlblN0eWxlfT5cbiAgICAgICAgICB7cm93ID8gXCJFZGl0IENvdXBvbiBQcm9kdWN0XCIgOiBcIkNyZWF0ZSBDb3Vwb24gUHJvZHVjdFwifVxuICAgICAgICA8L0ZvY3VzTW9kYWwuVGl0bGU+XG4gICAgICAgIDxQcm9ncmVzc1RhYnNcbiAgICAgICAgICB2YWx1ZT17YWN0aXZlU3RlcH1cbiAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsodmFsdWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXAgPSB2YWx1ZSBhcyBXaXphcmRTdGVwXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHZpc2libGVTdGVwcy5pbmRleE9mKHN0ZXApXG4gICAgICAgICAgICBpZiAoIWlzU3RlcERpc2FibGVkKGluZGV4KSkgc2V0QWN0aXZlU3RlcChzdGVwKVxuICAgICAgICAgIH19XG4gICAgICAgICAgc3R5bGU9e21vZGFsV2l6YXJkU3R5bGV9XG4gICAgICAgID5cbiAgICAgICAgICA8Rm9jdXNNb2RhbC5IZWFkZXI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIi1teS0yIHctZnVsbCBib3JkZXItbFwiPlxuICAgICAgICAgICAgICA8UHJvZ3Jlc3NUYWJzLkxpc3QgY2xhc3NOYW1lPVwianVzdGlmeS1zdGFydC1zdGFydCBmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICB7dmlzaWJsZVN0ZXBzLm1hcCgoc3RlcCwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICAgIDxQcm9ncmVzc1RhYnMuVHJpZ2dlclxuICAgICAgICAgICAgICAgICAgICBrZXk9e3N0ZXB9XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzdGVwfVxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM9e3N0ZXBTdGF0dXMoc3RlcCl9XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc1N0ZXBEaXNhYmxlZChpbmRleCl9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm1heC13LVsyMDBweF0gdHJ1bmNhdGVcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7c3RlcFswXS50b1VwcGVyQ2FzZSgpICsgc3RlcC5zbGljZSgxKX1cbiAgICAgICAgICAgICAgICAgIDwvUHJvZ3Jlc3NUYWJzLlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgIDwvUHJvZ3Jlc3NUYWJzLkxpc3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L0ZvY3VzTW9kYWwuSGVhZGVyPlxuXG4gICAgICAgICAgPEZvY3VzTW9kYWwuQm9keSBjbGFzc05hbWU9XCJvdmVyZmxvdy1oaWRkZW4gcC0wXCIgc3R5bGU9e21vZGFsQm9keVN0eWxlfT5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgc3R5bGU9e1xuICAgICAgICAgICAgICAgIGFjdGl2ZVN0ZXAgPT09IFwicHJpY2VzXCJcbiAgICAgICAgICAgICAgICAgID8geyBoZWlnaHQ6IFwiMTAwJVwiLCBvdmVyZmxvdzogXCJoaWRkZW5cIiwgd2lkdGg6IFwiMTAwJVwiIH1cbiAgICAgICAgICAgICAgICAgIDogbW9kYWxTY3JvbGxTdHlsZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBzdHlsZT17XG4gICAgICAgICAgICAgICAgICBhY3RpdmVTdGVwID09PSBcInByaWNlc1wiXG4gICAgICAgICAgICAgICAgICAgID8geyBoZWlnaHQ6IFwiMTAwJVwiLCB3aWR0aDogXCIxMDAlXCIgfVxuICAgICAgICAgICAgICAgICAgICA6IG1vZGFsRm9ybVN0eWxlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2FjdGl2ZVN0ZXAgPT09IFwiZGV0YWlsc1wiICYmIChcbiAgICAgICAgICAgICAgICAgIDxQcm9ncmVzc1RhYnMuQ29udGVudCB2YWx1ZT1cImRldGFpbHNcIiBzdHlsZT17c3RhY2tTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgIDxIZWFkaW5nIGxldmVsPVwiaDFcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7cm93ID8gXCJFZGl0IENvdXBvbiBQcm9kdWN0XCIgOiBcIkNyZWF0ZSBDb3Vwb24gUHJvZHVjdFwifVxuICAgICAgICAgICAgICAgICAgICA8L0hlYWRpbmc+XG4gICAgICAgICAgICAgICAgICAgIDxEaXZpZGVyIC8+XG4gICAgICAgICAgICAgICAgICAgIDxTZWN0aW9uIHRpdGxlPVwiR2VuZXJhbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3RocmVlQ29sdW1uR3JpZFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0LnRpdGxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiV2ludGVyIGphY2tldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3QoKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiU3VidGl0bGVcIiBvcHRpb25hbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3Quc3VidGl0bGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJXYXJtIGFuZCBjb3p5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdCgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGU6IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8RmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJIYW5kbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwPVwiVGhlIFVSTC1mcmllbmRseSBpZGVudGlmaWVyIGZvciB0aGlzIHByb2R1Y3QuIElmIGxlZnQgZW1wdHksIE1lZHVzYSBnZW5lcmF0ZXMgaXQgZnJvbSB0aGUgdGl0bGUuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEhhbmRsZUlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3QuaGFuZGxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoaGFuZGxlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdCgoY3VycmVudCkgPT4gKHsgLi4uY3VycmVudCwgaGFuZGxlIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiRGVzY3JpcHRpb25cIiBvcHRpb25hbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdC5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJBIHdhcm0gYW5kIGNvenkgamFja2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJNZWRpYVwiIG9wdGlvbmFsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPE1lZGlhVXBsb2FkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzVXBsb2FkaW5nPXt1cGxvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhPXtwcm9kdWN0Lm1lZGlhfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvblVwbG9hZD17KGZpbGVzKSA9PiB2b2lkIHVwbG9hZE1lZGlhKGZpbGVzKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25SZW1vdmU9eyhtZWRpYSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOiBjdXJyZW50Lm1lZGlhLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW0pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1lZGlhLmFzc2V0X2lkICYmIGl0ZW0uYXNzZXRfaWQgIT09IG1lZGlhLmFzc2V0X2lkKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghbWVkaWEuYXNzZXRfaWQgJiYgaXRlbS51cmwgIT09IG1lZGlhLnVybCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiU0tVXCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3Quc2t1fVxuICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkNPVVBPTi0wMDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3QoKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPC9TZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8RGl2aWRlciAvPlxuICAgICAgICAgICAgICAgICAgICA8UHVyY2hhc2VDb25kaXRpb25zRmllbGRcbiAgICAgICAgICAgICAgICAgICAgICBmaXhlZEFtb3VudD17aXNBbW91bnRUeXBlfVxuICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbi5wdXJjaGFzZV9jb25kaXRpb25zfVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVQdXJjaGFzZUNvbmRpdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L1Byb2dyZXNzVGFicy5Db250ZW50PlxuICAgICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAgICB7YWN0aXZlU3RlcCA9PT0gXCJvcmdhbml6ZVwiICYmIChcbiAgICAgICAgICAgICAgICAgIDxQcm9ncmVzc1RhYnMuQ29udGVudCB2YWx1ZT1cIm9yZ2FuaXplXCIgc3R5bGU9e3N0YWNrU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICA8U2VjdGlvbiB0aXRsZT1cIk9yZ2FuaXplXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17cGFuZWxTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAteC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgd2VpZ2h0PVwicGx1c1wiPkRpc2NvdW50YWJsZTwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvdyBwcm9tb3Rpb25zIHRvIGRpc2NvdW50IHRoaXMgcHJvZHVjdCdzIHNhbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaWNlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTd2l0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtwcm9kdWN0LmRpc2NvdW50YWJsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoZWNrZWRDaGFuZ2U9eyhkaXNjb3VudGFibGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3VudGFibGU6IEJvb2xlYW4oZGlzY291bnRhYmxlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3R3b0NvbHVtbkdyaWRTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7YWxsb3dQcm9tb3Rpb25NaXJyb3IgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJTZWxsZXJcIiBvcHRpb25hbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8T3B0aW9uU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdC5zZWxsZXJfaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zLnNlbGxlcnMgfHwgW119XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHNlbGxlcl9pZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdCgoY3VycmVudCkgPT4gKHsgLi4uY3VycmVudCwgc2VsbGVyX2lkIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiVHlwZVwiIG9wdGlvbmFsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8T3B0aW9uU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3QudHlwZV9pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zLnByb2R1Y3RfdHlwZXMgfHwgW119XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh0eXBlX2lkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdCgoY3VycmVudCkgPT4gKHsgLi4uY3VycmVudCwgdHlwZV9pZCB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ29sbGVjdGlvblwiIG9wdGlvbmFsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8T3B0aW9uU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3QuY29sbGVjdGlvbl9pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zLnByb2R1Y3RfY29sbGVjdGlvbnMgfHwgW119XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhjb2xsZWN0aW9uX2lkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdCgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbl9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDYXRlZ29yeVwiIG9wdGlvbmFsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8T3B0aW9uU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3QuY2F0ZWdvcnlfaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5wcm9kdWN0X2NhdGVnb3JpZXMgfHwgW119XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhjYXRlZ29yeV9pZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3QoKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIGNhdGVnb3J5X2lkIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJUYWdcIiBvcHRpb25hbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPE9wdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0LnRhZ19pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zLnByb2R1Y3RfdGFncyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHRhZ19pZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3QoKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIHRhZ19pZCB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L1NlY3Rpb24+XG4gICAgICAgICAgICAgICAgICA8L1Byb2dyZXNzVGFicy5Db250ZW50PlxuICAgICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAgICB7YWN0aXZlU3RlcCA9PT0gXCJkZXRhaWxzXCIgJiYgKFxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17eyAuLi5zdGFja1N0eWxlLCBtYXJnaW5Ub3A6IDI0IH19PlxuICAgICAgICAgICAgICAgICAgICA8RGl2aWRlciAvPlxuICAgICAgICAgICAgICAgICAgICA8U2VjdGlvblxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiQ291cG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj1cIkNvbmZpZ3VyZSB0aGUgY291cG9uIGlzc3VlZCB3aGVuIHRoaXMgcHJvZHVjdCBpcyBwdXJjaGFzZWQuXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3BhbmVsU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLXgtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHdlaWdodD1cInBsdXNcIj5Db3Vwb24gaXNzdWFuY2U8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNzdWUgY291cG9ucyB3aGVuIGN1c3RvbWVycyBwdXJjaGFzZSB0aGlzIHByb2R1Y3QuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFN3aXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e2NvdXBvbi5lbmFibGVkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hlY2tlZENoYW5nZT17KGVuYWJsZWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IEJvb2xlYW4oZW5hYmxlZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgIDxTZWN0aW9uIHRpdGxlPVwiVHlwZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFJhZGlvR3JvdXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbi50eXBlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsodHlwZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb3Vwb25UeXBlKHR5cGUgYXMgQ291cG9uVHlwZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC15LTNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7dHlwZUNob2ljZXMubWFwKChjaG9pY2UpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UmFkaW9Hcm91cC5DaG9pY2VCb3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17Y2hvaWNlLnZhbHVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2Nob2ljZS52YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtjaG9pY2UubGFiZWx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj17Y2hvaWNlLmRlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9SYWRpb0dyb3VwPlxuICAgICAgICAgICAgICAgICAgICAgIDwvU2VjdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICAgIDxTZWN0aW9uIHRpdGxlPVwiU3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8UmFkaW9Hcm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLnByb21vdGlvbl9zdGF0dXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyhwcm9tb3Rpb25fc3RhdHVzKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25fc3RhdHVzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25fc3RhdHVzIGFzIFByb21vdGlvblN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17dHdvQ29sdW1uR3JpZFN0eWxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7c3RhdHVzQ2hvaWNlcy5tYXAoKGNob2ljZSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxSYWRpb0dyb3VwLkNob2ljZUJveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtjaG9pY2UudmFsdWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2hvaWNlLnZhbHVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e2Nob2ljZS5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPXtjaG9pY2UuZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1JhZGlvR3JvdXA+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TZWN0aW9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgeyhpc0Ftb3VudFR5cGUgfHwgaXNQZXJjZW50YWdlVHlwZSkgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlY3Rpb24gdGl0bGU9e2lzQW1vdW50VHlwZSA/IFwiQ291cG9uIFZhbHVlc1wiIDogXCJWYWx1ZVwifT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2lzQW1vdW50VHlwZSA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLXktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NvdXBvbi5hbW91bnRzLm1hcCgocm93LCByb3dJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW5jeSA9IGN1cnJlbmNpZXMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbSkgPT4gaXRlbS5jb2RlID09PSByb3cuY3VycmVuY3lfY29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtyb3cua2V5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwic2hhZG93LWVsZXZhdGlvbi1jYXJkLXJlc3QgYmctdWktYmctY29tcG9uZW50IHJvdW5kZWQtbWQgcHgtNCBweS0zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLXktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyb3cuY3VycmVuY3lfY29kZS50b1VwcGVyQ2FzZSgpfSBDb3Vwb24gVmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjdXJyZW5jeT8ubmFtZSB8fCByb3cuY3VycmVuY3lfY29kZS50b1VwcGVyQ2FzZSgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEN1cnJlbmN5QW1vdW50RmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmNpZXM9e2N1cnJlbmNpZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeUNvZGU9e3Jvdy5jdXJyZW5jeV9jb2RlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Jvdy5hbW91bnR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGFtb3VudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50czogY3VycmVudC5hbW91bnRzLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtLCBpbmRleCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPT09IHJvd0luZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7IC4uLml0ZW0sIGFtb3VudCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyFjb3Vwb24uYW1vdW50cy5sZW5ndGggJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0IGF0IGxlYXN0IG9uZSBlZmZlY3RpdmUgQ3VycmVuY3kgQ29kZSBjb25kaXRpb24gdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ291cG9uIFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UGVyY2VudGFnZUlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb24ucGVyY2VudGFnZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhwZXJjZW50YWdlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1NlY3Rpb24+XG4gICAgICAgICAgICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgICAgICAgICAgIHtpc0l0ZW1TY29wZWREaXNjb3VudCAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWN0aW9uIHRpdGxlPVwiQWxsb2NhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxSYWRpb0dyb3VwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLmFsbG9jYXRpb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsoYWxsb2NhdGlvbikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGlvbjogYWxsb2NhdGlvbiBhcyBDb3Vwb25BbGxvY2F0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt0d29Db2x1bW5HcmlkU3R5bGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJhZGlvR3JvdXAuQ2hvaWNlQm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiZWFjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiRWFjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPVwiQXBwbGllcyB2YWx1ZSBvbiBlYWNoIGl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxSYWRpb0dyb3VwLkNob2ljZUJveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIm9uY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIk9uY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj1cIkxpbWl0IGRpc2NvdW50IHRvIG1heCBxdWFudGl0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvUmFkaW9Hcm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgICAgICAgICAgIDxTZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkV4cGlyYXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249XCJDb250cm9sIHdoZW4gaXNzdWVkIGNvdXBvbnMgZXhwaXJlLlwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17dHdvQ29sdW1uR3JpZFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiRXhwaXJhdGlvbiBwb2xpY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLmV4cGlyYXRpb25fdHlwZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyhleHBpcmF0aW9uX3R5cGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyYXRpb25fdHlwZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyYXRpb25fdHlwZSBhcyBFeHBpcmF0aW9uUG9saWN5VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJub25lXCI+Tm9uZTwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImR1cmF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHVyYXRpb24gYWZ0ZXIgaXNzdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiZml4ZWRcIj5GaXhlZCBkYXRlPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtjb3Vwb24uZXhwaXJhdGlvbl90eXBlID09PSBcImR1cmF0aW9uXCIgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiRXhwaXJhdGlvbiBkYXlzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbj17MX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbi5leHBpcmF0aW9uX2RheXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyYXRpb25fZGF5czogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICkgOiBjb3Vwb24uZXhwaXJhdGlvbl90eXBlID09PSBcImZpeGVkXCIgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiRXhwaXJlcyBhdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb24uZXhwaXJhdGlvbl9kYXRlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmF0aW9uX2RhdGU6IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2NvdXBvbi5leHBpcmF0aW9uX3R5cGUgIT09IFwibm9uZVwiICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ2FwIGV4cGlyYXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAteC00XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17eyAuLi5wYW5lbFN0eWxlLCBwYWRkaW5nOiBcIjhweCAxMnB4XCIgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbXBhaWduIGVuZCBvciBjYXAgZGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U3dpdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoZWNrZWRDaGFuZ2U9eyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWduOiBCb29sZWFuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiRXhwaXJhdGlvbiBjYXAgZGF0ZVwiIG9wdGlvbmFsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshY291cG9uLmV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWdufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYXR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJhdGlvbl9jYXBfYXQ6IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlY3Rpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8U2VjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJDb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPVwiQ2hvb3NlIHdoZXRoZXIgZXZlcnkgaXNzdWVkIGNvdXBvbiBpcyB1bmlxdWUgb3Igc2hhcmVzIG9uZSBjb2RlLlwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17dHdvQ29sdW1uR3JpZFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ29kZSBzdHJhdGVneVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb24uY29kZV9zdHJhdGVneX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyhjb2RlX3N0cmF0ZWd5KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlX3N0cmF0ZWd5OiBjb2RlX3N0cmF0ZWd5IGFzIENvZGVTdHJhdGVneSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJ1bmlxdWVfY29kZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaXF1ZSBjb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cInNoYXJlZF9jb2RlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhcmVkIGNvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtjb3Vwb24uY29kZV9zdHJhdGVneSA9PT0gXCJ1bmlxdWVfY29kZVwiID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkNvZGUgcHJlZml4XCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbi5jb2RlX3ByZWZpeH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJDT1VQT05cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlX3ByZWZpeDogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiU2hhcmVkIGNvZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLnNoYXJlZF9jb2RlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNVTU1FUjE1XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2NvZGU6IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TZWN0aW9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgPFNlY3Rpb24gdGl0bGU9XCJJc3N1YW5jZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17dHdvQ29sdW1uR3JpZFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiTWF4IGlzc3VhbmNlIHBlciBpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbj17MX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb24ubWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtOiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHthbGxvd1Byb21vdGlvbk1pcnJvciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0Ftb3VudFR5cGUgJiYgY291cG9uLmFtb3VudHMubGVuZ3RoID4gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiUHJvbW90aW9uIG1pcnJvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbi5wcm9tb3Rpb25fbWlycm9yX21vZGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2NvdXBvbi50eXBlID09PSBcImJ1eV94X2dldF95XCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHByb21vdGlvbl9taXJyb3JfbW9kZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uX21pcnJvcl9tb2RlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbl9taXJyb3JfbW9kZSBhcyBNaXJyb3JNb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwibm9uZVwiPk5vbmU8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwibWFudWFsXCI+TWFudWFsPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImF1dG9cIj5BdXRvPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvU2VjdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9TZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgICAgIHthbGxvd1Byb21vdGlvbk1pcnJvciAmJiBhY3RpdmVTdGVwID09PSBcImNhbXBhaWduXCIgJiYgKFxuICAgICAgICAgICAgICAgICAgPFByb2dyZXNzVGFicy5Db250ZW50IHZhbHVlPVwiY2FtcGFpZ25cIiBzdHlsZT17c3RhY2tTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgIDxTZWN0aW9uIHRpdGxlPVwiQ2FtcGFpZ25cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt0d29Db2x1bW5HcmlkU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ2FtcGFpZ24gbW9kZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NhbXBhaWduLm1vZGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KG1vZGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDYW1wYWlnbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogbW9kZSBhcyBDYW1wYWlnbk1vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJub25lXCI+Tm8gY2FtcGFpZ248L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiZXhpc3RpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhpc3RpbmcgY2FtcGFpZ25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJuZXdcIj5OZXcgY2FtcGFpZ248L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjYW1wYWlnbi5tb2RlID09PSBcImV4aXN0aW5nXCIgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJFeGlzdGluZyBjYW1wYWlnblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxPcHRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjYW1wYWlnbi5jYW1wYWlnbl9pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMuY2FtcGFpZ25zIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhjYW1wYWlnbl9pZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FtcGFpZ24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1wYWlnbl9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2FtcGFpZ24ubW9kZSA9PT0gXCJuZXdcIiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiTmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjYW1wYWlnbi5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENhbXBhaWduKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIklkZW50aWZpZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2FtcGFpZ24uY2FtcGFpZ25faWRlbnRpZmllcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDYW1wYWlnbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1wYWlnbl9pZGVudGlmaWVyOiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJTdGFydHMgYXRcIiBvcHRpb25hbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2FtcGFpZ24uc3RhcnRzX2F0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENhbXBhaWduKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0c19hdDogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiRW5kcyBhdFwiIG9wdGlvbmFsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjYW1wYWlnbi5lbmRzX2F0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENhbXBhaWduKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHNfYXQ6IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvU2VjdGlvbj5cbiAgICAgICAgICAgICAgICAgIDwvUHJvZ3Jlc3NUYWJzLkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgICAgIHthY3RpdmVTdGVwID09PSBcInByaWNlc1wiICYmIChcbiAgICAgICAgICAgICAgICAgIDxQcm9ncmVzc1RhYnMuQ29udGVudCB2YWx1ZT1cInByaWNlc1wiIHN0eWxlPXt7IGhlaWdodDogXCIxMDAlXCIgfX0+XG4gICAgICAgICAgICAgICAgICAgIDxQcm9kdWN0UHJpY2VzVGFibGVcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jaWVzPXtjdXJyZW5jaWVzfVxuICAgICAgICAgICAgICAgICAgICAgIGNvdXBvblZhbHVlPXtmb3JtYXRDb3Vwb25WYWx1ZShjb3Vwb24sIGN1cnJlbmNpZXMpfVxuICAgICAgICAgICAgICAgICAgICAgIHByaWNlcz17cHJvZHVjdC5wcmljZV9hbW91bnRzfVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoY3VycmVuY3lDb2RlLCB2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3QoKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByaWNlX2Ftb3VudHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LnByaWNlX2Ftb3VudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2N1cnJlbmN5Q29kZV06IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9Qcm9ncmVzc1RhYnMuQ29udGVudD5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvRm9jdXNNb2RhbC5Cb2R5PlxuXG4gICAgICAgICAgPEZvY3VzTW9kYWwuRm9vdGVyIHN0eWxlPXt7IGZsZXhTaHJpbms6IDAgfX0+XG4gICAgICAgICAgICA8QnV0dG9uIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIiBvbkNsaWNrPXsoKSA9PiBvbk9wZW5DaGFuZ2UoZmFsc2UpfT5cbiAgICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgIHtjdXJyZW50U3RlcEluZGV4ID4gMCAmJiAoXG4gICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICB2YXJpYW50PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgc2V0QWN0aXZlU3RlcCh2aXNpYmxlU3RlcHNbY3VycmVudFN0ZXBJbmRleCAtIDFdKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEJhY2tcbiAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAge2N1cnJlbnRTdGVwSW5kZXggPCB2aXNpYmxlU3RlcHMubGVuZ3RoIC0gMSA/IChcbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXshYWN0aXZlU3RlcENvbXBsZXRlfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRJbmRleCA9IGN1cnJlbnRTdGVwSW5kZXggKyAxXG4gICAgICAgICAgICAgICAgICBzZXRGdXJ0aGVzdFN0ZXBJbmRleCgoY3VycmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoY3VycmVudCwgbmV4dEluZGV4KSxcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIHNldEFjdGl2ZVN0ZXAodmlzaWJsZVN0ZXBzW25leHRJbmRleF0pXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIENvbnRpbnVlXG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXshYWN0aXZlU3RlcENvbXBsZXRlfVxuICAgICAgICAgICAgICAgIGlzTG9hZGluZz17c2F2aW5nfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHZvaWQgc2F2ZSgpfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgU2F2ZVxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9Gb2N1c01vZGFsLkZvb3Rlcj5cbiAgICAgICAgPC9Qcm9ncmVzc1RhYnM+XG4gICAgICA8L0ZvY3VzTW9kYWwuQ29udGVudD5cbiAgICA8L0ZvY3VzTW9kYWw+XG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENvdXBvblByb2R1Y3RzUGFnZSh7XG4gIGFsbG93UHJvbW90aW9uTWlycm9yID0gZmFsc2UsXG4gIGFwaUJhc2UsXG4gIHRpdGxlLFxufToge1xuICBhbGxvd1Byb21vdGlvbk1pcnJvcj86IGJvb2xlYW5cbiAgYXBpQmFzZTogQXBpQmFzZVxuICB0aXRsZTogc3RyaW5nXG59KSB7XG4gIGNvbnN0IFtwcm9kdWN0cywgc2V0UHJvZHVjdHNdID0gdXNlU3RhdGU8Q291cG9uUHJvZHVjdFJvd1tdPihbXSlcbiAgY29uc3QgW29wdGlvbnMsIHNldE9wdGlvbnNdID0gdXNlU3RhdGU8T3B0aW9uc1BheWxvYWQ+KHt9KVxuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKVxuICBjb25zdCBbbG9hZEVycm9yLCBzZXRMb2FkRXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW21vZGFsT3Blbiwgc2V0TW9kYWxPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbZWRpdGluZ1Jvdywgc2V0RWRpdGluZ1Jvd10gPSB1c2VTdGF0ZTxDb3Vwb25Qcm9kdWN0Um93IHwgbnVsbD4obnVsbClcbiAgY29uc3QgcHJvbXB0ID0gdXNlUHJvbXB0KClcbiAgY29uc3QgY291cG9uQmFzZSA9IGAke2FwaUJhc2V9L2NvdXBvbi1wcm9kdWN0c2BcblxuICBjb25zdCBsb2FkID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIHNldExvYWRpbmcodHJ1ZSlcbiAgICBzZXRMb2FkRXJyb3IobnVsbClcbiAgICB0cnkge1xuICAgICAgY29uc3QgW3Byb2R1Y3RzUGF5bG9hZCwgb3B0aW9uc1BheWxvYWRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBhcGlGZXRjaDx7IGNvdXBvbl9wcm9kdWN0czogQ291cG9uUHJvZHVjdFJvd1tdIH0+KGNvdXBvbkJhc2UpLFxuICAgICAgICBhcGlGZXRjaDxPcHRpb25zUGF5bG9hZD4oYCR7Y291cG9uQmFzZX0vb3B0aW9uc2ApLFxuICAgICAgXSlcbiAgICAgIHNldFByb2R1Y3RzKHByb2R1Y3RzUGF5bG9hZC5jb3Vwb25fcHJvZHVjdHMgfHwgW10pXG4gICAgICBzZXRPcHRpb25zKG9wdGlvbnNQYXlsb2FkIHx8IHt9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgID8gZXJyb3IubWVzc2FnZVxuICAgICAgICAgIDogXCJGYWlsZWQgdG8gbG9hZCBjb3Vwb24gcHJvZHVjdHNcIlxuICAgICAgc2V0TG9hZEVycm9yKG1lc3NhZ2UpXG4gICAgICB0b2FzdC5lcnJvcihtZXNzYWdlKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgIH1cbiAgfSwgW2NvdXBvbkJhc2VdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgdm9pZCBsb2FkKClcbiAgfSwgW2xvYWRdKVxuXG4gIGNvbnN0IHJlbW92ZSA9IGFzeW5jIChyb3c6IENvdXBvblByb2R1Y3RSb3cpID0+IHtcbiAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBwcm9tcHQoe1xuICAgICAgdGl0bGU6IFwiUmVtb3ZlIGNvdXBvbiBwcm9kdWN0P1wiLFxuICAgICAgZGVzY3JpcHRpb246IGBUaGlzIHJlbW92ZXMgY291cG9uIGlzc3VhbmNlIGZyb20gJHtyb3cucHJvZHVjdC50aXRsZSB8fCByb3cucHJvZHVjdC5pZFxuICAgICAgICB9LiBUaGUgdW5kZXJseWluZyBNZWR1c2EgcHJvZHVjdCB3aWxsIHJlbWFpbiBhdmFpbGFibGUuYCxcbiAgICAgIGNvbmZpcm1UZXh0OiBcIlJlbW92ZSBwcm9kdWN0XCIsXG4gICAgICBjYW5jZWxUZXh0OiBcIkNhbmNlbFwiLFxuICAgICAgdmFyaWFudDogXCJkYW5nZXJcIixcbiAgICB9KVxuICAgIGlmICghY29uZmlybWVkKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhcGlGZXRjaChgJHtjb3Vwb25CYXNlfS8ke3Jvdy5wcm9kdWN0LmlkfWAsIHsgbWV0aG9kOiBcIkRFTEVURVwiIH0pXG4gICAgICB0b2FzdC5zdWNjZXNzKFwiQ291cG9uIGNvbmZpZ3VyYXRpb24gcmVtb3ZlZFwiKVxuICAgICAgYXdhaXQgbG9hZCgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRvYXN0LmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJEZWxldGUgZmFpbGVkXCIpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWlycm9yID0gYXN5bmMgKHJvdzogQ291cG9uUHJvZHVjdFJvdykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhcGlGZXRjaChcbiAgICAgICAgYC9hZG1pbi9jb3Vwb24tcHJvZHVjdHMvJHtyb3cucHJvZHVjdC5pZH0vbWlycm9yLXByb21vdGlvbmAsXG4gICAgICAgIHtcbiAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHt9KSxcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICAgIHRvYXN0LnN1Y2Nlc3MoXCJQcm9tb3Rpb24gbWlycm9yIGNyZWF0ZWRcIilcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdG9hc3QuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIk1pcnJvciBmYWlsZWRcIilcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxDb250YWluZXIgY2xhc3NOYW1lPVwiZGl2aWRlLXkgcC0wXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBweC02IHB5LTRcIj5cbiAgICAgICAgPEhlYWRpbmcgbGV2ZWw9XCJoMVwiPnt0aXRsZX08L0hlYWRpbmc+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLXgtMlwiPlxuICAgICAgICAgIDxCdXR0b24gc2l6ZT1cInNtYWxsXCIgdmFyaWFudD1cInNlY29uZGFyeVwiIG9uQ2xpY2s9eygpID0+IHZvaWQgbG9hZCgpfT5cbiAgICAgICAgICAgIDxBcnJvd1BhdGggLz4gUmVmcmVzaFxuICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgIHNldEVkaXRpbmdSb3cobnVsbClcbiAgICAgICAgICAgICAgc2V0TW9kYWxPcGVuKHRydWUpXG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxQbHVzIC8+IENyZWF0ZVxuICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgPENvdXBvbkVtcHR5U3RhdGUgdGl0bGU9XCJMb2FkaW5nIGNvdXBvbiBwcm9kdWN0c1wiIC8+XG4gICAgICApIDogbG9hZEVycm9yID8gKFxuICAgICAgICA8Q291cG9uRW1wdHlTdGF0ZSB0aXRsZT17bG9hZEVycm9yfSAvPlxuICAgICAgKSA6IHByb2R1Y3RzLmxlbmd0aCA/IChcbiAgICAgICAgPFRhYmxlPlxuICAgICAgICAgIDxUYWJsZS5IZWFkZXI+XG4gICAgICAgICAgICA8VGFibGUuUm93PlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5Qcm9kdWN0PC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5TdGF0dXM8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPlR5cGU8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPkNvZGU8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPkNhbXBhaWduPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5Jc3N1ZWQ8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsIC8+XG4gICAgICAgICAgICA8L1RhYmxlLlJvdz5cbiAgICAgICAgICA8L1RhYmxlLkhlYWRlcj5cbiAgICAgICAgICA8VGFibGUuQm9keVxuICAgICAgICAgICAgc3R5bGU9e3sgYm9yZGVyQm90dG9tOiAnbm9uZScgfX0+XG4gICAgICAgICAgICB7cHJvZHVjdHMubWFwKChyb3cpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgY29uZmlnID0gcm93LmNvdXBvbl9wcm9kdWN0X2NvbmZpZ1xuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxUYWJsZS5Sb3cga2V5PXtyb3cuaWR9XG4gICAgICAgICAgICAgICAgICBzdHlsZT17eyBib3JkZXJCb3R0b206ICdub25lJywgYmFja2dyb3VuZDogJ25vbmUnIH19PlxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHdlaWdodD1cInBsdXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtyb3cucHJvZHVjdC50aXRsZSB8fCByb3cucHJvZHVjdC5pZH1cbiAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3Jvdy5wcm9kdWN0LmhhbmRsZSB8fCByb3cucHJvZHVjdC5pZH1cbiAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICAgIDxTdGF0dXNCYWRnZVxuICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPXtjb3Vwb25TdGF0dXNDb2xvcihjb25maWcucHJvbW90aW9uX3N0YXR1cyl9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICB7Y29uZmlnLnByb21vdGlvbl9zdGF0dXMgfHwgXCJkcmFmdFwifVxuICAgICAgICAgICAgICAgICAgICA8L1N0YXR1c0JhZGdlPlxuICAgICAgICAgICAgICAgICAgPC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGw+e2NvdXBvblR5cGVMYWJlbChjb25maWcpfTwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgICB7Y29uZmlnLmNvZGVfc3RyYXRlZ3kgPT09IFwic2hhcmVkX2NvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgID8gY29uZmlnLnNoYXJlZF9jb2RlIHx8IFwiU2hhcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICA6IGAke2NvbmZpZy5jb2RlX3ByZWZpeCB8fCBcIkNPVVBPTlwifS0qYH1cbiAgICAgICAgICAgICAgICAgIDwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsPntjYW1wYWlnbkxhYmVsKGNvbmZpZyl9PC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGw+e3Jvdy5lbnRpdGxlbWVudHNfY291bnQgfHwgMH08L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktZW5kIGdhcC14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7YWxsb3dQcm9tb3Rpb25NaXJyb3IgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy5hbW91bnRzPy5sZW5ndGggfHwgMCkgPiAxXG4gICAgICAgICAgICAgICAgICAgICAgICApICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gdm9pZCBtaXJyb3Iocm93KX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0aW5nUm93KHJvdylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TW9kYWxPcGVuKHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxQZW5jaWxTcXVhcmUgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImRhbmdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB2b2lkIHJlbW92ZShyb3cpfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUcmFzaCAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICA8L1RhYmxlLlJvdz5cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgPC9UYWJsZS5Cb2R5PlxuICAgICAgICA8L1RhYmxlPlxuICAgICAgKSA6IChcbiAgICAgICAgPENvdXBvbkVtcHR5U3RhdGVcbiAgICAgICAgICB0aXRsZT1cIk5vIGNvdXBvbiBwcm9kdWN0cyBmb3VuZFwiXG4gICAgICAgICAgZGVzY3JpcHRpb249XCJDcmVhdGUgYSBuZXcgY291cG9uIHByb2R1Y3QgdG8gZ2V0IHN0YXJ0ZWQuXCJcbiAgICAgICAgLz5cbiAgICAgICl9XG5cbiAgICAgIDxDb3Vwb25Qcm9kdWN0TW9kYWxcbiAgICAgICAgb3Blbj17bW9kYWxPcGVufVxuICAgICAgICByb3c9e2VkaXRpbmdSb3d9XG4gICAgICAgIGFwaUJhc2U9e2FwaUJhc2V9XG4gICAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICAgIGFsbG93UHJvbW90aW9uTWlycm9yPXthbGxvd1Byb21vdGlvbk1pcnJvcn1cbiAgICAgICAgb25PcGVuQ2hhbmdlPXtzZXRNb2RhbE9wZW59XG4gICAgICAgIG9uU2F2ZWQ9e2xvYWR9XG4gICAgICAvPlxuICAgIDwvQ29udGFpbmVyPlxuICApXG59XG4iLCAiaW1wb3J0IHsgVGV4dCB9IGZyb20gXCJAbWVkdXNhanMvdWlcIlxuXG5leHBvcnQgZnVuY3Rpb24gQ291cG9uRW1wdHlTdGF0ZSh7XG4gIGRlc2NyaXB0aW9uLFxuICB0aXRsZSxcbn06IHtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgdGl0bGU6IHN0cmluZ1xufSkge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCB3LWZ1bGwgZmxleC0xIGZsZXgtY29sIG92ZXJmbG93LWhpZGRlblwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IG1pbi1oLVsyNTBweF0gdy1mdWxsIGZsZXgtMSBmbGV4LWNvbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHgtNiBweS00XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBzaXplLWZ1bGwgZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0yIHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgPFRleHQgd2VpZ2h0PVwicGx1c1wiPnt0aXRsZX08L1RleHQ+XG4gICAgICAgICAge2Rlc2NyaXB0aW9uID8gPFRleHQ+e2Rlc2NyaXB0aW9ufTwvVGV4dD4gOiBudWxsfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApXG59XG4iLCAiaW1wb3J0IHsgQ291cG9uRGV0YWlsUGFnZVZpZXcgfSBmcm9tIFwiLi4vLi4vLi4vLi4vZGFzaGJvYXJkL2NvdXBvbnMvY291cG9uLW1hbmFnZXJcIlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDb3Vwb25EZXRhaWxQYWdlKCkge1xuICByZXR1cm4gPENvdXBvbkRldGFpbFBhZ2VWaWV3IGFwaUJhc2U9XCIvYWRtaW5cIiAvPlxufVxuIiwgImltcG9ydCB0eXBlIHsgUm91dGVDb25maWcgfSBmcm9tIFwiQG1lcmN1cmpzL2Rhc2hib2FyZC1zZGtcIlxuaW1wb3J0IHsgUmVjZWlwdFBlcmNlbnQgfSBmcm9tIFwiQG1lZHVzYWpzL2ljb25zXCJcbmltcG9ydCB7IENvdXBvblByb2R1Y3RzUGFnZVZpZXcgfSBmcm9tIFwiLi4vLi4vLi4vLi4vZGFzaGJvYXJkL2NvdXBvbnMvY291cG9uLW1hbmFnZXJcIlxuXG5leHBvcnQgY29uc3QgY29uZmlnOiBSb3V0ZUNvbmZpZyA9IHtcbiAgbGFiZWw6IFwiQ291cG9uIFByb2R1Y3RzXCIsXG4gIGljb246IFJlY2VpcHRQZXJjZW50LFxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDb3Vwb25Qcm9kdWN0c1BhZ2UoKSB7XG4gIHJldHVybiAoXG4gICAgPENvdXBvblByb2R1Y3RzUGFnZVZpZXdcbiAgICAgIGFwaUJhc2U9XCIvYWRtaW5cIlxuICAgICAgdGl0bGU9XCJDb3Vwb24gUHJvZHVjdHNcIlxuICAgICAgYWxsb3dQcm9tb3Rpb25NaXJyb3JcbiAgICAvPlxuICApXG59XG4iLCAiaW1wb3J0IGkxOG5SZXNvdXJjZXMgZnJvbSBcIi4vaTE4blwiXG5pbXBvcnQgQ291cG9uc1BhZ2UsIHsgY29uZmlnIGFzIGNvdXBvbnNDb25maWcgfSBmcm9tIFwiLi9yb3V0ZXMvY291cG9ucy9wYWdlXCJcbmltcG9ydCBDb3Vwb25EZXRhaWxQYWdlIGZyb20gXCIuL3JvdXRlcy9jb3Vwb25zL1tpZF0vcGFnZVwiXG5pbXBvcnQgQ291cG9uUHJvZHVjdHNQYWdlLCB7XG4gIGNvbmZpZyBhcyBjb3Vwb25Qcm9kdWN0c0NvbmZpZyxcbn0gZnJvbSBcIi4vcm91dGVzL2NvdXBvbnMvcHJvZHVjdHMvcGFnZVwiXG5cbmNvbnN0IHJvdXRlTW9kdWxlID0ge1xuICByb3V0ZXM6IFtcbiAgICB7XG4gICAgICBDb21wb25lbnQ6IENvdXBvbnNQYWdlLFxuICAgICAgcGF0aDogXCIvY291cG9uc1wiLFxuICAgIH0sXG4gICAge1xuICAgICAgQ29tcG9uZW50OiBDb3Vwb25Qcm9kdWN0c1BhZ2UsXG4gICAgICBwYXRoOiBcIi9jb3Vwb25zL3Byb2R1Y3RzXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBDb21wb25lbnQ6IENvdXBvbkRldGFpbFBhZ2UsXG4gICAgICBwYXRoOiBcIi9jb3Vwb25zLzppZFwiLFxuICAgIH0sXG4gIF0sXG59XG5cbmNvbnN0IG1lbnVJdGVtTW9kdWxlID0ge1xuICBtZW51SXRlbXM6IFtcbiAgICB7XG4gICAgICBsYWJlbDogY291cG9uc0NvbmZpZy5sYWJlbCxcbiAgICAgIGljb246IGNvdXBvbnNDb25maWcuaWNvbixcbiAgICAgIHBhdGg6IFwiL2NvdXBvbnNcIixcbiAgICAgIHJhbms6IGNvdXBvbnNDb25maWcucmFuayxcbiAgICAgIG5lc3RlZDogY291cG9uc0NvbmZpZy5uZXN0ZWQsXG4gICAgICB0cmFuc2xhdGlvbk5zOiBjb3Vwb25zQ29uZmlnLnRyYW5zbGF0aW9uTnMsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogY291cG9uUHJvZHVjdHNDb25maWcubGFiZWwsXG4gICAgICBpY29uOiBjb3Vwb25Qcm9kdWN0c0NvbmZpZy5pY29uLFxuICAgICAgcGF0aDogXCIvY291cG9ucy9wcm9kdWN0c1wiLFxuICAgICAgcmFuazogMTEsXG4gICAgICBuZXN0ZWQ6IFwiL2NvdXBvbnNcIixcbiAgICAgIHRyYW5zbGF0aW9uTnM6IGNvdXBvblByb2R1Y3RzQ29uZmlnLnRyYW5zbGF0aW9uTnMsXG4gICAgfSxcbiAgXSxcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICB3aWRnZXRNb2R1bGU6IHtcbiAgICB3aWRnZXRzOiBbXSxcbiAgfSxcbiAgcm91dGVNb2R1bGUsXG4gIG1lbnVJdGVtTW9kdWxlLFxuICBmb3JtTW9kdWxlOiB7XG4gICAgY3VzdG9tRmllbGRzOiB7fSxcbiAgfSxcbiAgZGlzcGxheU1vZHVsZToge1xuICAgIGRpc3BsYXlzOiB7fSxcbiAgfSxcbiAgaTE4bk1vZHVsZTogaTE4blJlc291cmNlcyxcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQTtBQUFBLEVBQ0UsU0FBVztBQUFBLElBQ1QsTUFBUTtBQUFBLElBQ1IsY0FBZ0I7QUFBQSxFQUNsQjtBQUNGOzs7QUNIQSxJQUFPLGVBQVE7QUFBQSxFQUNiLElBQUk7QUFBQSxJQUNGLGFBQWE7QUFBQSxFQUNmO0FBQ0Y7OztBQ0xBLFNBQVMsc0JBQXNCOzs7QUNEL0I7QUFBQSxFQUNFLGVBQUFBO0FBQUEsRUFDQSxhQUFBQztBQUFBLEVBQ0EsV0FBQUM7QUFBQSxFQUNBLFlBQUFDO0FBQUEsT0FJSztBQUNQO0FBQUEsRUFDRSxhQUFBQztBQUFBLEVBQ0EsZ0JBQUFDO0FBQUEsRUFDQSxRQUFBQztBQUFBLEVBQ0E7QUFBQSxFQUNBLFNBQUFDO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0UsVUFBQUM7QUFBQSxFQUNBLGFBQUFD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QU8sT0FBYztBQUFBLE1BQ3JCLE1BQU0sT0FBYztBQUFBLE1BQ3BCLE1BQU07QUFBQSxNQUNOLE1BQU0sT0FBYztBQUFBLE1BQ3BCLFFBQVEsT0FBYztBQUFBLE1BQ3RCLGVBQWUsT0FBYztBQUFBLElBQy9CO0FBQUEsSUFDQTtBQUFBLE1BQ0UsT0FBT0MsUUFBcUI7QUFBQSxNQUM1QixNQUFNQSxRQUFxQjtBQUFBLE1BQzNCLE1BQU07QUFBQSxNQUNOLE1BQU07QUFBQSxNQUNOLFFBQVE7QUFBQSxNQUNSLGVBQWVBLFFBQXFCO0FBQUEsSUFDdEM7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxJQUFPLGdCQUFRO0FBQUEsRUFDYixjQUFjO0FBQUEsSUFDWixTQUFTLENBQUM7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBLFlBQVk7QUFBQSxJQUNWLGNBQWMsQ0FBQztBQUFBLEVBQ2pCO0FBQUEsRUFDQSxlQUFlO0FBQUEsSUFDYixVQUFVLENBQUM7QUFBQSxFQUNiO0FBQUEsRUFDQSxZQUFZO0FBQ2Q7IiwKICAibmFtZXMiOiBbInVzZUNhbGxiYWNrIiwgInVzZUVmZmVjdCIsICJ1c2VNZW1vIiwgInVzZVN0YXRlIiwgIkFycm93UGF0aCIsICJQZW5jaWxTcXVhcmUiLCAiUGx1cyIsICJUcmFzaCIsICJCdXR0b24iLCAiQ29udGFpbmVyIiwgIkN1cnJlbmN5SW5wdXQiLCAiRm9jdXNNb2RhbCIsICJIZWFkaW5nIiwgIklucHV0IiwgIkxhYmVsIiwgIlByb2dyZXNzVGFicyIsICJTZWxlY3QiLCAiU3RhdHVzQmFkZ2UiLCAiU3dpdGNoIiwgIlRhYmxlIiwgIlRleHQiLCAiVGV4dGFyZWEiLCAidG9hc3QiLCAidXNlUHJvbXB0IiwgIlRleHQiLCAianN4IiwgImpzeHMiLCAiY29uZmlnIiwgInJvdyIsICJUZXh0IiwgImpzeCIsICJqc3hzIiwgIlRleHQiLCAidmFsdWUiLCAidmFsdWVzIiwgInBheWxvYWQiLCAicm93IiwgImNvbmZpZyIsICJGcmFnbWVudCIsICJqc3giLCAianN4cyIsICJiYWNrZW5kVXJsIiwgImFwaUVycm9yTWVzc2FnZSIsICJhcGlGZXRjaCIsICJhbW91bnQiLCAiY3VycmVuY3kiLCAianN4cyIsICJqc3giLCAiVGV4dCIsICJIZWFkaW5nIiwgIkNvbnRhaW5lciIsICJTdGF0dXNCYWRnZSIsICJGcmFnbWVudCIsICJ1c2VTdGF0ZSIsICJ1c2VFZmZlY3QiLCAiYXBpRmV0Y2giLCAidG9hc3QiLCAiVGFibGUiLCAidXNlQ2FsbGJhY2siLCAiQnV0dG9uIiwgIkFycm93UGF0aCIsICJqc3giLCAianN4IiwgIlJlY2VpcHRQZXJjZW50IiwgImpzeCIsICJjb25maWciLCAiUmVjZWlwdFBlcmNlbnQiLCAiQ291cG9uUHJvZHVjdHNQYWdlIiwgIkNvdXBvblByb2R1Y3RzUGFnZSIsICJjb25maWciXQp9Cg==