@merchi/product-form 1.19.12
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/README.md +272 -0
- package/lib/actions/jobs.d.ts +3 -0
- package/lib/actions/jobs.js +80 -0
- package/lib/actions/leads.d.ts +7 -0
- package/lib/actions/leads.js +67 -0
- package/lib/components/AlertVariationSellerEditable.d.ts +6 -0
- package/lib/components/AlertVariationSellerEditable.js +46 -0
- package/lib/components/Collapse.d.ts +3 -0
- package/lib/components/Collapse.js +34 -0
- package/lib/components/DateCountdown.d.ts +44 -0
- package/lib/components/DateCountdown.js +188 -0
- package/lib/components/DropzoneInput.d.ts +10 -0
- package/lib/components/DropzoneInput.js +169 -0
- package/lib/components/DynamicVariationInput.d.ts +9 -0
- package/lib/components/DynamicVariationInput.js +71 -0
- package/lib/components/FormLead.d.ts +10 -0
- package/lib/components/FormLead.js +215 -0
- package/lib/components/GroupInventory.d.ts +6 -0
- package/lib/components/GroupInventory.js +16 -0
- package/lib/components/InputGroupQuantity.d.ts +8 -0
- package/lib/components/InputGroupQuantity.js +117 -0
- package/lib/components/InputHiddenStatic.d.ts +8 -0
- package/lib/components/InputHiddenStatic.js +24 -0
- package/lib/components/InputProductQuantity.d.ts +7 -0
- package/lib/components/InputProductQuantity.js +102 -0
- package/lib/components/InventoryStatus.d.ts +7 -0
- package/lib/components/InventoryStatus.js +67 -0
- package/lib/components/MerchiProductForm.d.ts +62 -0
- package/lib/components/MerchiProductForm.js +51 -0
- package/lib/components/PriceMatrix.d.ts +27 -0
- package/lib/components/PriceMatrix.js +106 -0
- package/lib/components/ProductButtonsSubmit.d.ts +3 -0
- package/lib/components/ProductButtonsSubmit.js +52 -0
- package/lib/components/ProductFeatureDeadline.d.ts +3 -0
- package/lib/components/ProductFeatureDeadline.js +25 -0
- package/lib/components/ProductGroupBuyStatus.d.ts +3 -0
- package/lib/components/ProductGroupBuyStatus.js +47 -0
- package/lib/components/ProductPriceMatrix.d.ts +3 -0
- package/lib/components/ProductPriceMatrix.js +51 -0
- package/lib/components/ProductTitle.d.ts +3 -0
- package/lib/components/ProductTitle.js +36 -0
- package/lib/components/ProductTotalCost.d.ts +3 -0
- package/lib/components/ProductTotalCost.js +74 -0
- package/lib/components/ProductUnitPrice.d.ts +7 -0
- package/lib/components/ProductUnitPrice.js +51 -0
- package/lib/components/TooltipElement.d.ts +9 -0
- package/lib/components/TooltipElement.js +35 -0
- package/lib/components/VariationAreaInput.d.ts +8 -0
- package/lib/components/VariationAreaInput.js +219 -0
- package/lib/components/VariationCheckBoxOrRadioOption.d.ts +10 -0
- package/lib/components/VariationCheckBoxOrRadioOption.js +82 -0
- package/lib/components/VariationCheckboxRadio.d.ts +17 -0
- package/lib/components/VariationCheckboxRadio.js +57 -0
- package/lib/components/VariationColourExtractInput.d.ts +8 -0
- package/lib/components/VariationColourExtractInput.js +395 -0
- package/lib/components/VariationError.d.ts +7 -0
- package/lib/components/VariationError.js +52 -0
- package/lib/components/VariationFieldInputInstructions.d.ts +10 -0
- package/lib/components/VariationFieldInputInstructions.js +50 -0
- package/lib/components/VariationFieldInstructions.d.ts +3 -0
- package/lib/components/VariationFieldInstructions.js +22 -0
- package/lib/components/VariationFieldNameAndCostInputs.d.ts +7 -0
- package/lib/components/VariationFieldNameAndCostInputs.js +34 -0
- package/lib/components/VariationFieldOptionDefaultInputs.d.ts +7 -0
- package/lib/components/VariationFieldOptionDefaultInputs.js +48 -0
- package/lib/components/VariationFieldStaticValues.d.ts +8 -0
- package/lib/components/VariationFieldStaticValues.js +57 -0
- package/lib/components/VariationFileInput.d.ts +8 -0
- package/lib/components/VariationFileInput.js +229 -0
- package/lib/components/VariationInput.d.ts +11 -0
- package/lib/components/VariationInput.js +97 -0
- package/lib/components/VariationLabel.d.ts +11 -0
- package/lib/components/VariationLabel.js +85 -0
- package/lib/components/VariationOptionColour.d.ts +8 -0
- package/lib/components/VariationOptionColour.js +50 -0
- package/lib/components/VariationOptionImage.d.ts +8 -0
- package/lib/components/VariationOptionImage.js +52 -0
- package/lib/components/VariationSelect.d.ts +8 -0
- package/lib/components/VariationSelect.js +66 -0
- package/lib/components/VariationSelectElements.d.ts +16 -0
- package/lib/components/VariationSelectElements.js +141 -0
- package/lib/components/VariationTurnaroundTime.d.ts +9 -0
- package/lib/components/VariationTurnaroundTime.js +156 -0
- package/lib/components/Variations.d.ts +9 -0
- package/lib/components/Variations.js +109 -0
- package/lib/components/VariationsGroups.d.ts +8 -0
- package/lib/components/VariationsGroups.js +79 -0
- package/lib/components/buttons/ButtonAddGroup.d.ts +7 -0
- package/lib/components/buttons/ButtonAddGroup.js +38 -0
- package/lib/components/buttons/ButtonProductSubmit.d.ts +7 -0
- package/lib/components/buttons/ButtonProductSubmit.js +33 -0
- package/lib/components/buttons/ButtonRemoveGroup.d.ts +8 -0
- package/lib/components/buttons/ButtonRemoveGroup.js +25 -0
- package/lib/components/buttons/index.d.ts +4 -0
- package/lib/components/buttons/index.js +5 -0
- package/lib/components/cost.d.ts +11 -0
- package/lib/components/cost.js +44 -0
- package/lib/components/currency.d.ts +16 -0
- package/lib/components/currency.js +184 -0
- package/lib/components/drafts/DraftApprovePanel.d.ts +6 -0
- package/lib/components/drafts/DraftApprovePanel.js +315 -0
- package/lib/components/drafts/DraftCanvas.d.ts +13 -0
- package/lib/components/drafts/DraftCanvas.js +496 -0
- package/lib/components/drafts/DraftDesignerSheet.d.ts +9 -0
- package/lib/components/drafts/DraftDesignerSheet.js +685 -0
- package/lib/components/drafts/ProductDraftsHost.d.ts +3 -0
- package/lib/components/drafts/ProductDraftsHost.js +207 -0
- package/lib/components/drafts/useHtmlImage.d.ts +1 -0
- package/lib/components/drafts/useHtmlImage.js +45 -0
- package/lib/components/icons/IconChecked.d.ts +3 -0
- package/lib/components/icons/IconChecked.js +10 -0
- package/lib/components/icons/IconCheckedOrNoStock.d.ts +7 -0
- package/lib/components/icons/IconCheckedOrNoStock.js +13 -0
- package/lib/components/icons/IconCountryFlag.d.ts +8 -0
- package/lib/components/icons/IconCountryFlag.js +27 -0
- package/lib/components/icons/IconFile.d.ts +7 -0
- package/lib/components/icons/IconFile.js +41 -0
- package/lib/components/icons/IconNoStock.d.ts +3 -0
- package/lib/components/icons/IconNoStock.js +12 -0
- package/lib/components/icons/index.d.ts +5 -0
- package/lib/components/icons/index.js +6 -0
- package/lib/components/quoteAfterFieldChange.d.ts +7 -0
- package/lib/components/quoteAfterFieldChange.js +11 -0
- package/lib/components/quoteAfterFieldChange.test.js +58 -0
- package/lib/components/utils.d.ts +26 -0
- package/lib/components/utils.js +500 -0
- package/lib/context/MerchiProductFormProvider.d.ts +177 -0
- package/lib/context/MerchiProductFormProvider.js +1020 -0
- package/lib/images/product-not-found.png +0 -0
- package/lib/index.d.ts +42 -0
- package/lib/index.js +41 -0
- package/lib/styles/globals.css +1590 -0
- package/lib/styles/globals.css.map +1 -0
- package/lib/styles/globals.scss +1698 -0
- package/lib/utils/area.d.ts +77 -0
- package/lib/utils/area.js +298 -0
- package/lib/utils/cleanFormVariationJson.d.ts +5 -0
- package/lib/utils/cleanFormVariationJson.js +39 -0
- package/lib/utils/cleanFormVariationJson.test.js +54 -0
- package/lib/utils/countries.d.ts +7 -0
- package/lib/utils/countries.js +290 -0
- package/lib/utils/currency.d.ts +2 -0
- package/lib/utils/currency.js +188 -0
- package/lib/utils/draftExport.d.ts +21 -0
- package/lib/utils/draftExport.js +481 -0
- package/lib/utils/draftExport.test.js +78 -0
- package/lib/utils/draftFonts.d.ts +55 -0
- package/lib/utils/draftFonts.js +68 -0
- package/lib/utils/draftStorage.d.ts +25 -0
- package/lib/utils/draftStorage.js +148 -0
- package/lib/utils/draftStorage.test.js +125 -0
- package/lib/utils/draftTemplates.d.ts +87 -0
- package/lib/utils/draftTemplates.js +579 -0
- package/lib/utils/draftTemplates.test.js +476 -0
- package/lib/utils/formErrors.d.ts +2 -0
- package/lib/utils/formErrors.js +29 -0
- package/lib/utils/index.d.ts +3 -0
- package/lib/utils/index.js +4 -0
- package/lib/utils/priceMatrix.d.ts +57 -0
- package/lib/utils/priceMatrix.js +82 -0
- package/lib/utils/priceMatrix.test.js +200 -0
- package/lib/utils/products.d.ts +40 -0
- package/lib/utils/products.js +68 -0
- package/lib/utils/quantity.d.ts +7 -0
- package/lib/utils/quantity.js +19 -0
- package/lib/utils/quantity.test.js +42 -0
- package/lib/utils/reconcileVariations.d.ts +25 -0
- package/lib/utils/reconcileVariations.js +246 -0
- package/lib/utils/reconcileVariations.test.js +239 -0
- package/lib/utils/selectedVariationCosts.d.ts +6 -0
- package/lib/utils/selectedVariationCosts.js +59 -0
- package/lib/utils/selectedVariationCosts.test.js +66 -0
- package/lib/utils/selections.d.ts +23 -0
- package/lib/utils/selections.js +76 -0
- package/lib/utils/selections.test.js +159 -0
- package/lib/utils/singleOptionVariation.d.ts +2 -0
- package/lib/utils/singleOptionVariation.js +22 -0
- package/lib/utils/singleOptionVariation.test.js +59 -0
- package/lib/utils/supportedNumbers.d.ts +1 -0
- package/lib/utils/supportedNumbers.js +27 -0
- package/lib/utils/types.d.ts +114 -0
- package/lib/utils/types.js +50 -0
- package/lib/utils/url.d.ts +3 -0
- package/lib/utils/url.js +65 -0
- package/lib/utils/variationFields.d.ts +5 -0
- package/lib/utils/variationFields.js +116 -0
- package/lib/utils/variationFields.test.js +108 -0
- package/package.json +93 -0
|
@@ -0,0 +1,579 @@
|
|
|
1
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
5
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
6
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
7
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
8
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
9
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
10
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
11
|
+
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
|
|
12
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
13
|
+
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
|
|
14
|
+
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
|
|
15
|
+
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
16
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
17
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
18
|
+
import { BLANK_TEMPLATE_ID, DEFAULT_ARTBOARD, FieldType } from './types';
|
|
19
|
+
import { DEFAULT_DRAFT_FONT, cssFontFamily } from './draftFonts';
|
|
20
|
+
import { productHasGroups } from './products';
|
|
21
|
+
export function productHasDraftTemplates(product) {
|
|
22
|
+
return Array.isArray(product === null || product === void 0 ? void 0 : product.draftTemplates) && product.draftTemplates.length > 0;
|
|
23
|
+
}
|
|
24
|
+
export function productAllowsClientDesign(product) {
|
|
25
|
+
return Boolean((product === null || product === void 0 ? void 0 : product.needsDrafting) && (product === null || product === void 0 ? void 0 : product.allowClientDraftContribution) && productHasDraftTemplates(product));
|
|
26
|
+
}
|
|
27
|
+
export function productHasVariationGroups(product) {
|
|
28
|
+
return productHasGroups(product);
|
|
29
|
+
}
|
|
30
|
+
export function designGroupCount(product, formValues) {
|
|
31
|
+
if (!productHasVariationGroups(product)) return 1;
|
|
32
|
+
var groups = formValues === null || formValues === void 0 ? void 0 : formValues.variationsGroups;
|
|
33
|
+
return Array.isArray(groups) && groups.length > 0 ? groups.length : 1;
|
|
34
|
+
}
|
|
35
|
+
export function parseSelectedOptionIds(value) {
|
|
36
|
+
if (value === undefined || value === null || value === '') return [];
|
|
37
|
+
return String(value).split(',').map(function (s) {
|
|
38
|
+
return parseInt(s.trim(), 10);
|
|
39
|
+
}).filter(function (n) {
|
|
40
|
+
return !isNaN(n);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
export function selectedOptionIdsFromVariations(variations) {
|
|
44
|
+
var ids = new Set();
|
|
45
|
+
var _iterator = _createForOfIteratorHelper(variations || []),
|
|
46
|
+
_step;
|
|
47
|
+
try {
|
|
48
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
49
|
+
var variation = _step.value;
|
|
50
|
+
var _iterator2 = _createForOfIteratorHelper(parseSelectedOptionIds(variation === null || variation === void 0 ? void 0 : variation.value)),
|
|
51
|
+
_step2;
|
|
52
|
+
try {
|
|
53
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
54
|
+
var id = _step2.value;
|
|
55
|
+
ids.add(id);
|
|
56
|
+
}
|
|
57
|
+
} catch (err) {
|
|
58
|
+
_iterator2.e(err);
|
|
59
|
+
} finally {
|
|
60
|
+
_iterator2.f();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
} catch (err) {
|
|
64
|
+
_iterator.e(err);
|
|
65
|
+
} finally {
|
|
66
|
+
_iterator.f();
|
|
67
|
+
}
|
|
68
|
+
return ids;
|
|
69
|
+
}
|
|
70
|
+
export function isTemplateVisible(template, selectedOptionIds) {
|
|
71
|
+
var required = template === null || template === void 0 ? void 0 : template.selectedByVariationFieldOptions;
|
|
72
|
+
if (!Array.isArray(required) || required.length === 0) return true;
|
|
73
|
+
return required.every(function (opt) {
|
|
74
|
+
return (opt === null || opt === void 0 ? void 0 : opt.id) && selectedOptionIds.has(opt.id);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
export function visibleTemplatesForGroup(product, independentVariations, groupVariations) {
|
|
78
|
+
var selected = selectedOptionIdsFromVariations([].concat(_toConsumableArray(independentVariations || []), _toConsumableArray(groupVariations || [])));
|
|
79
|
+
return ((product === null || product === void 0 ? void 0 : product.draftTemplates) || []).filter(function (template) {
|
|
80
|
+
return isTemplateVisible(template, selected);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
export function blankTemplate(product) {
|
|
84
|
+
var _product$draftTemplat, _product$featureImage, _product$draftTemplat2, _product$featureImage2;
|
|
85
|
+
var fromProduct = Number(product === null || product === void 0 || (_product$draftTemplat = product.draftTemplates) === null || _product$draftTemplat === void 0 || (_product$draftTemplat = _product$draftTemplat[0]) === null || _product$draftTemplat === void 0 ? void 0 : _product$draftTemplat.width) || Number(product === null || product === void 0 || (_product$featureImage = product.featureImage) === null || _product$featureImage === void 0 ? void 0 : _product$featureImage.width) || DEFAULT_ARTBOARD.width;
|
|
86
|
+
var height = Number(product === null || product === void 0 || (_product$draftTemplat2 = product.draftTemplates) === null || _product$draftTemplat2 === void 0 || (_product$draftTemplat2 = _product$draftTemplat2[0]) === null || _product$draftTemplat2 === void 0 ? void 0 : _product$draftTemplat2.height) || Number(product === null || product === void 0 || (_product$featureImage2 = product.featureImage) === null || _product$featureImage2 === void 0 ? void 0 : _product$featureImage2.height) || DEFAULT_ARTBOARD.height;
|
|
87
|
+
return {
|
|
88
|
+
id: BLANK_TEMPLATE_ID,
|
|
89
|
+
name: 'Artwork',
|
|
90
|
+
width: fromProduct,
|
|
91
|
+
height: height,
|
|
92
|
+
file: null,
|
|
93
|
+
editedByVariationFields: [],
|
|
94
|
+
selectedByVariationFieldOptions: []
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
export function templatesForGroup(product, independentVariations, groupVariations) {
|
|
98
|
+
var visible = visibleTemplatesForGroup(product, independentVariations, groupVariations);
|
|
99
|
+
return visible.length ? visible : [blankTemplate(product)];
|
|
100
|
+
}
|
|
101
|
+
export function canvasKindForFieldType(fieldType) {
|
|
102
|
+
switch (parseInt(String(fieldType), 10)) {
|
|
103
|
+
case FieldType.TEXT_INPUT:
|
|
104
|
+
case FieldType.TEXT_AREA:
|
|
105
|
+
case FieldType.NUMBER_INPUT:
|
|
106
|
+
case FieldType.SELECT:
|
|
107
|
+
case FieldType.RADIO:
|
|
108
|
+
case FieldType.CHECKBOX:
|
|
109
|
+
return 'text';
|
|
110
|
+
case FieldType.FILE_UPLOAD:
|
|
111
|
+
case FieldType.IMAGE_SELECT:
|
|
112
|
+
return 'image';
|
|
113
|
+
case FieldType.COLOUR_PICKER:
|
|
114
|
+
case FieldType.COLOUR_SELECT:
|
|
115
|
+
case FieldType.COLOUR_EXTRACT:
|
|
116
|
+
return 'rect';
|
|
117
|
+
default:
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function optionById(variation, id) {
|
|
122
|
+
var _variation$variationF;
|
|
123
|
+
var fromSelectable = ((variation === null || variation === void 0 ? void 0 : variation.selectableOptions) || []).find(function (option) {
|
|
124
|
+
return option.optionId === id || option.id === id;
|
|
125
|
+
});
|
|
126
|
+
if (fromSelectable) return fromSelectable;
|
|
127
|
+
return ((variation === null || variation === void 0 || (_variation$variationF = variation.variationField) === null || _variation$variationF === void 0 ? void 0 : _variation$variationF.options) || []).find(function (option) {
|
|
128
|
+
return option.id === id || option.optionId === id;
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
export function variationCanvasContent(variation) {
|
|
132
|
+
var field = variation === null || variation === void 0 ? void 0 : variation.variationField;
|
|
133
|
+
var kind = canvasKindForFieldType(field === null || field === void 0 ? void 0 : field.fieldType);
|
|
134
|
+
if (!kind) return {
|
|
135
|
+
kind: null
|
|
136
|
+
};
|
|
137
|
+
var type = parseInt(String(field.fieldType), 10);
|
|
138
|
+
if (kind === 'text') {
|
|
139
|
+
if (type === FieldType.SELECT || type === FieldType.RADIO || type === FieldType.CHECKBOX) {
|
|
140
|
+
var names = parseSelectedOptionIds(variation.value).map(function (id) {
|
|
141
|
+
var _optionById;
|
|
142
|
+
return (_optionById = optionById(variation, id)) === null || _optionById === void 0 ? void 0 : _optionById.value;
|
|
143
|
+
}).filter(Boolean);
|
|
144
|
+
return {
|
|
145
|
+
kind: kind,
|
|
146
|
+
text: names.join(', ')
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
kind: kind,
|
|
151
|
+
text: (variation === null || variation === void 0 ? void 0 : variation.value) != null && variation.value !== '' ? String(variation.value) : ''
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
if (kind === 'image') {
|
|
155
|
+
if (type === FieldType.FILE_UPLOAD) {
|
|
156
|
+
var _file = ((variation === null || variation === void 0 ? void 0 : variation.variationFiles) || [])[0];
|
|
157
|
+
return {
|
|
158
|
+
kind: kind,
|
|
159
|
+
src: (_file === null || _file === void 0 ? void 0 : _file.viewUrl) || (_file === null || _file === void 0 ? void 0 : _file.cachedViewUrl) || ''
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
var _ids = parseSelectedOptionIds(variation.value);
|
|
163
|
+
var _option = _ids.length ? optionById(variation, _ids[0]) : null;
|
|
164
|
+
var file = _option === null || _option === void 0 ? void 0 : _option.linkedFile;
|
|
165
|
+
return {
|
|
166
|
+
kind: kind,
|
|
167
|
+
src: (file === null || file === void 0 ? void 0 : file.viewUrl) || (file === null || file === void 0 ? void 0 : file.cachedViewUrl) || ''
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
if (type === FieldType.COLOUR_PICKER) {
|
|
171
|
+
return {
|
|
172
|
+
kind: kind,
|
|
173
|
+
fill: normaliseCssColour(variation === null || variation === void 0 ? void 0 : variation.value) || '#000000'
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
var ids = parseSelectedOptionIds(variation.value);
|
|
177
|
+
var option = ids.length ? optionById(variation, ids[0]) : null;
|
|
178
|
+
var selected = ((variation === null || variation === void 0 ? void 0 : variation.selectedOptions) || [])[0];
|
|
179
|
+
return {
|
|
180
|
+
kind: kind,
|
|
181
|
+
fill: normaliseCssColour(option === null || option === void 0 ? void 0 : option.colour, selected === null || selected === void 0 ? void 0 : selected.colour, option === null || option === void 0 ? void 0 : option.value, selected === null || selected === void 0 ? void 0 : selected.value, variation === null || variation === void 0 ? void 0 : variation.value)
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
var HEX_COLOUR = /^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i;
|
|
185
|
+
var CSS_FUNCTION_COLOUR = /^(rgba?|hsla?)\(/i;
|
|
186
|
+
export function normaliseCssColour() {
|
|
187
|
+
for (var _len = arguments.length, candidates = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
188
|
+
candidates[_key] = arguments[_key];
|
|
189
|
+
}
|
|
190
|
+
for (var _i = 0, _candidates = candidates; _i < _candidates.length; _i++) {
|
|
191
|
+
var value = _candidates[_i];
|
|
192
|
+
if (value == null || value === '') continue;
|
|
193
|
+
var raw = String(value).trim();
|
|
194
|
+
if (!raw || /^\d+$/.test(raw)) continue;
|
|
195
|
+
if (HEX_COLOUR.test(raw)) {
|
|
196
|
+
if (raw.length === 4) {
|
|
197
|
+
return "#".concat(raw[1]).concat(raw[1]).concat(raw[2]).concat(raw[2]).concat(raw[3]).concat(raw[3]);
|
|
198
|
+
}
|
|
199
|
+
return raw;
|
|
200
|
+
}
|
|
201
|
+
if (CSS_FUNCTION_COLOUR.test(raw)) return raw;
|
|
202
|
+
if (/^[a-z][a-z\s-]{2,}$/i.test(raw)) return raw;
|
|
203
|
+
}
|
|
204
|
+
return undefined;
|
|
205
|
+
}
|
|
206
|
+
export function linkedVariationsForTemplate(template, variations) {
|
|
207
|
+
var linkedIds = new Set(((template === null || template === void 0 ? void 0 : template.editedByVariationFields) || []).map(function (field) {
|
|
208
|
+
return field === null || field === void 0 ? void 0 : field.id;
|
|
209
|
+
}).filter(function (id) {
|
|
210
|
+
return id != null;
|
|
211
|
+
}));
|
|
212
|
+
if (!linkedIds.size) return [];
|
|
213
|
+
return (variations || []).filter(function (variation) {
|
|
214
|
+
var _variation$variationF2;
|
|
215
|
+
return linkedIds.has(variation === null || variation === void 0 || (_variation$variationF2 = variation.variationField) === null || _variation$variationF2 === void 0 ? void 0 : _variation$variationF2.id);
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
export function variationsForGroup(formValues, groupIndex) {
|
|
219
|
+
var _formValues$variation;
|
|
220
|
+
var independent = (formValues === null || formValues === void 0 ? void 0 : formValues.variations) || [];
|
|
221
|
+
var group = (formValues === null || formValues === void 0 || (_formValues$variation = formValues.variationsGroups) === null || _formValues$variation === void 0 || (_formValues$variation = _formValues$variation[groupIndex]) === null || _formValues$variation === void 0 ? void 0 : _formValues$variation.variations) || [];
|
|
222
|
+
return [].concat(_toConsumableArray(independent), _toConsumableArray(group));
|
|
223
|
+
}
|
|
224
|
+
function isValidBbox(bbox) {
|
|
225
|
+
if (!Array.isArray(bbox) || bbox.length !== 4) return false;
|
|
226
|
+
var _bbox$map = bbox.map(Number),
|
|
227
|
+
_bbox$map2 = _slicedToArray(_bbox$map, 4),
|
|
228
|
+
x = _bbox$map2[0],
|
|
229
|
+
y = _bbox$map2[1],
|
|
230
|
+
w = _bbox$map2[2],
|
|
231
|
+
h = _bbox$map2[3];
|
|
232
|
+
return w > 0 && h > 0 && x >= 0 && x <= 1 && y >= 0 && y <= 1;
|
|
233
|
+
}
|
|
234
|
+
export function regionsForRole(customisationMap, role) {
|
|
235
|
+
var regions = customisationMap === null || customisationMap === void 0 ? void 0 : customisationMap.regions;
|
|
236
|
+
if (!Array.isArray(regions)) return [];
|
|
237
|
+
return regions.filter(function (region) {
|
|
238
|
+
return (region === null || region === void 0 ? void 0 : region.role) === role && isValidBbox(region.bbox);
|
|
239
|
+
}).map(function (region) {
|
|
240
|
+
return region.bbox.map(Number);
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
export function bboxToPixels(bbox, width, height) {
|
|
244
|
+
var _bbox = _slicedToArray(bbox, 4),
|
|
245
|
+
x = _bbox[0],
|
|
246
|
+
y = _bbox[1],
|
|
247
|
+
w = _bbox[2],
|
|
248
|
+
h = _bbox[3];
|
|
249
|
+
return {
|
|
250
|
+
x: x * width,
|
|
251
|
+
y: y * height,
|
|
252
|
+
width: w * width,
|
|
253
|
+
height: h * height
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
export function fieldBindingsFrom(template) {
|
|
257
|
+
var _template$customisati;
|
|
258
|
+
var raw = template === null || template === void 0 || (_template$customisati = template.customisationMap) === null || _template$customisati === void 0 ? void 0 : _template$customisati.fieldBindings;
|
|
259
|
+
if (!Array.isArray(raw)) return [];
|
|
260
|
+
return raw.filter(function (item) {
|
|
261
|
+
return item && item.fieldId != null;
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
export function bindingForField(bindings, fieldId) {
|
|
265
|
+
var id = Number(fieldId);
|
|
266
|
+
return bindings.find(function (item) {
|
|
267
|
+
return Number(item.fieldId) === id;
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
function fieldName(field) {
|
|
271
|
+
return String((field === null || field === void 0 ? void 0 : field.name) || '').toLowerCase();
|
|
272
|
+
}
|
|
273
|
+
function isColourKind(kind) {
|
|
274
|
+
return kind === 'rect';
|
|
275
|
+
}
|
|
276
|
+
export function inferArtworkRole(field) {
|
|
277
|
+
var linkedFields = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
278
|
+
var kind = canvasKindForFieldType(field === null || field === void 0 ? void 0 : field.fieldType);
|
|
279
|
+
if (kind === 'image') return 'image';
|
|
280
|
+
if (kind === 'text') return 'text';
|
|
281
|
+
if (!isColourKind(kind)) return 'auto';
|
|
282
|
+
var name = fieldName(field);
|
|
283
|
+
if (/(text|font|letter|copy)/.test(name)) return 'text_fill';
|
|
284
|
+
if (/(wrist|band|base|body|ground|blank)/.test(name)) return 'body_colour_fill';
|
|
285
|
+
var hasText = linkedFields.some(function (item) {
|
|
286
|
+
return canvasKindForFieldType(item === null || item === void 0 ? void 0 : item.fieldType) === 'text';
|
|
287
|
+
});
|
|
288
|
+
return hasText ? 'text_fill' : 'body_colour_fill';
|
|
289
|
+
}
|
|
290
|
+
export function resolveArtworkRole(field, template) {
|
|
291
|
+
var linkedFields = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
292
|
+
var inferred = inferArtworkRole(field, linkedFields);
|
|
293
|
+
if (inferred === 'body_colour_fill') return 'body_colour_fill';
|
|
294
|
+
var binding = bindingForField(fieldBindingsFrom(template), field === null || field === void 0 ? void 0 : field.id);
|
|
295
|
+
if (binding !== null && binding !== void 0 && binding.role && binding.role !== 'auto') return binding.role;
|
|
296
|
+
return inferred;
|
|
297
|
+
}
|
|
298
|
+
export function inferTextTargetFieldId(field, template) {
|
|
299
|
+
var linkedFields = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
300
|
+
var binding = bindingForField(fieldBindingsFrom(template), field === null || field === void 0 ? void 0 : field.id);
|
|
301
|
+
if ((binding === null || binding === void 0 ? void 0 : binding.targetFieldId) != null) return Number(binding.targetFieldId);
|
|
302
|
+
var textField = linkedFields.find(function (item) {
|
|
303
|
+
return canvasKindForFieldType(item === null || item === void 0 ? void 0 : item.fieldType) === 'text' && (item === null || item === void 0 ? void 0 : item.id) != null;
|
|
304
|
+
});
|
|
305
|
+
return (textField === null || textField === void 0 ? void 0 : textField.id) != null ? Number(textField.id) : undefined;
|
|
306
|
+
}
|
|
307
|
+
export function fitInside(box, contentWidth, contentHeight) {
|
|
308
|
+
var lockAspectRatio = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
|
|
309
|
+
if (!lockAspectRatio || !(contentWidth > 0) || !(contentHeight > 0) || !(box.width > 0) || !(box.height > 0)) {
|
|
310
|
+
return _objectSpread({}, box);
|
|
311
|
+
}
|
|
312
|
+
var scale = Math.min(box.width / contentWidth, box.height / contentHeight);
|
|
313
|
+
var width = contentWidth * scale;
|
|
314
|
+
var height = contentHeight * scale;
|
|
315
|
+
return {
|
|
316
|
+
x: box.x + (box.width - width) / 2,
|
|
317
|
+
y: box.y + (box.height - height) / 2,
|
|
318
|
+
width: width,
|
|
319
|
+
height: height
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
export function shouldLockImageAspect(field, template) {
|
|
323
|
+
var binding = bindingForField(fieldBindingsFrom(template), field === null || field === void 0 ? void 0 : field.id);
|
|
324
|
+
if (typeof (binding === null || binding === void 0 ? void 0 : binding.lockAspectRatio) === 'boolean') return binding.lockAspectRatio;
|
|
325
|
+
if (typeof (field === null || field === void 0 ? void 0 : field.aspectRatioLock) === 'boolean') return field.aspectRatioLock;
|
|
326
|
+
return true;
|
|
327
|
+
}
|
|
328
|
+
export function isBackgroundFill(obj) {
|
|
329
|
+
return (obj === null || obj === void 0 ? void 0 : obj.type) === 'rect';
|
|
330
|
+
}
|
|
331
|
+
export function isFullArtboardFill(obj, artWidth, artHeight) {
|
|
332
|
+
return Number(obj.width) >= artWidth * 0.9 && Number(obj.height) >= artHeight * 0.9 && Number(obj.x) <= artWidth * 0.05 && Number(obj.y) <= artHeight * 0.05;
|
|
333
|
+
}
|
|
334
|
+
export function measureDraftText(text) {
|
|
335
|
+
var fontSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 48;
|
|
336
|
+
var fontFamily = arguments.length > 2 ? arguments[2] : undefined;
|
|
337
|
+
var lines = String(text || 'Text').split('\n');
|
|
338
|
+
var size = Math.max(12, Number(fontSize) || 48);
|
|
339
|
+
var width = 0;
|
|
340
|
+
if (typeof document !== 'undefined') {
|
|
341
|
+
var canvas = document.createElement('canvas');
|
|
342
|
+
var ctx = canvas.getContext('2d');
|
|
343
|
+
if (ctx) {
|
|
344
|
+
ctx.font = "".concat(size, "px ").concat(cssFontFamily(fontFamily));
|
|
345
|
+
width = Math.max.apply(Math, _toConsumableArray(lines.map(function (line) {
|
|
346
|
+
return ctx.measureText(line || ' ').width;
|
|
347
|
+
})).concat([0]));
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
if (!(width > 0)) {
|
|
351
|
+
width = Math.max.apply(Math, _toConsumableArray(lines.map(function (line) {
|
|
352
|
+
return (line || ' ').length;
|
|
353
|
+
})).concat([1])) * size * 0.62;
|
|
354
|
+
}
|
|
355
|
+
return {
|
|
356
|
+
width: Math.ceil(width + size * 0.16),
|
|
357
|
+
height: Math.ceil(Math.max(1, lines.length) * size * 1.15)
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
export function fitTextBox(obj) {
|
|
361
|
+
var measured = measureDraftText(obj.text || 'Text', obj.fontSize, obj.fontFamily);
|
|
362
|
+
var width = Math.max(24, measured.width);
|
|
363
|
+
var height = Math.max(20, measured.height);
|
|
364
|
+
var prevW = Number(obj.width) > 0 ? Number(obj.width) : width;
|
|
365
|
+
var prevH = Number(obj.height) > 0 ? Number(obj.height) : height;
|
|
366
|
+
return {
|
|
367
|
+
width: width,
|
|
368
|
+
height: height,
|
|
369
|
+
x: (Number(obj.x) || 0) + (prevW - width) / 2,
|
|
370
|
+
y: (Number(obj.y) || 0) + (prevH - height) / 2
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
function placementBoxes(role, kind, template) {
|
|
374
|
+
if (role === 'body_colour_fill' || kind === 'rect') {
|
|
375
|
+
var body = regionsForRole(template === null || template === void 0 ? void 0 : template.customisationMap, 'body_colour_fill');
|
|
376
|
+
if (body.length) return body;
|
|
377
|
+
var print = regionsForRole(template === null || template === void 0 ? void 0 : template.customisationMap, 'print_area');
|
|
378
|
+
if (print.length) return print;
|
|
379
|
+
return [[0, 0, 1, 1]];
|
|
380
|
+
}
|
|
381
|
+
if (kind === 'text') {
|
|
382
|
+
var placeholders = regionsForRole(template === null || template === void 0 ? void 0 : template.customisationMap, 'text_placeholder');
|
|
383
|
+
if (placeholders.length) return placeholders;
|
|
384
|
+
return regionsForRole(template === null || template === void 0 ? void 0 : template.customisationMap, 'print_area');
|
|
385
|
+
}
|
|
386
|
+
return regionsForRole(template === null || template === void 0 ? void 0 : template.customisationMap, 'print_area');
|
|
387
|
+
}
|
|
388
|
+
export function defaultPlacement(kind, index, artWidth, artHeight) {
|
|
389
|
+
var pad = Math.max(24, artWidth * 0.04);
|
|
390
|
+
if (kind === 'image') {
|
|
391
|
+
return {
|
|
392
|
+
x: artWidth * 0.2,
|
|
393
|
+
y: artHeight * 0.2,
|
|
394
|
+
width: artWidth * 0.6,
|
|
395
|
+
height: artHeight * 0.6
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
if (kind === 'rect') {
|
|
399
|
+
return {
|
|
400
|
+
x: 0,
|
|
401
|
+
y: 0,
|
|
402
|
+
width: artWidth,
|
|
403
|
+
height: artHeight
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
return {
|
|
407
|
+
x: pad,
|
|
408
|
+
y: pad + index * Math.max(64, artHeight * 0.08),
|
|
409
|
+
width: artWidth - pad * 2,
|
|
410
|
+
height: Math.max(56, artHeight * 0.07)
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
export function createObjectId() {
|
|
414
|
+
return "obj-".concat(Date.now(), "-").concat(Math.random().toString(36).slice(2, 8));
|
|
415
|
+
}
|
|
416
|
+
export function seedOrSyncCanvas(existing, template, variations) {
|
|
417
|
+
var width = Number(template === null || template === void 0 ? void 0 : template.width) || DEFAULT_ARTBOARD.width;
|
|
418
|
+
var height = Number(template === null || template === void 0 ? void 0 : template.height) || DEFAULT_ARTBOARD.height;
|
|
419
|
+
var objects = ((existing === null || existing === void 0 ? void 0 : existing.objects) || []).map(function (obj) {
|
|
420
|
+
return obj.type === 'text' ? _objectSpread(_objectSpread({}, obj), fitTextBox(obj)) : _objectSpread({}, obj);
|
|
421
|
+
});
|
|
422
|
+
var detached = new Set((existing === null || existing === void 0 ? void 0 : existing.detachedFieldIds) || []);
|
|
423
|
+
var linked = linkedVariationsForTemplate(template, variations);
|
|
424
|
+
var linkedFields = linked.map(function (variation) {
|
|
425
|
+
return variation === null || variation === void 0 ? void 0 : variation.variationField;
|
|
426
|
+
}).filter(Boolean);
|
|
427
|
+
var usedRegions = {};
|
|
428
|
+
var _iterator3 = _createForOfIteratorHelper(linked),
|
|
429
|
+
_step3;
|
|
430
|
+
try {
|
|
431
|
+
var _loop = function _loop() {
|
|
432
|
+
var variation = _step3.value;
|
|
433
|
+
var field = variation === null || variation === void 0 ? void 0 : variation.variationField;
|
|
434
|
+
if (resolveArtworkRole(field, template, linkedFields) !== 'text_fill') return 1; // continue
|
|
435
|
+
var index = objects.findIndex(function (obj) {
|
|
436
|
+
return obj.merchiFieldId === (field === null || field === void 0 ? void 0 : field.id) && obj.type === 'rect';
|
|
437
|
+
});
|
|
438
|
+
if (index >= 0) objects.splice(index, 1);
|
|
439
|
+
};
|
|
440
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
441
|
+
if (_loop()) continue;
|
|
442
|
+
}
|
|
443
|
+
} catch (err) {
|
|
444
|
+
_iterator3.e(err);
|
|
445
|
+
} finally {
|
|
446
|
+
_iterator3.f();
|
|
447
|
+
}
|
|
448
|
+
var applyColourToText = function applyColourToText(targetFieldId, fill, colourFieldId) {
|
|
449
|
+
if (!fill || targetFieldId == null) return false;
|
|
450
|
+
var textObj = objects.find(function (obj) {
|
|
451
|
+
return obj.merchiFieldId === targetFieldId && obj.type === 'text';
|
|
452
|
+
});
|
|
453
|
+
if (!textObj) return false;
|
|
454
|
+
textObj.fill = fill;
|
|
455
|
+
textObj.colourFieldId = colourFieldId;
|
|
456
|
+
return true;
|
|
457
|
+
};
|
|
458
|
+
var placeObject = function placeObject(kind, role, field, fieldId, content) {
|
|
459
|
+
var boxes = placementBoxes(role, kind, template);
|
|
460
|
+
var key = "".concat(role, ":").concat(kind);
|
|
461
|
+
var regionIndex = usedRegions[key] || 0;
|
|
462
|
+
usedRegions[key] = regionIndex + 1;
|
|
463
|
+
var box = boxes[regionIndex] || boxes[0];
|
|
464
|
+
var place = box ? bboxToPixels(box, width, height) : defaultPlacement(kind, objects.length, width, height);
|
|
465
|
+
var lockAspectRatio = kind === 'image' ? shouldLockImageAspect(field, template) : undefined;
|
|
466
|
+
var next = _objectSpread(_objectSpread({
|
|
467
|
+
id: createObjectId(),
|
|
468
|
+
type: kind,
|
|
469
|
+
merchiFieldId: fieldId,
|
|
470
|
+
artworkRole: role,
|
|
471
|
+
locked: kind === 'rect',
|
|
472
|
+
rotation: 0,
|
|
473
|
+
scaleX: 1,
|
|
474
|
+
scaleY: 1,
|
|
475
|
+
lockAspectRatio: lockAspectRatio
|
|
476
|
+
}, place), {}, {
|
|
477
|
+
text: content.text,
|
|
478
|
+
src: content.src,
|
|
479
|
+
fill: content.fill || (kind === 'text' ? '#111111' : undefined),
|
|
480
|
+
fontFamily: kind === 'text' ? DEFAULT_DRAFT_FONT : undefined,
|
|
481
|
+
fontSize: Math.max(28, Math.round(place.height * 0.62))
|
|
482
|
+
});
|
|
483
|
+
if (kind === 'text') Object.assign(next, fitTextBox(next));
|
|
484
|
+
if (kind === 'rect') objects.unshift(next);else objects.push(next);
|
|
485
|
+
};
|
|
486
|
+
var _iterator4 = _createForOfIteratorHelper(linked),
|
|
487
|
+
_step4;
|
|
488
|
+
try {
|
|
489
|
+
var _loop2 = function _loop2() {
|
|
490
|
+
var variation = _step4.value;
|
|
491
|
+
var field = variation === null || variation === void 0 ? void 0 : variation.variationField;
|
|
492
|
+
var fieldId = field === null || field === void 0 ? void 0 : field.id;
|
|
493
|
+
var content = variationCanvasContent(variation);
|
|
494
|
+
if (!content.kind || fieldId == null || detached.has(fieldId)) return 0; // continue
|
|
495
|
+
var role = resolveArtworkRole(field, template, linkedFields);
|
|
496
|
+
if (role === 'text_fill') return 0; // continue
|
|
497
|
+
var found = objects.find(function (obj) {
|
|
498
|
+
return obj.merchiFieldId === fieldId;
|
|
499
|
+
});
|
|
500
|
+
if (found) {
|
|
501
|
+
if (content.kind === 'text' && content.text != null) {
|
|
502
|
+
found.text = content.text;
|
|
503
|
+
Object.assign(found, fitTextBox(found));
|
|
504
|
+
}
|
|
505
|
+
if (content.kind === 'image' && content.src) found.src = content.src;
|
|
506
|
+
if (content.kind === 'rect' && content.fill) found.fill = content.fill;
|
|
507
|
+
if (found.type === 'image') {
|
|
508
|
+
found.lockAspectRatio = shouldLockImageAspect(field, template);
|
|
509
|
+
}
|
|
510
|
+
if (found.type === 'rect') {
|
|
511
|
+
found.locked = true;
|
|
512
|
+
found.artworkRole = role;
|
|
513
|
+
}
|
|
514
|
+
return 0; // continue
|
|
515
|
+
}
|
|
516
|
+
if (content.kind === 'text' && !content.text) return 0; // continue
|
|
517
|
+
if (content.kind === 'image' && !content.src) return 0; // continue
|
|
518
|
+
if (content.kind === 'rect' && !content.fill) return 0; // continue
|
|
519
|
+
placeObject(content.kind, role, field, fieldId, content);
|
|
520
|
+
},
|
|
521
|
+
_ret;
|
|
522
|
+
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
523
|
+
_ret = _loop2();
|
|
524
|
+
if (_ret === 0) continue;
|
|
525
|
+
}
|
|
526
|
+
} catch (err) {
|
|
527
|
+
_iterator4.e(err);
|
|
528
|
+
} finally {
|
|
529
|
+
_iterator4.f();
|
|
530
|
+
}
|
|
531
|
+
var _iterator5 = _createForOfIteratorHelper(linked),
|
|
532
|
+
_step5;
|
|
533
|
+
try {
|
|
534
|
+
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
|
535
|
+
var variation = _step5.value;
|
|
536
|
+
var field = variation === null || variation === void 0 ? void 0 : variation.variationField;
|
|
537
|
+
var fieldId = field === null || field === void 0 ? void 0 : field.id;
|
|
538
|
+
var content = variationCanvasContent(variation);
|
|
539
|
+
if (fieldId == null || detached.has(fieldId) || !content.fill) continue;
|
|
540
|
+
var role = resolveArtworkRole(field, template, linkedFields);
|
|
541
|
+
if (role !== 'text_fill') continue;
|
|
542
|
+
var targetId = inferTextTargetFieldId(field, template, linkedFields);
|
|
543
|
+
applyColourToText(targetId, content.fill, fieldId);
|
|
544
|
+
}
|
|
545
|
+
} catch (err) {
|
|
546
|
+
_iterator5.e(err);
|
|
547
|
+
} finally {
|
|
548
|
+
_iterator5.f();
|
|
549
|
+
}
|
|
550
|
+
return {
|
|
551
|
+
width: width,
|
|
552
|
+
height: height,
|
|
553
|
+
objects: objects,
|
|
554
|
+
detachedFieldIds: Array.from(detached)
|
|
555
|
+
};
|
|
556
|
+
}
|
|
557
|
+
export function detachField(state, objectId) {
|
|
558
|
+
var target = state.objects.find(function (obj) {
|
|
559
|
+
return obj.id === objectId;
|
|
560
|
+
});
|
|
561
|
+
var detachedFieldIds = _toConsumableArray(state.detachedFieldIds || []);
|
|
562
|
+
if ((target === null || target === void 0 ? void 0 : target.merchiFieldId) != null && !detachedFieldIds.includes(target.merchiFieldId)) {
|
|
563
|
+
detachedFieldIds.push(target.merchiFieldId);
|
|
564
|
+
}
|
|
565
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
566
|
+
objects: state.objects.filter(function (obj) {
|
|
567
|
+
return obj.id !== objectId;
|
|
568
|
+
}),
|
|
569
|
+
detachedFieldIds: detachedFieldIds
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
export function printAreaGuides(template) {
|
|
573
|
+
var width = Number(template === null || template === void 0 ? void 0 : template.width) || DEFAULT_ARTBOARD.width;
|
|
574
|
+
var height = Number(template === null || template === void 0 ? void 0 : template.height) || DEFAULT_ARTBOARD.height;
|
|
575
|
+
return regionsForRole(template === null || template === void 0 ? void 0 : template.customisationMap, 'print_area').map(function (bbox) {
|
|
576
|
+
return bboxToPixels(bbox, width, height);
|
|
577
|
+
});
|
|
578
|
+
}
|
|
579
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCTEFOS19URU1QTEFURV9JRCIsIkRFRkFVTFRfQVJUQk9BUkQiLCJGaWVsZFR5cGUiLCJERUZBVUxUX0RSQUZUX0ZPTlQiLCJjc3NGb250RmFtaWx5IiwicHJvZHVjdEhhc0dyb3VwcyIsInByb2R1Y3RIYXNEcmFmdFRlbXBsYXRlcyIsInByb2R1Y3QiLCJBcnJheSIsImlzQXJyYXkiLCJkcmFmdFRlbXBsYXRlcyIsImxlbmd0aCIsInByb2R1Y3RBbGxvd3NDbGllbnREZXNpZ24iLCJCb29sZWFuIiwibmVlZHNEcmFmdGluZyIsImFsbG93Q2xpZW50RHJhZnRDb250cmlidXRpb24iLCJwcm9kdWN0SGFzVmFyaWF0aW9uR3JvdXBzIiwiZGVzaWduR3JvdXBDb3VudCIsImZvcm1WYWx1ZXMiLCJncm91cHMiLCJ2YXJpYXRpb25zR3JvdXBzIiwicGFyc2VTZWxlY3RlZE9wdGlvbklkcyIsInZhbHVlIiwidW5kZWZpbmVkIiwiU3RyaW5nIiwic3BsaXQiLCJtYXAiLCJzIiwicGFyc2VJbnQiLCJ0cmltIiwiZmlsdGVyIiwibiIsImlzTmFOIiwic2VsZWN0ZWRPcHRpb25JZHNGcm9tVmFyaWF0aW9ucyIsInZhcmlhdGlvbnMiLCJpZHMiLCJTZXQiLCJfaXRlcmF0b3IiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9zdGVwIiwiZG9uZSIsInZhcmlhdGlvbiIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJpZCIsImFkZCIsImVyciIsImUiLCJmIiwiaXNUZW1wbGF0ZVZpc2libGUiLCJ0ZW1wbGF0ZSIsInNlbGVjdGVkT3B0aW9uSWRzIiwicmVxdWlyZWQiLCJzZWxlY3RlZEJ5VmFyaWF0aW9uRmllbGRPcHRpb25zIiwiZXZlcnkiLCJvcHQiLCJoYXMiLCJ2aXNpYmxlVGVtcGxhdGVzRm9yR3JvdXAiLCJpbmRlcGVuZGVudFZhcmlhdGlvbnMiLCJncm91cFZhcmlhdGlvbnMiLCJzZWxlY3RlZCIsImNvbmNhdCIsIl90b0NvbnN1bWFibGVBcnJheSIsImJsYW5rVGVtcGxhdGUiLCJfcHJvZHVjdCRkcmFmdFRlbXBsYXQiLCJfcHJvZHVjdCRmZWF0dXJlSW1hZ2UiLCJfcHJvZHVjdCRkcmFmdFRlbXBsYXQyIiwiX3Byb2R1Y3QkZmVhdHVyZUltYWdlMiIsImZyb21Qcm9kdWN0IiwiTnVtYmVyIiwid2lkdGgiLCJmZWF0dXJlSW1hZ2UiLCJoZWlnaHQiLCJuYW1lIiwiZmlsZSIsImVkaXRlZEJ5VmFyaWF0aW9uRmllbGRzIiwidGVtcGxhdGVzRm9yR3JvdXAiLCJ2aXNpYmxlIiwiY2FudmFzS2luZEZvckZpZWxkVHlwZSIsImZpZWxkVHlwZSIsIlRFWFRfSU5QVVQiLCJURVhUX0FSRUEiLCJOVU1CRVJfSU5QVVQiLCJTRUxFQ1QiLCJSQURJTyIsIkNIRUNLQk9YIiwiRklMRV9VUExPQUQiLCJJTUFHRV9TRUxFQ1QiLCJDT0xPVVJfUElDS0VSIiwiQ09MT1VSX1NFTEVDVCIsIkNPTE9VUl9FWFRSQUNUIiwib3B0aW9uQnlJZCIsIl92YXJpYXRpb24kdmFyaWF0aW9uRiIsImZyb21TZWxlY3RhYmxlIiwic2VsZWN0YWJsZU9wdGlvbnMiLCJmaW5kIiwib3B0aW9uIiwib3B0aW9uSWQiLCJ2YXJpYXRpb25GaWVsZCIsIm9wdGlvbnMiLCJ2YXJpYXRpb25DYW52YXNDb250ZW50IiwiZmllbGQiLCJraW5kIiwidHlwZSIsIm5hbWVzIiwiX29wdGlvbkJ5SWQiLCJ0ZXh0Iiwiam9pbiIsInZhcmlhdGlvbkZpbGVzIiwic3JjIiwidmlld1VybCIsImNhY2hlZFZpZXdVcmwiLCJsaW5rZWRGaWxlIiwiZmlsbCIsIm5vcm1hbGlzZUNzc0NvbG91ciIsInNlbGVjdGVkT3B0aW9ucyIsImNvbG91ciIsIkhFWF9DT0xPVVIiLCJDU1NfRlVOQ1RJT05fQ09MT1VSIiwiX2xlbiIsImFyZ3VtZW50cyIsImNhbmRpZGF0ZXMiLCJfa2V5IiwiX2kiLCJfY2FuZGlkYXRlcyIsInJhdyIsInRlc3QiLCJsaW5rZWRWYXJpYXRpb25zRm9yVGVtcGxhdGUiLCJsaW5rZWRJZHMiLCJzaXplIiwiX3ZhcmlhdGlvbiR2YXJpYXRpb25GMiIsInZhcmlhdGlvbnNGb3JHcm91cCIsImdyb3VwSW5kZXgiLCJfZm9ybVZhbHVlcyR2YXJpYXRpb24iLCJpbmRlcGVuZGVudCIsImdyb3VwIiwiaXNWYWxpZEJib3giLCJiYm94IiwiX2Jib3gkbWFwIiwiX2Jib3gkbWFwMiIsIl9zbGljZWRUb0FycmF5IiwieCIsInkiLCJ3IiwiaCIsInJlZ2lvbnNGb3JSb2xlIiwiY3VzdG9taXNhdGlvbk1hcCIsInJvbGUiLCJyZWdpb25zIiwicmVnaW9uIiwiYmJveFRvUGl4ZWxzIiwiX2Jib3giLCJmaWVsZEJpbmRpbmdzRnJvbSIsIl90ZW1wbGF0ZSRjdXN0b21pc2F0aSIsImZpZWxkQmluZGluZ3MiLCJpdGVtIiwiZmllbGRJZCIsImJpbmRpbmdGb3JGaWVsZCIsImJpbmRpbmdzIiwiZmllbGROYW1lIiwidG9Mb3dlckNhc2UiLCJpc0NvbG91cktpbmQiLCJpbmZlckFydHdvcmtSb2xlIiwibGlua2VkRmllbGRzIiwiaGFzVGV4dCIsInNvbWUiLCJyZXNvbHZlQXJ0d29ya1JvbGUiLCJpbmZlcnJlZCIsImJpbmRpbmciLCJpbmZlclRleHRUYXJnZXRGaWVsZElkIiwidGFyZ2V0RmllbGRJZCIsInRleHRGaWVsZCIsImZpdEluc2lkZSIsImJveCIsImNvbnRlbnRXaWR0aCIsImNvbnRlbnRIZWlnaHQiLCJsb2NrQXNwZWN0UmF0aW8iLCJfb2JqZWN0U3ByZWFkIiwic2NhbGUiLCJNYXRoIiwibWluIiwic2hvdWxkTG9ja0ltYWdlQXNwZWN0IiwiYXNwZWN0UmF0aW9Mb2NrIiwiaXNCYWNrZ3JvdW5kRmlsbCIsIm9iaiIsImlzRnVsbEFydGJvYXJkRmlsbCIsImFydFdpZHRoIiwiYXJ0SGVpZ2h0IiwibWVhc3VyZURyYWZ0VGV4dCIsImZvbnRTaXplIiwiZm9udEZhbWlseSIsImxpbmVzIiwibWF4IiwiZG9jdW1lbnQiLCJjYW52YXMiLCJjcmVhdGVFbGVtZW50IiwiY3R4IiwiZ2V0Q29udGV4dCIsImZvbnQiLCJhcHBseSIsImxpbmUiLCJtZWFzdXJlVGV4dCIsImNlaWwiLCJmaXRUZXh0Qm94IiwibWVhc3VyZWQiLCJwcmV2VyIsInByZXZIIiwicGxhY2VtZW50Qm94ZXMiLCJib2R5IiwicHJpbnQiLCJwbGFjZWhvbGRlcnMiLCJkZWZhdWx0UGxhY2VtZW50IiwiaW5kZXgiLCJwYWQiLCJjcmVhdGVPYmplY3RJZCIsIkRhdGUiLCJub3ciLCJyYW5kb20iLCJ0b1N0cmluZyIsInNsaWNlIiwic2VlZE9yU3luY0NhbnZhcyIsImV4aXN0aW5nIiwib2JqZWN0cyIsImRldGFjaGVkIiwiZGV0YWNoZWRGaWVsZElkcyIsImxpbmtlZCIsInVzZWRSZWdpb25zIiwiX2l0ZXJhdG9yMyIsIl9zdGVwMyIsIl9sb29wIiwiZmluZEluZGV4IiwibWVyY2hpRmllbGRJZCIsInNwbGljZSIsImFwcGx5Q29sb3VyVG9UZXh0IiwiY29sb3VyRmllbGRJZCIsInRleHRPYmoiLCJwbGFjZU9iamVjdCIsImNvbnRlbnQiLCJib3hlcyIsImtleSIsInJlZ2lvbkluZGV4IiwicGxhY2UiLCJuZXh0IiwiYXJ0d29ya1JvbGUiLCJsb2NrZWQiLCJyb3RhdGlvbiIsInNjYWxlWCIsInNjYWxlWSIsInJvdW5kIiwiT2JqZWN0IiwiYXNzaWduIiwidW5zaGlmdCIsInB1c2giLCJfaXRlcmF0b3I0IiwiX3N0ZXA0IiwiX2xvb3AyIiwiZm91bmQiLCJfcmV0IiwiX2l0ZXJhdG9yNSIsIl9zdGVwNSIsInRhcmdldElkIiwiZnJvbSIsImRldGFjaEZpZWxkIiwic3RhdGUiLCJvYmplY3RJZCIsInRhcmdldCIsImluY2x1ZGVzIiwicHJpbnRBcmVhR3VpZGVzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2RyYWZ0VGVtcGxhdGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJMQU5LX1RFTVBMQVRFX0lELFxuICBERUZBVUxUX0FSVEJPQVJELFxuICBEcmFmdEFydHdvcmtSb2xlLFxuICBEcmFmdENhbnZhc09iamVjdCxcbiAgRHJhZnRDYW52YXNPYmplY3RUeXBlLFxuICBEcmFmdENhbnZhc1N0YXRlLFxuICBEcmFmdEZpZWxkQmluZGluZyxcbiAgRmllbGRUeXBlLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IERFRkFVTFRfRFJBRlRfRk9OVCwgY3NzRm9udEZhbWlseSB9IGZyb20gJy4vZHJhZnRGb250cyc7XG5pbXBvcnQgeyBwcm9kdWN0SGFzR3JvdXBzIH0gZnJvbSAnLi9wcm9kdWN0cyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9kdWN0SGFzRHJhZnRUZW1wbGF0ZXMocHJvZHVjdDogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHByb2R1Y3Q/LmRyYWZ0VGVtcGxhdGVzKSAmJiBwcm9kdWN0LmRyYWZ0VGVtcGxhdGVzLmxlbmd0aCA+IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9kdWN0QWxsb3dzQ2xpZW50RGVzaWduKHByb2R1Y3Q6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICBwcm9kdWN0Py5uZWVkc0RyYWZ0aW5nXG4gICAgJiYgcHJvZHVjdD8uYWxsb3dDbGllbnREcmFmdENvbnRyaWJ1dGlvblxuICAgICYmIHByb2R1Y3RIYXNEcmFmdFRlbXBsYXRlcyhwcm9kdWN0KSxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2R1Y3RIYXNWYXJpYXRpb25Hcm91cHMocHJvZHVjdDogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiBwcm9kdWN0SGFzR3JvdXBzKHByb2R1Y3QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzaWduR3JvdXBDb3VudChwcm9kdWN0OiBhbnksIGZvcm1WYWx1ZXM6IGFueSk6IG51bWJlciB7XG4gIGlmICghcHJvZHVjdEhhc1ZhcmlhdGlvbkdyb3Vwcyhwcm9kdWN0KSkgcmV0dXJuIDE7XG4gIGNvbnN0IGdyb3VwcyA9IGZvcm1WYWx1ZXM/LnZhcmlhdGlvbnNHcm91cHM7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGdyb3VwcykgJiYgZ3JvdXBzLmxlbmd0aCA+IDAgPyBncm91cHMubGVuZ3RoIDogMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2VsZWN0ZWRPcHRpb25JZHModmFsdWU6IGFueSk6IG51bWJlcltdIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICcnKSByZXR1cm4gW107XG4gIHJldHVybiBTdHJpbmcodmFsdWUpXG4gICAgLnNwbGl0KCcsJylcbiAgICAubWFwKChzKSA9PiBwYXJzZUludChzLnRyaW0oKSwgMTApKVxuICAgIC5maWx0ZXIoKG4pID0+ICFpc05hTihuKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RlZE9wdGlvbklkc0Zyb21WYXJpYXRpb25zKHZhcmlhdGlvbnM6IGFueVtdKTogU2V0PG51bWJlcj4ge1xuICBjb25zdCBpZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCB2YXJpYXRpb24gb2YgdmFyaWF0aW9ucyB8fCBbXSkge1xuICAgIGZvciAoY29uc3QgaWQgb2YgcGFyc2VTZWxlY3RlZE9wdGlvbklkcyh2YXJpYXRpb24/LnZhbHVlKSkge1xuICAgICAgaWRzLmFkZChpZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpZHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RlbXBsYXRlVmlzaWJsZShcbiAgdGVtcGxhdGU6IGFueSxcbiAgc2VsZWN0ZWRPcHRpb25JZHM6IFNldDxudW1iZXI+LFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlcXVpcmVkID0gdGVtcGxhdGU/LnNlbGVjdGVkQnlWYXJpYXRpb25GaWVsZE9wdGlvbnM7XG4gIGlmICghQXJyYXkuaXNBcnJheShyZXF1aXJlZCkgfHwgcmVxdWlyZWQubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIHJlcXVpcmVkLmV2ZXJ5KChvcHQ6IGFueSkgPT4gb3B0Py5pZCAmJiBzZWxlY3RlZE9wdGlvbklkcy5oYXMob3B0LmlkKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpYmxlVGVtcGxhdGVzRm9yR3JvdXAoXG4gIHByb2R1Y3Q6IGFueSxcbiAgaW5kZXBlbmRlbnRWYXJpYXRpb25zOiBhbnlbXSxcbiAgZ3JvdXBWYXJpYXRpb25zOiBhbnlbXSxcbik6IGFueVtdIHtcbiAgY29uc3Qgc2VsZWN0ZWQgPSBzZWxlY3RlZE9wdGlvbklkc0Zyb21WYXJpYXRpb25zKFtcbiAgICAuLi4oaW5kZXBlbmRlbnRWYXJpYXRpb25zIHx8IFtdKSxcbiAgICAuLi4oZ3JvdXBWYXJpYXRpb25zIHx8IFtdKSxcbiAgXSk7XG4gIHJldHVybiAocHJvZHVjdD8uZHJhZnRUZW1wbGF0ZXMgfHwgW10pLmZpbHRlcigodGVtcGxhdGU6IGFueSkgPT5cbiAgICBpc1RlbXBsYXRlVmlzaWJsZSh0ZW1wbGF0ZSwgc2VsZWN0ZWQpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBibGFua1RlbXBsYXRlKHByb2R1Y3Q/OiBhbnkpIHtcbiAgY29uc3QgZnJvbVByb2R1Y3QgPSBOdW1iZXIocHJvZHVjdD8uZHJhZnRUZW1wbGF0ZXM/LlswXT8ud2lkdGgpXG4gICAgfHwgTnVtYmVyKHByb2R1Y3Q/LmZlYXR1cmVJbWFnZT8ud2lkdGgpXG4gICAgfHwgREVGQVVMVF9BUlRCT0FSRC53aWR0aDtcbiAgY29uc3QgaGVpZ2h0ID0gTnVtYmVyKHByb2R1Y3Q/LmRyYWZ0VGVtcGxhdGVzPy5bMF0/LmhlaWdodClcbiAgICB8fCBOdW1iZXIocHJvZHVjdD8uZmVhdHVyZUltYWdlPy5oZWlnaHQpXG4gICAgfHwgREVGQVVMVF9BUlRCT0FSRC5oZWlnaHQ7XG4gIHJldHVybiB7XG4gICAgaWQ6IEJMQU5LX1RFTVBMQVRFX0lELFxuICAgIG5hbWU6ICdBcnR3b3JrJyxcbiAgICB3aWR0aDogZnJvbVByb2R1Y3QsXG4gICAgaGVpZ2h0LFxuICAgIGZpbGU6IG51bGwsXG4gICAgZWRpdGVkQnlWYXJpYXRpb25GaWVsZHM6IFtdLFxuICAgIHNlbGVjdGVkQnlWYXJpYXRpb25GaWVsZE9wdGlvbnM6IFtdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGVzRm9yR3JvdXAoXG4gIHByb2R1Y3Q6IGFueSxcbiAgaW5kZXBlbmRlbnRWYXJpYXRpb25zOiBhbnlbXSxcbiAgZ3JvdXBWYXJpYXRpb25zOiBhbnlbXSxcbik6IGFueVtdIHtcbiAgY29uc3QgdmlzaWJsZSA9IHZpc2libGVUZW1wbGF0ZXNGb3JHcm91cChcbiAgICBwcm9kdWN0LFxuICAgIGluZGVwZW5kZW50VmFyaWF0aW9ucyxcbiAgICBncm91cFZhcmlhdGlvbnMsXG4gICk7XG4gIHJldHVybiB2aXNpYmxlLmxlbmd0aCA/IHZpc2libGUgOiBbYmxhbmtUZW1wbGF0ZShwcm9kdWN0KV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYW52YXNLaW5kRm9yRmllbGRUeXBlKFxuICBmaWVsZFR5cGU6IGFueSxcbik6IERyYWZ0Q2FudmFzT2JqZWN0VHlwZSB8IG51bGwge1xuICBzd2l0Y2ggKHBhcnNlSW50KFN0cmluZyhmaWVsZFR5cGUpLCAxMCkpIHtcbiAgICBjYXNlIEZpZWxkVHlwZS5URVhUX0lOUFVUOlxuICAgIGNhc2UgRmllbGRUeXBlLlRFWFRfQVJFQTpcbiAgICBjYXNlIEZpZWxkVHlwZS5OVU1CRVJfSU5QVVQ6XG4gICAgY2FzZSBGaWVsZFR5cGUuU0VMRUNUOlxuICAgIGNhc2UgRmllbGRUeXBlLlJBRElPOlxuICAgIGNhc2UgRmllbGRUeXBlLkNIRUNLQk9YOlxuICAgICAgcmV0dXJuICd0ZXh0JztcbiAgICBjYXNlIEZpZWxkVHlwZS5GSUxFX1VQTE9BRDpcbiAgICBjYXNlIEZpZWxkVHlwZS5JTUFHRV9TRUxFQ1Q6XG4gICAgICByZXR1cm4gJ2ltYWdlJztcbiAgICBjYXNlIEZpZWxkVHlwZS5DT0xPVVJfUElDS0VSOlxuICAgIGNhc2UgRmllbGRUeXBlLkNPTE9VUl9TRUxFQ1Q6XG4gICAgY2FzZSBGaWVsZFR5cGUuQ09MT1VSX0VYVFJBQ1Q6XG4gICAgICByZXR1cm4gJ3JlY3QnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBvcHRpb25CeUlkKHZhcmlhdGlvbjogYW55LCBpZDogbnVtYmVyKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZnJvbVNlbGVjdGFibGUgPSAodmFyaWF0aW9uPy5zZWxlY3RhYmxlT3B0aW9ucyB8fCBbXSkuZmluZChcbiAgICAob3B0aW9uOiBhbnkpID0+IG9wdGlvbi5vcHRpb25JZCA9PT0gaWQgfHwgb3B0aW9uLmlkID09PSBpZFxuICApO1xuICBpZiAoZnJvbVNlbGVjdGFibGUpIHJldHVybiBmcm9tU2VsZWN0YWJsZTtcbiAgcmV0dXJuICh2YXJpYXRpb24/LnZhcmlhdGlvbkZpZWxkPy5vcHRpb25zIHx8IFtdKS5maW5kKFxuICAgIChvcHRpb246IGFueSkgPT4gb3B0aW9uLmlkID09PSBpZCB8fCBvcHRpb24ub3B0aW9uSWQgPT09IGlkXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YXJpYXRpb25DYW52YXNDb250ZW50KHZhcmlhdGlvbjogYW55KToge1xuICBraW5kOiBEcmFmdENhbnZhc09iamVjdFR5cGUgfCBudWxsO1xuICB0ZXh0Pzogc3RyaW5nO1xuICBzcmM/OiBzdHJpbmc7XG4gIGZpbGw/OiBzdHJpbmc7XG59IHtcbiAgY29uc3QgZmllbGQgPSB2YXJpYXRpb24/LnZhcmlhdGlvbkZpZWxkO1xuICBjb25zdCBraW5kID0gY2FudmFzS2luZEZvckZpZWxkVHlwZShmaWVsZD8uZmllbGRUeXBlKTtcbiAgaWYgKCFraW5kKSByZXR1cm4geyBraW5kOiBudWxsIH07XG5cbiAgY29uc3QgdHlwZSA9IHBhcnNlSW50KFN0cmluZyhmaWVsZC5maWVsZFR5cGUpLCAxMCk7XG5cbiAgaWYgKGtpbmQgPT09ICd0ZXh0Jykge1xuICAgIGlmIChcbiAgICAgIHR5cGUgPT09IEZpZWxkVHlwZS5TRUxFQ1RcbiAgICAgIHx8IHR5cGUgPT09IEZpZWxkVHlwZS5SQURJT1xuICAgICAgfHwgdHlwZSA9PT0gRmllbGRUeXBlLkNIRUNLQk9YXG4gICAgKSB7XG4gICAgICBjb25zdCBuYW1lcyA9IHBhcnNlU2VsZWN0ZWRPcHRpb25JZHModmFyaWF0aW9uLnZhbHVlKVxuICAgICAgICAubWFwKChpZCkgPT4gb3B0aW9uQnlJZCh2YXJpYXRpb24sIGlkKT8udmFsdWUpXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgICByZXR1cm4geyBraW5kLCB0ZXh0OiBuYW1lcy5qb2luKCcsICcpIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBraW5kLFxuICAgICAgdGV4dDogdmFyaWF0aW9uPy52YWx1ZSAhPSBudWxsICYmIHZhcmlhdGlvbi52YWx1ZSAhPT0gJydcbiAgICAgICAgPyBTdHJpbmcodmFyaWF0aW9uLnZhbHVlKVxuICAgICAgICA6ICcnLFxuICAgIH07XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ2ltYWdlJykge1xuICAgIGlmICh0eXBlID09PSBGaWVsZFR5cGUuRklMRV9VUExPQUQpIHtcbiAgICAgIGNvbnN0IGZpbGUgPSAodmFyaWF0aW9uPy52YXJpYXRpb25GaWxlcyB8fCBbXSlbMF07XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kLFxuICAgICAgICBzcmM6IGZpbGU/LnZpZXdVcmwgfHwgZmlsZT8uY2FjaGVkVmlld1VybCB8fCAnJyxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGlkcyA9IHBhcnNlU2VsZWN0ZWRPcHRpb25JZHModmFyaWF0aW9uLnZhbHVlKTtcbiAgICBjb25zdCBvcHRpb24gPSBpZHMubGVuZ3RoID8gb3B0aW9uQnlJZCh2YXJpYXRpb24sIGlkc1swXSkgOiBudWxsO1xuICAgIGNvbnN0IGZpbGUgPSBvcHRpb24/LmxpbmtlZEZpbGU7XG4gICAgcmV0dXJuIHsga2luZCwgc3JjOiBmaWxlPy52aWV3VXJsIHx8IGZpbGU/LmNhY2hlZFZpZXdVcmwgfHwgJycgfTtcbiAgfVxuXG4gIGlmICh0eXBlID09PSBGaWVsZFR5cGUuQ09MT1VSX1BJQ0tFUikge1xuICAgIHJldHVybiB7IGtpbmQsIGZpbGw6IG5vcm1hbGlzZUNzc0NvbG91cih2YXJpYXRpb24/LnZhbHVlKSB8fCAnIzAwMDAwMCcgfTtcbiAgfVxuICBjb25zdCBpZHMgPSBwYXJzZVNlbGVjdGVkT3B0aW9uSWRzKHZhcmlhdGlvbi52YWx1ZSk7XG4gIGNvbnN0IG9wdGlvbiA9IGlkcy5sZW5ndGggPyBvcHRpb25CeUlkKHZhcmlhdGlvbiwgaWRzWzBdKSA6IG51bGw7XG4gIGNvbnN0IHNlbGVjdGVkID0gKHZhcmlhdGlvbj8uc2VsZWN0ZWRPcHRpb25zIHx8IFtdKVswXTtcbiAgcmV0dXJuIHtcbiAgICBraW5kLFxuICAgIGZpbGw6IG5vcm1hbGlzZUNzc0NvbG91cihcbiAgICAgIG9wdGlvbj8uY29sb3VyLFxuICAgICAgc2VsZWN0ZWQ/LmNvbG91cixcbiAgICAgIG9wdGlvbj8udmFsdWUsXG4gICAgICBzZWxlY3RlZD8udmFsdWUsXG4gICAgICB2YXJpYXRpb24/LnZhbHVlLFxuICAgICksXG4gIH07XG59XG5cbmNvbnN0IEhFWF9DT0xPVVIgPSAvXiMoWzAtOWEtZl17M318WzAtOWEtZl17Nn18WzAtOWEtZl17OH0pJC9pO1xuY29uc3QgQ1NTX0ZVTkNUSU9OX0NPTE9VUiA9IC9eKHJnYmE/fGhzbGE/KVxcKC9pO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXNlQ3NzQ29sb3VyKC4uLmNhbmRpZGF0ZXM6IGFueVtdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICcnKSBjb250aW51ZTtcbiAgICBjb25zdCByYXcgPSBTdHJpbmcodmFsdWUpLnRyaW0oKTtcbiAgICBpZiAoIXJhdyB8fCAvXlxcZCskLy50ZXN0KHJhdykpIGNvbnRpbnVlO1xuICAgIGlmIChIRVhfQ09MT1VSLnRlc3QocmF3KSkge1xuICAgICAgaWYgKHJhdy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgcmV0dXJuIGAjJHtyYXdbMV19JHtyYXdbMV19JHtyYXdbMl19JHtyYXdbMl19JHtyYXdbM119JHtyYXdbM119YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByYXc7XG4gICAgfVxuICAgIGlmIChDU1NfRlVOQ1RJT05fQ09MT1VSLnRlc3QocmF3KSkgcmV0dXJuIHJhdztcbiAgICBpZiAoL15bYS16XVthLXpcXHMtXXsyLH0kL2kudGVzdChyYXcpKSByZXR1cm4gcmF3O1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5rZWRWYXJpYXRpb25zRm9yVGVtcGxhdGUoXG4gIHRlbXBsYXRlOiBhbnksXG4gIHZhcmlhdGlvbnM6IGFueVtdLFxuKTogYW55W10ge1xuICBjb25zdCBsaW5rZWRJZHMgPSBuZXcgU2V0KFxuICAgICh0ZW1wbGF0ZT8uZWRpdGVkQnlWYXJpYXRpb25GaWVsZHMgfHwgW10pXG4gICAgICAubWFwKChmaWVsZDogYW55KSA9PiBmaWVsZD8uaWQpXG4gICAgICAuZmlsdGVyKChpZDogYW55KSA9PiBpZCAhPSBudWxsKVxuICApO1xuICBpZiAoIWxpbmtlZElkcy5zaXplKSByZXR1cm4gW107XG4gIHJldHVybiAodmFyaWF0aW9ucyB8fCBbXSkuZmlsdGVyKCh2YXJpYXRpb24pID0+XG4gICAgbGlua2VkSWRzLmhhcyh2YXJpYXRpb24/LnZhcmlhdGlvbkZpZWxkPy5pZClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhcmlhdGlvbnNGb3JHcm91cChcbiAgZm9ybVZhbHVlczogYW55LFxuICBncm91cEluZGV4OiBudW1iZXIsXG4pOiBhbnlbXSB7XG4gIGNvbnN0IGluZGVwZW5kZW50ID0gZm9ybVZhbHVlcz8udmFyaWF0aW9ucyB8fCBbXTtcbiAgY29uc3QgZ3JvdXAgPSBmb3JtVmFsdWVzPy52YXJpYXRpb25zR3JvdXBzPy5bZ3JvdXBJbmRleF0/LnZhcmlhdGlvbnMgfHwgW107XG4gIHJldHVybiBbLi4uaW5kZXBlbmRlbnQsIC4uLmdyb3VwXTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEJib3goYmJveDogYW55KTogYmJveCBpcyBudW1iZXJbXSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShiYm94KSB8fCBiYm94Lmxlbmd0aCAhPT0gNCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBbeCwgeSwgdywgaF0gPSBiYm94Lm1hcChOdW1iZXIpO1xuICByZXR1cm4gdyA+IDAgJiYgaCA+IDAgJiYgeCA+PSAwICYmIHggPD0gMSAmJiB5ID49IDAgJiYgeSA8PSAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaW9uc0ZvclJvbGUoY3VzdG9taXNhdGlvbk1hcDogYW55LCByb2xlOiBzdHJpbmcpOiBudW1iZXJbXVtdIHtcbiAgY29uc3QgcmVnaW9ucyA9IGN1c3RvbWlzYXRpb25NYXA/LnJlZ2lvbnM7XG4gIGlmICghQXJyYXkuaXNBcnJheShyZWdpb25zKSkgcmV0dXJuIFtdO1xuICByZXR1cm4gcmVnaW9uc1xuICAgIC5maWx0ZXIoKHJlZ2lvbjogYW55KSA9PiByZWdpb24/LnJvbGUgPT09IHJvbGUgJiYgaXNWYWxpZEJib3gocmVnaW9uLmJib3gpKVxuICAgIC5tYXAoKHJlZ2lvbjogYW55KSA9PiByZWdpb24uYmJveC5tYXAoTnVtYmVyKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiYm94VG9QaXhlbHMoXG4gIGJib3g6IG51bWJlcltdLFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlcixcbik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xuICBjb25zdCBbeCwgeSwgdywgaF0gPSBiYm94O1xuICByZXR1cm4ge1xuICAgIHg6IHggKiB3aWR0aCxcbiAgICB5OiB5ICogaGVpZ2h0LFxuICAgIHdpZHRoOiB3ICogd2lkdGgsXG4gICAgaGVpZ2h0OiBoICogaGVpZ2h0LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmllbGRCaW5kaW5nc0Zyb20odGVtcGxhdGU6IGFueSk6IERyYWZ0RmllbGRCaW5kaW5nW10ge1xuICBjb25zdCByYXcgPSB0ZW1wbGF0ZT8uY3VzdG9taXNhdGlvbk1hcD8uZmllbGRCaW5kaW5ncztcbiAgaWYgKCFBcnJheS5pc0FycmF5KHJhdykpIHJldHVybiBbXTtcbiAgcmV0dXJuIHJhdy5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbSAmJiBpdGVtLmZpZWxkSWQgIT0gbnVsbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiaW5kaW5nRm9yRmllbGQoXG4gIGJpbmRpbmdzOiBEcmFmdEZpZWxkQmluZGluZ1tdLFxuICBmaWVsZElkOiBhbnksXG4pOiBEcmFmdEZpZWxkQmluZGluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGlkID0gTnVtYmVyKGZpZWxkSWQpO1xuICByZXR1cm4gYmluZGluZ3MuZmluZCgoaXRlbSkgPT4gTnVtYmVyKGl0ZW0uZmllbGRJZCkgPT09IGlkKTtcbn1cblxuZnVuY3Rpb24gZmllbGROYW1lKGZpZWxkOiBhbnkpOiBzdHJpbmcge1xuICByZXR1cm4gU3RyaW5nKGZpZWxkPy5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xufVxuXG5mdW5jdGlvbiBpc0NvbG91cktpbmQoa2luZDogRHJhZnRDYW52YXNPYmplY3RUeXBlIHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4ga2luZCA9PT0gJ3JlY3QnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5mZXJBcnR3b3JrUm9sZShcbiAgZmllbGQ6IGFueSxcbiAgbGlua2VkRmllbGRzOiBhbnlbXSA9IFtdLFxuKTogRHJhZnRBcnR3b3JrUm9sZSB7XG4gIGNvbnN0IGtpbmQgPSBjYW52YXNLaW5kRm9yRmllbGRUeXBlKGZpZWxkPy5maWVsZFR5cGUpO1xuICBpZiAoa2luZCA9PT0gJ2ltYWdlJykgcmV0dXJuICdpbWFnZSc7XG4gIGlmIChraW5kID09PSAndGV4dCcpIHJldHVybiAndGV4dCc7XG4gIGlmICghaXNDb2xvdXJLaW5kKGtpbmQpKSByZXR1cm4gJ2F1dG8nO1xuICBjb25zdCBuYW1lID0gZmllbGROYW1lKGZpZWxkKTtcbiAgaWYgKC8odGV4dHxmb250fGxldHRlcnxjb3B5KS8udGVzdChuYW1lKSkgcmV0dXJuICd0ZXh0X2ZpbGwnO1xuICBpZiAoLyh3cmlzdHxiYW5kfGJhc2V8Ym9keXxncm91bmR8YmxhbmspLy50ZXN0KG5hbWUpKSByZXR1cm4gJ2JvZHlfY29sb3VyX2ZpbGwnO1xuICBjb25zdCBoYXNUZXh0ID0gbGlua2VkRmllbGRzLnNvbWUoXG4gICAgKGl0ZW0pID0+IGNhbnZhc0tpbmRGb3JGaWVsZFR5cGUoaXRlbT8uZmllbGRUeXBlKSA9PT0gJ3RleHQnXG4gICk7XG4gIHJldHVybiBoYXNUZXh0ID8gJ3RleHRfZmlsbCcgOiAnYm9keV9jb2xvdXJfZmlsbCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQXJ0d29ya1JvbGUoXG4gIGZpZWxkOiBhbnksXG4gIHRlbXBsYXRlOiBhbnksXG4gIGxpbmtlZEZpZWxkczogYW55W10gPSBbXSxcbik6IERyYWZ0QXJ0d29ya1JvbGUge1xuICBjb25zdCBpbmZlcnJlZCA9IGluZmVyQXJ0d29ya1JvbGUoZmllbGQsIGxpbmtlZEZpZWxkcyk7XG4gIGlmIChpbmZlcnJlZCA9PT0gJ2JvZHlfY29sb3VyX2ZpbGwnKSByZXR1cm4gJ2JvZHlfY29sb3VyX2ZpbGwnO1xuICBjb25zdCBiaW5kaW5nID0gYmluZGluZ0ZvckZpZWxkKGZpZWxkQmluZGluZ3NGcm9tKHRlbXBsYXRlKSwgZmllbGQ/LmlkKTtcbiAgaWYgKGJpbmRpbmc/LnJvbGUgJiYgYmluZGluZy5yb2xlICE9PSAnYXV0bycpIHJldHVybiBiaW5kaW5nLnJvbGU7XG4gIHJldHVybiBpbmZlcnJlZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluZmVyVGV4dFRhcmdldEZpZWxkSWQoXG4gIGZpZWxkOiBhbnksXG4gIHRlbXBsYXRlOiBhbnksXG4gIGxpbmtlZEZpZWxkczogYW55W10gPSBbXSxcbik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGJpbmRpbmcgPSBiaW5kaW5nRm9yRmllbGQoZmllbGRCaW5kaW5nc0Zyb20odGVtcGxhdGUpLCBmaWVsZD8uaWQpO1xuICBpZiAoYmluZGluZz8udGFyZ2V0RmllbGRJZCAhPSBudWxsKSByZXR1cm4gTnVtYmVyKGJpbmRpbmcudGFyZ2V0RmllbGRJZCk7XG4gIGNvbnN0IHRleHRGaWVsZCA9IGxpbmtlZEZpZWxkcy5maW5kKFxuICAgIChpdGVtKSA9PiBjYW52YXNLaW5kRm9yRmllbGRUeXBlKGl0ZW0/LmZpZWxkVHlwZSkgPT09ICd0ZXh0JyAmJiBpdGVtPy5pZCAhPSBudWxsXG4gICk7XG4gIHJldHVybiB0ZXh0RmllbGQ/LmlkICE9IG51bGwgPyBOdW1iZXIodGV4dEZpZWxkLmlkKSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpdEluc2lkZShcbiAgYm94OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9LFxuICBjb250ZW50V2lkdGg6IG51bWJlcixcbiAgY29udGVudEhlaWdodDogbnVtYmVyLFxuICBsb2NrQXNwZWN0UmF0aW8gPSB0cnVlLFxuKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gIGlmIChcbiAgICAhbG9ja0FzcGVjdFJhdGlvXG4gICAgfHwgIShjb250ZW50V2lkdGggPiAwKVxuICAgIHx8ICEoY29udGVudEhlaWdodCA+IDApXG4gICAgfHwgIShib3gud2lkdGggPiAwKVxuICAgIHx8ICEoYm94LmhlaWdodCA+IDApXG4gICkge1xuICAgIHJldHVybiB7IC4uLmJveCB9O1xuICB9XG4gIGNvbnN0IHNjYWxlID0gTWF0aC5taW4oYm94LndpZHRoIC8gY29udGVudFdpZHRoLCBib3guaGVpZ2h0IC8gY29udGVudEhlaWdodCk7XG4gIGNvbnN0IHdpZHRoID0gY29udGVudFdpZHRoICogc2NhbGU7XG4gIGNvbnN0IGhlaWdodCA9IGNvbnRlbnRIZWlnaHQgKiBzY2FsZTtcbiAgcmV0dXJuIHtcbiAgICB4OiBib3gueCArIChib3gud2lkdGggLSB3aWR0aCkgLyAyLFxuICAgIHk6IGJveC55ICsgKGJveC5oZWlnaHQgLSBoZWlnaHQpIC8gMixcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRMb2NrSW1hZ2VBc3BlY3QoZmllbGQ6IGFueSwgdGVtcGxhdGU/OiBhbnkpOiBib29sZWFuIHtcbiAgY29uc3QgYmluZGluZyA9IGJpbmRpbmdGb3JGaWVsZChmaWVsZEJpbmRpbmdzRnJvbSh0ZW1wbGF0ZSksIGZpZWxkPy5pZCk7XG4gIGlmICh0eXBlb2YgYmluZGluZz8ubG9ja0FzcGVjdFJhdGlvID09PSAnYm9vbGVhbicpIHJldHVybiBiaW5kaW5nLmxvY2tBc3BlY3RSYXRpbztcbiAgaWYgKHR5cGVvZiBmaWVsZD8uYXNwZWN0UmF0aW9Mb2NrID09PSAnYm9vbGVhbicpIHJldHVybiBmaWVsZC5hc3BlY3RSYXRpb0xvY2s7XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCYWNrZ3JvdW5kRmlsbChvYmo6IHsgdHlwZT86IHN0cmluZyB9KTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmo/LnR5cGUgPT09ICdyZWN0Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRnVsbEFydGJvYXJkRmlsbChcbiAgb2JqOiB7IHg/OiBudW1iZXI7IHk/OiBudW1iZXI7IHdpZHRoPzogbnVtYmVyOyBoZWlnaHQ/OiBudW1iZXIgfSxcbiAgYXJ0V2lkdGg6IG51bWJlcixcbiAgYXJ0SGVpZ2h0OiBudW1iZXIsXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBOdW1iZXIob2JqLndpZHRoKSA+PSBhcnRXaWR0aCAqIDAuOVxuICAgICYmIE51bWJlcihvYmouaGVpZ2h0KSA+PSBhcnRIZWlnaHQgKiAwLjlcbiAgICAmJiBOdW1iZXIob2JqLngpIDw9IGFydFdpZHRoICogMC4wNVxuICAgICYmIE51bWJlcihvYmoueSkgPD0gYXJ0SGVpZ2h0ICogMC4wNVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVhc3VyZURyYWZ0VGV4dChcbiAgdGV4dDogc3RyaW5nLFxuICBmb250U2l6ZSA9IDQ4LFxuICBmb250RmFtaWx5Pzogc3RyaW5nLFxuKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgY29uc3QgbGluZXMgPSBTdHJpbmcodGV4dCB8fCAnVGV4dCcpLnNwbGl0KCdcXG4nKTtcbiAgY29uc3Qgc2l6ZSA9IE1hdGgubWF4KDEyLCBOdW1iZXIoZm9udFNpemUpIHx8IDQ4KTtcbiAgbGV0IHdpZHRoID0gMDtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBpZiAoY3R4KSB7XG4gICAgICBjdHguZm9udCA9IGAke3NpemV9cHggJHtjc3NGb250RmFtaWx5KGZvbnRGYW1pbHkpfWA7XG4gICAgICB3aWR0aCA9IE1hdGgubWF4KC4uLmxpbmVzLm1hcCgobGluZSkgPT4gY3R4Lm1lYXN1cmVUZXh0KGxpbmUgfHwgJyAnKS53aWR0aCksIDApO1xuICAgIH1cbiAgfVxuICBpZiAoISh3aWR0aCA+IDApKSB7XG4gICAgd2lkdGggPSBNYXRoLm1heCguLi5saW5lcy5tYXAoKGxpbmUpID0+IChsaW5lIHx8ICcgJykubGVuZ3RoKSwgMSkgKiBzaXplICogMC42MjtcbiAgfVxuICByZXR1cm4ge1xuICAgIHdpZHRoOiBNYXRoLmNlaWwod2lkdGggKyBzaXplICogMC4xNiksXG4gICAgaGVpZ2h0OiBNYXRoLmNlaWwoTWF0aC5tYXgoMSwgbGluZXMubGVuZ3RoKSAqIHNpemUgKiAxLjE1KSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpdFRleHRCb3goXG4gIG9iajogUGljazxEcmFmdENhbnZhc09iamVjdCwgJ3gnIHwgJ3knIHwgJ3dpZHRoJyB8ICdoZWlnaHQnIHwgJ3RleHQnIHwgJ2ZvbnRTaXplJyB8ICdmb250RmFtaWx5Jz4sXG4pOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgY29uc3QgbWVhc3VyZWQgPSBtZWFzdXJlRHJhZnRUZXh0KG9iai50ZXh0IHx8ICdUZXh0Jywgb2JqLmZvbnRTaXplLCBvYmouZm9udEZhbWlseSk7XG4gIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoMjQsIG1lYXN1cmVkLndpZHRoKTtcbiAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoMjAsIG1lYXN1cmVkLmhlaWdodCk7XG4gIGNvbnN0IHByZXZXID0gTnVtYmVyKG9iai53aWR0aCkgPiAwID8gTnVtYmVyKG9iai53aWR0aCkgOiB3aWR0aDtcbiAgY29uc3QgcHJldkggPSBOdW1iZXIob2JqLmhlaWdodCkgPiAwID8gTnVtYmVyKG9iai5oZWlnaHQpIDogaGVpZ2h0O1xuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICB4OiAoTnVtYmVyKG9iai54KSB8fCAwKSArIChwcmV2VyAtIHdpZHRoKSAvIDIsXG4gICAgeTogKE51bWJlcihvYmoueSkgfHwgMCkgKyAocHJldkggLSBoZWlnaHQpIC8gMixcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGxhY2VtZW50Qm94ZXMoXG4gIHJvbGU6IERyYWZ0QXJ0d29ya1JvbGUsXG4gIGtpbmQ6IERyYWZ0Q2FudmFzT2JqZWN0VHlwZSxcbiAgdGVtcGxhdGU6IGFueSxcbik6IG51bWJlcltdW10ge1xuICBpZiAocm9sZSA9PT0gJ2JvZHlfY29sb3VyX2ZpbGwnIHx8IGtpbmQgPT09ICdyZWN0Jykge1xuICAgIGNvbnN0IGJvZHkgPSByZWdpb25zRm9yUm9sZSh0ZW1wbGF0ZT8uY3VzdG9taXNhdGlvbk1hcCwgJ2JvZHlfY29sb3VyX2ZpbGwnKTtcbiAgICBpZiAoYm9keS5sZW5ndGgpIHJldHVybiBib2R5O1xuICAgIGNvbnN0IHByaW50ID0gcmVnaW9uc0ZvclJvbGUodGVtcGxhdGU/LmN1c3RvbWlzYXRpb25NYXAsICdwcmludF9hcmVhJyk7XG4gICAgaWYgKHByaW50Lmxlbmd0aCkgcmV0dXJuIHByaW50O1xuICAgIHJldHVybiBbWzAsIDAsIDEsIDFdXTtcbiAgfVxuICBpZiAoa2luZCA9PT0gJ3RleHQnKSB7XG4gICAgY29uc3QgcGxhY2Vob2xkZXJzID0gcmVnaW9uc0ZvclJvbGUodGVtcGxhdGU/LmN1c3RvbWlzYXRpb25NYXAsICd0ZXh0X3BsYWNlaG9sZGVyJyk7XG4gICAgaWYgKHBsYWNlaG9sZGVycy5sZW5ndGgpIHJldHVybiBwbGFjZWhvbGRlcnM7XG4gICAgcmV0dXJuIHJlZ2lvbnNGb3JSb2xlKHRlbXBsYXRlPy5jdXN0b21pc2F0aW9uTWFwLCAncHJpbnRfYXJlYScpO1xuICB9XG4gIHJldHVybiByZWdpb25zRm9yUm9sZSh0ZW1wbGF0ZT8uY3VzdG9taXNhdGlvbk1hcCwgJ3ByaW50X2FyZWEnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRQbGFjZW1lbnQoXG4gIGtpbmQ6IERyYWZ0Q2FudmFzT2JqZWN0VHlwZSxcbiAgaW5kZXg6IG51bWJlcixcbiAgYXJ0V2lkdGg6IG51bWJlcixcbiAgYXJ0SGVpZ2h0OiBudW1iZXIsXG4pOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgY29uc3QgcGFkID0gTWF0aC5tYXgoMjQsIGFydFdpZHRoICogMC4wNCk7XG4gIGlmIChraW5kID09PSAnaW1hZ2UnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGFydFdpZHRoICogMC4yLFxuICAgICAgeTogYXJ0SGVpZ2h0ICogMC4yLFxuICAgICAgd2lkdGg6IGFydFdpZHRoICogMC42LFxuICAgICAgaGVpZ2h0OiBhcnRIZWlnaHQgKiAwLjYsXG4gICAgfTtcbiAgfVxuICBpZiAoa2luZCA9PT0gJ3JlY3QnKSB7XG4gICAgcmV0dXJuIHsgeDogMCwgeTogMCwgd2lkdGg6IGFydFdpZHRoLCBoZWlnaHQ6IGFydEhlaWdodCB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgeDogcGFkLFxuICAgIHk6IHBhZCArIGluZGV4ICogTWF0aC5tYXgoNjQsIGFydEhlaWdodCAqIDAuMDgpLFxuICAgIHdpZHRoOiBhcnRXaWR0aCAtIHBhZCAqIDIsXG4gICAgaGVpZ2h0OiBNYXRoLm1heCg1NiwgYXJ0SGVpZ2h0ICogMC4wNyksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVPYmplY3RJZCgpOiBzdHJpbmcge1xuICByZXR1cm4gYG9iai0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCl9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlZWRPclN5bmNDYW52YXMoXG4gIGV4aXN0aW5nOiBEcmFmdENhbnZhc1N0YXRlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgdGVtcGxhdGU6IGFueSxcbiAgdmFyaWF0aW9uczogYW55W10sXG4pOiBEcmFmdENhbnZhc1N0YXRlIHtcbiAgY29uc3Qgd2lkdGggPSBOdW1iZXIodGVtcGxhdGU/LndpZHRoKSB8fCBERUZBVUxUX0FSVEJPQVJELndpZHRoO1xuICBjb25zdCBoZWlnaHQgPSBOdW1iZXIodGVtcGxhdGU/LmhlaWdodCkgfHwgREVGQVVMVF9BUlRCT0FSRC5oZWlnaHQ7XG4gIGNvbnN0IG9iamVjdHM6IERyYWZ0Q2FudmFzT2JqZWN0W10gPSAoZXhpc3Rpbmc/Lm9iamVjdHMgfHwgW10pLm1hcCgob2JqKSA9PiAoXG4gICAgb2JqLnR5cGUgPT09ICd0ZXh0JyA/IHsgLi4ub2JqLCAuLi5maXRUZXh0Qm94KG9iaikgfSA6IHsgLi4ub2JqIH1cbiAgKSk7XG4gIGNvbnN0IGRldGFjaGVkID0gbmV3IFNldChleGlzdGluZz8uZGV0YWNoZWRGaWVsZElkcyB8fCBbXSk7XG4gIGNvbnN0IGxpbmtlZCA9IGxpbmtlZFZhcmlhdGlvbnNGb3JUZW1wbGF0ZSh0ZW1wbGF0ZSwgdmFyaWF0aW9ucyk7XG4gIGNvbnN0IGxpbmtlZEZpZWxkcyA9IGxpbmtlZC5tYXAoKHZhcmlhdGlvbikgPT4gdmFyaWF0aW9uPy52YXJpYXRpb25GaWVsZCkuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCB1c2VkUmVnaW9uczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuXG4gIGZvciAoY29uc3QgdmFyaWF0aW9uIG9mIGxpbmtlZCkge1xuICAgIGNvbnN0IGZpZWxkID0gdmFyaWF0aW9uPy52YXJpYXRpb25GaWVsZDtcbiAgICBpZiAocmVzb2x2ZUFydHdvcmtSb2xlKGZpZWxkLCB0ZW1wbGF0ZSwgbGlua2VkRmllbGRzKSAhPT0gJ3RleHRfZmlsbCcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGluZGV4ID0gb2JqZWN0cy5maW5kSW5kZXgoXG4gICAgICAob2JqKSA9PiBvYmoubWVyY2hpRmllbGRJZCA9PT0gZmllbGQ/LmlkICYmIG9iai50eXBlID09PSAncmVjdCdcbiAgICApO1xuICAgIGlmIChpbmRleCA+PSAwKSBvYmplY3RzLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICBjb25zdCBhcHBseUNvbG91clRvVGV4dCA9ICh0YXJnZXRGaWVsZElkOiBudW1iZXIgfCB1bmRlZmluZWQsIGZpbGw/OiBzdHJpbmcsIGNvbG91ckZpZWxkSWQ/OiBudW1iZXIpID0+IHtcbiAgICBpZiAoIWZpbGwgfHwgdGFyZ2V0RmllbGRJZCA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgdGV4dE9iaiA9IG9iamVjdHMuZmluZCgob2JqKSA9PiBvYmoubWVyY2hpRmllbGRJZCA9PT0gdGFyZ2V0RmllbGRJZCAmJiBvYmoudHlwZSA9PT0gJ3RleHQnKTtcbiAgICBpZiAoIXRleHRPYmopIHJldHVybiBmYWxzZTtcbiAgICB0ZXh0T2JqLmZpbGwgPSBmaWxsO1xuICAgIHRleHRPYmouY29sb3VyRmllbGRJZCA9IGNvbG91ckZpZWxkSWQ7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgY29uc3QgcGxhY2VPYmplY3QgPSAoXG4gICAga2luZDogRHJhZnRDYW52YXNPYmplY3RUeXBlLFxuICAgIHJvbGU6IERyYWZ0QXJ0d29ya1JvbGUsXG4gICAgZmllbGQ6IGFueSxcbiAgICBmaWVsZElkOiBudW1iZXIsXG4gICAgY29udGVudDogUmV0dXJuVHlwZTx0eXBlb2YgdmFyaWF0aW9uQ2FudmFzQ29udGVudD4sXG4gICkgPT4ge1xuICAgIGNvbnN0IGJveGVzID0gcGxhY2VtZW50Qm94ZXMocm9sZSwga2luZCwgdGVtcGxhdGUpO1xuICAgIGNvbnN0IGtleSA9IGAke3JvbGV9OiR7a2luZH1gO1xuICAgIGNvbnN0IHJlZ2lvbkluZGV4ID0gdXNlZFJlZ2lvbnNba2V5XSB8fCAwO1xuICAgIHVzZWRSZWdpb25zW2tleV0gPSByZWdpb25JbmRleCArIDE7XG4gICAgY29uc3QgYm94ID0gYm94ZXNbcmVnaW9uSW5kZXhdIHx8IGJveGVzWzBdO1xuICAgIGNvbnN0IHBsYWNlID0gYm94XG4gICAgICA/IGJib3hUb1BpeGVscyhib3gsIHdpZHRoLCBoZWlnaHQpXG4gICAgICA6IGRlZmF1bHRQbGFjZW1lbnQoa2luZCwgb2JqZWN0cy5sZW5ndGgsIHdpZHRoLCBoZWlnaHQpO1xuICAgIGNvbnN0IGxvY2tBc3BlY3RSYXRpbyA9IGtpbmQgPT09ICdpbWFnZScgPyBzaG91bGRMb2NrSW1hZ2VBc3BlY3QoZmllbGQsIHRlbXBsYXRlKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBuZXh0OiBEcmFmdENhbnZhc09iamVjdCA9IHtcbiAgICAgIGlkOiBjcmVhdGVPYmplY3RJZCgpLFxuICAgICAgdHlwZToga2luZCxcbiAgICAgIG1lcmNoaUZpZWxkSWQ6IGZpZWxkSWQsXG4gICAgICBhcnR3b3JrUm9sZTogcm9sZSxcbiAgICAgIGxvY2tlZDoga2luZCA9PT0gJ3JlY3QnLFxuICAgICAgcm90YXRpb246IDAsXG4gICAgICBzY2FsZVg6IDEsXG4gICAgICBzY2FsZVk6IDEsXG4gICAgICBsb2NrQXNwZWN0UmF0aW8sXG4gICAgICAuLi5wbGFjZSxcbiAgICAgIHRleHQ6IGNvbnRlbnQudGV4dCxcbiAgICAgIHNyYzogY29udGVudC5zcmMsXG4gICAgICBmaWxsOiBjb250ZW50LmZpbGwgfHwgKGtpbmQgPT09ICd0ZXh0JyA/ICcjMTExMTExJyA6IHVuZGVmaW5lZCksXG4gICAgICBmb250RmFtaWx5OiBraW5kID09PSAndGV4dCcgPyBERUZBVUxUX0RSQUZUX0ZPTlQgOiB1bmRlZmluZWQsXG4gICAgICBmb250U2l6ZTogTWF0aC5tYXgoMjgsIE1hdGgucm91bmQocGxhY2UuaGVpZ2h0ICogMC42MikpLFxuICAgIH07XG4gICAgaWYgKGtpbmQgPT09ICd0ZXh0JykgT2JqZWN0LmFzc2lnbihuZXh0LCBmaXRUZXh0Qm94KG5leHQpKTtcbiAgICBpZiAoa2luZCA9PT0gJ3JlY3QnKSBvYmplY3RzLnVuc2hpZnQobmV4dCk7XG4gICAgZWxzZSBvYmplY3RzLnB1c2gobmV4dCk7XG4gIH07XG5cbiAgZm9yIChjb25zdCB2YXJpYXRpb24gb2YgbGlua2VkKSB7XG4gICAgY29uc3QgZmllbGQgPSB2YXJpYXRpb24/LnZhcmlhdGlvbkZpZWxkO1xuICAgIGNvbnN0IGZpZWxkSWQgPSBmaWVsZD8uaWQ7XG4gICAgY29uc3QgY29udGVudCA9IHZhcmlhdGlvbkNhbnZhc0NvbnRlbnQodmFyaWF0aW9uKTtcbiAgICBpZiAoIWNvbnRlbnQua2luZCB8fCBmaWVsZElkID09IG51bGwgfHwgZGV0YWNoZWQuaGFzKGZpZWxkSWQpKSBjb250aW51ZTtcbiAgICBjb25zdCByb2xlID0gcmVzb2x2ZUFydHdvcmtSb2xlKGZpZWxkLCB0ZW1wbGF0ZSwgbGlua2VkRmllbGRzKTtcbiAgICBpZiAocm9sZSA9PT0gJ3RleHRfZmlsbCcpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgZm91bmQgPSBvYmplY3RzLmZpbmQoKG9iaikgPT4gb2JqLm1lcmNoaUZpZWxkSWQgPT09IGZpZWxkSWQpO1xuICAgIGlmIChmb3VuZCkge1xuICAgICAgaWYgKGNvbnRlbnQua2luZCA9PT0gJ3RleHQnICYmIGNvbnRlbnQudGV4dCAhPSBudWxsKSB7XG4gICAgICAgIGZvdW5kLnRleHQgPSBjb250ZW50LnRleHQ7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZm91bmQsIGZpdFRleHRCb3goZm91bmQpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb250ZW50LmtpbmQgPT09ICdpbWFnZScgJiYgY29udGVudC5zcmMpIGZvdW5kLnNyYyA9IGNvbnRlbnQuc3JjO1xuICAgICAgaWYgKGNvbnRlbnQua2luZCA9PT0gJ3JlY3QnICYmIGNvbnRlbnQuZmlsbCkgZm91bmQuZmlsbCA9IGNvbnRlbnQuZmlsbDtcbiAgICAgIGlmIChmb3VuZC50eXBlID09PSAnaW1hZ2UnKSB7XG4gICAgICAgIGZvdW5kLmxvY2tBc3BlY3RSYXRpbyA9IHNob3VsZExvY2tJbWFnZUFzcGVjdChmaWVsZCwgdGVtcGxhdGUpO1xuICAgICAgfVxuICAgICAgaWYgKGZvdW5kLnR5cGUgPT09ICdyZWN0Jykge1xuICAgICAgICBmb3VuZC5sb2NrZWQgPSB0cnVlO1xuICAgICAgICBmb3VuZC5hcnR3b3JrUm9sZSA9IHJvbGU7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY29udGVudC5raW5kID09PSAndGV4dCcgJiYgIWNvbnRlbnQudGV4dCkgY29udGludWU7XG4gICAgaWYgKGNvbnRlbnQua2luZCA9PT0gJ2ltYWdlJyAmJiAhY29udGVudC5zcmMpIGNvbnRpbnVlO1xuICAgIGlmIChjb250ZW50LmtpbmQgPT09ICdyZWN0JyAmJiAhY29udGVudC5maWxsKSBjb250aW51ZTtcbiAgICBwbGFjZU9iamVjdChjb250ZW50LmtpbmQsIHJvbGUsIGZpZWxkLCBmaWVsZElkLCBjb250ZW50KTtcbiAgfVxuXG4gIGZvciAoY29uc3QgdmFyaWF0aW9uIG9mIGxpbmtlZCkge1xuICAgIGNvbnN0IGZpZWxkID0gdmFyaWF0aW9uPy52YXJpYXRpb25GaWVsZDtcbiAgICBjb25zdCBmaWVsZElkID0gZmllbGQ/LmlkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSB2YXJpYXRpb25DYW52YXNDb250ZW50KHZhcmlhdGlvbik7XG4gICAgaWYgKGZpZWxkSWQgPT0gbnVsbCB8fCBkZXRhY2hlZC5oYXMoZmllbGRJZCkgfHwgIWNvbnRlbnQuZmlsbCkgY29udGludWU7XG4gICAgY29uc3Qgcm9sZSA9IHJlc29sdmVBcnR3b3JrUm9sZShmaWVsZCwgdGVtcGxhdGUsIGxpbmtlZEZpZWxkcyk7XG4gICAgaWYgKHJvbGUgIT09ICd0ZXh0X2ZpbGwnKSBjb250aW51ZTtcbiAgICBjb25zdCB0YXJnZXRJZCA9IGluZmVyVGV4dFRhcmdldEZpZWxkSWQoZmllbGQsIHRlbXBsYXRlLCBsaW5rZWRGaWVsZHMpO1xuICAgIGFwcGx5Q29sb3VyVG9UZXh0KHRhcmdldElkLCBjb250ZW50LmZpbGwsIGZpZWxkSWQpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgb2JqZWN0cyxcbiAgICBkZXRhY2hlZEZpZWxkSWRzOiBBcnJheS5mcm9tKGRldGFjaGVkKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGFjaEZpZWxkKFxuICBzdGF0ZTogRHJhZnRDYW52YXNTdGF0ZSxcbiAgb2JqZWN0SWQ6IHN0cmluZyxcbik6IERyYWZ0Q2FudmFzU3RhdGUge1xuICBjb25zdCB0YXJnZXQgPSBzdGF0ZS5vYmplY3RzLmZpbmQoKG9iaikgPT4gb2JqLmlkID09PSBvYmplY3RJZCk7XG4gIGNvbnN0IGRldGFjaGVkRmllbGRJZHMgPSBbLi4uKHN0YXRlLmRldGFjaGVkRmllbGRJZHMgfHwgW10pXTtcbiAgaWYgKHRhcmdldD8ubWVyY2hpRmllbGRJZCAhPSBudWxsICYmICFkZXRhY2hlZEZpZWxkSWRzLmluY2x1ZGVzKHRhcmdldC5tZXJjaGlGaWVsZElkKSkge1xuICAgIGRldGFjaGVkRmllbGRJZHMucHVzaCh0YXJnZXQubWVyY2hpRmllbGRJZCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBvYmplY3RzOiBzdGF0ZS5vYmplY3RzLmZpbHRlcigob2JqKSA9PiBvYmouaWQgIT09IG9iamVjdElkKSxcbiAgICBkZXRhY2hlZEZpZWxkSWRzLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRBcmVhR3VpZGVzKHRlbXBsYXRlOiBhbnkpOiBBcnJheTx7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbn0+IHtcbiAgY29uc3Qgd2lkdGggPSBOdW1iZXIodGVtcGxhdGU/LndpZHRoKSB8fCBERUZBVUxUX0FSVEJPQVJELndpZHRoO1xuICBjb25zdCBoZWlnaHQgPSBOdW1iZXIodGVtcGxhdGU/LmhlaWdodCkgfHwgREVGQVVMVF9BUlRCT0FSRC5oZWlnaHQ7XG4gIHJldHVybiByZWdpb25zRm9yUm9sZSh0ZW1wbGF0ZT8uY3VzdG9taXNhdGlvbk1hcCwgJ3ByaW50X2FyZWEnKS5tYXAoKGJib3gpID0+XG4gICAgYmJveFRvUGl4ZWxzKGJib3gsIHdpZHRoLCBoZWlnaHQpXG4gICk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsU0FDRUEsaUJBQWlCLEVBQ2pCQyxnQkFBZ0IsRUFNaEJDLFNBQVMsUUFDSixTQUFTO0FBQ2hCLFNBQVNDLGtCQUFrQixFQUFFQyxhQUFhLFFBQVEsY0FBYztBQUNoRSxTQUFTQyxnQkFBZ0IsUUFBUSxZQUFZO0FBRTdDLE9BQU8sU0FBU0Msd0JBQXdCQSxDQUFDQyxPQUFZLEVBQVc7RUFDOUQsT0FBT0MsS0FBSyxDQUFDQyxPQUFPLENBQUNGLE9BQU8sYUFBUEEsT0FBTyx1QkFBUEEsT0FBTyxDQUFFRyxjQUFjLENB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QUFRO0VBQ3ZDLENBQUM7QUFDSDtBQUVBLE9BQU8sU0FBU3VDLFdBQVdBLENBQ3pCQyxLQUF1QixFQUN2QkMsUUFBZ0IsRUFDRTtFQUNsQixJQUFNQyxNQUFNLEdBQUdGLEtBQUssQ0FBQ3pDLE9BQU8sQ0FBQy9ILElBQUksQ0FBQyxVQUFDeUYsR0FBRztJQUFBLE9BQUtBLEdBQUcsQ0FBQzVJLEVBQUUsS0FBSzROLFFBQVE7RUFBQSxFQUFDO0VBQy9ELElBQU14QyxnQkFBZ0IsR0FBQWxLLGtCQUFBLENBQVF5TSxLQUFLLENBQUN2QyxnQkFBZ0IsSUFBSSxFQUFFLENBQUU7RUFDNUQsSUFBSSxDQUFBeUMsTUFBTSxhQUFOQSxNQUFNLHVCQUFOQSxNQUFNLENBQUVsQyxhQUFhLEtBQUksSUFBSSxJQUFJLENBQUNQLGdCQUFnQixDQUFDMEMsUUFBUSxDQUFDRCxNQUFNLENBQUNsQyxhQUFhLENBQUMsRUFBRTtJQUNyRlAsZ0JBQWdCLENBQUM0QixJQUFJLENBQUNhLE1BQU0sQ0FBQ2xDLGFBQWEsQ0FBQztFQUM3QztFQUNBLE9BQUF0RCxhQUFBLENBQUFBLGFBQUEsS0FDS3NGLEtBQUs7SUFDUnpDLE9BQU8sRUFBRXlDLEtBQUssQ0FBQ3pDLE9BQU8sQ0FBQ2hNLE1BQU0sQ0FBQyxVQUFDMEosR0FBRztNQUFBLE9BQUtBLEdBQUcsQ0FBQzVJLEVBQUUsS0FBSzROLFFBQVE7SUFBQSxFQUFDO0lBQzNEeEMsZ0JBQWdCLEVBQWhCQTtFQUFnQjtBQUVwQjtBQUVBLE9BQU8sU0FBUzJDLGVBQWVBLENBQUN6TixRQUFhLEVBSzFDO0VBQ0QsSUFBTW9CLEtBQUssR0FBR0QsTUFBTSxDQUFDbkIsUUFBUSxhQUFSQSxRQUFRLHVCQUFSQSxRQUFRLENBQUVvQixLQUFLLENBQUMsSUFBSXJFLGdCQUFnQixDQUFDcUUsS0FBSztFQUMvRCxJQUFNRSxNQUFNLEdBQUdILE1BQU0sQ0FBQ25CLFFBQVEsYUFBUkEsUUFBUSx1QkFBUkEsUUFBUSxDQUFFc0IsTUFBTSxDQUFDLElBQUl2RSxnQkFBZ0IsQ0FBQ3VFLE1BQU07RUFDbEUsT0FBT3lFLGNBQWMsQ0FBQy9GLFFBQVEsYUFBUkEsUUFBUSx1QkFBUkEsUUFBUSxDQUFFZ0csZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLENBQUN4SCxHQUFHLENBQUMsVUFBQytHLElBQUk7SUFBQSxPQUN2RWEsWUFBWSxDQUFDYixJQUFJLEVBQUVuRSxLQUFLLEVBQUVFLE1BQU0sQ0FBQztFQUFBLENBQ25DLENBQUM7QUFDSCIsImlnbm9yZUxpc3QiOltdfQ==
|