mxcad-app 1.0.33 → 1.0.35
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/LICENSE +3 -0
- package/LICENSE_CN +4 -0
- package/THIRD-PARTY-NOTICES.txt +19058 -0
- package/dist/chunks/index28.js.gz +0 -0
- package/dist/chunks/index37.js.gz +0 -0
- package/dist/chunks/lib.js.gz +0 -0
- package/dist/chunks/mxcad.js.gz +0 -0
- package/dist/chunks/mxdraw.js.gz +0 -0
- package/dist/chunks/sandbox.js.gz +0 -0
- package/dist/chunks/zod.js.gz +0 -0
- package/dist/index.cjs.gz +0 -0
- package/dist/index.d.ts +29 -29
- package/dist/index.js +1 -1
- package/dist/index.umd.js.gz +0 -0
- package/dist/mxcad.d.ts +105 -1
- package/dist/mxcadAppAssets/mxcad.umd.js.gz +0 -0
- package/dist/mxcadAppAssets/mxdraw.umd.js.gz +0 -0
- package/dist/mxcadAppAssets/wasm/2d/mxdrawassembly_min.js.gz +0 -0
- package/dist/mxcadAppAssets/wasm/2d/mxdrawassembly_min.wasm.gz +0 -0
- package/dist/mxcadAppAssets/wasm/2d-st/mxdrawassembly_min.js.gz +0 -0
- package/dist/mxcadAppAssets/wasm/2d-st/mxdrawassembly_minst.wasm.gz +0 -0
- package/dist/mxdraw.d.ts +10 -1
- package/dist/styles/style.css.gz +0 -0
- package/packToolPlugin/api-map.json.d.ts +1 -0
- package/packToolPlugin/{index-Da3ocqZH.mjs → index-C-cFEcIk.mjs} +2 -1
- package/packToolPlugin/{index-diNswxuk.js → index-DRKNKLRx.js} +3 -2
- package/packToolPlugin/rollup/index.cjs +1 -1
- package/packToolPlugin/rollup/index.mjs +1 -1
- package/packToolPlugin/vite/index.cjs +1 -1
- package/packToolPlugin/vite/index.mjs +1 -1
- package/packToolPlugin/webpack/index.cjs +1 -1
- package/packToolPlugin/webpack/index.mjs +1 -1
- package/package.json +2 -1
|
Binary file
|
|
Binary file
|
package/dist/chunks/lib.js.gz
CHANGED
|
Binary file
|
package/dist/chunks/mxcad.js.gz
CHANGED
|
Binary file
|
package/dist/chunks/mxdraw.js.gz
CHANGED
|
Binary file
|
|
Binary file
|
package/dist/chunks/zod.js.gz
CHANGED
|
Binary file
|
package/dist/index.cjs.gz
CHANGED
|
Binary file
|
package/dist/index.d.ts
CHANGED
|
@@ -220,28 +220,22 @@ declare module '@howdyjs/to-drag' {
|
|
|
220
220
|
}
|
|
221
221
|
|
|
222
222
|
|
|
223
|
-
declare module
|
|
223
|
+
declare module "@tiptap/core" {
|
|
224
224
|
interface Commands<ReturnType> {
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
*/
|
|
229
|
-
setStrike: () => ReturnType;
|
|
230
|
-
/**
|
|
231
|
-
* Unset the font size attribute
|
|
232
|
-
*/
|
|
233
|
-
unsetStrike: () => ReturnType;
|
|
234
|
-
toggleStrike: () => ReturnType;
|
|
225
|
+
selectedText: {
|
|
226
|
+
setSelectedText: (from: number, to: number) => ReturnType;
|
|
227
|
+
unsetSelectedText: (from: number, to: number) => ReturnType;
|
|
235
228
|
};
|
|
236
229
|
}
|
|
237
230
|
}
|
|
238
231
|
|
|
239
232
|
|
|
240
|
-
declare module
|
|
233
|
+
declare module '@tiptap/core' {
|
|
241
234
|
interface Commands<ReturnType> {
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
235
|
+
Underline: {
|
|
236
|
+
setUnderline: () => ReturnType;
|
|
237
|
+
unsetUnderline: () => ReturnType;
|
|
238
|
+
toggleUnderline: () => ReturnType;
|
|
245
239
|
};
|
|
246
240
|
}
|
|
247
241
|
}
|
|
@@ -249,15 +243,16 @@ declare module "@tiptap/core" {
|
|
|
249
243
|
|
|
250
244
|
declare module '@tiptap/core' {
|
|
251
245
|
interface Commands<ReturnType> {
|
|
252
|
-
|
|
246
|
+
Strike: {
|
|
253
247
|
/**
|
|
254
248
|
* Set the font size attribute
|
|
255
249
|
*/
|
|
256
|
-
|
|
250
|
+
setStrike: () => ReturnType;
|
|
257
251
|
/**
|
|
258
252
|
* Unset the font size attribute
|
|
259
253
|
*/
|
|
260
|
-
|
|
254
|
+
unsetStrike: () => ReturnType;
|
|
255
|
+
toggleStrike: () => ReturnType;
|
|
261
256
|
};
|
|
262
257
|
}
|
|
263
258
|
}
|
|
@@ -265,15 +260,16 @@ declare module '@tiptap/core' {
|
|
|
265
260
|
|
|
266
261
|
declare module '@tiptap/core' {
|
|
267
262
|
interface Commands<ReturnType> {
|
|
268
|
-
|
|
263
|
+
Overline: {
|
|
269
264
|
/**
|
|
270
265
|
* Set the font size attribute
|
|
271
266
|
*/
|
|
272
|
-
|
|
267
|
+
setOverline: () => ReturnType;
|
|
273
268
|
/**
|
|
274
269
|
* Unset the font size attribute
|
|
275
270
|
*/
|
|
276
|
-
|
|
271
|
+
unsetOverline: () => ReturnType;
|
|
272
|
+
toggleOverline: () => ReturnType;
|
|
277
273
|
};
|
|
278
274
|
}
|
|
279
275
|
}
|
|
@@ -281,10 +277,15 @@ declare module '@tiptap/core' {
|
|
|
281
277
|
|
|
282
278
|
declare module '@tiptap/core' {
|
|
283
279
|
interface Commands<ReturnType> {
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
280
|
+
fontSize: {
|
|
281
|
+
/**
|
|
282
|
+
* Set the font size attribute
|
|
283
|
+
*/
|
|
284
|
+
setFontSize: (size: string) => ReturnType;
|
|
285
|
+
/**
|
|
286
|
+
* Unset the font size attribute
|
|
287
|
+
*/
|
|
288
|
+
unsetFontSize: () => ReturnType;
|
|
288
289
|
};
|
|
289
290
|
}
|
|
290
291
|
}
|
|
@@ -292,16 +293,15 @@ declare module '@tiptap/core' {
|
|
|
292
293
|
|
|
293
294
|
declare module '@tiptap/core' {
|
|
294
295
|
interface Commands<ReturnType> {
|
|
295
|
-
|
|
296
|
+
TextDecoration: {
|
|
296
297
|
/**
|
|
297
298
|
* Set the font size attribute
|
|
298
299
|
*/
|
|
299
|
-
|
|
300
|
+
setTextDecoration: (textDecoration: string) => ReturnType;
|
|
300
301
|
/**
|
|
301
302
|
* Unset the font size attribute
|
|
302
303
|
*/
|
|
303
|
-
|
|
304
|
-
toggleOverline: () => ReturnType;
|
|
304
|
+
unsetTextDecoration: () => ReturnType;
|
|
305
305
|
};
|
|
306
306
|
}
|
|
307
307
|
}
|
package/dist/index.js
CHANGED
package/dist/index.umd.js.gz
CHANGED
|
Binary file
|
package/dist/mxcad.d.ts
CHANGED
|
@@ -1506,6 +1506,20 @@ declare module "mxcad" {
|
|
|
1506
1506
|
* ```
|
|
1507
1507
|
*/
|
|
1508
1508
|
setData(row: number, col: number, val: number): void;
|
|
1509
|
+
/**
|
|
1510
|
+
* 返回矩阵的所有定义数据。
|
|
1511
|
+
* @example
|
|
1512
|
+
* ```ts
|
|
1513
|
+
* ```
|
|
1514
|
+
*/
|
|
1515
|
+
getDatas(): string;
|
|
1516
|
+
/**
|
|
1517
|
+
* 返回THREE.Matrix4
|
|
1518
|
+
* @example
|
|
1519
|
+
* ```ts
|
|
1520
|
+
* ```
|
|
1521
|
+
*/
|
|
1522
|
+
toMatrix4(): THREE.Matrix4;
|
|
1509
1523
|
}
|
|
1510
1524
|
/**
|
|
1511
1525
|
* 整数数组
|
|
@@ -2748,11 +2762,16 @@ declare module "mxcad" {
|
|
|
2748
2762
|
* const ret = await MxCADUtility.getCorner("测试");
|
|
2749
2763
|
* if (!ret) return;
|
|
2750
2764
|
* console.log(ret.pt1, ret.pt2)
|
|
2765
|
+
* pt4----pt2
|
|
2766
|
+
* | |
|
|
2767
|
+
* pt1----pt3
|
|
2751
2768
|
* ```
|
|
2752
2769
|
* */
|
|
2753
2770
|
getCorner(strPrompt?: string, pt1?: McGePoint3d, detailedResult?: (retcode: DetailedResult) => any, drawSelectCroner?: boolean, isDisableAllTrace?: boolean, init?: (getPoint: MxCADUiPrPoint) => any): Promise<{
|
|
2754
2771
|
pt1: McGePoint3d;
|
|
2755
2772
|
pt2: McGePoint3d;
|
|
2773
|
+
pt3: McGePoint3d;
|
|
2774
|
+
pt4: McGePoint3d;
|
|
2756
2775
|
} | null>;
|
|
2757
2776
|
/** 获取多个实体形成的包围盒
|
|
2758
2777
|
* @param aryId 实体对象ID数组
|
|
@@ -3700,6 +3719,61 @@ declare module "mxcad" {
|
|
|
3700
3719
|
*/
|
|
3701
3720
|
setUseBasePt(useIt: boolean): void;
|
|
3702
3721
|
}
|
|
3722
|
+
/**
|
|
3723
|
+
* 带坐标变换的取点类
|
|
3724
|
+
* @example
|
|
3725
|
+
* ```ts
|
|
3726
|
+
* ```
|
|
3727
|
+
*/
|
|
3728
|
+
export class MxCADUiPrPointTransform extends MxCADUiPrPoint {
|
|
3729
|
+
mat: McGeMatrix3d;
|
|
3730
|
+
rmat: McGeMatrix3d;
|
|
3731
|
+
mat_three: THREE.Matrix4;
|
|
3732
|
+
rmat_three: THREE.Matrix4;
|
|
3733
|
+
constructor(mat: McGeMatrix3d);
|
|
3734
|
+
/**
|
|
3735
|
+
* 运行go方法, 将返回用户交互的Promise任务
|
|
3736
|
+
* @returns 返回一个promise对象,包含了用户点击页面得到的坐标点
|
|
3737
|
+
* @description
|
|
3738
|
+
* @example
|
|
3739
|
+
* ```ts
|
|
3740
|
+
* ```
|
|
3741
|
+
*/
|
|
3742
|
+
go(): Promise<McGePoint3d | null>;
|
|
3743
|
+
/**
|
|
3744
|
+
* 得以获取的点
|
|
3745
|
+
* @returns 点坐标
|
|
3746
|
+
* @example
|
|
3747
|
+
* ```ts
|
|
3748
|
+
* ```
|
|
3749
|
+
*/
|
|
3750
|
+
value(retcad_val?: boolean): McGePoint3d;
|
|
3751
|
+
/**
|
|
3752
|
+
* 得到动态拖动的基点
|
|
3753
|
+
* @returns 基点 McGePoint3d
|
|
3754
|
+
* @example
|
|
3755
|
+
* ```ts
|
|
3756
|
+
* import { MxCADUiPrPoint } from "mxcad"
|
|
3757
|
+
* ```
|
|
3758
|
+
*/
|
|
3759
|
+
basePt(retcad_val?: boolean): McGePoint3d;
|
|
3760
|
+
/**
|
|
3761
|
+
* 设置动态拖动的基点
|
|
3762
|
+
* @param basePt 基点 McGePoint3d
|
|
3763
|
+
* @example
|
|
3764
|
+
* ```ts
|
|
3765
|
+
* ```
|
|
3766
|
+
*/
|
|
3767
|
+
setBasePt(basePt: McGePoint3d, cad_val?: boolean): void;
|
|
3768
|
+
/**
|
|
3769
|
+
* 设置动态绘制
|
|
3770
|
+
* @param basePt 基点 McGePoint3d
|
|
3771
|
+
* @example
|
|
3772
|
+
* ```ts
|
|
3773
|
+
* ```
|
|
3774
|
+
*/
|
|
3775
|
+
setUserDraw(pDraw: ((currentPoint: McGePoint3d, pWorldDraw: McEdGetPointWorldDrawObject) => void)): void;
|
|
3776
|
+
}
|
|
3703
3777
|
/** UI交互获取距离
|
|
3704
3778
|
* @description 根据两个点确定一段距离
|
|
3705
3779
|
* @example
|
|
@@ -4041,7 +4115,7 @@ declare module "mxcad" {
|
|
|
4041
4115
|
* const getEnt = new MxCADUiPrEntity();
|
|
4042
4116
|
* ```
|
|
4043
4117
|
*/
|
|
4044
|
-
constructor();
|
|
4118
|
+
constructor(isDisableAllTrace?: boolean);
|
|
4045
4119
|
/**
|
|
4046
4120
|
* 设置或获取过滤器
|
|
4047
4121
|
* @param filter 过滤器
|
|
@@ -11604,6 +11678,14 @@ declare module "mxcad" {
|
|
|
11604
11678
|
* ```
|
|
11605
11679
|
*/
|
|
11606
11680
|
getMxDrawObject(): MxDrawObject;
|
|
11681
|
+
/**
|
|
11682
|
+
* 返回与MxCAD当前视区旋转矩阵
|
|
11683
|
+
* @returns McGeMatrix3d对象
|
|
11684
|
+
* @example
|
|
11685
|
+
* ```ts
|
|
11686
|
+
* ```
|
|
11687
|
+
*/
|
|
11688
|
+
getMxCADViewSpinMatrix(): McGeMatrix3d;
|
|
11607
11689
|
/**
|
|
11608
11690
|
* 返回与MxCAD对象绑定的MxDraw对象。
|
|
11609
11691
|
* @returns MxDraw对象
|
|
@@ -11616,6 +11698,10 @@ declare module "mxcad" {
|
|
|
11616
11698
|
* ```
|
|
11617
11699
|
*/
|
|
11618
11700
|
get mxdraw(): MxDrawObject;
|
|
11701
|
+
/**
|
|
11702
|
+
* 把mxcad设置当前的cad对象
|
|
11703
|
+
*/
|
|
11704
|
+
makeCurrent(): void;
|
|
11619
11705
|
/**
|
|
11620
11706
|
* 获取内部实现对象
|
|
11621
11707
|
* @returns 内部实现对象
|
|
@@ -13492,6 +13578,24 @@ declare module "mxcad" {
|
|
|
13492
13578
|
* ```
|
|
13493
13579
|
*/
|
|
13494
13580
|
getCurrentMxCAD(): McObject;
|
|
13581
|
+
/**
|
|
13582
|
+
* 返回当前活动的CAD对象
|
|
13583
|
+
* @example
|
|
13584
|
+
* ```ts
|
|
13585
|
+
* import { MxCpp } from "mxcad";
|
|
13586
|
+
* const mxcad = MxCpp.getCurrentMxCAD();
|
|
13587
|
+
* ```
|
|
13588
|
+
*/
|
|
13589
|
+
get mxcad(): McObject;
|
|
13590
|
+
/**
|
|
13591
|
+
* 返回当前活动的CAD对象的数据库对象.
|
|
13592
|
+
* @example
|
|
13593
|
+
* ```ts
|
|
13594
|
+
* import { MxCpp } from "mxcad";
|
|
13595
|
+
* const dataBase = MxCpp.getCurrentDatabase();
|
|
13596
|
+
* ```
|
|
13597
|
+
*/
|
|
13598
|
+
get currentDatabase(): McDbDatabase;
|
|
13495
13599
|
/**
|
|
13496
13600
|
* 返回当前活动的CAD对象的数据库对象.
|
|
13497
13601
|
* @example
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/dist/mxdraw.d.ts
CHANGED
|
@@ -497,7 +497,7 @@ declare module "mxdraw" {
|
|
|
497
497
|
* ```
|
|
498
498
|
*
|
|
499
499
|
*/
|
|
500
|
-
drawSolid(points: THREE.Vector3[]): void;
|
|
500
|
+
drawSolid(points: THREE.Vector3[], depthTest?: boolean): void;
|
|
501
501
|
/**
|
|
502
502
|
*把一个对象的绘图属性设置到当前绘图上下文
|
|
503
503
|
* @returns
|
|
@@ -3434,6 +3434,14 @@ declare module "mxdraw" {
|
|
|
3434
3434
|
[x: string]: any;
|
|
3435
3435
|
private _McEdGetPointWorldDraw;
|
|
3436
3436
|
constructor();
|
|
3437
|
+
/**
|
|
3438
|
+
* 设置一个变换矩阵
|
|
3439
|
+
* @example
|
|
3440
|
+
* ``` typescript
|
|
3441
|
+
* ```
|
|
3442
|
+
*
|
|
3443
|
+
*/
|
|
3444
|
+
initMat(_matCAD: any, _matThree: THREE.Matrix4): void;
|
|
3437
3445
|
/**
|
|
3438
3446
|
* 绘制圆
|
|
3439
3447
|
* @param cen 圆心位置
|
|
@@ -5088,6 +5096,7 @@ declare module "mxdraw" {
|
|
|
5088
5096
|
*/
|
|
5089
5097
|
class MxDbHatch extends MxDbEntity {
|
|
5090
5098
|
points: THREE.Vector3[];
|
|
5099
|
+
depthTest: boolean;
|
|
5091
5100
|
worldDraw(pWorldDraw: McGiWorldDraw): void;
|
|
5092
5101
|
getTypeName(): string;
|
|
5093
5102
|
moveGripPointsAt(index: number, offset: THREE.Vector3): boolean;
|
package/dist/styles/style.css.gz
CHANGED
|
Binary file
|
|
@@ -122,6 +122,7 @@ const mxcad = [
|
|
|
122
122
|
"MxCADUiPrInt",
|
|
123
123
|
"MxCADUiPrKeyWord",
|
|
124
124
|
"MxCADUiPrPoint",
|
|
125
|
+
"MxCADUiPrPointTransform",
|
|
125
126
|
"MxCADUiPrString",
|
|
126
127
|
"MxCADUtility",
|
|
127
128
|
"MxCADUtilityClass",
|
|
@@ -1510,4 +1511,4 @@ export {
|
|
|
1510
1511
|
getContentType as h,
|
|
1511
1512
|
resolveOptions as r
|
|
1512
1513
|
};
|
|
1513
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgtRGEzb2NxWkgubWpzIiwic291cmNlcyI6WyIuLi8uLi9wYWNrVG9vbFBsdWdpblNyYy9zaGFyZWQvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiXHJcbi8vIHBsdWdpbnMvc2hhcmVkL2luZGV4LnRzXHJcbmltcG9ydCB7IGJhc2VuYW1lLCBqb2luLCByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgZnMsIHsgTm9QYXJhbUNhbGxiYWNrIH0gZnJvbSAnZnMnO1xyXG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAndXJsJztcclxuaW1wb3J0IHsgbmFtZSB9IGZyb20gXCIuLi8uLi9saWIvcGFja2FnZS5qc29uXCJcclxuXHJcbmltcG9ydCB7IE14UXVpY2tDb21tYW5kIH0gZnJvbSBcIi4vdHlwZXMvbXhRdWlja0NvbW1hbmQuZFwiXHJcbmltcG9ydCB7IE14U2VydmVyQ29uZmlnIH0gZnJvbSBcIi4vdHlwZXMvbXhTZXJ2ZXJDb25maWcuZFwiXHJcbmltcG9ydCB7IE14U2tldGNoZXNBbmROb3Rlc1VpQ29uZmlnIH0gZnJvbSBcIi4vdHlwZXMvbXhTa2V0Y2hlc0FuZE5vdGVzVWlDb25maWcuZFwiXHJcbmltcG9ydCB7IE14VWlDb25maWcgfSBmcm9tIFwiLi90eXBlcy9teFVpQ29uZmlnLmRcIlxyXG5pbXBvcnQgeyBNeGNhZFVpQ29uZmlnIH0gZnJvbSBcIi4vdHlwZXMvbXhjYWRVaUNvbmZpZy5kXCJcclxuaW1wb3J0IHsgVnVldGlmeVRoZW1lQ29uZmlnIH0gZnJvbSBcIi4vdHlwZXMvdnVldGlmeVRoZW1lQ29uZmlnLmRcIlxyXG5pbXBvcnQgYXBpTWFwIGZyb20gJy4uL2FwaS1tYXAuanNvbidcclxuZXhwb3J0IGNvbnN0IGdldEFwaU1hcCA9ICgpID0+IGFwaU1hcFxyXG5leHBvcnQgaW50ZXJmYWNlIE14UGx1Z2luQ29uZmlnIHtcclxuICBwbHVnaW5zOiAoc3RyaW5nIHwge1xyXG4gICAgbmFtZT86IHN0cmluZyxcclxuICAgIGlzQWZ0ZXJMb2FkPzogYm9vbGVhbixcclxuICAgIGRpcj86IGJvb2xlYW4sXHJcbiAgICB2ZXJzaW9uPzogc3RyaW5nXHJcbiAgfSlbXVxyXG59XHJcbi8vID09PSDmlrDlop7vvJrphY3nva7mlofku7blkI3luLjph48gPT09XHJcbmV4cG9ydCBjb25zdCBDT05GSUdfRklMRU5BTUVTID0gW1xyXG4gIC8vICdteGNhZFVpQ29uZmlnLmpzb24nLFxyXG4gICdteFF1aWNrQ29tbWFuZC5qc29uJyxcclxuICAnbXhTZXJ2ZXJDb25maWcuanNvbicsXHJcbiAgJ214U2tldGNoZXNBbmROb3Rlc1VpQ29uZmlnLmpzb24nLFxyXG4gICdteFVpQ29uZmlnLmpzb24nLFxyXG4gICd2dWV0aWZ5VGhlbWVDb25maWcuanNvbicsXHJcbiAgLy8gJ3BsdWdpbnMvY29uZmlnLmpzb24nXHJcbl0gYXMgY29uc3Q7XHJcbi8qKlxyXG4gKiDphY3nva7mlofku7blpITnkIblmahcclxuICog5Y+v6YCJ77ya5a+554m55a6a6YWN572u5paH5Lu26L+b6KGM6L+Q6KGM5pe25L+u5pS5XHJcbiAqIOWHveaVsOaOpeaUtuWOn+WniyBKU09OIOaVsOaNru+8jOi/lOWbnuS/ruaUueWQjueahCBKU09OIOaVsOaNru+8iOWPr+W8guatpe+8iVxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zvcm1GdW5jdGlvbnMge1xyXG4gIC8vIHRyYW5zZm9ybU14Y2FkVWlDb25maWcoZGF0YTogTXhjYWRVaUNvbmZpZyk6IFByb21pc2U8TXhjYWRVaUNvbmZpZz4gfCBNeGNhZFVpQ29uZmlnO1xyXG4gIHRyYW5zZm9ybU14UXVpY2tDb21tYW5kKGRhdGE6IE14UXVpY2tDb21tYW5kKTogUHJvbWlzZTxNeFF1aWNrQ29tbWFuZD4gfCBNeFF1aWNrQ29tbWFuZDtcclxuICB0cmFuc2Zvcm1NeFNlcnZlckNvbmZpZyhkYXRhOiBNeFNlcnZlckNvbmZpZyk6IFByb21pc2U8TXhTZXJ2ZXJDb25maWc+IHwgTXhTZXJ2ZXJDb25maWc7XHJcbiAgdHJhbnNmb3JtTXhTa2V0Y2hlc0FuZE5vdGVzVWlDb25maWcoZGF0YTogTXhTa2V0Y2hlc0FuZE5vdGVzVWlDb25maWcpOiBQcm9taXNlPE14U2tldGNoZXNBbmROb3Rlc1VpQ29uZmlnPiB8IE14U2tldGNoZXNBbmROb3Rlc1VpQ29uZmlnO1xyXG4gIHRyYW5zZm9ybU14VWlDb25maWcoZGF0YTogTXhVaUNvbmZpZyk6IFByb21pc2U8TXhVaUNvbmZpZz4gfCBNeFVpQ29uZmlnO1xyXG4gIHRyYW5zZm9ybVZ1ZXRpZnlUaGVtZUNvbmZpZyhkYXRhOiBWdWV0aWZ5VGhlbWVDb25maWcpOiBQcm9taXNlPFZ1ZXRpZnlUaGVtZUNvbmZpZz4gfCBWdWV0aWZ5VGhlbWVDb25maWc7XHJcbiAgLy8gdHJhbnNmb3JtTXhQbHVnaW5zQ29uZmlnKGRhdGE6IE14UGx1Z2luQ29uZmlnW10pOiBQcm9taXNlPE14UGx1Z2luQ29uZmlnW10+IHwgTXhQbHVnaW5Db25maWdbXTtcclxufVxyXG4vLyDmianlsZXmj5Lku7bpgInpobnmjqXlj6MgPT09XHJcbmV4cG9ydCBpbnRlcmZhY2UgTXhDYWRBc3NldHNQbHVnaW5PcHRpb25zIGV4dGVuZHMgUGFydGlhbDxUcmFuc2Zvcm1GdW5jdGlvbnM+IHtcclxuICAvKipcclxuICAgKiDmnoTlu7rlkI7vvIxteGNhZEFwcEFzc2V0cyDotYTmupDlrZjmlL7nmoTlrZDnm67lvZXlkI3jgIJcclxuICAgKiBAZGVmYXVsdCAnbXhjYWRBcHBBc3NldHMnXHJcbiAgICovXHJcbiAgb3V0cHV0RGlyPzogc3RyaW5nO1xyXG4gIC8qKiDnrKzkuInmlrnkvp3otZYqL1xyXG4gIGxpYnJhcnlOYW1lcz86IChrZXlvZiB0eXBlb2YgZXh0ZXJuYWxzKVtdO1xyXG4gIC8qKiDmmK/lkKbljZXnur/nqIvliqDovb13YXNtICjpu5jorqTkvb/nlKjlpJrnur/nqIvlj4rliqDovb0pICovXHJcbiAgaXNXYXNtU3Q/OiBib29sZWFuO1xyXG4gICAvKipcclxuICAgKiDmmK/lkKblkK/nlKjpooTljovnvKnotYTmupDvvIjlpoIgLmd6IOaWh+S7tu+8ieeahOaLt+i0nSDpu5jorqTmmK90cnVlXHJcbiAgICog6K6+572u5Li6IGZhbHNlIOaXtu+8jC5neiDljovnvKnmlofku7blsIbkuI3kvJrooqvlpI3liLbliLDovpPlh7rnm67lvZVcclxuICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICovXHJcbiAgZW5hYmxlQ29tcHJlc3NlZEFzc2V0cz86IGJvb2xlYW47XHJcbn1cclxuXHJcblxyXG4vLyA9PT0g5aKe5by677yacmVzb2x2ZU9wdGlvbnMg6buY6K6k5YC8ID09PVxyXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU9wdGlvbnMob3B0aW9uczogTXhDYWRBc3NldHNQbHVnaW5PcHRpb25zID0ge30pOiBSZXF1aXJlZDxNeENhZEFzc2V0c1BsdWdpbk9wdGlvbnM+IHtcclxuICBjb25zdCByZXNvbHZlZDogUmVxdWlyZWQ8TXhDYWRBc3NldHNQbHVnaW5PcHRpb25zPiA9IHtcclxuICAgIG91dHB1dERpcjogb3B0aW9ucy5vdXRwdXREaXIgfHwgJ214Y2FkQXBwQXNzZXRzJyxcclxuICAgIGxpYnJhcnlOYW1lczogb3B0aW9ucy5saWJyYXJ5TmFtZXMgfHwgW10sXHJcbiAgICBpc1dhc21TdDogb3B0aW9ucy5pc1dhc21TdCB8fCBmYWxzZSxcclxuICAgIGVuYWJsZUNvbXByZXNzZWRBc3NldHM6IG9wdGlvbnMuZW5hYmxlQ29tcHJlc3NlZEFzc2V0cyB8fCB0cnVlLFxyXG4gICAgLy8gdHJhbnNmb3JtTXhjYWRVaUNvbmZpZzogb3B0aW9ucy50cmFuc2Zvcm1NeGNhZFVpQ29uZmlnIHx8ICgoZCkgPT4gZCksXHJcbiAgICB0cmFuc2Zvcm1NeFF1aWNrQ29tbWFuZDogb3B0aW9ucy50cmFuc2Zvcm1NeFF1aWNrQ29tbWFuZCB8fCAoKGQpID0+IGQpLFxyXG4gICAgdHJhbnNmb3JtTXhTZXJ2ZXJDb25maWc6IG9wdGlvbnMudHJhbnNmb3JtTXhTZXJ2ZXJDb25maWcgfHwgKChkKSA9PiBkKSxcclxuICAgIHRyYW5zZm9ybU14U2tldGNoZXNBbmROb3Rlc1VpQ29uZmlnOiBvcHRpb25zLnRyYW5zZm9ybU14U2tldGNoZXNBbmROb3Rlc1VpQ29uZmlnIHx8ICgoZCkgPT4gZCksXHJcbiAgICB0cmFuc2Zvcm1NeFVpQ29uZmlnOiBvcHRpb25zLnRyYW5zZm9ybU14VWlDb25maWcgfHwgKChkKSA9PiBkKSxcclxuICAgIHRyYW5zZm9ybVZ1ZXRpZnlUaGVtZUNvbmZpZzogb3B0aW9ucy50cmFuc2Zvcm1WdWV0aWZ5VGhlbWVDb25maWcgfHwgKChkKSA9PiBkKSxcclxuICAgIC8vIHRyYW5zZm9ybU14UGx1Z2luc0NvbmZpZzogb3B0aW9ucy50cmFuc2Zvcm1NeFBsdWdpbnNDb25maWcgfHwgKChkKSA9PiBkKSxcclxuICB9O1xyXG4gIHJldHVybiByZXNvbHZlZDtcclxufVxyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkUGF0aFJlc3VsdCB7XHJcbiAgc3VjY2VzczogYm9vbGVhbjtcclxuICBmaWxlUGF0aD86IHN0cmluZzsgICAgICAgICAvLyDlt7IgcmVzb2x2ZSDnmoTlronlhajmlofku7bot6/lvoRcclxuICB1cmxQYXRoPzogc3RyaW5nOyAgICAgICAgICAvLyDop6PnoIHlkI7nmoQgVVJMIOi3r+W+hO+8iOS4jeWQqyBxdWVyee+8iVxyXG4gIGZpbGVOYW1lPzogc3RyaW5nOyAgICAgICAgIC8vIOaWh+S7tuWQje+8iGJhc2VuYW1l77yJXHJcbiAgc3RhdHVzQ29kZT86IG51bWJlcjtcclxuICBtZXNzYWdlPzogc3RyaW5nO1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIOWuieWFqOino+aekOW5tumqjOivgeivt+axgui3r+W+hFxyXG4gKiBAcGFyYW0gcmVxVXJsIOivt+axgueahCBVUkzvvIjlpoIgJy9hc3NldHMvbXhTZXJ2ZXJDb25maWcuanNvbj92PTEn77yJXHJcbiAqIEBwYXJhbSByb290IOacrOWcsOagueebruW9le+8iOWmgiAnRDovcHJvamVjdC9kaXN0L214Y2FkJ++8iVxyXG4gKiBAcGFyYW0gYmFzZVBhdGgg5Y+v6YCJ55qE5Z+656GA6Lev5b6E5YmN57yA77yI5aaCICcvbXhjYWQvJ++8jOeUqOS6jiBWaXRl77yJXHJcbiAqIEByZXR1cm5zIOino+aekOe7k+aenOaIlumUmeivr1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTYWZlUGF0aChcclxuICByZXFVcmw6IHN0cmluZyxcclxuICByb290OiBzdHJpbmcsXHJcbiAgYmFzZVBhdGg/OiBzdHJpbmdcclxuKTogUGFyc2VkUGF0aFJlc3VsdCB7XHJcbiAgLy8gMS4g5Z+65pys5qCh6aqMXHJcbiAgaWYgKCFyZXFVcmwgfHwgdHlwZW9mIHJlcVVybCAhPT0gJ3N0cmluZycpIHtcclxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBzdGF0dXNDb2RlOiA0MDAsIG1lc3NhZ2U6ICdCYWQgUmVxdWVzdCcgfTtcclxuICB9XHJcblxyXG4gIC8vIDIuIOaPkOWPlui3r+W+hO+8iOWOuyBxdWVyeSDlkowgaGFzaO+8iVxyXG4gIGxldCB1cmxQYXRoID0gcmVxVXJsLnNwbGl0KCc/JylbMF0uc3BsaXQoJyMnKVswXTtcclxuXHJcbiAgLy8gMy4g6Kej56CBIFVSTFxyXG4gIGxldCBkZWNvZGVkUGF0aDogc3RyaW5nO1xyXG4gIHRyeSB7XHJcbiAgICBkZWNvZGVkUGF0aCA9IGRlY29kZVVSSUNvbXBvbmVudCh1cmxQYXRoKTtcclxuICAgIC8vIOmYsuatoiBudWxsIOWtl+iKguaUu+WHu1xyXG4gICAgaWYgKGRlY29kZWRQYXRoLmluY2x1ZGVzKCdcXDAnKSkge1xyXG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgc3RhdHVzQ29kZTogNDAwLCBtZXNzYWdlOiAnSW52YWxpZCBVUkwnIH07XHJcbiAgICB9XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgc3RhdHVzQ29kZTogNDAwLCBtZXNzYWdlOiAnSW52YWxpZCBVUkwgZW5jb2RpbmcnIH07XHJcbiAgfVxyXG5cclxuICAvLyA0LiDlpITnkIYgYmFzZVBhdGjvvIjlpoIgVml0ZSDnmoQgYmFzZe+8iVxyXG4gIGlmIChiYXNlUGF0aCAmJiBkZWNvZGVkUGF0aC5zdGFydHNXaXRoKGJhc2VQYXRoKSkge1xyXG4gICAgZGVjb2RlZFBhdGggPSBkZWNvZGVkUGF0aC5zbGljZShiYXNlUGF0aC5sZW5ndGgpO1xyXG4gIH1cclxuXHJcbiAgLy8gNS4g5riF55CG6Lev5b6E77ya5Y676Zmk5byA5aS05aSa5L2Z55qEIC9cclxuICAvLyDkvovlpoLvvJovL2Fzc2V0cy9maWxlLmpzb24gLT4gYXNzZXRzL2ZpbGUuanNvblxyXG4gIGNvbnN0IGNsZWFuZWRQYXRoID0gZGVjb2RlZFBhdGgucmVwbGFjZSgvXlxcLysvLCAnJyk7XHJcblxyXG4gIC8vIDYuIOaLvOaOpeaWh+S7tui3r+W+hFxyXG4gIGNvbnN0IGZpbGVQYXRoID0gam9pbihyb290LCBjbGVhbmVkUGF0aCB8fCAnLicpO1xyXG5cclxuICAvLyA3LiDlronlhajmo4Dmn6XvvJrpmLLmraLot6/lvoTnqb/otopcclxuICBsZXQgbm9ybWFsaXplZEZpbGU6IHN0cmluZztcclxuICBsZXQgbm9ybWFsaXplZFJvb3Q6IHN0cmluZztcclxuICB0cnkge1xyXG4gICAgbm9ybWFsaXplZEZpbGUgPSByZXNvbHZlKGZpbGVQYXRoKTtcclxuICAgIG5vcm1hbGl6ZWRSb290ID0gcmVzb2x2ZShyb290KTtcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBzdGF0dXNDb2RlOiA1MDAsIG1lc3NhZ2U6ICdQYXRoIHJlc29sdXRpb24gZmFpbGVkJyB9O1xyXG4gIH1cclxuXHJcbiAgLy8g4pyFIOWFs+mUru+8muehruS/nSBub3JtYWxpemVkRmlsZSDlnKggbm9ybWFsaXplZFJvb3Qg55uu5b2V5LiLXHJcbiAgY29uc3Qgbm9ybWFsaXplZEZpbGVTdHIgPSBub3JtYWxpemVkRmlsZS5yZXBsYWNlKC9cXFxcL2csICcvJykgKyAnLyc7XHJcbiAgY29uc3Qgbm9ybWFsaXplZFJvb3RTdHIgPSBub3JtYWxpemVkUm9vdC5yZXBsYWNlKC9cXFxcL2csICcvJykgKyAnLyc7XHJcblxyXG4gIGlmICghbm9ybWFsaXplZEZpbGVTdHIuc3RhcnRzV2l0aChub3JtYWxpemVkUm9vdFN0cikpIHtcclxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBzdGF0dXNDb2RlOiA0MDMsIG1lc3NhZ2U6ICdGb3JiaWRkZW46IFBhdGggdHJhdmVyc2FsIGRldGVjdGVkJyB9O1xyXG4gIH1cclxuXHJcbiAgLy8gOC4g5o+Q5Y+WIGZpbGVOYW1lXHJcbiAgY29uc3QgcGF0aFNlZ21lbnRzID0gY2xlYW5lZFBhdGguc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XHJcbiAgY29uc3QgZmlsZU5hbWUgPSBwYXRoU2VnbWVudHMubGVuZ3RoID4gMCA/IGJhc2VuYW1lKHBhdGhTZWdtZW50c1twYXRoU2VnbWVudHMubGVuZ3RoIC0gMV0pIDogJyc7XHJcblxyXG4gIC8vIOKchSDmiJDlip9cclxuICByZXR1cm4ge1xyXG4gICAgc3VjY2VzczogdHJ1ZSxcclxuICAgIGZpbGVQYXRoOiBub3JtYWxpemVkRmlsZSxcclxuICAgIHVybFBhdGg6IGRlY29kZWRQYXRoLFxyXG4gICAgZmlsZU5hbWUsXHJcbiAgfTtcclxufVxyXG5cclxuXHJcbnR5cGUgQ29uZmlnRmlsZW5hbWUgPSAodHlwZW9mIENPTkZJR19GSUxFTkFNRVMpW251bWJlcl07XHJcbmZ1bmN0aW9uIGhhbmRsZUNvbmZpZ0ZpbGUoXHJcbiAgc3JjUGF0aDogc3RyaW5nLFxyXG4gIGRlc3RQYXRoOiBzdHJpbmcsXHJcbiAgZmlsZW5hbWU6IENvbmZpZ0ZpbGVuYW1lLFxyXG4gIG9wdGlvbnM6IFJlcXVpcmVkPE14Q2FkQXNzZXRzUGx1Z2luT3B0aW9ucz4sXHJcbiAgY2FsbGJhY2s6IE5vUGFyYW1DYWxsYmFja1xyXG4pIHtcclxuICBmcy5yZWFkRmlsZShzcmNQYXRoLCAndXRmLTgnLCBhc3luYyAoZXJyLCBjb250ZW50KSA9PiB7XHJcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgZGF0YSA9IGNvbnRlbnQudHJpbSgpID8gSlNPTi5wYXJzZShjb250ZW50KSA6IHt9O1xyXG5cclxuICAgICAgLy8g4pyFIOato+ehrueUn+aIkCB0cmFuc2Zvcm0g5Ye95pWw5ZCNXHJcbiAgICAgIGNvbnN0IGJhc2VOYW1lID0gZmlsZW5hbWUucmVwbGFjZSgvXFwuanNvbiQvaSwgJycpO1xyXG4gICAgICBjb25zdCB0cmFuc2Zvcm1LZXkgPSBgdHJhbnNmb3JtJHtwYXNjYWxDYXNlKGJhc2VOYW1lKX1gOyAvLyDkvovlpoI6IHRyYW5zZm9ybVBsdWdpbnNDb25maWcg5oiWIHRyYW5zZm9ybU14UGx1Z2luc0NvbmZpZ1xyXG5cclxuICAgICAgY29uc3QgdHJhbnNmb3JtRm4gPSAob3B0aW9ucyBhcyBhbnkpW3RyYW5zZm9ybUtleV07XHJcblxyXG4gICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybUZuID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgZGF0YSA9IGF3YWl0IHRyYW5zZm9ybUZuKGRhdGEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMik7XHJcbiAgICAgIGZzLndyaXRlRmlsZShkZXN0UGF0aCwganNvbiwgJ3V0Zi04JywgY2FsbGJhY2spO1xyXG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcclxuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuLyoqXHJcbiAqIOWkhOeQhumFjee9ruaWh+S7tuivt+axgu+8muivu+WPliDihpIg6L2s5o2iIOKGkiDov5Tlm57lk43lupRcclxuICog55So5LqOIFZpdGUvV2VicGFjayBkZXYgc2VydmVyIOS4remXtOS7tlxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUNvbmZpZ1JlcXVlc3QoXHJcbiAgZmlsZVBhdGg6IHN0cmluZywgICAgICAgICAgIC8vIOW3sue7j+mqjOivgei/h+eahOWuieWFqOi3r+W+hFxyXG4gIGZpbGVOYW1lOiBzdHJpbmcsICAgICAgICAgICAvLyDmlofku7blkI3vvIzlpoIgJ214U2VydmVyQ29uZmlnLmpzb24nXHJcbiAgb3B0aW9uczogUmVxdWlyZWQ8TXhDYWRBc3NldHNQbHVnaW5PcHRpb25zPixcclxuICByZXM6IGFueSxcclxuICBsb2dnZXI/OiB7IGluZm8/OiAobXNnOiBzdHJpbmcpID0+IHZvaWQ7IGVycm9yPzogKG1zZzogc3RyaW5nKSA9PiB2b2lkIH1cclxuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgLy8g5LuF5aSE55CG55m95ZCN5Y2V5YaF55qE5paH5Lu2XHJcbiAgaWYgKCEoQ09ORklHX0ZJTEVOQU1FUyBhcyB1bmtub3duIGFzIHN0cmluZykuaW5jbHVkZXMoZmlsZU5hbWUpKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB0cnkge1xyXG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmLTgnKTtcclxuICAgIGxldCBkYXRhID0gY29udGVudC50cmltKCkgPyBKU09OLnBhcnNlKGNvbnRlbnQpIDoge307XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtS2V5ID0gYHRyYW5zZm9ybSR7cGFzY2FsQ2FzZShmaWxlTmFtZS5yZXBsYWNlKC9cXC5qc29uJC9pLCAnJykpfWA7XHJcbiAgICBjb25zdCB0cmFuc2Zvcm1GbiA9IChvcHRpb25zIGFzIGFueSlbdHJhbnNmb3JtS2V5XTtcclxuXHJcbiAgICBpZiAodHlwZW9mIHRyYW5zZm9ybUZuID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGRhdGEgPSBhd2FpdCB0cmFuc2Zvcm1GbihkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xyXG4gICAgcmVzLnNldEhlYWRlcignQ2FjaGUtQ29udHJvbCcsICduby1jYWNoZScpO1xyXG4gICAgcmVzLmVuZChKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKSk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9IGNhdGNoIChlcnI6IGFueSkge1xyXG4gICAgbG9nZ2VyPy5lcnJvcj8uKGBbbXhjYWQtYXNzZXRzXSDinYwgRmFpbGVkIHRvIHNlcnZlICR7ZmlsZU5hbWV9OiAke2Vyci5tZXNzYWdlfWApO1xyXG4gICAgaWYgKCFyZXMuaGVhZGVyc1NlbnQpIHtcclxuICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvcGxhaW4nKTtcclxuICAgICAgcmVzLnN0YXR1c0NvZGUgPSA1MDA7XHJcbiAgICAgIHJlcy5lbmQoJ0ludGVybmFsIFNlcnZlciBFcnJvcicpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7IC8vIOW3suWkhOeQhumUmeivr1xyXG4gIH1cclxufVxyXG5cclxuLyoqIOWIm+W7uumAmueUqOWFqOWxgOS4remXtOS7tiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR2xvYmFsVW5pdmVyc2FsTWlkZGxld2FyZShvcHRpb25zOiBSZXF1aXJlZDxNeENhZEFzc2V0c1BsdWdpbk9wdGlvbnM+KSB7XHJcbiAgcmV0dXJuIGFzeW5jIChyZXE6IGFueSwgcmVzOiBhbnksIG5leHQ6IGFueSkgPT4ge1xyXG4gICAgaWYgKCFvcHRpb25zLmlzV2FzbVN0KSB7XHJcbiAgICAgIHJlcy5zZXRIZWFkZXIoJ0Nyb3NzLU9yaWdpbi1PcGVuZXItUG9saWN5JywgJ3NhbWUtb3JpZ2luJyk7XHJcbiAgICAgIHJlcy5zZXRIZWFkZXIoJ0Nyb3NzLU9yaWdpbi1FbWJlZGRlci1Qb2xpY3knLCAncmVxdWlyZS1jb3JwJyk7XHJcbiAgICB9XHJcbiAgICBuZXh0KCk7XHJcbiAgfVxyXG59XHJcbi8vID09PSDovoXliqnlh73mlbDvvJrlrZfnrKbkuLLovawgUGFzY2FsQ2FzZSA9PT1cclxuZXhwb3J0IGZ1bmN0aW9uIHBhc2NhbENhc2Uoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIHJldHVybiBzdHJcclxuICAgIC5yZXBsYWNlKC9bXmEtekEtWjAtOV0rKC4pL2csIChtLCBjaHIpID0+IGNoci50b1VwcGVyQ2FzZSgpKVxyXG4gICAgLnJlcGxhY2UoL14uLywgYyA9PiBjLnRvVXBwZXJDYXNlKCkpO1xyXG59XHJcblxyXG4vLyA9PT0g5YW25LuW5Y6f5pyJ5a+85Ye65L+d5oyB5LiN5Y+YID09PVxyXG5leHBvcnQgY29uc3QgZXh0ZXJuYWxzID0ge1xyXG4gICd2dWUnOiAnTVhDQURBUFBfRVhURVJOQUxMSUJSQVJJRVMuVnVlJyxcclxuICAnYXhpb3MnOiAnTVhDQURBUFBfRVhURVJOQUxMSUJSQVJJRVMuYXhpb3MnLFxyXG4gICd2dWV0aWZ5JzogJ01YQ0FEQVBQX0VYVEVSTkFMTElCUkFSSUVTLnZ1ZXRpZnknLFxyXG4gICd2dWV0aWZ5L2NvbXBvbmVudHMnOiAnTVhDQURBUFBfRVhURVJOQUxMSUJSQVJJRVMudnVldGlmeUNvbXBvbmVudHMnLFxyXG4gICdtYXBib3gtZ2wnOiAnTVhDQURBUFBfRVhURVJOQUxMSUJSQVJJRVMubWFwYm94Z2wnLFxyXG4gICdwaW5pYSc6ICdNWENBREFQUF9FWFRFUk5BTExJQlJBUklFUy5waW5pYSdcclxufTtcclxuLy8g5aeL57uI5L+d55WZ55qE5qih5Z2XXHJcbmNvbnN0IEFMV0FZU19LRUVQID0gbmV3IFNldChbJ214Y2FkJywgJ214ZHJhdyddKTtcclxuXHJcbi8qKlxyXG4gKiDmuIXnkIblubblhpnlhaXmraPnoa7nmoTnsbvlnovlvJXnlKhcclxuICovXHJcbmZ1bmN0aW9uIHN5bmNUeXBlUmVmZXJlbmNlcyhsaWJyYXJ5TmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgY29uc3Qgcm9vdERpciA9IHByb2Nlc3MuY3dkKCk7XHJcbiAgY29uc3QgZGlzdERpciA9IHJlc29sdmUocm9vdERpciwgJ25vZGVfbW9kdWxlcycsICdteGNhZC1hcHAnLCAnZGlzdCcpO1xyXG4gIGNvbnN0IGluZGV4UGF0aCA9IHJlc29sdmUoZGlzdERpciwgJ2luZGV4LmQudHMnKTtcclxuXHJcbiAgdHJ5IHtcclxuICAgIC8vIOKchSAxLiDmo4Dmn6UgZGlzdCDnm67lvZVcclxuICAgIGlmICghZnMuZXhpc3RzU3luYyhkaXN0RGlyKSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oYOKaoO+4jyBteGNhZC1hcHAvZGlzdCDnm67lvZXkuI3lrZjlnKjvvIzot7Pov4fnsbvlnovlkIzmraU6ICR7ZGlzdERpcn1gKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOKchSAyLiDnoa7kv50gaW5kZXguZC50cyDlrZjlnKhcclxuICAgIGlmICghZnMuZXhpc3RzU3luYyhpbmRleFBhdGgpKSB7XHJcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoaW5kZXhQYXRoLCAnJywgJ3V0Zi04Jyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKGDinIUg5bey5Yib5bu656m657G75Z6L5paH5Lu2OiAke2luZGV4UGF0aH1gKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhpbmRleFBhdGgsICd1dGYtOCcpO1xyXG4gICAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KC9cXHI/XFxuLyk7XHJcblxyXG4gICAgLy8g4pyFIDMuIOaPkOWPluaJgOacieeOsOacieeahCAvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi94eHguZC50c1wiIC8+IOihjFxyXG4gICAgY29uc3QgcmVmZXJlbmNlUmVnZXggPSAvXFwvXFwvXFwvXFxzKjxyZWZlcmVuY2VcXHMrcGF0aD1cIlxcLlxcLyhbXlwiXStcXC5kXFwudHMpXCJcXHMqXFwvPi87XHJcbiAgICBjb25zdCBleGlzdGluZ1JlZnM6IHN0cmluZ1tdID0gW107XHJcbiAgICBjb25zdCBub25SZWZMaW5lczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICBsaW5lcy5mb3JFYWNoKGxpbmUgPT4ge1xyXG4gICAgICBjb25zdCBtYXRjaCA9IGxpbmUudHJpbSgpLm1hdGNoKHJlZmVyZW5jZVJlZ2V4KTtcclxuICAgICAgaWYgKG1hdGNoKSB7XHJcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBtYXRjaFsxXTsgLy8g5aaCIFwidnVlLmQudHNcIlxyXG4gICAgICAgIGNvbnN0IG1vZHVsZU5hbWUgPSBmaWxlTmFtZS5yZXBsYWNlKC9cXC5kXFwudHMkLywgJycpOyAvLyDmj5Dlj5bmqKHlnZflkI1cclxuICAgICAgICBleGlzdGluZ1JlZnMucHVzaChtb2R1bGVOYW1lKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBub25SZWZMaW5lcy5wdXNoKGxpbmUpOyAvLyDkv53nlZnpnZ4gcmVmZXJlbmNlIOihjFxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyDinIUgNC4g6K6h566X5pyA57uI5bqU6K+l5L+d55WZ55qE5qih5Z2XXHJcbiAgICBjb25zdCB2YWxpZE1vZHVsZXMgPSBuZXcgU2V0PHN0cmluZz4oQUxXQVlTX0tFRVApO1xyXG5cclxuICAgIGxpYnJhcnlOYW1lcy5mb3JFYWNoKG5hbWUgPT4ge1xyXG4gICAgICAvLyDlv4XpobvlnKggZXh0ZXJuYWxzIOS4reWumuS5ie+8jOS4lOexu+Wei+aWh+S7tuWtmOWcqFxyXG4gICAgICBpZiAobmFtZSBpbiBleHRlcm5hbHMpIHtcclxuICAgICAgICBjb25zdCBkdHNQYXRoID0gcmVzb2x2ZShkaXN0RGlyLCBgJHtuYW1lfS5kLnRzYCk7XHJcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZHRzUGF0aCkpIHtcclxuICAgICAgICAgIHZhbGlkTW9kdWxlcy5hZGQobmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyDinIUgNS4g55Sf5oiQ5pyA57uI55qEIHJlZmVyZW5jZSDooYzvvIjkv53mjIEgbXhjYWQg5ZKMIG14ZHJhdyDlnKjmnIDliY3vvIlcclxuICAgIGNvbnN0IGZpbmFsUmVmcyA9IFsnbXhjYWQnLCAnbXhkcmF3J11cclxuICAgICAgLmZpbHRlcihuYW1lID0+IHZhbGlkTW9kdWxlcy5oYXMobmFtZSkpXHJcbiAgICAgIC5tYXAobmFtZSA9PiBgLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vJHtuYW1lfS5kLnRzXCIgLz5gKTtcclxuXHJcbiAgICAvLyDmt7vliqDlhbbku5YgdmFsaWRNb2R1bGVzIOS4reeahO+8iOWOu+mHje+8iVxyXG4gICAgQXJyYXkuZnJvbSh2YWxpZE1vZHVsZXMpXHJcbiAgICAgIC5maWx0ZXIobmFtZSA9PiAhQUxXQVlTX0tFRVAuaGFzKG5hbWUpKVxyXG4gICAgICAuZm9yRWFjaChuYW1lID0+IHtcclxuICAgICAgICBmaW5hbFJlZnMucHVzaChgLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vJHtuYW1lfS5kLnRzXCIgLz5gKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgLy8g4pyFIDYuIOWQiOW5tu+8muacgOe7iOW8leeUqCArIOWOn+Wni+mdnuW8leeUqOihjFxyXG4gICAgY29uc3QgcmVzdWx0TGluZXMgPSBbLi4uZmluYWxSZWZzLCAnJywgLi4ubm9uUmVmTGluZXMuZmlsdGVyKGwgPT4gbC50cmltKCkubGVuZ3RoID4gMCldO1xyXG5cclxuICAgIC8vIOenu+mZpOi/nue7reepuuihjO+8jOS/neeVmeS4gOS4quWIhumalFxyXG4gICAgY29uc3QgY2xlYW5lZExpbmVzID0gcmVzdWx0TGluZXMuZmlsdGVyKChsaW5lLCBpLCBhcnIpID0+XHJcbiAgICAgICEobGluZS50cmltKCkgPT09ICcnICYmIGkgPiAwICYmIGFycltpIC0gMV0udHJpbSgpID09PSAnJylcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGNsZWFuZWRMaW5lcy5qb2luKCdcXG4nKS50cmltKCkgKyAnXFxuJztcclxuXHJcbiAgICAvLyDinIUgNy4g5YaZ5Zue5paH5Lu277yI5LuF5b2T5YaF5a655Y+Y5YyW5pe277yJXHJcbiAgICBpZiAoY29udGVudC50cmltKCkgIT09IG5ld0NvbnRlbnQudHJpbSgpKSB7XHJcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoaW5kZXhQYXRoLCBuZXdDb250ZW50LCAndXRmLTgnKTtcclxuICAgICAgY29uc29sZS5sb2coYOKchSDlt7LlkIzmraUgbXhjYWQtYXBwL2Rpc3QvaW5kZXguZC50cyDnsbvlnovlvJXnlKhgKTtcclxuICAgICAgY29uc29sZS5sb2coYCAgIOS/neeVmTogJHtBcnJheS5mcm9tKHZhbGlkTW9kdWxlcykuam9pbignLCAnKX1gKTtcclxuICAgIH1cclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGNvbnNvbGUuZXJyb3IoYOKdjCDlkIzmraXnsbvlnovlvJXnlKjlpLHotKU6YCwgZXJyKTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDpooTlrprkuYnlupPlkI3liLDlhajlsYDlj5jph4/nmoTmmKDlsIRcclxuICovXHJcbmV4cG9ydCBjb25zdCBERUZBVUxUX0xJQlJBUllfTUFQOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gIG14Y2FkOiAnTXhDQUQnLFxyXG4gIG14ZHJhdzogJ014J1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlcm5hbHMoXHJcbiAgbGlicmFyeU5hbWVzOiBSZXF1aXJlZDxNeENhZEFzc2V0c1BsdWdpbk9wdGlvbnM+WydsaWJyYXJ5TmFtZXMnXVxyXG4pOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcclxuICBzeW5jVHlwZVJlZmVyZW5jZXMobGlicmFyeU5hbWVzKTtcclxuICBjb25zdCByZXN1bHQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7IC4uLkRFRkFVTFRfTElCUkFSWV9NQVAgfVxyXG4gIGlmICghQXJyYXkuaXNBcnJheShsaWJyYXJ5TmFtZXMpKSByZXR1cm4gcmVzdWx0O1xyXG4gIGxpYnJhcnlOYW1lcy5mb3JFYWNoKG5hbWUgPT4ge1xyXG4gICAgaWYgKG5hbWUgaW4gZXh0ZXJuYWxzKSB7XHJcbiAgICAgIHJlc3VsdFtuYW1lXSA9IGV4dGVybmFsc1tuYW1lIGFzIGtleW9mIHR5cGVvZiBleHRlcm5hbHNdO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTb3VyY2VBc3NldHNQYXRoKCk6IHN0cmluZyB7XHJcbiAgbGV0IGN1cnJlbnRGaWxlOiBzdHJpbmc7XHJcbiAgaWYgKHR5cGVvZiBfX2ZpbGVuYW1lICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgY3VycmVudEZpbGUgPSBfX2ZpbGVuYW1lO1xyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICBjdXJyZW50RmlsZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcclxuICB9XHJcbiAgY29uc3QgcGFja2FnZVJvb3QgPSByZXNvbHZlKGN1cnJlbnRGaWxlLCAnLi4nLCAnLi4nLCAnLi4nKTtcclxuICBjb25zdCBhc3NldHNQYXRoID0gcmVzb2x2ZShwYWNrYWdlUm9vdCwgbmFtZSwgJ2Rpc3QnLCAnbXhjYWRBcHBBc3NldHMnKTtcclxuICBpZiAoIWZzLmV4aXN0c1N5bmMoYXNzZXRzUGF0aCkpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihgbXgtY2FkLWFwcCBhc3NldHMgbm90IGZvdW5kIGF0OiAke2Fzc2V0c1BhdGh9YCk7XHJcbiAgfVxyXG4gIHJldHVybiBhc3NldHNQYXRoO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tTb3VyY2VBc3NldHNFeGlzdCgpOiBib29sZWFuIHtcclxuICBjb25zdCBwYXRoID0gZ2V0U291cmNlQXNzZXRzUGF0aCgpO1xyXG4gIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGgpICYmIGZzLmxzdGF0U3luYyhwYXRoKS5pc0RpcmVjdG9yeSgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVSdW50aW1lQ29uZmlnU2NyaXB0KHB1YmxpY1BhdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgcmV0dXJuIGBcclxuICAgIDxzY3JpcHQ+XHJcbiAgICAgIHdpbmRvdy5fX01YX0NBRF9BUFBfQVNTRVRfUEFUSF9fID0gJyR7cHVibGljUGF0aH0nO1xyXG4gICAgPC9zY3JpcHQ+XHJcbiAgYC50cmltKCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjb3B5RGlyKFxyXG4gIHNyYzogc3RyaW5nLFxyXG4gIGRlc3Q6IHN0cmluZyxcclxuICBwdWJsaWNEaXI6IHN0cmluZyxcclxuICBvcHRpb25zOiBSZXF1aXJlZDxNeENhZEFzc2V0c1BsdWdpbk9wdGlvbnM+LFxyXG4gIGNhbGxiYWNrOiAoZXJyPzogRXJyb3IpID0+IHZvaWRcclxuKTogdm9pZCB7XHJcbiAgLy8g56ys5LiA5q2l77ya5omr5o+PIHB1YmxpY0RpciDkuIvmiYDmnInmlofku7bvvIjnm7jlr7nkuo4gcHVibGljRGlyIOeahOi3r+W+hO+8iVxyXG4gIHNjYW5QdWJsaWNEaXIocHVibGljRGlyLCAoZXJyLCBwdWJsaWNGaWxlcykgPT4ge1xyXG4gICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XHJcblxyXG4gICAgLy8g56ys5LqM5q2l77ya5byA5aeL5aSN5Yi277yM5Lyg5YWlIHB1YmxpY0ZpbGVzIOe8k+WtmFxyXG4gICAgZG9Db3B5KHNyYywgZGVzdCwgcHVibGljRGlyLCBwdWJsaWNGaWxlcyEsIG9wdGlvbnMsIGNhbGxiYWNrKTtcclxuICB9KTtcclxufVxyXG5cclxuLy8g5a6e6ZmF5omn6KGM5aSN5Yi255qE5Ye95pWwXHJcbmZ1bmN0aW9uIGRvQ29weShcclxuICBzcmM6IHN0cmluZyxcclxuICBkZXN0OiBzdHJpbmcsXHJcbiAgcHVibGljRGlyOiBzdHJpbmcsXHJcbiAgcHVibGljRmlsZXM6IFNldDxzdHJpbmc+LFxyXG4gIG9wdGlvbnM6IFJlcXVpcmVkPE14Q2FkQXNzZXRzUGx1Z2luT3B0aW9ucz4sIC8vIOazqOaEj++8mui/memHjOmcgOimgeehruS/nSBlbmFibGVDb21wcmVzc2VkQXNzZXRzIOaYr+W/hemAieeahFxyXG4gIGNhbGxiYWNrOiAoZXJyPzogRXJyb3IpID0+IHZvaWRcclxuKSB7XHJcbiAgZnMubWtkaXIoZGVzdCwgeyByZWN1cnNpdmU6IHRydWUgfSwgKGVycikgPT4ge1xyXG4gICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XHJcblxyXG4gICAgZnMucmVhZGRpcihzcmMsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9LCAoZXJyLCBkaXJlbnRzKSA9PiB7XHJcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xyXG5cclxuICAgICAgbGV0IHBlbmRpbmcgPSBkaXJlbnRzLmxlbmd0aDtcclxuICAgICAgaWYgKHBlbmRpbmcgPT09IDApIHJldHVybiBjYWxsYmFjaygpO1xyXG5cclxuICAgICAgLy8g5o+Q5YmN5a6a5LmJ5Y6L57yp5paH5Lu25omp5bGV5ZCNXHJcbiAgICAgIGNvbnN0IGNvbXByZXNzZWRFeHRzID0gWycuZ3onXTsgLy8g5Y+v5oyJ6ZyA5omp5bGVXHJcblxyXG4gICAgICBkaXJlbnRzLmZvckVhY2goKGRpcmVudCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNyY1BhdGggPSByZXNvbHZlKHNyYywgZGlyZW50Lm5hbWUpO1xyXG4gICAgICAgIGNvbnN0IGRlc3RQYXRoID0gcmVzb2x2ZShkZXN0LCBkaXJlbnQubmFtZSk7XHJcbiAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUoc3JjLCBzcmNQYXRoKS5yZXBsYWNlKC9cXFxcL2csICcvJykgYXMgQ29uZmlnRmlsZW5hbWU7XHJcblxyXG4gICAgICAgIC8vIOaWsOWinu+8muWmguaenOemgeeUqOWOi+e8qei1hOa6kOS4lOaYr+WOi+e8qeaWh+S7tu+8jOWImei3s+i/h1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICFvcHRpb25zLmVuYWJsZUNvbXByZXNzZWRBc3NldHMgJiZcclxuICAgICAgICAgIGNvbXByZXNzZWRFeHRzLnNvbWUoZXh0ID0+IHJlbGF0aXZlUGF0aC5lbmRzV2l0aChleHQpKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgaWYgKC0tcGVuZGluZyA9PT0gMCkgY2FsbGJhY2soKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSkge1xyXG4gICAgICAgICAgZG9Db3B5KHNyY1BhdGgsIGRlc3RQYXRoLCBwdWJsaWNEaXIsIHB1YmxpY0ZpbGVzLCBvcHRpb25zLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICgtLXBlbmRpbmcgPT09IDApIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRpcmVudC5pc0ZpbGUoKSkge1xyXG4gICAgICAgICAgaWYgKHB1YmxpY0ZpbGVzLmhhcyhyZWxhdGl2ZVBhdGgpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHB1YmxpY0ZpbGVQYXRoID0gcmVzb2x2ZShwdWJsaWNEaXIsIHJlbGF0aXZlUGF0aCk7XHJcbiAgICAgICAgICAgIGZzLmNvcHlGaWxlKHB1YmxpY0ZpbGVQYXRoLCBkZXN0UGF0aCwgKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xyXG4gICAgICAgICAgICAgIGlmICgtLXBlbmRpbmcgPT09IDApIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChDT05GSUdfRklMRU5BTUVTLmluY2x1ZGVzKHJlbGF0aXZlUGF0aCkpIHtcclxuICAgICAgICAgICAgaGFuZGxlQ29uZmlnRmlsZShzcmNQYXRoLCBkZXN0UGF0aCwgcmVsYXRpdmVQYXRoLCBvcHRpb25zLCAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XHJcbiAgICAgICAgICAgICAgaWYgKC0tcGVuZGluZyA9PT0gMCkgY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmcy5jb3B5RmlsZShzcmNQYXRoLCBkZXN0UGF0aCwgKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xyXG4gICAgICAgICAgICAgIGlmICgtLXBlbmRpbmcgPT09IDApIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoLS1wZW5kaW5nID09PSAwKSBjYWxsYmFjaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG4vLyDmiavmj48gcHVibGljRGlyIOS4i+aJgOacieaWh+S7tu+8jOi/lOWbnuebuOWvueS6jiBwdWJsaWNEaXIg55qE6Lev5b6E6ZuG5ZCIXHJcbmZ1bmN0aW9uIHNjYW5QdWJsaWNEaXIoXHJcbiAgcHVibGljRGlyOiBzdHJpbmcsXHJcbiAgY2FsbGJhY2s6IChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB8IG51bGwsIGZpbGVzPzogU2V0PHN0cmluZz4pID0+IHZvaWRcclxuKSB7XHJcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblxyXG4gIGZ1bmN0aW9uIHdhbGsoZGlyOiBzdHJpbmcpIHtcclxuICAgIGZzLnJlYWRkaXIoZGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSwgKGVyciwgZGlyZW50cykgPT4ge1xyXG4gICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcclxuXHJcbiAgICAgIGxldCBwZW5kaW5nID0gZGlyZW50cy5sZW5ndGg7XHJcbiAgICAgIGlmIChwZW5kaW5nID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGRpcmVudHMuZm9yRWFjaCgoZGlyZW50KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSByZXNvbHZlKGRpciwgZGlyZW50Lm5hbWUpO1xyXG4gICAgICAgIGNvbnN0IHJlbFBhdGggPSByZWxhdGl2ZShwdWJsaWNEaXIsIGZ1bGxQYXRoKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XHJcblxyXG4gICAgICAgIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSkge1xyXG4gICAgICAgICAgd2FsayhmdWxsUGF0aCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkaXJlbnQuaXNGaWxlKCkpIHtcclxuICAgICAgICAgIHJlc3VsdC5hZGQocmVsUGF0aCk7XHJcbiAgICAgICAgICBpZiAoLS1wZW5kaW5nID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmICgtLXBlbmRpbmcgPT09IDApIHtcclxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB3YWxrKHB1YmxpY0Rpcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250ZW50VHlwZShmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICBjb25zdCBleHQgPSBmaWxlUGF0aC5zcGxpdCgnLicpLnBvcCgpPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xyXG4gIGNvbnN0IHR5cGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gICAgJ2Nzcyc6ICd0ZXh0L2NzcycsXHJcbiAgICAnanMnOiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcsXHJcbiAgICAnanNvbic6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICdwbmcnOiAnaW1hZ2UvcG5nJyxcclxuICAgICdqcGcnOiAnaW1hZ2UvanBlZycsXHJcbiAgICAnanBlZyc6ICdpbWFnZS9qcGVnJyxcclxuICAgICdnaWYnOiAnaW1hZ2UvZ2lmJyxcclxuICAgICdzdmcnOiAnaW1hZ2Uvc3ZnK3htbCcsXHJcbiAgICAnd29mZic6ICdmb250L3dvZmYnLFxyXG4gICAgJ3dvZmYyJzogJ2ZvbnQvd29mZjInLFxyXG4gICAgJ3R0Zic6ICdmb250L3R0ZicsXHJcbiAgICAnZW90JzogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0JyxcclxuICAgICdpY28nOiAnaW1hZ2UveC1pY29uJyxcclxuICAgICd3YXNtJzogJ2FwcGxpY2F0aW9uL3dhc20nLFxyXG4gICAgJ3ppcCc6ICdhcHBsaWNhdGlvbi96aXAnLFxyXG4gICAgJ3Jhcic6ICdhcHBsaWNhdGlvbi94LXJhci1jb21wcmVzc2VkJyxcclxuICAgICc3eic6ICdhcHBsaWNhdGlvbi94LTd6LWNvbXByZXNzZWQnLFxyXG4gICAgJ3Rhcic6ICdhcHBsaWNhdGlvbi94LXRhcicsXHJcbiAgICAnZ3onOiAnYXBwbGljYXRpb24vZ3ppcCcsXHJcbiAgICAnYnoyJzogJ2FwcGxpY2F0aW9uL3gtYnppcDInLFxyXG4gICAgJ3h6JzogJ2FwcGxpY2F0aW9uL3gteHonXHJcbiAgfTtcclxuICByZXR1cm4gdHlwZXNbZXh0XSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiDmoIflh4bljJbot6/lvoTvvIznoa7kv53ku6UgJy8nIOe7k+WwvlxyXG4gKi9cclxuZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIHJldHVybiByZXNvbHZlKHApLnJlcGxhY2UoL1xcXFwvZywgJy8nKSArICcvJztcclxufVxyXG5cclxuLyoqXHJcbiAqIOWIm+W7uumAmueUqOS4remXtOS7tu+8muS8mOWFiOS9v+eUqCBwdWJsaWMg6LWE5rqQ77yM5Zue6YCA5YiwIHNvdXJjZUFzc2V0c1BhdGhcclxuICog5a+55qCHIGNyZWF0ZVN0YXRpY01pZGRsZXdhcmUg6aOO5qC8XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTXhDYWRBc3NldHNNaWRkbGV3YXJlKFxyXG4gIHJvb3Q6IHN0cmluZyxcclxuICBvcHRpb25zOiBSZXF1aXJlZDxNeENhZEFzc2V0c1BsdWdpbk9wdGlvbnM+LFxyXG4gIHB1YmxpY0Rpcjogc3RyaW5nLFxyXG4gIGxvZ2dlcj86IGFueVxyXG4pIHtcclxuICBjb25zdCB7IG91dHB1dERpciwgaXNXYXNtU3QgPSBmYWxzZSB9ID0gb3B0aW9ucztcclxuICAvLyDinIUgMS4g6KeE6IyD5YyW6Lev5b6EXHJcbiAgY29uc3QgYmFzZVBhdGggPSBgLyR7b3V0cHV0RGlyLnJlcGxhY2UoL15cXC8rLywgJycpfWA7IC8vICcvbXhjYWRBcHBBc3NldHMnXHJcbiAgY29uc3Qgc291cmNlQXNzZXRzUm9vdCA9IG5vcm1hbGl6ZVBhdGgocm9vdCk7XHJcblxyXG4gIHJldHVybiBhc3luYyAocmVxOiBhbnksIHJlczogYW55LCBuZXh0OiAoKSA9PiB2b2lkKSA9PiB7XHJcbiAgICAvLyDinIUgMi4g5Z+65pys5qCh6aqMXHJcbiAgICBpZiAoIXJlcS51cmwgfHwgdHlwZW9mIHJlcS51cmwgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHJldHVybiBuZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g4pyFIDMuIOiuvue9ruWuieWFqOWktO+8iOmdniBpc1dhc21TdCDmqKHlvI/vvIlcclxuICAgIGlmICghaXNXYXNtU3QpIHtcclxuICAgICAgcmVzLnNldEhlYWRlcignQ3Jvc3MtT3JpZ2luLU9wZW5lci1Qb2xpY3knLCAnc2FtZS1vcmlnaW4nKTtcclxuICAgICAgcmVzLnNldEhlYWRlcignQ3Jvc3MtT3JpZ2luLUVtYmVkZGVyLVBvbGljeScsICdyZXF1aXJlLWNvcnAnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDinIUgNC4g6Kej5p6QIFVSTCDot6/lvoTvvIjljrsgcXVlcnnvvIzop6PnoIHvvIlcclxuICAgIGNvbnN0IHVybFBhdGggPSByZXEudXJsLnNwbGl0KCc/JylbMF07XHJcbiAgICBsZXQgZmlsZVBhdGghOiBzdHJpbmc7XHJcbiAgICBsZXQgZmlsZU5hbWUhOiBzdHJpbmc7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZGVjb2RlZFBhdGggPSBkZWNvZGVVUklDb21wb25lbnQodXJsUGF0aCk7XHJcbiAgICAgIC8vIOinhOiMg+WMlui3r+W+hO+8jOmYsuatoiAuLi8uLi8g6LaK5p2DXHJcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gZGVjb2RlZFBhdGgucmVwbGFjZSgvXlsvXFxcXF0rLywgJycpO1xyXG5cclxuICAgICAgLy8g4pyFIDUuIOS8mOWFiO+8muajgOafpSBwdWJsaWMvJHtvdXRwdXREaXJ9IOebruW9lVxyXG4gICAgICBjb25zdCBwdWJsaWNGaWxlUGF0aCA9IGpvaW4ocHVibGljRGlyLCBub3JtYWxpemVkUGF0aCkucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChwdWJsaWNGaWxlUGF0aCk7XHJcbiAgICAgICAgaWYgKHN0YXQuaXNGaWxlKCkpIHtcclxuICAgICAgICAgIGZpbGVQYXRoID0gcHVibGljRmlsZVBhdGg7XHJcbiAgICAgICAgICBmaWxlTmFtZSA9IGJhc2VuYW1lKG5vcm1hbGl6ZWRQYXRoKTtcclxuICAgICAgICAgIHJldHVybiBzZXJ2ZUZpbGUoZmlsZVBhdGgsIGZpbGVOYW1lLCByZXMsIGxvZ2dlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAvLyBwdWJsaWMg5Lit5rKh5pyJ77yM57un57ut5p+l5om+IHNvdXJjZUFzc2V0c1BhdGhcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8g4pyFIDYuIGZhbGxiYWNr77ya5p+l5om+IHNvdXJjZUFzc2V0c1BhdGhcclxuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzb2x2ZVNhZmVQYXRoKGRlY29kZWRQYXRoLCBzb3VyY2VBc3NldHNSb290LCBiYXNlUGF0aCk7XHJcbiAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgICByZXMuc3RhdHVzQ29kZSA9IHJlc3VsdC5zdGF0dXNDb2RlIHx8IDQwMDtcclxuICAgICAgICByZXR1cm4gcmVzLmVuZChyZXN1bHQubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyZXN1bHQuZmlsZVBhdGgpIGZpbGVQYXRoID0gcmVzdWx0LmZpbGVQYXRoO1xyXG4gICAgICBpZiAocmVzdWx0LmZpbGVOYW1lKSBmaWxlTmFtZSA9IHJlc3VsdC5maWxlTmFtZTtcclxuXHJcbiAgICAgIC8vIOKchSA3LiDlsJ3or5XnlLEgaGFuZGxlQ29uZmlnUmVxdWVzdCDlpITnkIbvvIjlpoLms6jlhaXphY3nva7vvIlcclxuICAgICAgY29uc3QgaGFuZGxlZCA9IGF3YWl0IGhhbmRsZUNvbmZpZ1JlcXVlc3QoXHJcbiAgICAgICAgZmlsZVBhdGgsXHJcbiAgICAgICAgZmlsZU5hbWUsXHJcbiAgICAgICAgb3B0aW9ucyxcclxuICAgICAgICByZXMsXHJcbiAgICAgICAgbG9nZ2VyXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChoYW5kbGVkKSByZXR1cm47XHJcblxyXG4gICAgICAvLyDinIUgOC4g56Gu5L+d5piv5paH5Lu2XHJcbiAgICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KGZpbGVQYXRoKTtcclxuICAgICAgaWYgKCFzdGF0LmlzRmlsZSgpKSB7XHJcbiAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSA0MDQ7XHJcbiAgICAgICAgcmV0dXJuIHJlcy5lbmQoJ0ZpbGUgbm90IGZvdW5kJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBzZXJ2ZUZpbGUoZmlsZVBhdGgsIGZpbGVOYW1lLCByZXMsIGxvZ2dlcik7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgbG9nZ2VyPy53YXJuPy4oYFtNeENhZEFzc2V0c10gU2VydmUgZmFpbGVkIGZvciAke3JlcS51cmx9OiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XHJcbiAgICAgIGlmIChyZXMuaGVhZGVyc1NlbnQpIHJldHVybjtcclxuICAgICAgcmVzLnN0YXR1c0NvZGUgPSA0MDQ7XHJcbiAgICAgIHJlcy5lbmQoJ0ZpbGUgbm90IGZvdW5kJyk7XHJcbiAgICB9XHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIOWwgeijheaWh+S7tuWTjeW6lOmAu+i+ke+8iOa1geW8j+S8oOi+k++8iVxyXG4gKi9cclxuZnVuY3Rpb24gc2VydmVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcsIHJlczogYW55LCBsb2dnZXI/OiBhbnkpIHtcclxuICBjb25zdCBzdHJlYW0gPSBmcy5jcmVhdGVSZWFkU3RyZWFtKGZpbGVQYXRoKTtcclxuXHJcbiAgc3RyZWFtLm9uKCdlcnJvcicsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xyXG4gICAgaWYgKHJlcy5oZWFkZXJzU2VudCkgcmV0dXJuO1xyXG4gICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJyB8fCBlcnIuY29kZSA9PT0gJ0VBQ0NFUycpIHtcclxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXNDb2RlID09PSAyMDAgPyByZXMuZW5kKCkgOiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBsb2dnZXI/LmVycm9yPy4oYFtNeENhZEFzc2V0c10gUmVhZCBlcnJvcjogJHtlcnIubWVzc2FnZX1gLCBlcnIpO1xyXG4gICAgcmVzLnN0YXR1c0NvZGUgPSA1MDA7XHJcbiAgICByZXMuZW5kKCdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InKTtcclxuICB9KTtcclxuXHJcbiAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgZ2V0Q29udGVudFR5cGUoZmlsZU5hbWUpKTtcclxuICByZXMuc2V0SGVhZGVyKCdYLUNvbnRlbnQtVHlwZS1PcHRpb25zJywgJ25vc25pZmYnKTtcclxuXHJcbiAgc3RyZWFtLnBpcGUocmVzKTtcclxufSJdLCJuYW1lcyI6WyJmcyIsImVyciIsIm5hbWUiLCJzdGF0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
|
|
1514
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgtQy1jRkVjSWsubWpzIiwic291cmNlcyI6WyIuLi8uLi9wYWNrVG9vbFBsdWdpblNyYy9zaGFyZWQvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiXHJcbi8vIHBsdWdpbnMvc2hhcmVkL2luZGV4LnRzXHJcbmltcG9ydCB7IGJhc2VuYW1lLCBqb2luLCByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgZnMsIHsgTm9QYXJhbUNhbGxiYWNrIH0gZnJvbSAnZnMnO1xyXG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAndXJsJztcclxuaW1wb3J0IHsgbmFtZSB9IGZyb20gXCIuLi8uLi9saWIvcGFja2FnZS5qc29uXCJcclxuXHJcbmltcG9ydCB7IE14UXVpY2tDb21tYW5kIH0gZnJvbSBcIi4vdHlwZXMvbXhRdWlja0NvbW1hbmQuZFwiXHJcbmltcG9ydCB7IE14U2VydmVyQ29uZmlnIH0gZnJvbSBcIi4vdHlwZXMvbXhTZXJ2ZXJDb25maWcuZFwiXHJcbmltcG9ydCB7IE14U2tldGNoZXNBbmROb3Rlc1VpQ29uZmlnIH0gZnJvbSBcIi4vdHlwZXMvbXhTa2V0Y2hlc0FuZE5vdGVzVWlDb25maWcuZFwiXHJcbmltcG9ydCB7IE14VWlDb25maWcgfSBmcm9tIFwiLi90eXBlcy9teFVpQ29uZmlnLmRcIlxyXG5pbXBvcnQgeyBNeGNhZFVpQ29uZmlnIH0gZnJvbSBcIi4vdHlwZXMvbXhjYWRVaUNvbmZpZy5kXCJcclxuaW1wb3J0IHsgVnVldGlmeVRoZW1lQ29uZmlnIH0gZnJvbSBcIi4vdHlwZXMvdnVldGlmeVRoZW1lQ29uZmlnLmRcIlxyXG5pbXBvcnQgYXBpTWFwIGZyb20gJy4uL2FwaS1tYXAuanNvbidcclxuZXhwb3J0IGNvbnN0IGdldEFwaU1hcCA9ICgpID0+IGFwaU1hcFxyXG5leHBvcnQgaW50ZXJmYWNlIE14UGx1Z2luQ29uZmlnIHtcclxuICBwbHVnaW5zOiAoc3RyaW5nIHwge1xyXG4gICAgbmFtZT86IHN0cmluZyxcclxuICAgIGlzQWZ0ZXJMb2FkPzogYm9vbGVhbixcclxuICAgIGRpcj86IGJvb2xlYW4sXHJcbiAgICB2ZXJzaW9uPzogc3RyaW5nXHJcbiAgfSlbXVxyXG59XHJcbi8vID09PSDmlrDlop7vvJrphY3nva7mlofku7blkI3luLjph48gPT09XHJcbmV4cG9ydCBjb25zdCBDT05GSUdfRklMRU5BTUVTID0gW1xyXG4gIC8vICdteGNhZFVpQ29uZmlnLmpzb24nLFxyXG4gICdteFF1aWNrQ29tbWFuZC5qc29uJyxcclxuICAnbXhTZXJ2ZXJDb25maWcuanNvbicsXHJcbiAgJ214U2tldGNoZXNBbmROb3Rlc1VpQ29uZmlnLmpzb24nLFxyXG4gICdteFVpQ29uZmlnLmpzb24nLFxyXG4gICd2dWV0aWZ5VGhlbWVDb25maWcuanNvbicsXHJcbiAgLy8gJ3BsdWdpbnMvY29uZmlnLmpzb24nXHJcbl0gYXMgY29uc3Q7XHJcbi8qKlxyXG4gKiDphY3nva7mlofku7blpITnkIblmahcclxuICog5Y+v6YCJ77ya5a+554m55a6a6YWN572u5paH5Lu26L+b6KGM6L+Q6KGM5pe25L+u5pS5XHJcbiAqIOWHveaVsOaOpeaUtuWOn+WniyBKU09OIOaVsOaNru+8jOi/lOWbnuS/ruaUueWQjueahCBKU09OIOaVsOaNru+8iOWPr+W8guatpe+8iVxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zvcm1GdW5jdGlvbnMge1xyXG4gIC8vIHRyYW5zZm9ybU14Y2FkVWlDb25maWcoZGF0YTogTXhjYWRVaUNvbmZpZyk6IFByb21pc2U8TXhjYWRVaUNvbmZpZz4gfCBNeGNhZFVpQ29uZmlnO1xyXG4gIHRyYW5zZm9ybU14UXVpY2tDb21tYW5kKGRhdGE6IE14UXVpY2tDb21tYW5kKTogUHJvbWlzZTxNeFF1aWNrQ29tbWFuZD4gfCBNeFF1aWNrQ29tbWFuZDtcclxuICB0cmFuc2Zvcm1NeFNlcnZlckNvbmZpZyhkYXRhOiBNeFNlcnZlckNvbmZpZyk6IFByb21pc2U8TXhTZXJ2ZXJDb25maWc+IHwgTXhTZXJ2ZXJDb25maWc7XHJcbiAgdHJhbnNmb3JtTXhTa2V0Y2hlc0FuZE5vdGVzVWlDb25maWcoZGF0YTogTXhTa2V0Y2hlc0FuZE5vdGVzVWlDb25maWcpOiBQcm9taXNlPE14U2tldGNoZXNBbmROb3Rlc1VpQ29uZmlnPiB8IE14U2tldGNoZXNBbmROb3Rlc1VpQ29uZmlnO1xyXG4gIHRyYW5zZm9ybU14VWlDb25maWcoZGF0YTogTXhVaUNvbmZpZyk6IFByb21pc2U8TXhVaUNvbmZpZz4gfCBNeFVpQ29uZmlnO1xyXG4gIHRyYW5zZm9ybVZ1ZXRpZnlUaGVtZUNvbmZpZyhkYXRhOiBWdWV0aWZ5VGhlbWVDb25maWcpOiBQcm9taXNlPFZ1ZXRpZnlUaGVtZUNvbmZpZz4gfCBWdWV0aWZ5VGhlbWVDb25maWc7XHJcbiAgLy8gdHJhbnNmb3JtTXhQbHVnaW5zQ29uZmlnKGRhdGE6IE14UGx1Z2luQ29uZmlnW10pOiBQcm9taXNlPE14UGx1Z2luQ29uZmlnW10+IHwgTXhQbHVnaW5Db25maWdbXTtcclxufVxyXG4vLyDmianlsZXmj5Lku7bpgInpobnmjqXlj6MgPT09XHJcbmV4cG9ydCBpbnRlcmZhY2UgTXhDYWRBc3NldHNQbHVnaW5PcHRpb25zIGV4dGVuZHMgUGFydGlhbDxUcmFuc2Zvcm1GdW5jdGlvbnM+IHtcclxuICAvKipcclxuICAgKiDmnoTlu7rlkI7vvIxteGNhZEFwcEFzc2V0cyDotYTmupDlrZjmlL7nmoTlrZDnm67lvZXlkI3jgIJcclxuICAgKiBAZGVmYXVsdCAnbXhjYWRBcHBBc3NldHMnXHJcbiAgICovXHJcbiAgb3V0cHV0RGlyPzogc3RyaW5nO1xyXG4gIC8qKiDnrKzkuInmlrnkvp3otZYqL1xyXG4gIGxpYnJhcnlOYW1lcz86IChrZXlvZiB0eXBlb2YgZXh0ZXJuYWxzKVtdO1xyXG4gIC8qKiDmmK/lkKbljZXnur/nqIvliqDovb13YXNtICjpu5jorqTkvb/nlKjlpJrnur/nqIvlj4rliqDovb0pICovXHJcbiAgaXNXYXNtU3Q/OiBib29sZWFuO1xyXG4gICAvKipcclxuICAgKiDmmK/lkKblkK/nlKjpooTljovnvKnotYTmupDvvIjlpoIgLmd6IOaWh+S7tu+8ieeahOaLt+i0nSDpu5jorqTmmK90cnVlXHJcbiAgICog6K6+572u5Li6IGZhbHNlIOaXtu+8jC5neiDljovnvKnmlofku7blsIbkuI3kvJrooqvlpI3liLbliLDovpPlh7rnm67lvZVcclxuICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICovXHJcbiAgZW5hYmxlQ29tcHJlc3NlZEFzc2V0cz86IGJvb2xlYW47XHJcbn1cclxuXHJcblxyXG4vLyA9PT0g5aKe5by677yacmVzb2x2ZU9wdGlvbnMg6buY6K6k5YC8ID09PVxyXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU9wdGlvbnMob3B0aW9uczogTXhDYWRBc3NldHNQbHVnaW5PcHRpb25zID0ge30pOiBSZXF1aXJlZDxNeENhZEFzc2V0c1BsdWdpbk9wdGlvbnM+IHtcclxuICBjb25zdCByZXNvbHZlZDogUmVxdWlyZWQ8TXhDYWRBc3NldHNQbHVnaW5PcHRpb25zPiA9IHtcclxuICAgIG91dHB1dERpcjogb3B0aW9ucy5vdXRwdXREaXIgfHwgJ214Y2FkQXBwQXNzZXRzJyxcclxuICAgIGxpYnJhcnlOYW1lczogb3B0aW9ucy5saWJyYXJ5TmFtZXMgfHwgW10sXHJcbiAgICBpc1dhc21TdDogb3B0aW9ucy5pc1dhc21TdCB8fCBmYWxzZSxcclxuICAgIGVuYWJsZUNvbXByZXNzZWRBc3NldHM6IG9wdGlvbnMuZW5hYmxlQ29tcHJlc3NlZEFzc2V0cyB8fCB0cnVlLFxyXG4gICAgLy8gdHJhbnNmb3JtTXhjYWRVaUNvbmZpZzogb3B0aW9ucy50cmFuc2Zvcm1NeGNhZFVpQ29uZmlnIHx8ICgoZCkgPT4gZCksXHJcbiAgICB0cmFuc2Zvcm1NeFF1aWNrQ29tbWFuZDogb3B0aW9ucy50cmFuc2Zvcm1NeFF1aWNrQ29tbWFuZCB8fCAoKGQpID0+IGQpLFxyXG4gICAgdHJhbnNmb3JtTXhTZXJ2ZXJDb25maWc6IG9wdGlvbnMudHJhbnNmb3JtTXhTZXJ2ZXJDb25maWcgfHwgKChkKSA9PiBkKSxcclxuICAgIHRyYW5zZm9ybU14U2tldGNoZXNBbmROb3Rlc1VpQ29uZmlnOiBvcHRpb25zLnRyYW5zZm9ybU14U2tldGNoZXNBbmROb3Rlc1VpQ29uZmlnIHx8ICgoZCkgPT4gZCksXHJcbiAgICB0cmFuc2Zvcm1NeFVpQ29uZmlnOiBvcHRpb25zLnRyYW5zZm9ybU14VWlDb25maWcgfHwgKChkKSA9PiBkKSxcclxuICAgIHRyYW5zZm9ybVZ1ZXRpZnlUaGVtZUNvbmZpZzogb3B0aW9ucy50cmFuc2Zvcm1WdWV0aWZ5VGhlbWVDb25maWcgfHwgKChkKSA9PiBkKSxcclxuICAgIC8vIHRyYW5zZm9ybU14UGx1Z2luc0NvbmZpZzogb3B0aW9ucy50cmFuc2Zvcm1NeFBsdWdpbnNDb25maWcgfHwgKChkKSA9PiBkKSxcclxuICB9O1xyXG4gIHJldHVybiByZXNvbHZlZDtcclxufVxyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkUGF0aFJlc3VsdCB7XHJcbiAgc3VjY2VzczogYm9vbGVhbjtcclxuICBmaWxlUGF0aD86IHN0cmluZzsgICAgICAgICAvLyDlt7IgcmVzb2x2ZSDnmoTlronlhajmlofku7bot6/lvoRcclxuICB1cmxQYXRoPzogc3RyaW5nOyAgICAgICAgICAvLyDop6PnoIHlkI7nmoQgVVJMIOi3r+W+hO+8iOS4jeWQqyBxdWVyee+8iVxyXG4gIGZpbGVOYW1lPzogc3RyaW5nOyAgICAgICAgIC8vIOaWh+S7tuWQje+8iGJhc2VuYW1l77yJXHJcbiAgc3RhdHVzQ29kZT86IG51bWJlcjtcclxuICBtZXNzYWdlPzogc3RyaW5nO1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIOWuieWFqOino+aekOW5tumqjOivgeivt+axgui3r+W+hFxyXG4gKiBAcGFyYW0gcmVxVXJsIOivt+axgueahCBVUkzvvIjlpoIgJy9hc3NldHMvbXhTZXJ2ZXJDb25maWcuanNvbj92PTEn77yJXHJcbiAqIEBwYXJhbSByb290IOacrOWcsOagueebruW9le+8iOWmgiAnRDovcHJvamVjdC9kaXN0L214Y2FkJ++8iVxyXG4gKiBAcGFyYW0gYmFzZVBhdGgg5Y+v6YCJ55qE5Z+656GA6Lev5b6E5YmN57yA77yI5aaCICcvbXhjYWQvJ++8jOeUqOS6jiBWaXRl77yJXHJcbiAqIEByZXR1cm5zIOino+aekOe7k+aenOaIlumUmeivr1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTYWZlUGF0aChcclxuICByZXFVcmw6IHN0cmluZyxcclxuICByb290OiBzdHJpbmcsXHJcbiAgYmFzZVBhdGg/OiBzdHJpbmdcclxuKTogUGFyc2VkUGF0aFJlc3VsdCB7XHJcbiAgLy8gMS4g5Z+65pys5qCh6aqMXHJcbiAgaWYgKCFyZXFVcmwgfHwgdHlwZW9mIHJlcVVybCAhPT0gJ3N0cmluZycpIHtcclxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBzdGF0dXNDb2RlOiA0MDAsIG1lc3NhZ2U6ICdCYWQgUmVxdWVzdCcgfTtcclxuICB9XHJcblxyXG4gIC8vIDIuIOaPkOWPlui3r+W+hO+8iOWOuyBxdWVyeSDlkowgaGFzaO+8iVxyXG4gIGxldCB1cmxQYXRoID0gcmVxVXJsLnNwbGl0KCc/JylbMF0uc3BsaXQoJyMnKVswXTtcclxuXHJcbiAgLy8gMy4g6Kej56CBIFVSTFxyXG4gIGxldCBkZWNvZGVkUGF0aDogc3RyaW5nO1xyXG4gIHRyeSB7XHJcbiAgICBkZWNvZGVkUGF0aCA9IGRlY29kZVVSSUNvbXBvbmVudCh1cmxQYXRoKTtcclxuICAgIC8vIOmYsuatoiBudWxsIOWtl+iKguaUu+WHu1xyXG4gICAgaWYgKGRlY29kZWRQYXRoLmluY2x1ZGVzKCdcXDAnKSkge1xyXG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgc3RhdHVzQ29kZTogNDAwLCBtZXNzYWdlOiAnSW52YWxpZCBVUkwnIH07XHJcbiAgICB9XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgc3RhdHVzQ29kZTogNDAwLCBtZXNzYWdlOiAnSW52YWxpZCBVUkwgZW5jb2RpbmcnIH07XHJcbiAgfVxyXG5cclxuICAvLyA0LiDlpITnkIYgYmFzZVBhdGjvvIjlpoIgVml0ZSDnmoQgYmFzZe+8iVxyXG4gIGlmIChiYXNlUGF0aCAmJiBkZWNvZGVkUGF0aC5zdGFydHNXaXRoKGJhc2VQYXRoKSkge1xyXG4gICAgZGVjb2RlZFBhdGggPSBkZWNvZGVkUGF0aC5zbGljZShiYXNlUGF0aC5sZW5ndGgpO1xyXG4gIH1cclxuXHJcbiAgLy8gNS4g5riF55CG6Lev5b6E77ya5Y676Zmk5byA5aS05aSa5L2Z55qEIC9cclxuICAvLyDkvovlpoLvvJovL2Fzc2V0cy9maWxlLmpzb24gLT4gYXNzZXRzL2ZpbGUuanNvblxyXG4gIGNvbnN0IGNsZWFuZWRQYXRoID0gZGVjb2RlZFBhdGgucmVwbGFjZSgvXlxcLysvLCAnJyk7XHJcblxyXG4gIC8vIDYuIOaLvOaOpeaWh+S7tui3r+W+hFxyXG4gIGNvbnN0IGZpbGVQYXRoID0gam9pbihyb290LCBjbGVhbmVkUGF0aCB8fCAnLicpO1xyXG5cclxuICAvLyA3LiDlronlhajmo4Dmn6XvvJrpmLLmraLot6/lvoTnqb/otopcclxuICBsZXQgbm9ybWFsaXplZEZpbGU6IHN0cmluZztcclxuICBsZXQgbm9ybWFsaXplZFJvb3Q6IHN0cmluZztcclxuICB0cnkge1xyXG4gICAgbm9ybWFsaXplZEZpbGUgPSByZXNvbHZlKGZpbGVQYXRoKTtcclxuICAgIG5vcm1hbGl6ZWRSb290ID0gcmVzb2x2ZShyb290KTtcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBzdGF0dXNDb2RlOiA1MDAsIG1lc3NhZ2U6ICdQYXRoIHJlc29sdXRpb24gZmFpbGVkJyB9O1xyXG4gIH1cclxuXHJcbiAgLy8g4pyFIOWFs+mUru+8muehruS/nSBub3JtYWxpemVkRmlsZSDlnKggbm9ybWFsaXplZFJvb3Qg55uu5b2V5LiLXHJcbiAgY29uc3Qgbm9ybWFsaXplZEZpbGVTdHIgPSBub3JtYWxpemVkRmlsZS5yZXBsYWNlKC9cXFxcL2csICcvJykgKyAnLyc7XHJcbiAgY29uc3Qgbm9ybWFsaXplZFJvb3RTdHIgPSBub3JtYWxpemVkUm9vdC5yZXBsYWNlKC9cXFxcL2csICcvJykgKyAnLyc7XHJcblxyXG4gIGlmICghbm9ybWFsaXplZEZpbGVTdHIuc3RhcnRzV2l0aChub3JtYWxpemVkUm9vdFN0cikpIHtcclxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBzdGF0dXNDb2RlOiA0MDMsIG1lc3NhZ2U6ICdGb3JiaWRkZW46IFBhdGggdHJhdmVyc2FsIGRldGVjdGVkJyB9O1xyXG4gIH1cclxuXHJcbiAgLy8gOC4g5o+Q5Y+WIGZpbGVOYW1lXHJcbiAgY29uc3QgcGF0aFNlZ21lbnRzID0gY2xlYW5lZFBhdGguc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XHJcbiAgY29uc3QgZmlsZU5hbWUgPSBwYXRoU2VnbWVudHMubGVuZ3RoID4gMCA/IGJhc2VuYW1lKHBhdGhTZWdtZW50c1twYXRoU2VnbWVudHMubGVuZ3RoIC0gMV0pIDogJyc7XHJcblxyXG4gIC8vIOKchSDmiJDlip9cclxuICByZXR1cm4ge1xyXG4gICAgc3VjY2VzczogdHJ1ZSxcclxuICAgIGZpbGVQYXRoOiBub3JtYWxpemVkRmlsZSxcclxuICAgIHVybFBhdGg6IGRlY29kZWRQYXRoLFxyXG4gICAgZmlsZU5hbWUsXHJcbiAgfTtcclxufVxyXG5cclxuXHJcbnR5cGUgQ29uZmlnRmlsZW5hbWUgPSAodHlwZW9mIENPTkZJR19GSUxFTkFNRVMpW251bWJlcl07XHJcbmZ1bmN0aW9uIGhhbmRsZUNvbmZpZ0ZpbGUoXHJcbiAgc3JjUGF0aDogc3RyaW5nLFxyXG4gIGRlc3RQYXRoOiBzdHJpbmcsXHJcbiAgZmlsZW5hbWU6IENvbmZpZ0ZpbGVuYW1lLFxyXG4gIG9wdGlvbnM6IFJlcXVpcmVkPE14Q2FkQXNzZXRzUGx1Z2luT3B0aW9ucz4sXHJcbiAgY2FsbGJhY2s6IE5vUGFyYW1DYWxsYmFja1xyXG4pIHtcclxuICBmcy5yZWFkRmlsZShzcmNQYXRoLCAndXRmLTgnLCBhc3luYyAoZXJyLCBjb250ZW50KSA9PiB7XHJcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgZGF0YSA9IGNvbnRlbnQudHJpbSgpID8gSlNPTi5wYXJzZShjb250ZW50KSA6IHt9O1xyXG5cclxuICAgICAgLy8g4pyFIOato+ehrueUn+aIkCB0cmFuc2Zvcm0g5Ye95pWw5ZCNXHJcbiAgICAgIGNvbnN0IGJhc2VOYW1lID0gZmlsZW5hbWUucmVwbGFjZSgvXFwuanNvbiQvaSwgJycpO1xyXG4gICAgICBjb25zdCB0cmFuc2Zvcm1LZXkgPSBgdHJhbnNmb3JtJHtwYXNjYWxDYXNlKGJhc2VOYW1lKX1gOyAvLyDkvovlpoI6IHRyYW5zZm9ybVBsdWdpbnNDb25maWcg5oiWIHRyYW5zZm9ybU14UGx1Z2luc0NvbmZpZ1xyXG5cclxuICAgICAgY29uc3QgdHJhbnNmb3JtRm4gPSAob3B0aW9ucyBhcyBhbnkpW3RyYW5zZm9ybUtleV07XHJcblxyXG4gICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybUZuID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgZGF0YSA9IGF3YWl0IHRyYW5zZm9ybUZuKGRhdGEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMik7XHJcbiAgICAgIGZzLndyaXRlRmlsZShkZXN0UGF0aCwganNvbiwgJ3V0Zi04JywgY2FsbGJhY2spO1xyXG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcclxuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuLyoqXHJcbiAqIOWkhOeQhumFjee9ruaWh+S7tuivt+axgu+8muivu+WPliDihpIg6L2s5o2iIOKGkiDov5Tlm57lk43lupRcclxuICog55So5LqOIFZpdGUvV2VicGFjayBkZXYgc2VydmVyIOS4remXtOS7tlxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUNvbmZpZ1JlcXVlc3QoXHJcbiAgZmlsZVBhdGg6IHN0cmluZywgICAgICAgICAgIC8vIOW3sue7j+mqjOivgei/h+eahOWuieWFqOi3r+W+hFxyXG4gIGZpbGVOYW1lOiBzdHJpbmcsICAgICAgICAgICAvLyDmlofku7blkI3vvIzlpoIgJ214U2VydmVyQ29uZmlnLmpzb24nXHJcbiAgb3B0aW9uczogUmVxdWlyZWQ8TXhDYWRBc3NldHNQbHVnaW5PcHRpb25zPixcclxuICByZXM6IGFueSxcclxuICBsb2dnZXI/OiB7IGluZm8/OiAobXNnOiBzdHJpbmcpID0+IHZvaWQ7IGVycm9yPzogKG1zZzogc3RyaW5nKSA9PiB2b2lkIH1cclxuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgLy8g5LuF5aSE55CG55m95ZCN5Y2V5YaF55qE5paH5Lu2XHJcbiAgaWYgKCEoQ09ORklHX0ZJTEVOQU1FUyBhcyB1bmtub3duIGFzIHN0cmluZykuaW5jbHVkZXMoZmlsZU5hbWUpKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB0cnkge1xyXG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmLTgnKTtcclxuICAgIGxldCBkYXRhID0gY29udGVudC50cmltKCkgPyBKU09OLnBhcnNlKGNvbnRlbnQpIDoge307XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtS2V5ID0gYHRyYW5zZm9ybSR7cGFzY2FsQ2FzZShmaWxlTmFtZS5yZXBsYWNlKC9cXC5qc29uJC9pLCAnJykpfWA7XHJcbiAgICBjb25zdCB0cmFuc2Zvcm1GbiA9IChvcHRpb25zIGFzIGFueSlbdHJhbnNmb3JtS2V5XTtcclxuXHJcbiAgICBpZiAodHlwZW9mIHRyYW5zZm9ybUZuID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGRhdGEgPSBhd2FpdCB0cmFuc2Zvcm1GbihkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xyXG4gICAgcmVzLnNldEhlYWRlcignQ2FjaGUtQ29udHJvbCcsICduby1jYWNoZScpO1xyXG4gICAgcmVzLmVuZChKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKSk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9IGNhdGNoIChlcnI6IGFueSkge1xyXG4gICAgbG9nZ2VyPy5lcnJvcj8uKGBbbXhjYWQtYXNzZXRzXSDinYwgRmFpbGVkIHRvIHNlcnZlICR7ZmlsZU5hbWV9OiAke2Vyci5tZXNzYWdlfWApO1xyXG4gICAgaWYgKCFyZXMuaGVhZGVyc1NlbnQpIHtcclxuICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvcGxhaW4nKTtcclxuICAgICAgcmVzLnN0YXR1c0NvZGUgPSA1MDA7XHJcbiAgICAgIHJlcy5lbmQoJ0ludGVybmFsIFNlcnZlciBFcnJvcicpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7IC8vIOW3suWkhOeQhumUmeivr1xyXG4gIH1cclxufVxyXG5cclxuLyoqIOWIm+W7uumAmueUqOWFqOWxgOS4remXtOS7tiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR2xvYmFsVW5pdmVyc2FsTWlkZGxld2FyZShvcHRpb25zOiBSZXF1aXJlZDxNeENhZEFzc2V0c1BsdWdpbk9wdGlvbnM+KSB7XHJcbiAgcmV0dXJuIGFzeW5jIChyZXE6IGFueSwgcmVzOiBhbnksIG5leHQ6IGFueSkgPT4ge1xyXG4gICAgaWYgKCFvcHRpb25zLmlzV2FzbVN0KSB7XHJcbiAgICAgIHJlcy5zZXRIZWFkZXIoJ0Nyb3NzLU9yaWdpbi1PcGVuZXItUG9saWN5JywgJ3NhbWUtb3JpZ2luJyk7XHJcbiAgICAgIHJlcy5zZXRIZWFkZXIoJ0Nyb3NzLU9yaWdpbi1FbWJlZGRlci1Qb2xpY3knLCAncmVxdWlyZS1jb3JwJyk7XHJcbiAgICB9XHJcbiAgICBuZXh0KCk7XHJcbiAgfVxyXG59XHJcbi8vID09PSDovoXliqnlh73mlbDvvJrlrZfnrKbkuLLovawgUGFzY2FsQ2FzZSA9PT1cclxuZXhwb3J0IGZ1bmN0aW9uIHBhc2NhbENhc2Uoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIHJldHVybiBzdHJcclxuICAgIC5yZXBsYWNlKC9bXmEtekEtWjAtOV0rKC4pL2csIChtLCBjaHIpID0+IGNoci50b1VwcGVyQ2FzZSgpKVxyXG4gICAgLnJlcGxhY2UoL14uLywgYyA9PiBjLnRvVXBwZXJDYXNlKCkpO1xyXG59XHJcblxyXG4vLyA9PT0g5YW25LuW5Y6f5pyJ5a+85Ye65L+d5oyB5LiN5Y+YID09PVxyXG5leHBvcnQgY29uc3QgZXh0ZXJuYWxzID0ge1xyXG4gICd2dWUnOiAnTVhDQURBUFBfRVhURVJOQUxMSUJSQVJJRVMuVnVlJyxcclxuICAnYXhpb3MnOiAnTVhDQURBUFBfRVhURVJOQUxMSUJSQVJJRVMuYXhpb3MnLFxyXG4gICd2dWV0aWZ5JzogJ01YQ0FEQVBQX0VYVEVSTkFMTElCUkFSSUVTLnZ1ZXRpZnknLFxyXG4gICd2dWV0aWZ5L2NvbXBvbmVudHMnOiAnTVhDQURBUFBfRVhURVJOQUxMSUJSQVJJRVMudnVldGlmeUNvbXBvbmVudHMnLFxyXG4gICdtYXBib3gtZ2wnOiAnTVhDQURBUFBfRVhURVJOQUxMSUJSQVJJRVMubWFwYm94Z2wnLFxyXG4gICdwaW5pYSc6ICdNWENBREFQUF9FWFRFUk5BTExJQlJBUklFUy5waW5pYSdcclxufTtcclxuLy8g5aeL57uI5L+d55WZ55qE5qih5Z2XXHJcbmNvbnN0IEFMV0FZU19LRUVQID0gbmV3IFNldChbJ214Y2FkJywgJ214ZHJhdyddKTtcclxuXHJcbi8qKlxyXG4gKiDmuIXnkIblubblhpnlhaXmraPnoa7nmoTnsbvlnovlvJXnlKhcclxuICovXHJcbmZ1bmN0aW9uIHN5bmNUeXBlUmVmZXJlbmNlcyhsaWJyYXJ5TmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgY29uc3Qgcm9vdERpciA9IHByb2Nlc3MuY3dkKCk7XHJcbiAgY29uc3QgZGlzdERpciA9IHJlc29sdmUocm9vdERpciwgJ25vZGVfbW9kdWxlcycsICdteGNhZC1hcHAnLCAnZGlzdCcpO1xyXG4gIGNvbnN0IGluZGV4UGF0aCA9IHJlc29sdmUoZGlzdERpciwgJ2luZGV4LmQudHMnKTtcclxuXHJcbiAgdHJ5IHtcclxuICAgIC8vIOKchSAxLiDmo4Dmn6UgZGlzdCDnm67lvZVcclxuICAgIGlmICghZnMuZXhpc3RzU3luYyhkaXN0RGlyKSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oYOKaoO+4jyBteGNhZC1hcHAvZGlzdCDnm67lvZXkuI3lrZjlnKjvvIzot7Pov4fnsbvlnovlkIzmraU6ICR7ZGlzdERpcn1gKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOKchSAyLiDnoa7kv50gaW5kZXguZC50cyDlrZjlnKhcclxuICAgIGlmICghZnMuZXhpc3RzU3luYyhpbmRleFBhdGgpKSB7XHJcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoaW5kZXhQYXRoLCAnJywgJ3V0Zi04Jyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKGDinIUg5bey5Yib5bu656m657G75Z6L5paH5Lu2OiAke2luZGV4UGF0aH1gKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhpbmRleFBhdGgsICd1dGYtOCcpO1xyXG4gICAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KC9cXHI/XFxuLyk7XHJcblxyXG4gICAgLy8g4pyFIDMuIOaPkOWPluaJgOacieeOsOacieeahCAvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi94eHguZC50c1wiIC8+IOihjFxyXG4gICAgY29uc3QgcmVmZXJlbmNlUmVnZXggPSAvXFwvXFwvXFwvXFxzKjxyZWZlcmVuY2VcXHMrcGF0aD1cIlxcLlxcLyhbXlwiXStcXC5kXFwudHMpXCJcXHMqXFwvPi87XHJcbiAgICBjb25zdCBleGlzdGluZ1JlZnM6IHN0cmluZ1tdID0gW107XHJcbiAgICBjb25zdCBub25SZWZMaW5lczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICBsaW5lcy5mb3JFYWNoKGxpbmUgPT4ge1xyXG4gICAgICBjb25zdCBtYXRjaCA9IGxpbmUudHJpbSgpLm1hdGNoKHJlZmVyZW5jZVJlZ2V4KTtcclxuICAgICAgaWYgKG1hdGNoKSB7XHJcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBtYXRjaFsxXTsgLy8g5aaCIFwidnVlLmQudHNcIlxyXG4gICAgICAgIGNvbnN0IG1vZHVsZU5hbWUgPSBmaWxlTmFtZS5yZXBsYWNlKC9cXC5kXFwudHMkLywgJycpOyAvLyDmj5Dlj5bmqKHlnZflkI1cclxuICAgICAgICBleGlzdGluZ1JlZnMucHVzaChtb2R1bGVOYW1lKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBub25SZWZMaW5lcy5wdXNoKGxpbmUpOyAvLyDkv53nlZnpnZ4gcmVmZXJlbmNlIOihjFxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyDinIUgNC4g6K6h566X5pyA57uI5bqU6K+l5L+d55WZ55qE5qih5Z2XXHJcbiAgICBjb25zdCB2YWxpZE1vZHVsZXMgPSBuZXcgU2V0PHN0cmluZz4oQUxXQVlTX0tFRVApO1xyXG5cclxuICAgIGxpYnJhcnlOYW1lcy5mb3JFYWNoKG5hbWUgPT4ge1xyXG4gICAgICAvLyDlv4XpobvlnKggZXh0ZXJuYWxzIOS4reWumuS5ie+8jOS4lOexu+Wei+aWh+S7tuWtmOWcqFxyXG4gICAgICBpZiAobmFtZSBpbiBleHRlcm5hbHMpIHtcclxuICAgICAgICBjb25zdCBkdHNQYXRoID0gcmVzb2x2ZShkaXN0RGlyLCBgJHtuYW1lfS5kLnRzYCk7XHJcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZHRzUGF0aCkpIHtcclxuICAgICAgICAgIHZhbGlkTW9kdWxlcy5hZGQobmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyDinIUgNS4g55Sf5oiQ5pyA57uI55qEIHJlZmVyZW5jZSDooYzvvIjkv53mjIEgbXhjYWQg5ZKMIG14ZHJhdyDlnKjmnIDliY3vvIlcclxuICAgIGNvbnN0IGZpbmFsUmVmcyA9IFsnbXhjYWQnLCAnbXhkcmF3J11cclxuICAgICAgLmZpbHRlcihuYW1lID0+IHZhbGlkTW9kdWxlcy5oYXMobmFtZSkpXHJcbiAgICAgIC5tYXAobmFtZSA9PiBgLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vJHtuYW1lfS5kLnRzXCIgLz5gKTtcclxuXHJcbiAgICAvLyDmt7vliqDlhbbku5YgdmFsaWRNb2R1bGVzIOS4reeahO+8iOWOu+mHje+8iVxyXG4gICAgQXJyYXkuZnJvbSh2YWxpZE1vZHVsZXMpXHJcbiAgICAgIC5maWx0ZXIobmFtZSA9PiAhQUxXQVlTX0tFRVAuaGFzKG5hbWUpKVxyXG4gICAgICAuZm9yRWFjaChuYW1lID0+IHtcclxuICAgICAgICBmaW5hbFJlZnMucHVzaChgLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vJHtuYW1lfS5kLnRzXCIgLz5gKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgLy8g4pyFIDYuIOWQiOW5tu+8muacgOe7iOW8leeUqCArIOWOn+Wni+mdnuW8leeUqOihjFxyXG4gICAgY29uc3QgcmVzdWx0TGluZXMgPSBbLi4uZmluYWxSZWZzLCAnJywgLi4ubm9uUmVmTGluZXMuZmlsdGVyKGwgPT4gbC50cmltKCkubGVuZ3RoID4gMCldO1xyXG5cclxuICAgIC8vIOenu+mZpOi/nue7reepuuihjO+8jOS/neeVmeS4gOS4quWIhumalFxyXG4gICAgY29uc3QgY2xlYW5lZExpbmVzID0gcmVzdWx0TGluZXMuZmlsdGVyKChsaW5lLCBpLCBhcnIpID0+XHJcbiAgICAgICEobGluZS50cmltKCkgPT09ICcnICYmIGkgPiAwICYmIGFycltpIC0gMV0udHJpbSgpID09PSAnJylcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGNsZWFuZWRMaW5lcy5qb2luKCdcXG4nKS50cmltKCkgKyAnXFxuJztcclxuXHJcbiAgICAvLyDinIUgNy4g5YaZ5Zue5paH5Lu277yI5LuF5b2T5YaF5a655Y+Y5YyW5pe277yJXHJcbiAgICBpZiAoY29udGVudC50cmltKCkgIT09IG5ld0NvbnRlbnQudHJpbSgpKSB7XHJcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoaW5kZXhQYXRoLCBuZXdDb250ZW50LCAndXRmLTgnKTtcclxuICAgICAgY29uc29sZS5sb2coYOKchSDlt7LlkIzmraUgbXhjYWQtYXBwL2Rpc3QvaW5kZXguZC50cyDnsbvlnovlvJXnlKhgKTtcclxuICAgICAgY29uc29sZS5sb2coYCAgIOS/neeVmTogJHtBcnJheS5mcm9tKHZhbGlkTW9kdWxlcykuam9pbignLCAnKX1gKTtcclxuICAgIH1cclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGNvbnNvbGUuZXJyb3IoYOKdjCDlkIzmraXnsbvlnovlvJXnlKjlpLHotKU6YCwgZXJyKTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDpooTlrprkuYnlupPlkI3liLDlhajlsYDlj5jph4/nmoTmmKDlsIRcclxuICovXHJcbmV4cG9ydCBjb25zdCBERUZBVUxUX0xJQlJBUllfTUFQOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gIG14Y2FkOiAnTXhDQUQnLFxyXG4gIG14ZHJhdzogJ014J1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlcm5hbHMoXHJcbiAgbGlicmFyeU5hbWVzOiBSZXF1aXJlZDxNeENhZEFzc2V0c1BsdWdpbk9wdGlvbnM+WydsaWJyYXJ5TmFtZXMnXVxyXG4pOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcclxuICBzeW5jVHlwZVJlZmVyZW5jZXMobGlicmFyeU5hbWVzKTtcclxuICBjb25zdCByZXN1bHQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7IC4uLkRFRkFVTFRfTElCUkFSWV9NQVAgfVxyXG4gIGlmICghQXJyYXkuaXNBcnJheShsaWJyYXJ5TmFtZXMpKSByZXR1cm4gcmVzdWx0O1xyXG4gIGxpYnJhcnlOYW1lcy5mb3JFYWNoKG5hbWUgPT4ge1xyXG4gICAgaWYgKG5hbWUgaW4gZXh0ZXJuYWxzKSB7XHJcbiAgICAgIHJlc3VsdFtuYW1lXSA9IGV4dGVybmFsc1tuYW1lIGFzIGtleW9mIHR5cGVvZiBleHRlcm5hbHNdO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTb3VyY2VBc3NldHNQYXRoKCk6IHN0cmluZyB7XHJcbiAgbGV0IGN1cnJlbnRGaWxlOiBzdHJpbmc7XHJcbiAgaWYgKHR5cGVvZiBfX2ZpbGVuYW1lICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgY3VycmVudEZpbGUgPSBfX2ZpbGVuYW1lO1xyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICBjdXJyZW50RmlsZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcclxuICB9XHJcbiAgY29uc3QgcGFja2FnZVJvb3QgPSByZXNvbHZlKGN1cnJlbnRGaWxlLCAnLi4nLCAnLi4nLCAnLi4nKTtcclxuICBjb25zdCBhc3NldHNQYXRoID0gcmVzb2x2ZShwYWNrYWdlUm9vdCwgbmFtZSwgJ2Rpc3QnLCAnbXhjYWRBcHBBc3NldHMnKTtcclxuICBpZiAoIWZzLmV4aXN0c1N5bmMoYXNzZXRzUGF0aCkpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihgbXgtY2FkLWFwcCBhc3NldHMgbm90IGZvdW5kIGF0OiAke2Fzc2V0c1BhdGh9YCk7XHJcbiAgfVxyXG4gIHJldHVybiBhc3NldHNQYXRoO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tTb3VyY2VBc3NldHNFeGlzdCgpOiBib29sZWFuIHtcclxuICBjb25zdCBwYXRoID0gZ2V0U291cmNlQXNzZXRzUGF0aCgpO1xyXG4gIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGgpICYmIGZzLmxzdGF0U3luYyhwYXRoKS5pc0RpcmVjdG9yeSgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVSdW50aW1lQ29uZmlnU2NyaXB0KHB1YmxpY1BhdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgcmV0dXJuIGBcclxuICAgIDxzY3JpcHQ+XHJcbiAgICAgIHdpbmRvdy5fX01YX0NBRF9BUFBfQVNTRVRfUEFUSF9fID0gJyR7cHVibGljUGF0aH0nO1xyXG4gICAgPC9zY3JpcHQ+XHJcbiAgYC50cmltKCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjb3B5RGlyKFxyXG4gIHNyYzogc3RyaW5nLFxyXG4gIGRlc3Q6IHN0cmluZyxcclxuICBwdWJsaWNEaXI6IHN0cmluZyxcclxuICBvcHRpb25zOiBSZXF1aXJlZDxNeENhZEFzc2V0c1BsdWdpbk9wdGlvbnM+LFxyXG4gIGNhbGxiYWNrOiAoZXJyPzogRXJyb3IpID0+IHZvaWRcclxuKTogdm9pZCB7XHJcbiAgLy8g56ys5LiA5q2l77ya5omr5o+PIHB1YmxpY0RpciDkuIvmiYDmnInmlofku7bvvIjnm7jlr7nkuo4gcHVibGljRGlyIOeahOi3r+W+hO+8iVxyXG4gIHNjYW5QdWJsaWNEaXIocHVibGljRGlyLCAoZXJyLCBwdWJsaWNGaWxlcykgPT4ge1xyXG4gICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XHJcblxyXG4gICAgLy8g56ys5LqM5q2l77ya5byA5aeL5aSN5Yi277yM5Lyg5YWlIHB1YmxpY0ZpbGVzIOe8k+WtmFxyXG4gICAgZG9Db3B5KHNyYywgZGVzdCwgcHVibGljRGlyLCBwdWJsaWNGaWxlcyEsIG9wdGlvbnMsIGNhbGxiYWNrKTtcclxuICB9KTtcclxufVxyXG5cclxuLy8g5a6e6ZmF5omn6KGM5aSN5Yi255qE5Ye95pWwXHJcbmZ1bmN0aW9uIGRvQ29weShcclxuICBzcmM6IHN0cmluZyxcclxuICBkZXN0OiBzdHJpbmcsXHJcbiAgcHVibGljRGlyOiBzdHJpbmcsXHJcbiAgcHVibGljRmlsZXM6IFNldDxzdHJpbmc+LFxyXG4gIG9wdGlvbnM6IFJlcXVpcmVkPE14Q2FkQXNzZXRzUGx1Z2luT3B0aW9ucz4sIC8vIOazqOaEj++8mui/memHjOmcgOimgeehruS/nSBlbmFibGVDb21wcmVzc2VkQXNzZXRzIOaYr+W/hemAieeahFxyXG4gIGNhbGxiYWNrOiAoZXJyPzogRXJyb3IpID0+IHZvaWRcclxuKSB7XHJcbiAgZnMubWtkaXIoZGVzdCwgeyByZWN1cnNpdmU6IHRydWUgfSwgKGVycikgPT4ge1xyXG4gICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XHJcblxyXG4gICAgZnMucmVhZGRpcihzcmMsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9LCAoZXJyLCBkaXJlbnRzKSA9PiB7XHJcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xyXG5cclxuICAgICAgbGV0IHBlbmRpbmcgPSBkaXJlbnRzLmxlbmd0aDtcclxuICAgICAgaWYgKHBlbmRpbmcgPT09IDApIHJldHVybiBjYWxsYmFjaygpO1xyXG5cclxuICAgICAgLy8g5o+Q5YmN5a6a5LmJ5Y6L57yp5paH5Lu25omp5bGV5ZCNXHJcbiAgICAgIGNvbnN0IGNvbXByZXNzZWRFeHRzID0gWycuZ3onXTsgLy8g5Y+v5oyJ6ZyA5omp5bGVXHJcblxyXG4gICAgICBkaXJlbnRzLmZvckVhY2goKGRpcmVudCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNyY1BhdGggPSByZXNvbHZlKHNyYywgZGlyZW50Lm5hbWUpO1xyXG4gICAgICAgIGNvbnN0IGRlc3RQYXRoID0gcmVzb2x2ZShkZXN0LCBkaXJlbnQubmFtZSk7XHJcbiAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUoc3JjLCBzcmNQYXRoKS5yZXBsYWNlKC9cXFxcL2csICcvJykgYXMgQ29uZmlnRmlsZW5hbWU7XHJcblxyXG4gICAgICAgIC8vIOaWsOWinu+8muWmguaenOemgeeUqOWOi+e8qei1hOa6kOS4lOaYr+WOi+e8qeaWh+S7tu+8jOWImei3s+i/h1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICFvcHRpb25zLmVuYWJsZUNvbXByZXNzZWRBc3NldHMgJiZcclxuICAgICAgICAgIGNvbXByZXNzZWRFeHRzLnNvbWUoZXh0ID0+IHJlbGF0aXZlUGF0aC5lbmRzV2l0aChleHQpKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgaWYgKC0tcGVuZGluZyA9PT0gMCkgY2FsbGJhY2soKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSkge1xyXG4gICAgICAgICAgZG9Db3B5KHNyY1BhdGgsIGRlc3RQYXRoLCBwdWJsaWNEaXIsIHB1YmxpY0ZpbGVzLCBvcHRpb25zLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICgtLXBlbmRpbmcgPT09IDApIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRpcmVudC5pc0ZpbGUoKSkge1xyXG4gICAgICAgICAgaWYgKHB1YmxpY0ZpbGVzLmhhcyhyZWxhdGl2ZVBhdGgpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHB1YmxpY0ZpbGVQYXRoID0gcmVzb2x2ZShwdWJsaWNEaXIsIHJlbGF0aXZlUGF0aCk7XHJcbiAgICAgICAgICAgIGZzLmNvcHlGaWxlKHB1YmxpY0ZpbGVQYXRoLCBkZXN0UGF0aCwgKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xyXG4gICAgICAgICAgICAgIGlmICgtLXBlbmRpbmcgPT09IDApIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChDT05GSUdfRklMRU5BTUVTLmluY2x1ZGVzKHJlbGF0aXZlUGF0aCkpIHtcclxuICAgICAgICAgICAgaGFuZGxlQ29uZmlnRmlsZShzcmNQYXRoLCBkZXN0UGF0aCwgcmVsYXRpdmVQYXRoLCBvcHRpb25zLCAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XHJcbiAgICAgICAgICAgICAgaWYgKC0tcGVuZGluZyA9PT0gMCkgY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmcy5jb3B5RmlsZShzcmNQYXRoLCBkZXN0UGF0aCwgKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xyXG4gICAgICAgICAgICAgIGlmICgtLXBlbmRpbmcgPT09IDApIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoLS1wZW5kaW5nID09PSAwKSBjYWxsYmFjaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG4vLyDmiavmj48gcHVibGljRGlyIOS4i+aJgOacieaWh+S7tu+8jOi/lOWbnuebuOWvueS6jiBwdWJsaWNEaXIg55qE6Lev5b6E6ZuG5ZCIXHJcbmZ1bmN0aW9uIHNjYW5QdWJsaWNEaXIoXHJcbiAgcHVibGljRGlyOiBzdHJpbmcsXHJcbiAgY2FsbGJhY2s6IChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB8IG51bGwsIGZpbGVzPzogU2V0PHN0cmluZz4pID0+IHZvaWRcclxuKSB7XHJcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblxyXG4gIGZ1bmN0aW9uIHdhbGsoZGlyOiBzdHJpbmcpIHtcclxuICAgIGZzLnJlYWRkaXIoZGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSwgKGVyciwgZGlyZW50cykgPT4ge1xyXG4gICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcclxuXHJcbiAgICAgIGxldCBwZW5kaW5nID0gZGlyZW50cy5sZW5ndGg7XHJcbiAgICAgIGlmIChwZW5kaW5nID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGRpcmVudHMuZm9yRWFjaCgoZGlyZW50KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSByZXNvbHZlKGRpciwgZGlyZW50Lm5hbWUpO1xyXG4gICAgICAgIGNvbnN0IHJlbFBhdGggPSByZWxhdGl2ZShwdWJsaWNEaXIsIGZ1bGxQYXRoKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XHJcblxyXG4gICAgICAgIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSkge1xyXG4gICAgICAgICAgd2FsayhmdWxsUGF0aCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkaXJlbnQuaXNGaWxlKCkpIHtcclxuICAgICAgICAgIHJlc3VsdC5hZGQocmVsUGF0aCk7XHJcbiAgICAgICAgICBpZiAoLS1wZW5kaW5nID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmICgtLXBlbmRpbmcgPT09IDApIHtcclxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB3YWxrKHB1YmxpY0Rpcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250ZW50VHlwZShmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICBjb25zdCBleHQgPSBmaWxlUGF0aC5zcGxpdCgnLicpLnBvcCgpPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xyXG4gIGNvbnN0IHR5cGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gICAgJ2Nzcyc6ICd0ZXh0L2NzcycsXHJcbiAgICAnanMnOiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcsXHJcbiAgICAnanNvbic6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICdwbmcnOiAnaW1hZ2UvcG5nJyxcclxuICAgICdqcGcnOiAnaW1hZ2UvanBlZycsXHJcbiAgICAnanBlZyc6ICdpbWFnZS9qcGVnJyxcclxuICAgICdnaWYnOiAnaW1hZ2UvZ2lmJyxcclxuICAgICdzdmcnOiAnaW1hZ2Uvc3ZnK3htbCcsXHJcbiAgICAnd29mZic6ICdmb250L3dvZmYnLFxyXG4gICAgJ3dvZmYyJzogJ2ZvbnQvd29mZjInLFxyXG4gICAgJ3R0Zic6ICdmb250L3R0ZicsXHJcbiAgICAnZW90JzogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0JyxcclxuICAgICdpY28nOiAnaW1hZ2UveC1pY29uJyxcclxuICAgICd3YXNtJzogJ2FwcGxpY2F0aW9uL3dhc20nLFxyXG4gICAgJ3ppcCc6ICdhcHBsaWNhdGlvbi96aXAnLFxyXG4gICAgJ3Jhcic6ICdhcHBsaWNhdGlvbi94LXJhci1jb21wcmVzc2VkJyxcclxuICAgICc3eic6ICdhcHBsaWNhdGlvbi94LTd6LWNvbXByZXNzZWQnLFxyXG4gICAgJ3Rhcic6ICdhcHBsaWNhdGlvbi94LXRhcicsXHJcbiAgICAnZ3onOiAnYXBwbGljYXRpb24vZ3ppcCcsXHJcbiAgICAnYnoyJzogJ2FwcGxpY2F0aW9uL3gtYnppcDInLFxyXG4gICAgJ3h6JzogJ2FwcGxpY2F0aW9uL3gteHonXHJcbiAgfTtcclxuICByZXR1cm4gdHlwZXNbZXh0XSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiDmoIflh4bljJbot6/lvoTvvIznoa7kv53ku6UgJy8nIOe7k+WwvlxyXG4gKi9cclxuZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIHJldHVybiByZXNvbHZlKHApLnJlcGxhY2UoL1xcXFwvZywgJy8nKSArICcvJztcclxufVxyXG5cclxuLyoqXHJcbiAqIOWIm+W7uumAmueUqOS4remXtOS7tu+8muS8mOWFiOS9v+eUqCBwdWJsaWMg6LWE5rqQ77yM5Zue6YCA5YiwIHNvdXJjZUFzc2V0c1BhdGhcclxuICog5a+55qCHIGNyZWF0ZVN0YXRpY01pZGRsZXdhcmUg6aOO5qC8XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTXhDYWRBc3NldHNNaWRkbGV3YXJlKFxyXG4gIHJvb3Q6IHN0cmluZyxcclxuICBvcHRpb25zOiBSZXF1aXJlZDxNeENhZEFzc2V0c1BsdWdpbk9wdGlvbnM+LFxyXG4gIHB1YmxpY0Rpcjogc3RyaW5nLFxyXG4gIGxvZ2dlcj86IGFueVxyXG4pIHtcclxuICBjb25zdCB7IG91dHB1dERpciwgaXNXYXNtU3QgPSBmYWxzZSB9ID0gb3B0aW9ucztcclxuICAvLyDinIUgMS4g6KeE6IyD5YyW6Lev5b6EXHJcbiAgY29uc3QgYmFzZVBhdGggPSBgLyR7b3V0cHV0RGlyLnJlcGxhY2UoL15cXC8rLywgJycpfWA7IC8vICcvbXhjYWRBcHBBc3NldHMnXHJcbiAgY29uc3Qgc291cmNlQXNzZXRzUm9vdCA9IG5vcm1hbGl6ZVBhdGgocm9vdCk7XHJcblxyXG4gIHJldHVybiBhc3luYyAocmVxOiBhbnksIHJlczogYW55LCBuZXh0OiAoKSA9PiB2b2lkKSA9PiB7XHJcbiAgICAvLyDinIUgMi4g5Z+65pys5qCh6aqMXHJcbiAgICBpZiAoIXJlcS51cmwgfHwgdHlwZW9mIHJlcS51cmwgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHJldHVybiBuZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g4pyFIDMuIOiuvue9ruWuieWFqOWktO+8iOmdniBpc1dhc21TdCDmqKHlvI/vvIlcclxuICAgIGlmICghaXNXYXNtU3QpIHtcclxuICAgICAgcmVzLnNldEhlYWRlcignQ3Jvc3MtT3JpZ2luLU9wZW5lci1Qb2xpY3knLCAnc2FtZS1vcmlnaW4nKTtcclxuICAgICAgcmVzLnNldEhlYWRlcignQ3Jvc3MtT3JpZ2luLUVtYmVkZGVyLVBvbGljeScsICdyZXF1aXJlLWNvcnAnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDinIUgNC4g6Kej5p6QIFVSTCDot6/lvoTvvIjljrsgcXVlcnnvvIzop6PnoIHvvIlcclxuICAgIGNvbnN0IHVybFBhdGggPSByZXEudXJsLnNwbGl0KCc/JylbMF07XHJcbiAgICBsZXQgZmlsZVBhdGghOiBzdHJpbmc7XHJcbiAgICBsZXQgZmlsZU5hbWUhOiBzdHJpbmc7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZGVjb2RlZFBhdGggPSBkZWNvZGVVUklDb21wb25lbnQodXJsUGF0aCk7XHJcbiAgICAgIC8vIOinhOiMg+WMlui3r+W+hO+8jOmYsuatoiAuLi8uLi8g6LaK5p2DXHJcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gZGVjb2RlZFBhdGgucmVwbGFjZSgvXlsvXFxcXF0rLywgJycpO1xyXG5cclxuICAgICAgLy8g4pyFIDUuIOS8mOWFiO+8muajgOafpSBwdWJsaWMvJHtvdXRwdXREaXJ9IOebruW9lVxyXG4gICAgICBjb25zdCBwdWJsaWNGaWxlUGF0aCA9IGpvaW4ocHVibGljRGlyLCBub3JtYWxpemVkUGF0aCkucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChwdWJsaWNGaWxlUGF0aCk7XHJcbiAgICAgICAgaWYgKHN0YXQuaXNGaWxlKCkpIHtcclxuICAgICAgICAgIGZpbGVQYXRoID0gcHVibGljRmlsZVBhdGg7XHJcbiAgICAgICAgICBmaWxlTmFtZSA9IGJhc2VuYW1lKG5vcm1hbGl6ZWRQYXRoKTtcclxuICAgICAgICAgIHJldHVybiBzZXJ2ZUZpbGUoZmlsZVBhdGgsIGZpbGVOYW1lLCByZXMsIGxvZ2dlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAvLyBwdWJsaWMg5Lit5rKh5pyJ77yM57un57ut5p+l5om+IHNvdXJjZUFzc2V0c1BhdGhcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8g4pyFIDYuIGZhbGxiYWNr77ya5p+l5om+IHNvdXJjZUFzc2V0c1BhdGhcclxuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzb2x2ZVNhZmVQYXRoKGRlY29kZWRQYXRoLCBzb3VyY2VBc3NldHNSb290LCBiYXNlUGF0aCk7XHJcbiAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgICByZXMuc3RhdHVzQ29kZSA9IHJlc3VsdC5zdGF0dXNDb2RlIHx8IDQwMDtcclxuICAgICAgICByZXR1cm4gcmVzLmVuZChyZXN1bHQubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyZXN1bHQuZmlsZVBhdGgpIGZpbGVQYXRoID0gcmVzdWx0LmZpbGVQYXRoO1xyXG4gICAgICBpZiAocmVzdWx0LmZpbGVOYW1lKSBmaWxlTmFtZSA9IHJlc3VsdC5maWxlTmFtZTtcclxuXHJcbiAgICAgIC8vIOKchSA3LiDlsJ3or5XnlLEgaGFuZGxlQ29uZmlnUmVxdWVzdCDlpITnkIbvvIjlpoLms6jlhaXphY3nva7vvIlcclxuICAgICAgY29uc3QgaGFuZGxlZCA9IGF3YWl0IGhhbmRsZUNvbmZpZ1JlcXVlc3QoXHJcbiAgICAgICAgZmlsZVBhdGgsXHJcbiAgICAgICAgZmlsZU5hbWUsXHJcbiAgICAgICAgb3B0aW9ucyxcclxuICAgICAgICByZXMsXHJcbiAgICAgICAgbG9nZ2VyXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChoYW5kbGVkKSByZXR1cm47XHJcblxyXG4gICAgICAvLyDinIUgOC4g56Gu5L+d5piv5paH5Lu2XHJcbiAgICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KGZpbGVQYXRoKTtcclxuICAgICAgaWYgKCFzdGF0LmlzRmlsZSgpKSB7XHJcbiAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSA0MDQ7XHJcbiAgICAgICAgcmV0dXJuIHJlcy5lbmQoJ0ZpbGUgbm90IGZvdW5kJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBzZXJ2ZUZpbGUoZmlsZVBhdGgsIGZpbGVOYW1lLCByZXMsIGxvZ2dlcik7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgbG9nZ2VyPy53YXJuPy4oYFtNeENhZEFzc2V0c10gU2VydmUgZmFpbGVkIGZvciAke3JlcS51cmx9OiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XHJcbiAgICAgIGlmIChyZXMuaGVhZGVyc1NlbnQpIHJldHVybjtcclxuICAgICAgcmVzLnN0YXR1c0NvZGUgPSA0MDQ7XHJcbiAgICAgIHJlcy5lbmQoJ0ZpbGUgbm90IGZvdW5kJyk7XHJcbiAgICB9XHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIOWwgeijheaWh+S7tuWTjeW6lOmAu+i+ke+8iOa1geW8j+S8oOi+k++8iVxyXG4gKi9cclxuZnVuY3Rpb24gc2VydmVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcsIHJlczogYW55LCBsb2dnZXI/OiBhbnkpIHtcclxuICBjb25zdCBzdHJlYW0gPSBmcy5jcmVhdGVSZWFkU3RyZWFtKGZpbGVQYXRoKTtcclxuXHJcbiAgc3RyZWFtLm9uKCdlcnJvcicsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xyXG4gICAgaWYgKHJlcy5oZWFkZXJzU2VudCkgcmV0dXJuO1xyXG4gICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJyB8fCBlcnIuY29kZSA9PT0gJ0VBQ0NFUycpIHtcclxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXNDb2RlID09PSAyMDAgPyByZXMuZW5kKCkgOiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBsb2dnZXI/LmVycm9yPy4oYFtNeENhZEFzc2V0c10gUmVhZCBlcnJvcjogJHtlcnIubWVzc2FnZX1gLCBlcnIpO1xyXG4gICAgcmVzLnN0YXR1c0NvZGUgPSA1MDA7XHJcbiAgICByZXMuZW5kKCdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InKTtcclxuICB9KTtcclxuXHJcbiAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgZ2V0Q29udGVudFR5cGUoZmlsZU5hbWUpKTtcclxuICByZXMuc2V0SGVhZGVyKCdYLUNvbnRlbnQtVHlwZS1PcHRpb25zJywgJ25vc25pZmYnKTtcclxuXHJcbiAgc3RyZWFtLnBpcGUocmVzKTtcclxufSJdLCJuYW1lcyI6WyJmcyIsImVyciIsIm5hbWUiLCJzdGF0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
|