@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.
- package/.medusa/server/src/admin/index.js +3207 -0
- package/.medusa/server/src/admin/index.mjs +3253 -0
- package/.medusa/server/src/api/admin/coupon-products/[product_id]/entitlements/route.js +9 -0
- package/.medusa/server/src/api/admin/coupon-products/[product_id]/mirror-promotion/route.js +132 -0
- package/.medusa/server/src/api/admin/coupon-products/[product_id]/preview/route.js +28 -0
- package/.medusa/server/src/api/admin/coupon-products/[product_id]/route.js +18 -0
- package/.medusa/server/src/api/admin/coupon-products/[product_id]/variants/[variant_config_id]/route.js +14 -0
- package/.medusa/server/src/api/admin/coupon-products/[product_id]/variants/route.js +14 -0
- package/.medusa/server/src/api/admin/coupon-products/configs/[id]/route.js +53 -0
- package/.medusa/server/src/api/admin/coupon-products/configs/[id]/variants/[variant_config_id]/route.js +26 -0
- package/.medusa/server/src/api/admin/coupon-products/configs/[id]/variants/route.js +27 -0
- package/.medusa/server/src/api/admin/coupon-products/configs/route.js +36 -0
- package/.medusa/server/src/api/admin/coupon-products/entitlements/[id]/cancel/route.js +15 -0
- package/.medusa/server/src/api/admin/coupon-products/entitlements/[id]/redeem/route.js +15 -0
- package/.medusa/server/src/api/admin/coupon-products/entitlements/[id]/route.js +16 -0
- package/.medusa/server/src/api/admin/coupon-products/entitlements/route.js +22 -0
- package/.medusa/server/src/api/admin/coupon-products/options/route.js +9 -0
- package/.medusa/server/src/api/admin/coupon-products/products/route.js +16 -0
- package/.medusa/server/src/api/admin/coupon-products/route.js +13 -0
- package/.medusa/server/src/api/admin/coupon-products/uploads/route.js +7 -0
- package/.medusa/server/src/api/coupon-product-routes.js +546 -0
- package/.medusa/server/src/api/entitlement-utils.js +90 -0
- package/.medusa/server/src/api/media-upload.js +57 -0
- package/.medusa/server/src/api/middlewares.js +92 -0
- package/.medusa/server/src/api/product-utils.js +304 -0
- package/.medusa/server/src/api/promotion-code-resolver.js +225 -0
- package/.medusa/server/src/api/seller-utils.js +101 -0
- package/.medusa/server/src/api/utils.js +25 -0
- package/.medusa/server/src/api/validators.js +199 -0
- package/.medusa/server/src/api/vendor/coupon-products/[product_id]/entitlements/route.js +9 -0
- package/.medusa/server/src/api/vendor/coupon-products/[product_id]/route.js +18 -0
- package/.medusa/server/src/api/vendor/coupon-products/[product_id]/variants/[variant_config_id]/route.js +14 -0
- package/.medusa/server/src/api/vendor/coupon-products/[product_id]/variants/route.js +14 -0
- package/.medusa/server/src/api/vendor/coupon-products/configs/[id]/route.js +60 -0
- package/.medusa/server/src/api/vendor/coupon-products/configs/[id]/variants/[variant_config_id]/route.js +41 -0
- package/.medusa/server/src/api/vendor/coupon-products/configs/[id]/variants/route.js +45 -0
- package/.medusa/server/src/api/vendor/coupon-products/configs/route.js +51 -0
- package/.medusa/server/src/api/vendor/coupon-products/entitlements/[id]/route.js +25 -0
- package/.medusa/server/src/api/vendor/coupon-products/entitlements/route.js +45 -0
- package/.medusa/server/src/api/vendor/coupon-products/options/route.js +9 -0
- package/.medusa/server/src/api/vendor/coupon-products/products/route.js +19 -0
- package/.medusa/server/src/api/vendor/coupon-products/route.js +13 -0
- package/.medusa/server/src/api/vendor/coupon-products/uploads/route.js +7 -0
- package/.medusa/server/src/jobs/retry-coupon-media-deletes.js +14 -0
- package/.medusa/server/src/links/coupon-issuance-order-line-item.js +17 -0
- package/.medusa/server/src/links/coupon-issuance-order.js +15 -0
- package/.medusa/server/src/links/coupon-product-config-product.js +17 -0
- package/.medusa/server/src/links/coupon-product-variant-config-variant.js +17 -0
- package/.medusa/server/src/links/coupon-promotion-mirror-promotion.js +17 -0
- package/.medusa/server/src/links/customer-coupon-entitlement-customer.js +15 -0
- package/.medusa/server/src/modules/coupon/constants.js +46 -0
- package/.medusa/server/src/modules/coupon/index.js +16 -0
- package/.medusa/server/src/modules/coupon/loaders/reconcile-coupon-products.js +65 -0
- package/.medusa/server/src/modules/coupon/migrations/Migration20260709000000.js +40 -0
- package/.medusa/server/src/modules/coupon/migrations/Migration20260710000000.js +22 -0
- package/.medusa/server/src/modules/coupon/migrations/Migration20260711000000.js +25 -0
- package/.medusa/server/src/modules/coupon/migrations/Migration20260712000000.js +78 -0
- package/.medusa/server/src/modules/coupon/migrations/Migration20260719000000.js +19 -0
- package/.medusa/server/src/modules/coupon/migrations/Migration20260722000000.js +17 -0
- package/.medusa/server/src/modules/coupon/migrations/Migration20260723000000.js +18 -0
- package/.medusa/server/src/modules/coupon/models/coupon-entitlement-promotion.js +31 -0
- package/.medusa/server/src/modules/coupon/models/coupon-entitlement-seller.js +28 -0
- package/.medusa/server/src/modules/coupon/models/coupon-issuance.js +35 -0
- package/.medusa/server/src/modules/coupon/models/coupon-media-asset.js +41 -0
- package/.medusa/server/src/modules/coupon/models/coupon-product-config.js +45 -0
- package/.medusa/server/src/modules/coupon/models/coupon-product-variant-config.js +36 -0
- package/.medusa/server/src/modules/coupon/models/coupon-promotion-mirror.js +27 -0
- package/.medusa/server/src/modules/coupon/models/customer-coupon-entitlement.js +56 -0
- package/.medusa/server/src/modules/coupon/models/index.js +23 -0
- package/.medusa/server/src/modules/coupon/payment-order-utils.js +76 -0
- package/.medusa/server/src/modules/coupon/product-metadata.js +24 -0
- package/.medusa/server/src/modules/coupon/purchase-conditions.js +138 -0
- package/.medusa/server/src/modules/coupon/service.js +628 -0
- package/.medusa/server/src/modules/coupon/types.js +3 -0
- package/.medusa/server/src/modules/coupon/utils.js +302 -0
- package/.medusa/server/src/subscribers/issue-coupons-from-order.js +88 -0
- package/.medusa/server/src/vendor/index.mjs +3237 -0
- package/.medusa/server/src/workflows/hooks/validate-coupon-add-to-cart.js +13 -0
- package/.medusa/server/src/workflows/hooks/validate-coupon-complete-cart.js +8 -0
- package/.medusa/server/src/workflows/index.js +21 -0
- package/.medusa/server/src/workflows/steps.js +27 -0
- package/.medusa/server/src/workflows/validate-coupon-purchase.js +85 -0
- package/README.md +84 -0
- 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==
|