Sanakey
2021-06-04 355a84d740a2a9dfa1d67cb2d2e11843d42809ac
提交 | 用户 | age
b6cc28 1 "use strict";
3dd7c0 2 var __assign = (this && this.__assign) || function () {
S 3     __assign = Object.assign || function(t) {
4         for (var s, i = 1, n = arguments.length; i < n; i++) {
5             s = arguments[i];
6             for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7                 t[p] = s[p];
8         }
9         return t;
10     };
11     return __assign.apply(this, arguments);
12 };
27d5ae 13 var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
S 14     return new (P || (P = Promise))(function (resolve, reject) {
15         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17         function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
18         step((generator = generator.apply(thisArg, _arguments || [])).next());
19     });
20 };
21 var __generator = (this && this.__generator) || function (thisArg, body) {
22     var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
23     return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24     function verb(n) { return function (v) { return step([n, v]); }; }
25     function step(op) {
26         if (f) throw new TypeError("Generator is already executing.");
27         while (_) try {
28             if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29             if (y = 0, t) op = [op[0] & 2, t.value];
30             switch (op[0]) {
31                 case 0: case 1: t = op; break;
32                 case 4: _.label++; return { value: op[1], done: false };
33                 case 5: _.label++; y = op[1]; op = [0]; continue;
34                 case 7: op = _.ops.pop(); _.trys.pop(); continue;
35                 default:
36                     if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37                     if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38                     if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39                     if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40                     if (t[2]) _.ops.pop();
41                     _.trys.pop(); continue;
42             }
43             op = body.call(thisArg, _);
44         } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45         if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46     }
47 };
b6cc28 48 Object.defineProperty(exports, "__esModule", { value: true });
S 49 var myValidator_1 = require("../../utils/myValidator");
50 var validatorInstance;
51 Page({
52     data: {
6eb4ec 53         autosize: { maxHeight: 120, minHeight: 50 },
3dd7c0 54         validatorInstance: {},
S 55         freeId: 0,
56         formId: 710802,
57         formData: {},
27d5ae 58         doccode: '',
282d69 59         fromPage: '',
f46177 60         delivery: {},
355a84 61         feeRateForPay: 1,
S 62         sellerUnCheckedNames: '',
63         coverImageUrl: '',
64         isShowDialog: false
b6cc28 65     },
27d5ae 66     onLoad: function (options) {
S 67         var doccode = options.doccode || '';
282d69 68         var fromPage = options.fromPage || '';
f46177 69         var settings = wx.globalData.settings;
3dd7c0 70         this.setData({
27d5ae 71             fileUploadUrl: "/shopping/panicBuying.do?m=uploadAttachment&formid=" + this.data.formId,
S 72             doccode: doccode,
f46177 73             fromPage: fromPage,
S 74             feeRateForPay: (settings.feeRateForWxPay + settings.platformOperatorCommissionRatio) * 100
27d5ae 75         });
S 76         if (doccode) {
77             this.getSaveData();
78         }
79     },
80     getSaveData: function () {
81         return __awaiter(this, void 0, void 0, function () {
82             var doccode, _a, error, result, data, formData;
83             return __generator(this, function (_b) {
84                 switch (_b.label) {
85                     case 0:
86                         doccode = this.data.doccode;
87                         return [4, wx.$utils.to(wx.$http.request({
88                                 url: "/shopping/panicBuying.do?m=getPanicBuyingDetail",
89                                 data: {
90                                     doccode: doccode,
91                                     isEdit: true,
92                                     RefOpenId: wx.globalData.OpenId
93                                 }
94                             }))];
95                     case 1:
96                         _a = _b.sent(), error = _a[0], result = _a[1];
97                         if (error) {
98                             console.log(error);
99                             return [2];
100                         }
101                         console.log(result);
102                         data = result.list[0];
103                         formData = {
104                             promotionsTitle: data.title,
105                             originalPrice: data.originalPrice,
106                             flashSalePrice: data.salesPrice,
107                             flashSaleTotal: data.quantity,
108                             flashSaleLimit: data.restrictBuyingQuantity,
109                             promotionDescription: data.description,
110                             startTime: data.effectiveStartDate,
111                             endTime: data.effectiveEndDate,
112                             coverImageList: (data.coverImageUrl && this.getCoverImageList(data)) || [],
282d69 113                             imagesList: data.imagesUrl,
27d5ae 114                             coverImage: data.coverImage,
S 115                             images: data.images,
116                             freeId: data.freeId,
117                         };
355a84 118                         this.setData(__assign({}, formData, { coverImageUrl: data.coverImageUrl, sellerList: result.sellerList, status: data.panicBuyingStatus, delivery: {
27d5ae 119                                 freeId: data.freeId,
S 120                                 freeName: data.freeName,
121                                 isRequiredAddress: data.isRequiredAddress,
122                                 transCosts: data.transCosts,
123                             } }));
124                         console.log('配送数据。。。', this.data.delivery);
d38be7 125                         wx.setNavigationBarTitle({
S 126                             title: data.title
127                         });
27d5ae 128                         return [2];
S 129                 }
130             });
131         });
132     },
133     getCoverImageList: function (data) {
134         var _a = data.coverImage.split(";"), unid = _a[0], seq = _a[1];
135         return [{
136                 url: data.coverImageUrl || '',
137                 unid: unid,
138                 seq: seq
139             }];
b6cc28 140     },
S 141     onReady: function () {
142         this.initValidator();
143     },
144     selectedStartTime: function (event) {
145         console.log('开始', event);
27d5ae 146         this.setData({
S 147             startTime: event.detail.startTime,
148         });
b6cc28 149     },
S 150     selectedEndTime: function (event) {
151         console.log('结束', event);
27d5ae 152         this.setData({
S 153             endTime: event.detail.endTime,
154         });
b6cc28 155     },
S 156     getDeliveryMethod: function (event) {
157         console.log(event.detail);
27d5ae 158         this.setData({
S 159             freeId: event.detail.freeId,
160         });
3dd7c0 161         console.log('this.data.freeId;', this.data.freeId);
b6cc28 162     },
S 163     checkPromotionsTitle: function (e) {
164         var value = e.detail.value;
165         console.log(e);
166         validatorInstance.checkField('promotionsTitle', value);
27d5ae 167         this.setData({
S 168             promotionsTitle: value.trim()
169         });
b6cc28 170     },
S 171     checkOriginalPrice: function (e) {
172         var value = e.detail.value;
173         console.log(e);
174         validatorInstance.checkField('originalPrice', value);
27d5ae 175         this.setData({
282d69 176             originalPrice: value.trim()
27d5ae 177         });
b6cc28 178     },
S 179     checkFlashSalePrice: function (e) {
180         var value = e.detail.value;
181         console.log(e);
182         validatorInstance.checkField('flashSalePrice', value);
27d5ae 183         this.setData({
282d69 184             flashSalePrice: value.trim()
27d5ae 185         });
b6cc28 186     },
S 187     checkFlashSaleTotal: function (e) {
188         var value = e.detail.value;
189         console.log(e);
190         validatorInstance.checkField('flashSaleTotal', value);
27d5ae 191         this.setData({
282d69 192             flashSaleTotal: value.trim()
27d5ae 193         });
b6cc28 194     },
S 195     checkFlashSaleLimit: function (e) {
196         var value = e.detail.value;
197         console.log(e);
198         validatorInstance.checkField('flashSaleLimit', value);
27d5ae 199         this.setData({
282d69 200             flashSaleLimit: value.trim()
27d5ae 201         });
3dd7c0 202     },
S 203     checkPromotionDescription: function (e) {
204         var value = e.detail.value;
205         console.log(e);
206         validatorInstance.checkField('promotionDescription', value);
27d5ae 207         this.setData({
S 208             promotionDescription: value.trim()
209         });
3dd7c0 210     },
S 211     postFormData: function (data) {
27d5ae 212         return __awaiter(this, void 0, void 0, function () {
S 213             var _a, error, res;
214             return __generator(this, function (_b) {
215                 switch (_b.label) {
216                     case 0: return [4, wx.$utils.to(wx.$http.request({
217                             url: '/shopping/panicBuying.do?m=saveDocCode',
218                             data: data,
219                             method: 'POST'
220                         }))];
221                     case 1:
222                         _a = _b.sent(), error = _a[0], res = _a[1];
223                         if (error) {
224                             console.log(error);
282d69 225                             return [2, false];
27d5ae 226                         }
S 227                         console.log(res);
355a84 228                         if (res.state === 'success') {
S 229                             wx.showToast({
230                                 title: '成功',
231                                 duration: 2000
232                             });
233                         }
234                         if (res.state === 'failed' && res.sellerCheckedBalance > 0) {
235                             this.setData({
236                                 sellerUnCheckedNames: res.sellerUnCheckedNames,
237                                 isShowDialog: true
238                             });
239                         }
240                         return [2, res.state === 'success'];
27d5ae 241                 }
S 242             });
243         });
6eb4ec 244     },
b6cc28 245     onSubmit: function () {
282d69 246         return __awaiter(this, void 0, void 0, function () {
355a84 247             var timeQuantum, sellerEdit, fileUploader, fileUploaderMultiple, deliveryMethod, checkTransCosts, transCosts, checkStartTime, checkEndTime, checkCoverImage, checkAllData, sellerList, checkDefaultSeller, checkArr, data, coverImage, coverImageUrl, images, formData;
282d69 248             return __generator(this, function (_a) {
S 249                 switch (_a.label) {
250                     case 0:
251                         timeQuantum = this.selectComponent('#time-quantum');
252                         sellerEdit = this.selectComponent('#seller-edit');
253                         fileUploader = this.selectComponent('#file-uploader');
254                         fileUploaderMultiple = this.selectComponent('#file-uploader-multiple');
255                         deliveryMethod = this.selectComponent('#delivery-method');
256                         checkTransCosts = true;
257                         transCosts = 0;
258                         if (deliveryMethod.data.isRequiredAddress) {
259                             checkTransCosts = deliveryMethod.checkFields();
260                             transCosts = Number(deliveryMethod.data.transCosts);
261                         }
262                         console.log(timeQuantum);
263                         checkStartTime = timeQuantum.checkTime("startTime", "请选择计划开始时间");
264                         checkEndTime = timeQuantum.checkTime("endTime", "请选择计划结束时间");
265                         checkCoverImage = fileUploader.checkImages("coverImage", "请上传一张封面图");
266                         checkAllData = validatorInstance.checkAllData();
267                         sellerList = sellerEdit.getSellerList();
268                         if (sellerList.length < 1) {
269                             wx.showToast({
270                                 title: '请选择营销人员',
271                                 icon: 'none',
272                                 duration: 2000
273                             });
274                             return [2];
275                         }
276                         checkDefaultSeller = sellerEdit.checkDefaultSeller();
277                         if (!checkDefaultSeller) {
278                             wx.showToast({
279                                 title: '请选择默认营销人员',
280                                 icon: 'none',
281                                 duration: 2000
282                             });
283                             return [2];
284                         }
285                         console.log('checkDefaultSeller', checkDefaultSeller);
d38be7 286                         checkArr = [checkTransCosts, checkStartTime, checkEndTime, checkCoverImage, checkAllData];
282d69 287                         data = {};
S 288                         if (!checkArr.every(function (item) {
289                             return item;
290                         })) return [3, 2];
291                         console.log('....提交成功');
292                         coverImage = fileUploader.getCoverImageUnid();
355a84 293                         coverImageUrl = fileUploader.getImgList()[0].url || '';
S 294                         this.setData({
295                             coverImageUrl: coverImageUrl
296                         });
282d69 297                         images = fileUploaderMultiple.getImagesUnid();
355a84 298                         console.log(coverImage, images, coverImageUrl);
282d69 299                         formData = this.data;
S 300                         data = {
301                             docCode: formData.doccode,
302                             formId: formData.formId,
303                             docStatus: 100,
304                             coverImage: coverImage,
305                             images: images,
306                             transCosts: transCosts,
307                             effectiveStartDate: formData.startTime,
308                             effectiveEndDate: formData.endTime,
309                             freeId: formData.freeId,
310                             title: formData.promotionsTitle,
311                             originalPrice: Number(formData.originalPrice),
312                             salesPrice: Number(formData.flashSalePrice),
313                             quantity: Number(formData.flashSaleTotal),
314                             restrictBuyingQuantity: Number(formData.flashSaleLimit),
315                             description: formData.promotionDescription,
316                             sellerList: sellerList,
317                         };
318                         console.log('待发布数据', data);
319                         return [4, this.postFormData(data)];
320                     case 1:
321                         if (!(_a.sent()))
322                             return [2];
323                         if (this.data.fromPage == 'edit') {
324                             wx.navigateBack();
325                         }
326                         else {
327                             wx.redirectTo({
328                                 url: '../promotionsManageList/promotionsManageList?tab=1'
329                             });
330                         }
331                         return [3, 3];
332                     case 2:
333                         wx.showToast({
334                             title: '页面还有错误未处理',
335                             icon: 'none',
336                             duration: 2000
337                         });
338                         console.log('还有错误未处理');
339                         _a.label = 3;
340                     case 3: return [2];
341                 }
27d5ae 342             });
282d69 343         });
b6cc28 344     },
3dd7c0 345     onSave: function () {
S 346         var sellerEdit = this.selectComponent('#seller-edit');
347         var sellerList = sellerEdit.getSellerList();
348         var fileUploader = this.selectComponent('#file-uploader');
349         var fileUploaderMultiple = this.selectComponent('#file-uploader-multiple');
350         console.log('....提交成功');
351         var coverImage = fileUploader.getCoverImageUnid();
352         var images = fileUploaderMultiple.getImagesUnid();
27d5ae 353         var deliveryMethod = this.selectComponent('#delivery-method');
S 354         var transCosts = 0;
355         if (deliveryMethod.data.isRequiredAddress) {
356             transCosts = Number(deliveryMethod.data.transCosts);
357         }
3dd7c0 358         console.log(coverImage, images);
27d5ae 359         var formData = this.data;
282d69 360         console.log('>>>>>>>>formData', formData);
27d5ae 361         var data = {
S 362             docCode: formData.doccode,
363             formId: formData.formId,
364             docStatus: 0,
365             coverImage: coverImage,
366             images: images,
367             transCosts: transCosts,
368             effectiveStartDate: formData.startTime,
369             effectiveEndDate: formData.endTime,
370             freeId: formData.freeId,
371             title: formData.promotionsTitle,
282d69 372             originalPrice: Number(formData.originalPrice) || 0,
S 373             salesPrice: Number(formData.flashSalePrice) || 0,
374             quantity: Number(formData.flashSaleTotal) || 0,
375             restrictBuyingQuantity: Number(formData.flashSaleLimit) || 0,
27d5ae 376             description: formData.promotionDescription,
S 377             sellerList: sellerList,
378         };
3dd7c0 379         console.log('待保存数据', data);
S 380         this.postFormData(data);
b6cc28 381     },
S 382     initValidator: function () {
383         validatorInstance = new myValidator_1.default({
384             rules: {
385                 promotionsTitle: {
386                     required: true,
355a84 387                     rangelength: [3, 14]
b6cc28 388                 },
S 389                 originalPrice: {
390                     required: true,
391                     number: true
392                 },
393                 flashSalePrice: {
394                     required: true,
395                     number: true
396                 },
397                 flashSaleTotal: {
398                     required: true,
399                     number: true
400                 },
401                 flashSaleLimit: {
402                     required: true,
403                     number: true
404                 },
405             },
406             messages: {
407                 promotionsTitle: {
408                     required: '请输入活动标题',
355a84 409                     rangelength: '文字长度请控制在3到14之间'
b6cc28 410                 },
S 411                 originalPrice: {
8724a4 412                     required: '请输入产品标价',
b6cc28 413                     number: '价格必须为数字'
S 414                 },
415                 flashSalePrice: {
416                     required: '请输入产品秒杀价',
417                     number: '价格必须为数字'
418                 },
419                 flashSaleTotal: {
420                     required: '请输入产品总量',
421                     number: '数量必须为数字'
422                 },
423                 flashSaleLimit: {
424                     required: '请输入产品每人限购数量',
425                     number: '数量必须为数字'
426                 },
427             },
428             multiCheck: true
429         }, this);
9e299c 430         console.log('hhhh,', validatorInstance);
b6cc28 431     },
355a84 432     onShareAppMessage: function () {
S 433         var doccode = this.data.doccode || '';
434         var imageUrl = this.data.coverImageUrl || '';
435         var sellerUnCheckedNames = this.data.sellerUnCheckedNames || '';
436         return {
437             title: "\u8BF7\u8425\u9500\u4EBA\u5458[" + sellerUnCheckedNames + "]\u9A8C\u8BC1\u8EAB\u4EFD",
438             imageUrl: imageUrl,
439             path: "pages/sellerVerify/sellerVerify?doccode=" + doccode,
440         };
441     }
b6cc28 442 });
355a84 443 //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhc2hTYWxlQ3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZmxhc2hTYWxlQ3JlYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLHVEQUFrRDtBQUVsRCxJQUFJLGlCQUE2QixDQUFDO0FBRWxDLElBQUksQ0FBQztJQUNILElBQUksRUFBRTtRQUNKLFFBQVEsRUFBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtRQUMxQyxpQkFBaUIsRUFBQyxFQUFFO1FBQ3BCLE1BQU0sRUFBQyxDQUFDO1FBQ1IsTUFBTSxFQUFDLE1BQU07UUFDYixRQUFRLEVBQUUsRUFBRTtRQUNaLE9BQU8sRUFBQyxFQUFFO1FBQ1YsUUFBUSxFQUFDLEVBQUU7UUFDWCxRQUFRLEVBQUMsRUFBRTtRQUNYLGFBQWEsRUFBQyxDQUFDO1FBQ2Ysb0JBQW9CLEVBQUMsRUFBRTtRQUN2QixhQUFhLEVBQUMsRUFBRTtRQUNoQixZQUFZLEVBQUMsS0FBSztLQUNuQjtJQUNELE1BQU0sWUFBQyxPQUFPO1FBRVosSUFBSSxPQUFPLEdBQUUsT0FBTyxDQUFDLE9BQU8sSUFBRSxFQUFFLENBQUM7UUFDakMsSUFBSSxRQUFRLEdBQUUsT0FBTyxDQUFDLFFBQVEsSUFBRSxFQUFFLENBQUM7UUFDbkMsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7UUFDdEMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUNYLGFBQWEsRUFBRSx3REFBc0QsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFRO1lBQ3ZGLE9BQU8sU0FBQTtZQUNQLFFBQVEsVUFBQTtZQUNSLGFBQWEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEdBQUMsUUFBUSxDQUFDLCtCQUErQixDQUFDLEdBQUMsR0FBRztTQUN2RixDQUFDLENBQUE7UUFDRixJQUFJLE9BQU8s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QVcsRUFBRSxnQkFBZ0I7aUJBQzlCO2dCQUNELGFBQWEsRUFBRTtvQkFDYixRQUFRLEVBQUUsU0FBUztvQkFDbkIsTUFBTSxFQUFFLFNBQVM7aUJBQ2xCO2dCQUNELGNBQWMsRUFBRTtvQkFDZCxRQUFRLEVBQUUsVUFBVTtvQkFDcEIsTUFBTSxFQUFFLFNBQVM7aUJBQ2xCO2dCQUNELGNBQWMsRUFBRTtvQkFDZCxRQUFRLEVBQUUsU0FBUztvQkFDbkIsTUFBTSxFQUFFLFNBQVM7aUJBQ2xCO2dCQUNELGNBQWMsRUFBRTtvQkFDZCxRQUFRLEVBQUUsYUFBYTtvQkFDdkIsTUFBTSxFQUFFLFNBQVM7aUJBQ2xCO2FBSUY7WUFDRCxVQUFVLEVBQUMsSUFBSTtTQUNoQixFQUFDLElBQUksQ0FBQyxDQUFBO1FBSVAsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsaUJBQWlCO1FBQ2YsSUFBSSxPQUFPLEdBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1FBRTdDLElBQUksUUFBUSxHQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQztRQUNwRCxJQUFJLG9CQUFvQixHQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLElBQUksRUFBRSxDQUFDO1FBQ3ZFLE9BQU87WUFFTCxLQUFLLEVBQUUsb0NBQVMsb0JBQW9CLDhCQUFPO1lBQzNDLFFBQVEsVUFBQTtZQUNSLElBQUksRUFBRSw2Q0FBMkMsT0FBUztTQUMzRCxDQUFBO0lBQ0gsQ0FBQztDQUNGLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIGltcG9ydCAqIGFzIGRheWpzIGZyb20gXCJkYXlqc1wiO1xyXG5pbXBvcnQgTXlWYWxpZGF0b3IgZnJvbSBcIi4uLy4uL3V0aWxzL215VmFsaWRhdG9yXCI7XHJcblxyXG5sZXQgdmFsaWRhdG9ySW5zdGFuY2U6TXlWYWxpZGF0b3I7XHJcbi8vIGNvbnN0IGFwcCA9IGdldEFwcDxJQXBwT3B0aW9uPigpO1xyXG5QYWdlKHtcclxuICBkYXRhOiB7XHJcbiAgICBhdXRvc2l6ZTp7IG1heEhlaWdodDogMTIwLCBtaW5IZWlnaHQ6IDUwIH0sXHJcbiAgICB2YWxpZGF0b3JJbnN0YW5jZTp7fSxcclxuICAgIGZyZWVJZDowLFxyXG4gICAgZm9ybUlkOjcxMDgwMiwgLy/lip/og73lj7fvvJrnp5LmnYAgNzEwODAyIO+8jCDmiqXlkI3pgoDnuqYgNzEwODAzIO+8jOWboui0rSA3MTA4MDRcclxuICAgIGZvcm1EYXRhOiB7fSxcclxuICAgIGRvY2NvZGU6JycsXHJcbiAgICBmcm9tUGFnZTonJyxcclxuICAgIGRlbGl2ZXJ5Ont9LFxyXG4gICAgZmVlUmF0ZUZvclBheToxLFxyXG4gICAgc2VsbGVyVW5DaGVja2VkTmFtZXM6JycsXHJcbiAgICBjb3ZlckltYWdlVXJsOicnLFxyXG4gICAgaXNTaG93RGlhbG9nOmZhbHNlXHJcbiAgfSxcclxuICBvbkxvYWQob3B0aW9ucykge1xyXG4gICAgLy8gY29uc29sZS5sb2coYXBwKTtcclxuICAgIGxldCBkb2Njb2RlID1vcHRpb25zLmRvY2NvZGV8fCcnO1xyXG4gICAgbGV0IGZyb21QYWdlID1vcHRpb25zLmZyb21QYWdlfHwnJztcclxuICAgIGxldCBzZXR0aW5ncyA9IHd4Lmdsb2JhbERhdGEuc2V0dGluZ3M7XHJcbiAgICB0aGlzLnNldERhdGEoe1xyXG4gICAgICBmaWxlVXBsb2FkVXJsOiBgL3Nob3BwaW5nL3BhbmljQnV5aW5nLmRvP209dXBsb2FkQXR0YWNobWVudCZmb3JtaWQ9JHt0aGlzLmRhdGEuZm9ybUlkfWAsXHJcbiAgICAgIGRvY2NvZGUsXHJcbiAgICAgIGZyb21QYWdlLFxyXG4gICAgICBmZWVSYXRlRm9yUGF5OiAoc2V0dGluZ3MuZmVlUmF0ZUZvcld4UGF5K3NldHRpbmdzLnBsYXRmb3JtT3BlcmF0b3JDb21taXNzaW9uUmF0aW8pKjEwMFxyXG4gICAgfSlcclxuICAgIGlmIChkb2Njb2RlKSB7XHJcbiAgICAgIHRoaXMuZ2V0U2F2ZURhdGEoKTtcclxuICAgIH1cclxuICB9LFxyXG4gIGFzeW5jIGdldFNhdmVEYXRhKCkge1xyXG4gICAgbGV0IGRvY2NvZGUgPSB0aGlzLmRhdGEuZG9jY29kZTtcclxuICAgIGxldCBbZXJyb3IsIHJlc3VsdF0gPSBhd2FpdCB3eC4kdXRpbHMudG8oXHJcbiAgICAgIHd4LiRodHRwLnJlcXVlc3Qoe1xyXG4gICAgICAgIHVybDpgL3Nob3BwaW5nL3BhbmljQnV5aW5nLmRvP209Z2V0UGFuaWNCdXlpbmdEZXRhaWxgLFxyXG4gICAgICAgIGRhdGE6e1xyXG4gICAgICAgICAgZG9jY29kZSxcclxuICAgICAgICAgIGlzRWRpdDp0cnVlLFxyXG4gICAgICAgICAgUmVmT3BlbklkOnd4Lmdsb2JhbERhdGEuT3BlbklkXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKVxyXG4gICAgaWYgKGVycm9yKXtcclxuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhyZXN1bHQpO1xyXG4gICAgbGV0IGRhdGEgPSByZXN1bHQubGlzdFswXTtcclxuICAgIGxldCBmb3JtRGF0YSA9IHtcclxuICAgICAgcHJvbW90aW9uc1RpdGxlOiBkYXRhLnRpdGxlLFxyXG4gICAgICBvcmlnaW5hbFByaWNlOiBkYXRhLm9yaWdpbmFsUHJpY2UsXHJcbiAgICAgIGZsYXNoU2FsZVByaWNlOiBkYXRhLnNhbGVzUHJpY2UsXHJcbiAgICAgIGZsYXNoU2FsZVRvdGFsOiBkYXRhLnF1YW50aXR5LFxyXG4gICAgICBmbGFzaFNhbGVMaW1pdDogZGF0YS5yZXN0cmljdEJ1eWluZ1F1YW50aXR5LFxyXG4gICAgICBwcm9tb3Rpb25EZXNjcmlwdGlvbjogZGF0YS5kZXNjcmlwdGlvbixcclxuICAgICAgc3RhcnRUaW1lOiBkYXRhLmVmZmVjdGl2ZVN0YXJ0RGF0ZSxcclxuICAgICAgZW5kVGltZTogZGF0YS5lZmZlY3RpdmVFbmREYXRlLFxyXG4gICAgICBjb3ZlckltYWdlTGlzdDogKGRhdGEuY292ZXJJbWFnZVVybCYmdGhpcy5nZXRDb3ZlckltYWdlTGlzdChkYXRhKSl8fFtdLFxyXG4gICAgICAvLyBpbWFnZXNMaXN0OiAoZGF0YS5pbWFnZXNVcmwubGVuZ3RoPjAmJnRoaXMuZ2V0SW1hZ2VzTGlzdChkYXRhKSl8fFtdLFxyXG4gICAgICBpbWFnZXNMaXN0OiBkYXRhLmltYWdlc1VybCxcclxuICAgICAgY292ZXJJbWFnZTogZGF0YS5jb3ZlckltYWdlLFxyXG4gICAgICBpbWFnZXM6IGRhdGEuaW1hZ2VzLFxyXG4gICAgICBmcmVlSWQ6ZGF0YS5mcmVlSWQsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5zZXREYXRhKHtcclxuICAgICAgLi4uZm9ybURhdGEsXHJcbiAgICAgIGNvdmVySW1hZ2VVcmw6ZGF0YS5jb3ZlckltYWdlVXJsLFxyXG4gICAgICAvLyBbYGVmZmVjdGl2ZVN0YXJ0RGF0ZWBdOiBkYXRhLmVmZmVjdGl2ZVN0YXJ0RGF0ZSxcclxuICAgICAgLy8gW2BlZmZlY3RpdmVFbmREYXRlYF06IGRhdGEuZWZmZWN0aXZlRW5kRGF0ZSxcclxuICAgICAgLy8gW2BmcmVlSWRgXTogZGF0YS5mcmVlSWQsXHJcbiAgICAgIC8vIFtgdGl0bGVgXTogZGF0YS50aXRsZSxcclxuICAgICAgLy8gW2BvcmlnaW5hbFByaWNlYF06IGRhdGEub3JpZ2luYWxQcmljZSxcclxuICAgICAgLy8gW2BzYWxlc1ByaWNlYF06IGRhdGEuc2FsZXNQcmljZSxcclxuICAgICAgLy8gW2BxdWFudGl0eWBdOiBkYXRhLnF1YW50aXR5LFxyXG4gICAgICAvLyBbYHJlc3RyaWN0QnV5aW5nUXVhbnRpdHlgXTogZGF0YS5yZXN0cmljdEJ1eWluZ1F1YW50aXR5LFxyXG4gICAgICAvLyBbYGRlc2NyaXB0aW9uYF06IGRhdGEuZGVzY3JpcHRpb24sXHJcbiAgICAgIHNlbGxlckxpc3Q6cmVzdWx0LnNlbGxlckxpc3QsXHJcbiAgICAgIHN0YXR1czpkYXRhLnBhbmljQnV5aW5nU3RhdHVzLFxyXG4gICAgICBkZWxpdmVyeTp7XHJcbiAgICAgICAgZnJlZUlkOmRhdGEuZnJlZUlkLFxyXG4gICAgICAgIGZyZWVOYW1lOmRhdGEuZnJlZU5hbWUsXHJcbiAgICAgICAgaXNSZXF1aXJlZEFkZHJlc3M6ZGF0YS5pc1JlcXVpcmVkQWRkcmVzcyxcclxuICAgICAgICB0cmFuc0Nvc3RzOmRhdGEudHJhbnNDb3N0cyxcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBjb25zb2xlLmxvZygn6YWN6YCB5pWw5o2u44CC44CC44CCJyx0aGlzLmRhdGEuZGVsaXZlcnkpO1xyXG4gICAgd3guc2V0TmF2aWdhdGlvbkJhclRpdGxlKHtcclxuICAgICAgdGl0bGU6IGRhdGEudGl0bGVcclxuICAgIH0pXHJcbiAgfSxcclxuXHJcbiAgZ2V0Q292ZXJJbWFnZUxpc3QoZGF0YTphbnkpe1xyXG4gICAgbGV0IFt1bmlkLHNlcV0gPSBkYXRhLmNvdmVySW1hZ2Uuc3BsaXQoXCI7XCIpO1xyXG4gICAgcmV0dXJuIFt7XHJcbiAgICAgIHVybDogZGF0YS5jb3ZlckltYWdlVXJsfHwnJyxcclxuICAgICAgdW5pZCxcclxuICAgICAgc2VxXHJcbiAgICB9XVxyXG4gIH0sXHJcbiAgLy8gZ2V0SW1hZ2VzTGlzdChkYXRhOmFueSl7XHJcbiAgLy8gICBsZXQgW3VuaWQsc2VxXSA9IGRhdGEuaW1hZ2VzLnNwbGl0KFwiO1wiKTtcclxuICAvLyAgIHJldHVybiBkYXRhLmltYWdlc1VybC5tYXAoKGl0ZW06c3RyaW5nKT0+e1xyXG4gIC8vICAgICByZXR1cm4ge1xyXG4gIC8vICAgICAgIHVybDogaXRlbSxcclxuICAvLyAgICAgICB1bmlkLFxyXG4gIC8vICAgICAgIHNlcVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9KVxyXG4gIC8vIH0sXHJcblxyXG4gIG9uUmVhZHkoKSB7XHJcbiAgICB0aGlzLmluaXRWYWxpZGF0b3IoKVxyXG4gIH0sXHJcbiAgc2VsZWN0ZWRTdGFydFRpbWUoZXZlbnQ6YW55KSB7XHJcbiAgICBjb25zb2xlLmxvZygn5byA5aeLJyxldmVudCk7XHJcbiAgICB0aGlzLnNldERhdGEoe1xyXG4gICAgICBzdGFydFRpbWU6IGV2ZW50LmRldGFpbC5zdGFydFRpbWUsXHJcbiAgICB9KVxyXG4gIH0sXHJcbiAgc2VsZWN0ZWRFbmRUaW1lKGV2ZW50OmFueSl7XHJcbiAgICBjb25zb2xlLmxvZygn57uT5p2fJyxldmVudCk7XHJcbiAgICB0aGlzLnNldERhdGEoe1xyXG4gICAgICBlbmRUaW1lOiBldmVudC5kZXRhaWwuZW5kVGltZSxcclxuICAgIH0pXHJcbiAgfSxcclxuICBnZXREZWxpdmVyeU1ldGhvZChldmVudDphbnkpe1xyXG4gICAgY29uc29sZS5sb2coZXZlbnQuZGV0YWlsKTtcclxuICAgIHRoaXMuc2V0RGF0YSh7XHJcbiAgICAgIC8vIGRlbGl2ZXJ5TWV0aG9kOiBldmVudC5kZXRhaWwuZGVsaXZlcnlNZXRob2QsXHJcbiAgICAgIGZyZWVJZDogZXZlbnQuZGV0YWlsLmZyZWVJZCxcclxuICAgIH0pXHJcbiAgICBjb25zb2xlLmxvZygndGhpcy5kYXRhLmZyZWVJZDsnLHRoaXMuZGF0YS5mcmVlSWQpO1xyXG4gIH0sXHJcblxyXG4gIGNoZWNrUHJvbW90aW9uc1RpdGxlKGU6YW55KXtcclxuICAgIGxldCB7IHZhbHVlIH0gPSBlLmRldGFpbFxyXG4gICAgY29uc29sZS5sb2coZSk7XHJcbiAgICB2YWxpZGF0b3JJbnN0YW5jZS5jaGVja0ZpZWxkKCdwcm9tb3Rpb25zVGl0bGUnLHZhbHVlKTtcclxuICAgIHRoaXMuc2V0RGF0YSh7XHJcbiAgICAgIHByb21vdGlvbnNUaXRsZTp2YWx1ZS50cmltKClcclxuICAgIH0pXHJcbiAgfSxcclxuICBjaGVja09yaWdpbmFsUHJpY2UoZTphbnkpe1xyXG4gICAgbGV0IHsgdmFsdWUgfSA9IGUuZGV0YWlsXHJcbiAgICBjb25zb2xlLmxvZyhlKTtcclxuICAgIHZhbGlkYXRvckluc3RhbmNlLmNoZWNrRmllbGQoJ29yaWdpbmFsUHJpY2UnLHZhbHVlKTtcclxuICAgIHRoaXMuc2V0RGF0YSh7XHJcbiAgICAgIG9yaWdpbmFsUHJpY2U6dmFsdWUudHJpbSgpXHJcbiAgICB9KVxyXG4gIH0sXHJcbiAgY2hlY2tGbGFzaFNhbGVQcmljZShlOmFueSl7XHJcbiAgICBsZXQgeyB2YWx1ZSB9ID0gZS5kZXRhaWxcclxuICAgIGNvbnNvbGUubG9nKGUpO1xyXG4gICAgdmFsaWRhdG9ySW5zdGFuY2UuY2hlY2tGaWVsZCgnZmxhc2hTYWxlUHJpY2UnLHZhbHVlKTtcclxuICAgIHRoaXMuc2V0RGF0YSh7XHJcbiAgICAgIGZsYXNoU2FsZVByaWNlOnZhbHVlLnRyaW0oKVxyXG4gICAgfSlcclxuICB9LFxyXG4gIGNoZWNrRmxhc2hTYWxlVG90YWwoZTphbnkpe1xyXG4gICAgbGV0IHsgdmFsdWUgfSA9IGUuZGV0YWlsXHJcbiAgICBjb25zb2xlLmxvZyhlKTtcclxuICAgIHZhbGlkYXRvckluc3RhbmNlLmNoZWNrRmllbGQoJ2ZsYXNoU2FsZVRvdGFsJyx2YWx1ZSk7XHJcbiAgICB0aGlzLnNldERhdGEoe1xyXG4gICAgICBmbGFzaFNhbGVUb3RhbDp2YWx1ZS50cmltKClcclxuICAgIH0pXHJcbiAgfSxcclxuICBjaGVja0ZsYXNoU2FsZUxpbWl0KGU6YW55KXtcclxuICAgIGxldCB7IHZhbHVlIH0gPSBlLmRldGFpbFxyXG4gICAgY29uc29sZS5sb2coZSk7XHJcbiAgICB2YWxpZGF0b3JJbnN0YW5jZS5jaGVja0ZpZWxkKCdmbGFzaFNhbGVMaW1pdCcsdmFsdWUpO1xyXG4gICAgdGhpcy5zZXREYXRhKHtcclxuICAgICAgZmxhc2hTYWxlTGltaXQ6dmFsdWUudHJpbSgpXHJcbiAgICB9KVxyXG4gIH0sXHJcbiAgY2hlY2tQcm9tb3Rpb25EZXNjcmlwdGlvbihlOmFueSl7XHJcbiAgICBsZXQgeyB2YWx1ZSB9ID0gZS5kZXRhaWxcclxuICAgIGNvbnNvbGUubG9nKGUpO1xyXG4gICAgdmFsaWRhdG9ySW5zdGFuY2UuY2hlY2tGaWVsZCgncHJvbW90aW9uRGVzY3JpcHRpb24nLHZhbHVlKTtcclxuICAgIHRoaXMuc2V0RGF0YSh7XHJcbiAgICAgIHByb21vdGlvbkRlc2NyaXB0aW9uOnZhbHVlLnRyaW0oKVxyXG4gICAgfSlcclxuICB9LFxyXG5cclxuICBhc3luYyBwb3N0Rm9ybURhdGEoZGF0YTpvYmplY3Qpe1xyXG4gICAgbGV0IFtlcnJvciwgcmVzXSA9IGF3YWl0IHd4LiR1dGlscy50byhcclxuICAgICAgd3guJGh0dHAucmVxdWVzdCh7XHJcbiAgICAgICAgdXJsOicvc2hvcHBpbmcvcGFuaWNCdXlpbmcuZG8/bT1zYXZlRG9jQ29kZScsXHJcbiAgICAgICAgZGF0YSxcclxuICAgICAgICBtZXRob2Q6J1BPU1QnXHJcbiAgICAgIH0pXHJcbiAgICApXHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhyZXMpO1xyXG4gICAgaWYgKHJlcy5zdGF0ZSA9PT0gJ3N1Y2Nlc3MnKSB7XHJcbiAgICAgIHd4LnNob3dUb2FzdCh7XHJcbiAgICAgICAgdGl0bGU6ICfmiJDlip8nLFxyXG4gICAgICAgIGR1cmF0aW9uOiAyMDAwXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBpZiAocmVzLnN0YXRlID09PSAnZmFpbGVkJyYmcmVzLnNlbGxlckNoZWNrZWRCYWxhbmNlPjApIHtcclxuICAgICAgdGhpcy5zZXREYXRhKHtcclxuICAgICAgICBzZWxsZXJVbkNoZWNrZWROYW1lczogcmVzLnNlbGxlclVuQ2hlY2tlZE5hbWVzLFxyXG4gICAgICAgIGlzU2hvd0RpYWxvZzogdHJ1ZVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcy5zdGF0ZSA9PT0gJ3N1Y2Nlc3MnO1xyXG4gIH0sXHJcbiAgYXN5bmMgb25TdWJtaXQoKSB7XHJcbiAgICBsZXQgdGltZVF1YW50dW0gPSB0aGlzLnNlbGVjdENvbXBvbmVudCgnI3RpbWUtcXVhbnR1bScpO1xyXG4gICAgbGV0IHNlbGxlckVkaXQgPSB0aGlzLnNlbGVjdENvbXBvbmVudCgnI3NlbGxlci1lZGl0Jyk7XHJcbiAgICBsZXQgZmlsZVVwbG9hZGVyID0gdGhpcy5zZWxlY3RDb21wb25lbnQoJyNmaWxlLXVwbG9hZGVyJyk7XHJcbiAgICBsZXQgZmlsZVVwbG9hZGVyTXVsdGlwbGUgPSB0aGlzLnNlbGVjdENvbXBvbmVudCgnI2ZpbGUtdXBsb2FkZXItbXVsdGlwbGUnKTtcclxuXHJcbiAgICBsZXQgZGVsaXZlcnlNZXRob2QgPSB0aGlzLnNlbGVjdENvbXBvbmVudCgnI2RlbGl2ZXJ5LW1ldGhvZCcpO1xyXG4gICAgbGV0IGNoZWNrVHJhbnNDb3N0cyA9IHRydWU7XHJcbiAgICBsZXQgdHJhbnNDb3N0cyA9IDA7XHJcbiAgICBpZiAoZGVsaXZlcnlNZXRob2QuZGF0YS5pc1JlcXVpcmVkQWRkcmVzcyl7XHJcbiAgICAgIGNoZWNrVHJhbnNDb3N0cyA9IGRlbGl2ZXJ5TWV0aG9kLmNoZWNrRmllbGRzKCk7XHJcbiAgICAgIHRyYW5zQ29zdHMgPSBOdW1iZXIoZGVsaXZlcnlNZXRob2QuZGF0YS50cmFuc0Nvc3RzKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zb2xlLmxvZyh0aW1lUXVhbnR1bSk7XHJcblxyXG4gICAgbGV0IGNoZWNrU3RhcnRUaW1lID0gdGltZVF1YW50dW0uY2hlY2tUaW1lKFwic3RhcnRUaW1lXCIsIFwi6K+36YCJ5oup6K6h5YiS5byA5aeL5pe26Ze0XCIpO1xyXG4gICAgbGV0IGNoZWNrRW5kVGltZSA9IHRpbWVRdWFudHVtLmNoZWNrVGltZShcImVuZFRpbWVcIiwgXCLor7fpgInmi6norqHliJLnu5PmnZ/ml7bpl7RcIik7XHJcbiAgICBsZXQgY2hlY2tDb3ZlckltYWdlID0gZmlsZVVwbG9hZGVyLmNoZWNrSW1hZ2VzKFwiY292ZXJJbWFnZVwiLCBcIuivt+S4iuS8oOS4gOW8oOWwgemdouWbvlwiKTtcclxuICAgIC8vIGxldCBjaGVja0ltYWdlcyA9IGZpbGVVcGxvYWRlck11bHRpcGxlLmNoZWNrSW1hZ2VzKFwiaW1hZ2VzXCIsIFwi6K+36Iez5bCR5LiK5Lyg5LiA5byg5Zu+54mHXCIpO1xyXG4gICAgbGV0IGNoZWNrQWxsRGF0YSA9IHZhbGlkYXRvckluc3RhbmNlLmNoZWNrQWxsRGF0YSgpO1xyXG4gICAgLy8gaWYgKHRoaXMuZGF0YS5nb29kc0ltZ0xpc3QubGVuZ3RoIDwgMSkge1xyXG4gICAgLy8gICBjb25zb2xlLmxvZygn6K+35LiK5Lyg5Lqn5ZOB5Zu+54mHJyk7XHJcbiAgICAvLyB9XHJcbiAgICBsZXQgc2VsbGVyTGlzdCA9IHNlbGxlckVkaXQuZ2V0U2VsbGVyTGlzdCgpO1xyXG4gICAgaWYgKHNlbGxlckxpc3QubGVuZ3RoPDEpIHtcclxuICAgICAgd3guc2hvd1RvYXN0KHtcclxuICAgICAgICB0aXRsZTogJ+ivt+mAieaLqeiQpemUgOS6uuWRmCcsXHJcbiAgICAgICAgaWNvbjogJ25vbmUnLFxyXG4gICAgICAgIGR1cmF0aW9uOiAyMDAwXHJcbiAgICAgIH0pXHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IGNoZWNrRGVmYXVsdFNlbGxlciA9IHNlbGxlckVkaXQuY2hlY2tEZWZhdWx0U2VsbGVyKCk7XHJcbiAgICBpZiAoIWNoZWNrRGVmYXVsdFNlbGxlcikge1xyXG4gICAgICB3eC5zaG93VG9hc3Qoe1xyXG4gICAgICAgIHRpdGxlOiAn6K+36YCJ5oup6buY6K6k6JCl6ZSA5Lq65ZGYJyxcclxuICAgICAgICBpY29uOiAnbm9uZScsXHJcbiAgICAgICAgZHVyYXRpb246IDIwMDBcclxuICAgICAgfSlcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZygnY2hlY2tEZWZhdWx0U2VsbGVyJyxjaGVja0RlZmF1bHRTZWxsZXIpO1xyXG5cclxuICAgIGxldCBjaGVja0FyciA9IFtjaGVja1RyYW5zQ29zdHMsY2hlY2tTdGFydFRpbWUsY2hlY2tFbmRUaW1lLGNoZWNrQ292ZXJJbWFnZSxjaGVja0FsbERhdGFdO1xyXG4gICAgbGV0IGRhdGEgPSB7fTtcclxuICAgIGlmIChjaGVja0Fyci5ldmVyeSgoaXRlbSk9PntcclxuICAgICAgcmV0dXJuIGl0ZW1cclxuICAgIH0pKXtcclxuICAgICAgY29uc29sZS5sb2coJy4uLi7mj5DkuqTmiJDlip8nKTtcclxuICAgICAgbGV0IGNvdmVySW1hZ2UgPSBmaWxlVXBsb2FkZXIuZ2V0Q292ZXJJbWFnZVVuaWQoKTtcclxuICAgICAgbGV0IGNvdmVySW1hZ2VVcmwgPSBmaWxlVXBsb2FkZXIuZ2V0SW1nTGlzdCgpWzBdLnVybHx8Jyc7XHJcbiAgICAgIHRoaXMuc2V0RGF0YSh7XHJcbiAgICAgICAgY292ZXJJbWFnZVVybFxyXG4gICAgICB9KVxyXG4gICAgICBsZXQgaW1hZ2VzID0gZmlsZVVwbG9hZGVyTXVsdGlwbGUuZ2V0SW1hZ2VzVW5pZCgpO1xyXG4gICAgICBjb25zb2xlLmxvZyhjb3ZlckltYWdlLGltYWdlcyxjb3ZlckltYWdlVXJsKTtcclxuICAgICAgbGV0IGZvcm1EYXRhOiBhbnkgPSB0aGlzLmRhdGE7XHJcbiAgICAgIGRhdGEgPSB7XHJcbiAgICAgICAgZG9jQ29kZTogZm9ybURhdGEuZG9jY29kZSwgLy/mtLvliqjljZXlj7fvvIzmlrDlu7rmtLvliqjml7bkuLrnqbrlgLzvvIznvJbovpHml7bpnIDopoFkb2Njb2Rl5YC8XHJcbiAgICAgICAgZm9ybUlkOiBmb3JtRGF0YS5mb3JtSWQsIC8v5Yqf6IO95Y+377ya56eS5p2AIDcxMDgwMiDvvIwg5oql5ZCN6YKA57qmIDcxMDgwMyDvvIzlm6LotK0gNzEwODA0XHJcbiAgICAgICAgZG9jU3RhdHVzOjEwMCwgLy/ljZXmja7nirbmgIE6IDAg5L+d5a2Y77yI6LW36I2J77yJIO+8jDEwMCDlj5HluINcclxuICAgICAgICBjb3ZlckltYWdlLFxyXG4gICAgICAgIGltYWdlcyxcclxuICAgICAgICB0cmFuc0Nvc3RzLCAvL+mAgei0p+S4iumXqOaXtiDphY3pgIHotLlcclxuICAgICAgICAvLyAuLi50aGlzLmRhdGEuZm9ybURhdGEsXHJcblxyXG4gICAgICAgIGVmZmVjdGl2ZVN0YXJ0RGF0ZTogZm9ybURhdGEuc3RhcnRUaW1lLFxyXG4gICAgICAgIGVmZmVjdGl2ZUVuZERhdGU6IGZvcm1EYXRhLmVuZFRpbWUsXHJcbiAgICAgICAgZnJlZUlkOiBmb3JtRGF0YS5mcmVlSWQsXHJcbiAgICAgICAgdGl0bGU6IGZvcm1EYXRhLnByb21vdGlvbnNUaXRsZSxcclxuICAgICAgICBvcmlnaW5hbFByaWNlOiBOdW1iZXIoZm9ybURhdGEub3JpZ2luYWxQcmljZSksXHJcbiAgICAgICAgc2FsZXNQcmljZTogTnVtYmVyKGZvcm1EYXRhLmZsYXNoU2FsZVByaWNlKSxcclxuICAgICAgICBxdWFudGl0eTogTnVtYmVyKGZvcm1EYXRhLmZsYXNoU2FsZVRvdGFsKSxcclxuICAgICAgICByZXN0cmljdEJ1eWluZ1F1YW50aXR5OiBOdW1iZXIoZm9ybURhdGEuZmxhc2hTYWxlTGltaXQpLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBmb3JtRGF0YS5wcm9tb3Rpb25EZXNjcmlwdGlvbixcclxuXHJcbiAgICAgICAgc2VsbGVyTGlzdCxcclxuICAgICAgfVxyXG4gICAgICBjb25zb2xlLmxvZygn5b6F5Y+R5biD5pWw5o2uJyxkYXRhKTtcclxuICAgICAgaWYgKCFhd2FpdCB0aGlzLnBvc3RGb3JtRGF0YShkYXRhKSkgcmV0dXJuO1xyXG4gICAgICBpZiAodGhpcy5kYXRhLmZyb21QYWdlPT0nZWRpdCcpe1xyXG4gICAgICAgIHd4Lm5hdmlnYXRlQmFjaygpO1xyXG4gICAgICB9IGVsc2V7XHJcbiAgICAgICAgd3gucmVkaXJlY3RUbyh7XHJcbiAgICAgICAgICB1cmw6Jy4uL3Byb21vdGlvbnNNYW5hZ2VMaXN0L3Byb21vdGlvbnNNYW5hZ2VMaXN0P3RhYj0xJ1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB3eC5zaG93VG9hc3Qoe1xyXG4gICAgICAgIHRpdGxlOiAn6aG16Z2i6L+Y5pyJ6ZSZ6K+v5pyq5aSE55CGJyxcclxuICAgICAgICBpY29uOiAnbm9uZScsXHJcbiAgICAgICAgZHVyYXRpb246IDIwMDBcclxuICAgICAgfSlcclxuICAgICAgY29uc29sZS5sb2coJ+i/mOaciemUmeivr+acquWkhOeQhicpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgfSxcclxuXHJcbiAgb25TYXZlKCl7XHJcbiAgICBsZXQgc2VsbGVyRWRpdCA9IHRoaXMuc2VsZWN0Q29tcG9uZW50KCcjc2VsbGVyLWVkaXQnKTtcclxuICAgIGxldCBzZWxsZXJMaXN0ID0gc2VsbGVyRWRpdC5nZXRTZWxsZXJMaXN0KCk7XHJcbiAgICBsZXQgZmlsZVVwbG9hZGVyID0gdGhpcy5zZWxlY3RDb21wb25lbnQoJyNmaWxlLXVwbG9hZGVyJyk7XHJcbiAgICBsZXQgZmlsZVVwbG9hZGVyTXVsdGlwbGUgPSB0aGlzLnNlbGVjdENvbXBvbmVudCgnI2ZpbGUtdXBsb2FkZXItbXVsdGlwbGUnKTtcclxuICAgIGNvbnNvbGUubG9nKCcuLi4u5o+Q5Lqk5oiQ5YqfJyk7XHJcbiAgICBsZXQgY292ZXJJbWFnZSA9IGZpbGVVcGxvYWRlci5nZXRDb3ZlckltYWdlVW5pZCgpO1xyXG4gICAgbGV0IGltYWdlcyA9IGZpbGVVcGxvYWRlck11bHRpcGxlLmdldEltYWdlc1VuaWQoKTtcclxuICAgIGxldCBkZWxpdmVyeU1ldGhvZCA9IHRoaXMuc2VsZWN0Q29tcG9uZW50KCcjZGVsaXZlcnktbWV0aG9kJyk7XHJcbiAgICBsZXQgdHJhbnNDb3N0cyA9IDA7XHJcbiAgICBpZiAoZGVsaXZlcnlNZXRob2QuZGF0YS5pc1JlcXVpcmVkQWRkcmVzcyl7XHJcbiAgICAgIHRyYW5zQ29zdHMgPSBOdW1iZXIoZGVsaXZlcnlNZXRob2QuZGF0YS50cmFuc0Nvc3RzKTtcclxuICAgIH1cclxuICAgIGNvbnNvbGUubG9nKGNvdmVySW1hZ2UsaW1hZ2VzKTtcclxuICAgIGxldCBmb3JtRGF0YTogYW55ID0gdGhpcy5kYXRhO1xyXG4gICAgY29uc29sZS5sb2coJz4+Pj4+Pj4+Zm9ybURhdGEnLGZvcm1EYXRhKTtcclxuICAgIGxldCBkYXRhID0ge1xyXG4gICAgICBkb2NDb2RlOiBmb3JtRGF0YS5kb2Njb2RlLCAvL+a0u+WKqOWNleWPt++8jOaWsOW7uua0u+WKqOaXtuS4uuepuuWAvO+8jOe8lui+keaXtumcgOimgWRvY2NvZGXlgLxcclxuICAgICAgZm9ybUlkOiBmb3JtRGF0YS5mb3JtSWQsIC8v5Yqf6IO95Y+377ya56eS5p2AIDcxMDgwMiDvvIwg5oql5ZCN6YKA57qmIDcxMDgwMyDvvIzlm6LotK0gNzEwODA0XHJcbiAgICAgIGRvY1N0YXR1czogMCwgLy/ljZXmja7nirbmgIE6IDAg5L+d5a2Y77yI6LW36I2J77yJIO+8jDEwMCDlj5HluINcclxuICAgICAgY292ZXJJbWFnZSxcclxuICAgICAgaW1hZ2VzLFxyXG4gICAgICB0cmFuc0Nvc3RzLCAvL+mAgei0p+S4iumXqOaXtiDphY3pgIHotLlcclxuICAgICAgLy8gLi4udGhpcy5kYXRhLmZvcm1EYXRhLFxyXG5cclxuICAgICAgZWZmZWN0aXZlU3RhcnREYXRlOiBmb3JtRGF0YS5zdGFydFRpbWUsXHJcbiAgICAgIGVmZmVjdGl2ZUVuZERhdGU6IGZvcm1EYXRhLmVuZFRpbWUsXHJcbiAgICAgIGZyZWVJZDogZm9ybURhdGEuZnJlZUlkLFxyXG4gICAgICB0aXRsZTogZm9ybURhdGEucHJvbW90aW9uc1RpdGxlLFxyXG4gICAgICBvcmlnaW5hbFByaWNlOiBOdW1iZXIoZm9ybURhdGEub3JpZ2luYWxQcmljZSl8fDAsXHJcbiAgICAgIHNhbGVzUHJpY2U6IE51bWJlcihmb3JtRGF0YS5mbGFzaFNhbGVQcmljZSl8fDAsXHJcbiAgICAgIHF1YW50aXR5OiBOdW1iZXIoZm9ybURhdGEuZmxhc2hTYWxlVG90YWwpfHwwLFxyXG4gICAgICByZXN0cmljdEJ1eWluZ1F1YW50aXR5OiBOdW1iZXIoZm9ybURhdGEuZmxhc2hTYWxlTGltaXQpfHwwLFxyXG4gICAgICBkZXNjcmlwdGlvbjogZm9ybURhdGEucHJvbW90aW9uRGVzY3JpcHRpb24sXHJcblxyXG4gICAgICBzZWxsZXJMaXN0LFxyXG4gICAgfVxyXG4gICAgLy8gbGV0IGRhdGEgPSB7XHJcbiAgICAvLyAgIGRvY0NvZGU6dGhpcy5kYXRhLmRvY2NvZGUsIC8v5rS75Yqo5Y2V5Y+377yM5paw5bu65rS75Yqo5pe25Li656m65YC877yM57yW6L6R5pe26ZyA6KaBZG9jY29kZeWAvFxyXG4gICAgLy8gICBmb3JtSWQ6dGhpcy5kYXRhLmZvcm1JZCwgLy/lip/og73lj7fvvJrnp5LmnYAgNzEwODAyIO+8jCDmiqXlkI3pgoDnuqYgNzEwODAzIO+8jOWboui0rSA3MTA4MDRcclxuICAgIC8vICAgZG9jU3RhdHVzOjAsIC8v5Y2V5o2u54q25oCBOiAwIOS/neWtmO+8iOi1t+iNie+8iSDvvIwxMDAg5Y+R5biDXHJcbiAgICAvLyAgIGNvdmVySW1hZ2UsXHJcbiAgICAvLyAgIGltYWdlcyxcclxuICAgIC8vICAgdHJhbnNDb3N0cywgLy/pgIHotKfkuIrpl6jml7Yg6YWN6YCB6LS5XHJcbiAgICAvLyAgIC4uLnRoaXMuZGF0YS5mb3JtRGF0YSxcclxuICAgIC8vICAgc2VsbGVyTGlzdCxcclxuICAgIC8vIH1cclxuICAgIGNvbnNvbGUubG9nKCflvoXkv53lrZjmlbDmja4nLGRhdGEpO1xyXG4gICAgdGhpcy5wb3N0Rm9ybURhdGEoZGF0YSk7XHJcbiAgfSxcclxuICAvLyBvbklucHV0U3RhcnREYXRlKCkge30sXHJcbiAgLy8gb25JbnB1dEVuZERhdGUoKSB7fSxcclxuICBpbml0VmFsaWRhdG9yKCl7XHJcbiAgICAvLyDlrp7kvovljJZcclxuICAgIHZhbGlkYXRvckluc3RhbmNlID0gbmV3IE15VmFsaWRhdG9yKHtcclxuICAgICAgcnVsZXM6IHtcclxuICAgICAgICBwcm9tb3Rpb25zVGl0bGU6IHtcclxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxyXG4gICAgICAgICAgcmFuZ2VsZW5ndGg6IFszLDE0XVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb3JpZ2luYWxQcmljZToge1xyXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXHJcbiAgICAgICAgICBudW1iZXI6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIGZsYXNoU2FsZVByaWNlOiB7XHJcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgICAgIG51bWJlcjogdHJ1ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZmxhc2hTYWxlVG90YWw6IHtcclxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxyXG4gICAgICAgICAgbnVtYmVyOiB0cnVlXHJcbiAgICAgICAgfSxcclxuICAgICAgICBmbGFzaFNhbGVMaW1pdDoge1xyXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXHJcbiAgICAgICAgICBudW1iZXI6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIHByb21vdGlvbkRlc2NyaXB0aW9uOiB7XHJcbiAgICAgICAgLy8gICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgICAgIC8vIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIG1lc3NhZ2VzOiB7XHJcbiAgICAgICAgcHJvbW90aW9uc1RpdGxlOiB7XHJcbiAgICAgICAgICByZXF1aXJlZDogJ+ivt+i+k+WFpea0u+WKqOagh+mimCcsXHJcbiAgICAgICAgICByYW5nZWxlbmd0aDogJ+aWh+Wtl+mVv+W6puivt+aOp+WItuWcqDPliLAxNOS5i+mXtCdcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9yaWdpbmFsUHJpY2U6IHtcclxuICAgICAgICAgIHJlcXVpcmVkOiAn6K+36L6T5YWl5Lqn5ZOB5qCH5Lu3JyxcclxuICAgICAgICAgIG51bWJlcjogJ+S7t+agvOW/hemhu+S4uuaVsOWtlydcclxuICAgICAgICB9LFxyXG4gICAgICAgIGZsYXNoU2FsZVByaWNlOiB7XHJcbiAgICAgICAgICByZXF1aXJlZDogJ+ivt+i+k+WFpeS6p+WTgeenkuadgOS7tycsXHJcbiAgICAgICAgICBudW1iZXI6ICfku7fmoLzlv4XpobvkuLrmlbDlrZcnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBmbGFzaFNhbGVUb3RhbDoge1xyXG4gICAgICAgICAgcmVxdWlyZWQ6ICfor7fovpPlhaXkuqflk4HmgLvph48nLFxyXG4gICAgICAgICAgbnVtYmVyOiAn5pWw6YeP5b+F6aG75Li65pWw5a2XJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZmxhc2hTYWxlTGltaXQ6IHtcclxuICAgICAgICAgIHJlcXVpcmVkOiAn6K+36L6T5YWl5Lqn5ZOB5q+P5Lq66ZmQ6LSt5pWw6YePJyxcclxuICAgICAgICAgIG51bWJlcjogJ+aVsOmHj+W/hemhu+S4uuaVsOWtlydcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIHByb21vdGlvbkRlc2NyaXB0aW9uOiB7XHJcbiAgICAgICAgLy8gICByZXF1aXJlZDogJ+ivt+i+k+WFpea0u+WKqOaPj+i/sCdcclxuICAgICAgICAvLyB9LFxyXG4gICAgICB9LFxyXG4gICAgICBtdWx0aUNoZWNrOnRydWVcclxuICAgIH0sdGhpcylcclxuICAgIC8vIHRoaXMuc2V0RGF0YSh7XHJcbiAgICAvLyAgIHZhbGlkYXRvckluc3RhbmNlXHJcbiAgICAvLyB9KVxyXG4gICAgY29uc29sZS5sb2coJ2hoaGgsJyx2YWxpZGF0b3JJbnN0YW5jZSk7XHJcbiAgfSxcclxuICBvblNoYXJlQXBwTWVzc2FnZSgpIHtcclxuICAgIGxldCBkb2Njb2RlOnN0cmluZyA9IHRoaXMuZGF0YS5kb2Njb2RlIHx8ICcnO1xyXG4gICAgLy8gbGV0IHRpdGxlOnN0cmluZyA9IHRoaXMuZGF0YS5wcm9tb3Rpb25zRGF0YS50aXRsZSB8fCAnJztcclxuICAgIGxldCBpbWFnZVVybDpzdHJpbmcgPSB0aGlzLmRhdGEuY292ZXJJbWFnZVVybCB8fCAnJztcclxuICAgIGxldCBzZWxsZXJVbkNoZWNrZWROYW1lczpzdHJpbmcgPSB0aGlzLmRhdGEuc2VsbGVyVW5DaGVja2VkTmFtZXMgfHwgJyc7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAvLyB0aXRsZTogdXRpbHMuZ2V0U2hhcmVUaXRsZSgpLFxyXG4gICAgICB0aXRsZTogYOivt+iQpemUgOS6uuWRmFske3NlbGxlclVuQ2hlY2tlZE5hbWVzfV3pqozor4Houqvku71gLFxyXG4gICAgICBpbWFnZVVybCxcclxuICAgICAgcGF0aDogYHBhZ2VzL3NlbGxlclZlcmlmeS9zZWxsZXJWZXJpZnk/ZG9jY29kZT0ke2RvY2NvZGV9YCxcclxuICAgIH1cclxuICB9XHJcbn0pXHJcbmV4cG9ydCB7fVxyXG4iXX0=