@libs-ui/components-draw-line 0.2.10-6.2

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhdy1saW5lLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9kcmF3LWxpbmUvc3JjL2RyYXctbGluZS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xuZXhwb3J0IGludGVyZmFjZSBJUmVhY2hhYmxlUG9pbnRSYW5nZSB7XG4gIGlkOiBzdHJpbmc7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICBzdHlsZTogSUNpcmNsZVN0eWxlO1xuICBpZENvbm5lY3RlZD86IHN0cmluZztcbiAgcmVmPzogSVJlYWNoYWJsZVBvaW50UmFuZ2U7XG4gIGVsZW1lbnQ/OiBTVkdDaXJjbGVFbGVtZW50O1xuICBvbkRlc3Ryb3lFdmVudD86IFN1YmplY3Q8dm9pZD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVZpZXdCb3hDb25maWcge1xuICBtaW5YPzogbnVtYmVyO1xuICBtaW5ZPzogbnVtYmVyO1xuICB3aWR0aD86IG51bWJlcjtcbiAgaGVpZ2h0PzogbnVtYmVyO1xuICBpZ25vcmVWaWV3Qm94PzogYm9vbGVhbjtcbiAgbWFyZ2luQmV0d2VlbkVsZW1lbnQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURyYXdMaW5lRGF0YUlucHV0IHtcbiAgaWQ6IHN0cmluZztcbiAgcG9pbnRzOiBJUG9pbnRzO1xuICBpZENvbm5lY3RlZD86IHN0cmluZztcbiAgbW9kZTogVFlQRV9NT0RFO1xuICBsaW5lU3R5bGU/OiBJTGluZVN0eWxlLFxuICBhcnJvd1N0eWxlPzogSUFycm93U3R5bGU7XG4gIGlnbm9yZURyYXdBcnJvdz86IGJvb2xlYW47IC8vIHRyxrDhu51uZyBo4bujcCB24bq9IHNlcGFyYXRlZFBvaW50IHPhur0gY+G6p24gYuG7jyBxdWEgYXJyb3dcbiAgc3RhcnRDaXJjbGU/OiBib29sZWFuO1xuICBzdGFydENpcmNsZVN0eWxlPzogSUNpcmNsZVN0eWxlO1xuICBlbmRDaXJjbGU/OiBib29sZWFuO1xuICBlbmRDaXJjbGVTdHlsZT86IElDaXJjbGVTdHlsZTtcbiAgaXNSZW1vdmU/OiBib29sZWFuO1xuICBhcnJvd0RpcmVjdGlvbj86IFRZUEVfRElSRUNUSU9OO1xuICByZWY/OiBJRHJhd0xpbmVEYXRhSW5wdXQ7XG4gIHN0YXJ0RW5kTW9kZT86ICdyaWdodC1sZWZ0JyB8ICdib3R0b20tdG9wJyB8ICdib3R0b20tbGVmdCc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxpbmVTdHlsZSB7XG4gIHN0cm9rZT86IHN0cmluZztcbiAgc3Ryb2tlRGFzaGFycmF5Pzogc3RyaW5nO1xuICBzdHJva2VXaWR0aD86IHN0cmluZztcbiAgZmlsbD86IHN0cmluZztcbiAgY3VydmU/OiBudW1iZXI7IC8vIGFwcGx5IG1vZGUgJ3ZlcnRpY2FsJyB8ICdob3Jpem9udGFsJ1xuICBkaXN0YW5jZVBvaW50PzogbnVtYmVyOyAvLyBraG/huqNuZyBjw6FjaCB04burIMSRaeG7g20gbcO6dCBjdeG7kWkgxJHhur9uIHbhu4sgdHLDrSBjb25nIGfhuqduIG5o4bqldCDEkeG7kWkgduG7m2kgbW9kZSBob3Jpem9udGFsIHbDoCDEkWnhu4NtIG3DunQgxJHhuqd1IMSR4bq/biDEkcaw4budbmcgxJHhur9uIMSRxrDhu51uZyBjb25nIGfhuqduIG5o4bqldCB24bubaSBtb2RlIHZlcnRpY2FsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBcnJvd1N0eWxlIHtcbiAgc3Ryb2tlPzogc3RyaW5nO1xuICBzdHJva2VXaWR0aD86IHN0cmluZztcbiAgd2lkdGg/OiBudW1iZXI7XG4gIGhlaWdodD86IG51bWJlcjtcbiAgZmlsbD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2lyY2xlU3R5bGUge1xuICBzdHJva2U/OiBzdHJpbmc7XG4gIHN0cm9rZVdpZHRoPzogc3RyaW5nO1xuICBmaWxsPzogc3RyaW5nO1xuICByPzogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBJQXR0cmlidXRlRE9uUGF0aCB7XG4gIE06IElQb2ludDtcbiAgQzogQXJyYXk8SVBvaW50PlxuICBMOiBJUG9pbnQ7XG4gIFE6IEFycmF5PElQb2ludD47XG4gIEwyOiBJUG9pbnQ7XG4gIFEyOiBBcnJheTxJUG9pbnQ+O1xuICBMMzogSVBvaW50O1xuICBRMz86IEFycmF5PElQb2ludD47XG4gIEw0PzogSVBvaW50O1xuICBRND86IEFycmF5PElQb2ludD47XG4gIEw1PzogSVBvaW50O1xuICBUPzogSVBvaW50O1xuICBBPzogSVBvaW50O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQb2ludHMge1xuICBpbml0aWFsaXplZD86IGJvb2xlYW47XG4gIG9ic3RhY2xlUmVjdD86IEFycmF5PElSZWN0PjtcbiAgc2VwYXJhdGVkUG9pbnRzPzogQXJyYXk8SVBvaW50cz47XG4gIHBhdGhFbGVtZW50PzogU1ZHUGF0aEVsZW1lbnQ7XG4gIGFycm93RWxlbWVudD86IFNWR1BvbHlsaW5lRWxlbWVudDtcbiAgY2lyY2xlU3RhcnRFbGVtZW50PzogU1ZHQ2lyY2xlRWxlbWVudDtcbiAgY2lyY2xlRW5kRWxlbWVudD86IFNWR0NpcmNsZUVsZW1lbnQ7XG4gIG9uRGVzdHJveUV2ZW50PzogU3ViamVjdDx2b2lkPjtcbiAgc3RhcnQ6IElQb2ludDtcbiAgZW5kOiBJUG9pbnQ7XG4gIG1vZGU/OiBUWVBFX01PREU7XG4gIGlkPzogc3RyaW5nLFxuICBuYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlY3Qge1xuICBpZD86IHN0cmluZ1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGdhcFhPYnN0YWNsZVJlY3Q/OiBudW1iZXI7XG4gIGdhcFlPYnN0YWNsZVJlY3Q/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBvaW50IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIFRZUEVfRElSRUNUSU9OID0gJ3JpZ2h0JyB8ICdsZWZ0JyB8ICd0b3AnIHwgJ2JvdHRvbSc7XG5leHBvcnQgdHlwZSBUWVBFX01PREUgPSAncXVhcnQtaW4nIHwgJ3ZlcnRpY2FsJyB8ICd2ZXJ0aWNhbC1zaW5nbGUtY3VydmUnIHwgJ2hvcml6b250YWwnIHwgJ2hvcml6b250YWwtc2luZ2xlLWN1cnZlJztcblxuZXhwb3J0IGludGVyZmFjZSBJTW9EcmF3TGluZUZ1bmN0aW9uQ29udHJvbCB7XG4gIHNldERhdGE6IChkYXRhOiBBcnJheTxJRHJhd0xpbmVEYXRhSW5wdXQ+KSA9PiB2b2lkO1xuICByZW1vdmVMaW5lOiAoaWQ6IHN0cmluZywgcG9pbnRzPzogQXJyYXk8SVBvaW50cz4pID0+IHZvaWQ7XG4gIHNldFJlYWNoYWJsZVBvaW50UmFuZ2U6IChkYXRhOiBBcnJheTxJUmVhY2hhYmxlUG9pbnRSYW5nZT4pID0+IHZvaWQ7XG4gIHJlbW92ZVJlYWNoYWJsZVBvaW50UmFuZ2U6IChpZHM6IEFycmF5PHN0cmluZz4pID0+IHZvaWQ7XG4gIHVwZGF0ZVZpZXdCb3g6ICh2aWV3Qm94Q29uZmlnPzogSVZpZXdCb3hDb25maWcpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvb3JkaW5hdGVzU3ZnIHtcbiAgbXg/OiBudW1iZXI7XG4gIG15PzogbnVtYmVyO1xuICB4MT86IG51bWJlcjtcbiAgeTE/OiBudW1iZXI7XG4gIHg/OiBudW1iZXI7XG4gIHk/OiBudW1iZXI7XG4gIGx4PzogbnVtYmVyO1xuICBseT86IG51bWJlcjtcbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ export * from './draw-line.directive';
2
+ export * from './draw-line.interface';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvZHJhdy1saW5lL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2RyYXctbGluZS5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9kcmF3LWxpbmUuaW50ZXJmYWNlJztcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicy11aS1jb21wb25lbnRzLWRyYXctbGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9kcmF3LWxpbmUvc3JjL2xpYnMtdWktY29tcG9uZW50cy1kcmF3LWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
@@ -0,0 +1,27 @@
1
+ export class MoCanvasCalculatorBranchUtil {
2
+ /**
3
+ *
4
+ * above, left a + b; opposite = true a - b;
5
+ *
6
+ * under, right a - b; opposite = true a + b
7
+ */
8
+ static mathOperatorsCalculation(direction, a, b, opposite) {
9
+ switch (direction) {
10
+ case 'left':
11
+ case 'above':
12
+ if (opposite) {
13
+ return (a ?? 0) - (b ?? 0);
14
+ }
15
+ return (a ?? 0) + (b ?? 0);
16
+ case 'right':
17
+ case 'under':
18
+ if (opposite) {
19
+ return (a ?? 0) + (b ?? 0);
20
+ }
21
+ return (a ?? 0) - (b ?? 0);
22
+ default:
23
+ return (a ?? 0) - (b ?? 0);
24
+ }
25
+ }
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRvci1icmFuY2gudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9kcmF3LWxpbmUvc3JjL3V0aWwvY2FsY3VsYXRvci1icmFuY2gudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxNQUFNLE9BQU8sNEJBQTRCO0lBQ3ZDOzs7OztLQUtDO0lBQ0QsTUFBTSxDQUFDLHdCQUF3QixDQUFDLFNBQXdELEVBQUUsQ0FBcUIsRUFBRSxDQUFxQixFQUFFLFFBQWtCO1FBQ3hKLFFBQVEsU0FBUyxFQUFFLENBQUM7WUFDbEIsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLE9BQU87Z0JBQ1YsSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDYixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUM3QixDQUFDO2dCQUVELE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFFN0IsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLE9BQU87Z0JBQ1YsSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDYixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUM3QixDQUFDO2dCQUVELE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDN0I7Z0JBQ0UsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMvQixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiXG5leHBvcnQgY2xhc3MgTW9DYW52YXNDYWxjdWxhdG9yQnJhbmNoVXRpbCB7XG4gIC8qKlxuICogXG4gKiBhYm92ZSwgbGVmdCBhICsgYjsgb3Bwb3NpdGUgPSB0cnVlIGEgLSBiO1xuICogXG4gKiB1bmRlciwgcmlnaHQgYSAtIGI7IG9wcG9zaXRlID0gdHJ1ZSBhICsgYlxuICovXG4gIHN0YXRpYyBtYXRoT3BlcmF0b3JzQ2FsY3VsYXRpb24oZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnIHwgJ2Fib3ZlJyB8ICd1bmRlcicgfCBzdHJpbmcsIGE6IG51bWJlciB8IHVuZGVmaW5lZCwgYjogbnVtYmVyIHwgdW5kZWZpbmVkLCBvcHBvc2l0ZT86IGJvb2xlYW4pIHtcbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICBjYXNlICdhYm92ZSc6XG4gICAgICAgIGlmIChvcHBvc2l0ZSkge1xuICAgICAgICAgIHJldHVybiAoYSA/PyAwKSAtIChiID8/IDApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChhID8/IDApICsgKGIgPz8gMCk7XG5cbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIGNhc2UgJ3VuZGVyJzpcbiAgICAgICAgaWYgKG9wcG9zaXRlKSB7XG4gICAgICAgICAgcmV0dXJuIChhID8/IDApICsgKGIgPz8gMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGEgPz8gMCkgLSAoYiA/PyAwKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoYSA/PyAwKSAtIChiID8/IDApO1xuICAgIH1cbiAgfVxufSJdfQ==
@@ -0,0 +1,350 @@
1
+ import { range } from "@libs-ui/utils";
2
+ import { MoCanvasCalculatorBranchUtil } from "./calculator-branch.util";
3
+ import { MoCanvasConnectNavigationNewElementUtil } from "./connect-navigation-new-element.util";
4
+ export class MoCanvasCalculatorDirectionElementUtil {
5
+ static checkUpDownLeftRight(firstPoint, endPoint, direction) {
6
+ const distance = ((firstPoint ?? 0) - (endPoint ?? 0));
7
+ if (distance === 0) {
8
+ return 'center';
9
+ }
10
+ if (distance > 0) {
11
+ return direction === 'x' ? 'left' : 'above';
12
+ }
13
+ return direction === 'x' ? 'right' : 'under';
14
+ }
15
+ static drawLineQ(start, corner, lineCurveX, lineCurveY) {
16
+ const coordQ = {};
17
+ switch (corner) {
18
+ case 'right-under':
19
+ coordQ.x1 = start.x + lineCurveX;
20
+ coordQ.y1 = start.y;
21
+ coordQ.x = coordQ.x1;
22
+ coordQ.y = coordQ.y1 + lineCurveY;
23
+ break;
24
+ case 'under-left':
25
+ coordQ.x1 = start.x;
26
+ coordQ.y1 = start.y + lineCurveY;
27
+ coordQ.x = coordQ.x1 - lineCurveX;
28
+ coordQ.y = coordQ.y1;
29
+ break;
30
+ case 'left-above':
31
+ coordQ.x1 = start.x - lineCurveX;
32
+ coordQ.y1 = start.y;
33
+ coordQ.x = coordQ.x1;
34
+ coordQ.y = coordQ.y1 - lineCurveY;
35
+ break;
36
+ case 'above-right':
37
+ coordQ.x1 = start.x;
38
+ coordQ.y1 = start.y - lineCurveY;
39
+ coordQ.x = coordQ.x1 + lineCurveX;
40
+ coordQ.y = coordQ.y1;
41
+ break;
42
+ case 'under-right':
43
+ coordQ.x1 = start.x;
44
+ coordQ.y1 = start.y + lineCurveY;
45
+ coordQ.x = coordQ.x1 + lineCurveX;
46
+ coordQ.y = coordQ.y1;
47
+ break;
48
+ case 'right-above':
49
+ coordQ.x1 = start.x + lineCurveX;
50
+ coordQ.y1 = start.y;
51
+ coordQ.x = coordQ.x1;
52
+ coordQ.y = coordQ.y1 - lineCurveY;
53
+ break;
54
+ case 'above-left':
55
+ coordQ.x1 = start.x;
56
+ coordQ.y1 = start.y - lineCurveY;
57
+ coordQ.x = coordQ.x1 - lineCurveX;
58
+ coordQ.y = coordQ.y1;
59
+ break;
60
+ case 'left-under':
61
+ coordQ.x1 = start.x - lineCurveX;
62
+ coordQ.y1 = start.y;
63
+ coordQ.x = coordQ.x1;
64
+ coordQ.y = coordQ.y1 + lineCurveY;
65
+ break;
66
+ default:
67
+ break;
68
+ }
69
+ return coordQ;
70
+ }
71
+ /**Tránh khối phía bên phải */
72
+ static byPassElementOnRightSide(startX, startY, endY, lineCurve, elementBlockRoad, directionX, separatedPoints, key, coordLX) {
73
+ const topElementBlockRoad = (elementBlockRoad.y ?? 0);
74
+ const bottomElementBlockRoad = (elementBlockRoad.y ?? 0) + (elementBlockRoad.height ?? 0);
75
+ const directionY = this.checkUpDownLeftRight(startY, endY, 'y');
76
+ const Q1 = this.drawLineQ({ x: startX, y: startY ?? 0 }, `${directionX}-${directionY === 'under' ? 'under' : 'above'}`, lineCurve, lineCurve);
77
+ const L1 = {
78
+ x: Q1.x ?? 0,
79
+ y: (directionY === 'under' ? bottomElementBlockRoad : topElementBlockRoad)
80
+ };
81
+ if (MoCanvasConnectNavigationNewElementUtil.START_MODE !== 'bottom-left') {
82
+ if ((directionY === 'under' && bottomElementBlockRoad - (Q1.y ?? 0) <= 0)
83
+ || (directionY === 'above' && topElementBlockRoad - (Q1.y ?? 0) >= 0)) {
84
+ L1.y = Q1.y ?? 0;
85
+ }
86
+ if (Math.abs((L1.y ?? 0) - endY) <= 10) {
87
+ L1.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionX, L1.y, lineCurve);
88
+ }
89
+ }
90
+ const Q2 = this.drawLineQ({ x: L1.x, y: L1.y ?? 0 }, `${directionY === 'under' ? 'under' : 'above'}-${directionX}`, lineCurve, lineCurve);
91
+ const pathQ1 = `Q ${Q1.x1},${Q1.y1} ${Q1.x},${Q1.y} L ${L1.x} ${L1.y}`;
92
+ const pathQ2 = `Q ${Q2.x1},${Q2.y1} ${Q2.x},${Q2.y}`;
93
+ separatedPoints.push({ start: { x: coordLX ?? startX, y: startY }, end: { x: Q1.x ?? 0, y: Q1.y ?? 0 }, mode: 'horizontal-single-curve', id: key, name: 'qr' });
94
+ separatedPoints.push({ start: { x: Q1.x ?? 0, y: Q1.y ?? 0 }, end: { x: L1.x ?? 0, y: L1.y }, mode: 'horizontal', id: key, name: 'lr' });
95
+ separatedPoints.push({ start: { x: L1.x ?? 0, y: L1.y }, end: { x: Q2.x ?? 0, y: Q2.y ?? 0 }, mode: 'vertical-single-curve', id: key, name: 'q2r' });
96
+ return {
97
+ pathByPassQ: `${pathQ1} ${pathQ2}`,
98
+ endPath: {
99
+ x: Q2.x ?? 0,
100
+ y: Q2.y ?? 0
101
+ }
102
+ };
103
+ }
104
+ /**Tránh khối phía bên trên */
105
+ static byPassElementOnTopBottomSide(startX, startY, endX, lineCurve, elementBlockRoad, directionY, separatedPoints, key) {
106
+ const leftElementBlockRoad = (elementBlockRoad.x ?? 0);
107
+ const rightElementBlockRoad = (elementBlockRoad.x ?? 0) + (elementBlockRoad.width ?? 0);
108
+ const directionX = this.checkUpDownLeftRight(startX, endX, 'x') === 'left' ? 'left' : 'right'; // xem nên tránh sang trái hay phải
109
+ const Q1 = this.drawLineQ({ x: startX, y: startY ?? 0 }, `${directionY}-${directionX}`, lineCurve, lineCurve);
110
+ const L1 = {
111
+ x: (directionX === 'left' ? leftElementBlockRoad : rightElementBlockRoad),
112
+ y: Q1.y ?? 0
113
+ };
114
+ if ((directionX === 'right' && rightElementBlockRoad - (Q1.x ?? 0) <= 0) || (directionX === 'left' && leftElementBlockRoad - (Q1.x ?? 0) >= 0)) {
115
+ L1.x = Q1.x ?? 0;
116
+ }
117
+ const Q2 = this.drawLineQ({ x: L1.x, y: L1.y ?? 0 }, `${directionX}-${directionY}`, lineCurve, lineCurve);
118
+ if (Math.abs((Q2.x ?? 0) - leftElementBlockRoad) <= 10) {
119
+ Q2.x = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionX, Q2.x, lineCurve, true);
120
+ }
121
+ const pathQ1 = `Q ${Q1.x1},${Q1.y1} ${Q1.x},${Q1.y} L ${L1.x} ${L1.y}`;
122
+ const pathQ2 = `Q ${Q2.x1},${Q2.y1} ${Q2.x},${Q2.y}`;
123
+ separatedPoints.push({ start: { x: startX, y: startY }, end: { x: Q1.x ?? 0, y: Q1.y ?? 0 }, mode: 'vertical-single-curve', id: key ?? 'qb' });
124
+ separatedPoints.push({ start: { x: Q1.x ?? 0, y: Q1.y ?? 0 }, end: { x: L1.x ?? 0, y: L1.y ?? 0 }, mode: 'horizontal-single-curve', id: key ?? 'lb' });
125
+ separatedPoints.push({ start: { x: L1.x ?? 0, y: L1.y ?? 0 }, end: { x: Q2.x ?? 0, y: Q2.y ?? 0 }, mode: 'horizontal-single-curve', id: key ?? 'q2b' });
126
+ return {
127
+ pathByPassQ: `${pathQ1} ${pathQ2}`,
128
+ endPath: {
129
+ x: Q2.x ?? 0,
130
+ y: Q2.y ?? 0
131
+ }
132
+ };
133
+ }
134
+ // kiểm tra đường thẳng và khối có cắt nhau không
135
+ static checkLinePassBlockHorizontal(start, end, xOrYOfLine, direction, obstacleRect, returnAllElementBlockRoad) {
136
+ const minimumDistanceFromBlock = 8;
137
+ start += minimumDistanceFromBlock + 1; // tránh khối xuất phát vào list
138
+ const listPointsOfLine = range(start, end + 1);
139
+ const elementBlockRoad = obstacleRect.filter(item => {
140
+ const left = (item.x ?? 0) - minimumDistanceFromBlock;
141
+ const right = (item.x ?? 0) + (item.width ?? 0) + minimumDistanceFromBlock;
142
+ const top = (item.y ?? 0) - minimumDistanceFromBlock;
143
+ const bottom = (item.y ?? 0) + (item.height ?? 0) + minimumDistanceFromBlock;
144
+ if (direction === 'x' && listPointsOfLine.find(el => (left <= el && el <= right)) && (top <= xOrYOfLine && xOrYOfLine <= bottom)) {
145
+ return true;
146
+ }
147
+ if (direction === 'y' && listPointsOfLine.find(el => (top <= el && el <= bottom)) && (left <= xOrYOfLine && xOrYOfLine <= right)) {
148
+ return true;
149
+ }
150
+ return false;
151
+ });
152
+ if (!elementBlockRoad || !elementBlockRoad.length) {
153
+ return undefined;
154
+ }
155
+ if (returnAllElementBlockRoad) {
156
+ return elementBlockRoad;
157
+ }
158
+ if (direction === 'y') {
159
+ return elementBlockRoad.reduce((a, b) => (Math.abs(((a.y ?? 0) - start))) < (Math.abs(((b.y ?? 0) - start))) ? a : b);
160
+ }
161
+ return elementBlockRoad.reduce((a, b) => (Math.abs(((a.x ?? 0) - start))) < (Math.abs(((b.x ?? 0) - start))) ? a : b);
162
+ }
163
+ // kiểm tra hướng thẳng vẽ về điểm end xem có bị chắn bởi khối nào không, nếu có thì phải lùi lại điểm end nhé.
164
+ static checkBlocksElementStraightY(startX, startY, endPosition, obstacleRect) {
165
+ const elementBlockRoad = this.checkLinePassBlockHorizontal(startY, endPosition.y, startX, 'y', obstacleRect, true);
166
+ if (!elementBlockRoad || !elementBlockRoad.length) {
167
+ return;
168
+ }
169
+ return elementBlockRoad.reduce((a, b) => (Math.abs((a.x ?? 0 - startX))) < (Math.abs((b.x ?? 0 - startX))) ? a : b);
170
+ }
171
+ // kiểm tra hướng ngang vẽ về điểm end xem có bị chắn bởi khối nào không, nếu có thì phải lùi lại điểm end nhé.
172
+ static checkBlocksElementX(startX, startY, endPosition, obstacleRect) {
173
+ const elementBlockRoad = this.checkLinePassBlockHorizontal(startX, endPosition.x, startY, 'x', obstacleRect, true);
174
+ if (!elementBlockRoad || !elementBlockRoad.length) {
175
+ return;
176
+ }
177
+ return elementBlockRoad.reduce((a, b) => (Math.abs(((a.y ?? 0) - startY))) < (Math.abs(((b.y ?? 0) - startY))) ? a : b);
178
+ }
179
+ // kiểm tra hướng sang phải là tránh khối
180
+ static checkAndAvoidBlocksLeft(startX, startY, lineCurve, endPosition, obstacleRect, separatedPoints) {
181
+ const coordLX = { x: endPosition.x, y: startY };
182
+ const elementBlockRoad = this.checkLinePassBlockHorizontal(startX, endPosition.x, startY, 'x', obstacleRect);
183
+ if (!elementBlockRoad) {
184
+ separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: '14' });
185
+ return coordLX;
186
+ }
187
+ const directionX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(startX, endPosition.x, 'x');
188
+ const specificXElement = directionX === 'right' ? (elementBlockRoad.x ?? 0) : ((elementBlockRoad.x ?? 0) + (elementBlockRoad.width ?? 0));
189
+ coordLX.x = specificXElement + (MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2) + (lineCurve / 2);
190
+ if (directionX === 'right') {
191
+ coordLX.x = specificXElement - (MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2) - (lineCurve / 2);
192
+ }
193
+ let startXBypassElement = coordLX.x;
194
+ if ((directionX === 'left' && startX - (coordLX.x ?? 0) <= 0) || (directionX === 'right' && startX - (coordLX.x ?? 0) >= 0)) {
195
+ coordLX.x = startX;
196
+ startXBypassElement = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionX, coordLX.x, lineCurve);
197
+ }
198
+ let lineByPassBlock = [];
199
+ let { endPath } = MoCanvasCalculatorDirectionElementUtil.byPassElementOnRightSide(startXBypassElement ?? 0, coordLX.y ?? 0, endPosition.y, lineCurve, elementBlockRoad, directionX, lineByPassBlock, undefined, coordLX.x);
200
+ if (MoCanvasConnectNavigationNewElementUtil.START_MODE === 'bottom-left' && elementBlockRoad.x + (elementBlockRoad.width) / 2 === endPosition.x && Math.abs(endPosition.y - elementBlockRoad.y) <= 20) { // check xem khối chắn có phải là khối đích hay không?
201
+ lineByPassBlock = [];
202
+ const data = MoCanvasCalculatorDirectionElementUtil.byPassElementOnRightSideNewMode(startXBypassElement ?? 0, coordLX.y ?? 0, endPosition.y, lineByPassBlock, undefined, coordLX.x);
203
+ endPath = data.endPath;
204
+ }
205
+ separatedPoints.push(...lineByPassBlock);
206
+ separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: '15' });
207
+ const dataEndPath = this.checkAndAvoidBlocksLeft(endPath.x ?? 0, endPath.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints);
208
+ return dataEndPath;
209
+ }
210
+ // kiểm tra hướng sang phải là tránh khối
211
+ static checkAndAvoidBlocks(startX, startY, lineCurve, endPosition, obstacleRect, separatedPoints, pathPre) {
212
+ const coordLX = { x: endPosition.x - 30, y: startY };
213
+ const elementBlockRoad = this.checkLinePassBlockHorizontal(startX, endPosition.x, startY, 'x', obstacleRect);
214
+ if (!elementBlockRoad) {
215
+ const elementBlockRoadStraightLineY = this.checkBlocksElementStraightY((coordLX.x ?? 0) + 10, coordLX.y ?? 0, endPosition, obstacleRect); // tính điểm end_x dự kiến theo trường hợp đẹp nhất xem nó có chắn bởi khối nào khi kéo xuống không
216
+ if (elementBlockRoadStraightLineY && (elementBlockRoadStraightLineY.x ?? 0) > startX) {
217
+ let toX = (elementBlockRoadStraightLineY.x ?? 0) - (MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2) - (lineCurve / 2);
218
+ if (((elementBlockRoadStraightLineY?.x ?? 0) - startX) < MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT) {
219
+ toX = (elementBlockRoadStraightLineY.x ?? 0) - (((elementBlockRoadStraightLineY?.x ?? 0) - startX) / 2);
220
+ }
221
+ coordLX.x = toX;
222
+ }
223
+ separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'checkAndAvoidBlocks', name: 'end' });
224
+ return {
225
+ path: pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`,
226
+ endPath: coordLX
227
+ };
228
+ }
229
+ const directionX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(startX, endPosition.x, 'x');
230
+ coordLX.x = (elementBlockRoad.x ?? 0) - (MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2) - (lineCurve / 2);
231
+ let separatedPointsByPassElementOnRightSide = [];
232
+ const { pathByPassQ, endPath } = MoCanvasCalculatorDirectionElementUtil.byPassElementOnRightSide(coordLX.x, coordLX.y ?? 0, endPosition.y, lineCurve, elementBlockRoad, directionX, separatedPointsByPassElementOnRightSide, 'checkAndAvoidBlocks', coordLX.x);
233
+ let line = pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y} ${pathByPassQ}` : `L ${coordLX.x} ${coordLX.y} ${pathByPassQ}`;
234
+ // tính trước trường hợp sau để lùi line
235
+ const elementBlockRoadPre = this.checkLinePassBlockHorizontal(endPath.x ?? 0, endPosition.x, endPath.y ?? 0, 'x', obstacleRect);
236
+ if (!elementBlockRoadPre) {
237
+ const elementBlockRoadStraightLineY = this.checkBlocksElementStraightY((endPosition.x ?? 0) + 10, endPath.y ?? 0, endPosition, obstacleRect);
238
+ if (elementBlockRoadStraightLineY) {
239
+ const XNew = (elementBlockRoadStraightLineY.x ?? 0) - (MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2) - (lineCurve / 2);
240
+ if (XNew < (endPath.x ?? 0)) {
241
+ separatedPointsByPassElementOnRightSide = [];
242
+ separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'checkAndAvoidBlocks', name: 'u' });
243
+ line = pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`;
244
+ return {
245
+ path: line,
246
+ endPath: coordLX
247
+ };
248
+ }
249
+ }
250
+ }
251
+ separatedPoints.splice(separatedPoints.length, 0, ...separatedPointsByPassElementOnRightSide);
252
+ separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'checkAndAvoidBlocks', name: 'p' });
253
+ const data = this.checkAndAvoidBlocks(endPath.x ?? 0, endPath.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints, `${line}`);
254
+ return {
255
+ path: data.path,
256
+ endPath: data.endPath
257
+ };
258
+ }
259
+ // kiểm tra hướng thẳng và tránh khối
260
+ static checkAndAvoidBlocksY(startX, startY, lineCurve, endPosition, directionY, obstacleRect, separatedPoints, pathPre) {
261
+ const coordLX = { x: startX, y: endPosition.y };
262
+ const elementBlockRoad = this.checkLinePassBlockHorizontal(startY, endPosition.y, startX, 'y', obstacleRect);
263
+ if ((directionY === 'under' && startY > endPosition.y) || (directionY === 'above' && startY < endPosition.y)) {
264
+ separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'k' });
265
+ return {
266
+ path: pathPre ?? '',
267
+ endPath: { x: startX, y: startY }
268
+ };
269
+ }
270
+ if (!elementBlockRoad) {
271
+ separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'r' });
272
+ return {
273
+ path: pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`,
274
+ endPath: coordLX
275
+ };
276
+ }
277
+ const y = directionY === 'above' ? (elementBlockRoad.y ?? 0) + (elementBlockRoad.height ?? 0) : (elementBlockRoad.y ?? 0);
278
+ coordLX.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, y, lineCurve * 2);
279
+ separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'ra' });
280
+ const { pathByPassQ, endPath } = MoCanvasCalculatorDirectionElementUtil.byPassElementOnTopBottomSide(coordLX.x ?? 0, coordLX.y ?? 0, endPosition.x, lineCurve, elementBlockRoad, directionY, separatedPoints);
281
+ // sau khi đã tránh thì tiếp tục kéo dài cho tời điểm end x, lại kiểm tra xem có khối nào chắn không?
282
+ const line = pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y} ${pathByPassQ}` : `L ${coordLX.x} ${coordLX.y} ${pathByPassQ}`;
283
+ const data = this.checkAndAvoidBlocksY(endPath.x ?? 0, endPath.y ?? 0, lineCurve, endPosition, directionY, obstacleRect, separatedPoints, `${line}`);
284
+ return {
285
+ path: data.path,
286
+ endPath: data.endPath
287
+ };
288
+ }
289
+ // kiểm tra hướng thẳng và tránh khối
290
+ static checkAndAvoidBlocksYLeft(startX, startY, lineCurve, endPosition, directionY, obstacleRect, separatedPoints, pathPre) {
291
+ const key = 'checkAndAvoidBlocksYLeft';
292
+ const coordLX = { x: startX, y: endPosition.y };
293
+ const elementBlockRoad = MoCanvasCalculatorDirectionElementUtil.checkLinePassBlockHorizontal(startY, endPosition.y, startX, 'y', obstacleRect);
294
+ if (!elementBlockRoad) {
295
+ const elementBlockRoadStraightLineX = MoCanvasCalculatorDirectionElementUtil.checkBlocksElementX(coordLX.x ?? 0, (coordLX.y ?? 0), endPosition, obstacleRect);
296
+ if (elementBlockRoadStraightLineX) {
297
+ const topElementBlockRoad = (elementBlockRoadStraightLineX.y ?? 0);
298
+ const bottomElementBlockRoad = (elementBlockRoadStraightLineX.y ?? 0) + (elementBlockRoadStraightLineX.height ?? 0);
299
+ let toY = (directionY === 'under' ? topElementBlockRoad : bottomElementBlockRoad);
300
+ toY = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, toY, lineCurve * 2);
301
+ if (toY > startY && MoCanvasConnectNavigationNewElementUtil.START_MODE !== 'bottom-left') {
302
+ coordLX.y = toY;
303
+ }
304
+ }
305
+ separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: key, name: 'a' });
306
+ return {
307
+ path: pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`,
308
+ endPath: coordLX
309
+ };
310
+ }
311
+ const y = directionY === 'above' ? (elementBlockRoad.y ?? 0) + (elementBlockRoad.height ?? 0) : (elementBlockRoad.y ?? 0);
312
+ const elementBlockRoadStraightLineX = MoCanvasCalculatorDirectionElementUtil.checkBlocksElementX(coordLX.x ?? 0, (coordLX.y ?? 0), endPosition, obstacleRect);
313
+ let ignoreBypassElement = false;
314
+ if (elementBlockRoadStraightLineX && elementBlockRoadStraightLineX.id === elementBlockRoad.id) {
315
+ ignoreBypassElement = true;
316
+ }
317
+ coordLX.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, y, lineCurve * 2);
318
+ let separatedPointsByPassElementOnRightSide = [];
319
+ const { pathByPassQ, endPath } = MoCanvasCalculatorDirectionElementUtil.byPassElementOnTopBottomSide(coordLX.x ?? 0, coordLX.y ?? 0, endPosition.x, lineCurve, elementBlockRoad, directionY, separatedPointsByPassElementOnRightSide, key);
320
+ let end = coordLX;
321
+ let line = pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`;
322
+ separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: key, name: 'b' });
323
+ if (ignoreBypassElement) {
324
+ separatedPointsByPassElementOnRightSide = [];
325
+ separatedPoints.push({ start: coordLX, end, mode: 'horizontal', id: key, name: 'c' });
326
+ return {
327
+ path: line,
328
+ endPath: end
329
+ };
330
+ }
331
+ end = endPath;
332
+ line += ` ${pathByPassQ}`;
333
+ separatedPoints.splice(separatedPoints.length, 0, ...separatedPointsByPassElementOnRightSide);
334
+ const data = this.checkAndAvoidBlocksYLeft(end.x ?? 0, end.y ?? 0, lineCurve, endPosition, directionY, obstacleRect, separatedPoints, `${line}`);
335
+ return {
336
+ path: data.path,
337
+ endPath: data.endPath
338
+ };
339
+ }
340
+ static byPassElementOnRightSideNewMode(startX, startY, endY, separatedPoints, key, coordLX) {
341
+ const start = { x: coordLX ?? startX, y: startY };
342
+ const end = { x: (start.x ?? 0) - 20, y: endY };
343
+ separatedPoints.push({ start: start, end: end, mode: 'horizontal', id: key, name: 'q2r' });
344
+ return {
345
+ pathByPassQ: ``,
346
+ endPath: end
347
+ };
348
+ }
349
+ }
350
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRvci1kaXJldGlvbi1lbGVtZW50LnVudGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2RyYXctbGluZS9zcmMvdXRpbC9jYWxjdWxhdG9yLWRpcmV0aW9uLWVsZW1lbnQudW50aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSx1Q0FBdUMsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBSWhHLE1BQU0sT0FBTyxzQ0FBc0M7SUFDakQsTUFBTSxDQUFDLG9CQUFvQixDQUFDLFVBQThCLEVBQUUsUUFBNEIsRUFBRSxTQUFvQjtRQUM1RyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdkQsSUFBSSxRQUFRLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkIsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUNELElBQUksUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pCLE9BQU8sU0FBUyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDOUMsQ0FBQztRQUVELE9BQU8sU0FBUyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDL0MsQ0FBQztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBK0IsRUFBRSxNQUFnQyxFQUFFLFVBQWtCLEVBQUUsVUFBa0I7UUFFeEgsTUFBTSxNQUFNLEdBQW9CLEVBQUUsQ0FBQztRQUVuQyxRQUFRLE1BQU0sRUFBRSxDQUFDO1lBQ2YsS0FBSyxhQUFhO2dCQUNoQixNQUFNLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO2dCQUNqQyxNQUFNLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3BCLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQztnQkFDbEMsTUFBTTtZQUVSLEtBQUssWUFBWTtnQkFDZixNQUFNLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3BCLE1BQU0sQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7Z0JBQ2pDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUM7Z0JBQ2xDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDckIsTUFBTTtZQUVSLEtBQUssWUFBWTtnQkFDZixNQUFNLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO2dCQUNqQyxNQUFNLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3BCLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQztnQkFDbEMsTUFBTTtZQUVSLEtBQUssYUFBYTtnQkFDaEIsTUFBTSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixNQUFNLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO2dCQUNqQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLEdBQUcsVUFBVSxDQUFDO2dCQUNsQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3JCLE1BQU07WUFFUixLQUFLLGFBQWE7Z0JBQ2hCLE1BQU0sQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsTUFBTSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztnQkFDakMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQztnQkFDbEMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUNyQixNQUFNO1lBRVIsS0FBSyxhQUFhO2dCQUNoQixNQUFNLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO2dCQUNqQyxNQUFNLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3BCLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQztnQkFDbEMsTUFBTTtZQUVSLEtBQUssWUFBWTtnQkFDZixNQUFNLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3BCLE1BQU0sQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7Z0JBQ2pDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUM7Z0JBQ2xDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDckIsTUFBTTtZQUVSLEtBQUssWUFBWTtnQkFDZixNQUFNLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO2dCQUNqQyxNQUFNLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3BCLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQztnQkFDbEMsTUFBTTtZQUVSO2dCQUNFLE1BQU07UUFDVixDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBYyxFQUFFLE1BQWMsRUFBRSxJQUFZLEVBQUUsU0FBaUIsRUFBRSxnQkFBdUIsRUFBRSxVQUFrQixFQUFFLGVBQStCLEVBQUUsR0FBWSxFQUFFLE9BQWdCO1FBQzNNLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdEQsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMxRixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNoRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsVUFBVSxJQUFJLFVBQVUsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzlJLE1BQU0sRUFBRSxHQUFHO1lBQ1QsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNaLENBQUMsRUFBRSxDQUFDLFVBQVUsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQztTQUMzRSxDQUFDO1FBRUYsSUFBSSx1Q0FBdUMsQ0FBQyxVQUFVLEtBQUssYUFBYSxFQUFFLENBQUM7WUFDekUsSUFBSSxDQUFDLFVBQVUsS0FBSyxPQUFPLElBQUksc0JBQXNCLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzttQkFDcEUsQ0FBQyxVQUFVLEtBQUssT0FBTyxJQUFJLG1CQUFtQixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN4RSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUN2QyxFQUFFLENBQUMsQ0FBQyxHQUFHLDRCQUE0QixDQUFDLHdCQUF3QixDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzVGLENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsVUFBVSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksVUFBVSxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRTFJLE1BQU0sTUFBTSxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2RSxNQUFNLE1BQU0sR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVyRCxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE9BQU8sSUFBSSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUseUJBQXlCLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNoSyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN6SSxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxF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QUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRXJELGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMvSSxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUseUJBQXlCLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZKLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSx5QkFBeUIsRUFBRSxFQUFFLEVBQUUsR0FB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QUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUUzRixPQUFPO1lBQ0wsV0FBVyxFQUFFLEVBQUU7WUFDZixPQUFPLEVBQUUsR0FBRztTQUNiLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5nZSB9IGZyb20gXCJAbGlicy11aS91dGlsc1wiO1xuaW1wb3J0IHsgSUNvb3JkaW5hdGVzU3ZnLCBJUG9pbnQsIElQb2ludHMsIElSZWN0IH0gZnJvbSBcIi4uL2RyYXctbGluZS5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IE1vQ2FudmFzQ2FsY3VsYXRvckJyYW5jaFV0aWwgfSBmcm9tIFwiLi9jYWxjdWxhdG9yLWJyYW5jaC51dGlsXCI7XG5pbXBvcnQgeyBNb0NhbnZhc0Nvbm5lY3ROYXZpZ2F0aW9uTmV3RWxlbWVudFV0aWwgfSBmcm9tIFwiLi9jb25uZWN0LW5hdmlnYXRpb24tbmV3LWVsZW1lbnQudXRpbFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElQb3NpdGlvblhZIHsgeDogbnVtYmVyLCB5OiBudW1iZXIgfVxuZXhwb3J0IHR5cGUgQ29ybmVyRGlyZWN0aW9uID0gJ3JpZ2h0LXVuZGVyJyB8ICd1bmRlci1sZWZ0JyB8ICdsZWZ0LWFib3ZlJyB8ICdhYm92ZS1yaWdodCcgfCAndW5kZXItcmlnaHQnIHwgJ3JpZ2h0LWFib3ZlJyB8ICdhYm92ZS1sZWZ0JyB8ICdsZWZ0LXVuZGVyJzsgLy8gdGhlbyBjaGnhu4F1XG5leHBvcnQgY2xhc3MgTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwge1xuICBzdGF0aWMgY2hlY2tVcERvd25MZWZ0UmlnaHQoZmlyc3RQb2ludDogbnVtYmVyIHwgdW5kZWZpbmVkLCBlbmRQb2ludDogbnVtYmVyIHwgdW5kZWZpbmVkLCBkaXJlY3Rpb246ICd4JyB8ICd5Jyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlzdGFuY2UgPSAoKGZpcnN0UG9pbnQgPz8gMCkgLSAoZW5kUG9pbnQgPz8gMCkpO1xuXG4gICAgaWYgKGRpc3RhbmNlID09PSAwKSB7XG4gICAgICByZXR1cm4gJ2NlbnRlcic7XG4gICAgfVxuICAgIGlmIChkaXN0YW5jZSA+IDApIHtcbiAgICAgIHJldHVybiBkaXJlY3Rpb24gPT09ICd4JyA/ICdsZWZ0JyA6ICdhYm92ZSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gJ3gnID8gJ3JpZ2h0JyA6ICd1bmRlcic7XG4gIH1cblxuICBzdGF0aWMgZHJhd0xpbmVRKHN0YXJ0OiB7IHg6IG51bWJlciwgeTogbnVtYmVyIH0sIGNvcm5lcjogQ29ybmVyRGlyZWN0aW9uIHwgc3RyaW5nLCBsaW5lQ3VydmVYOiBudW1iZXIsIGxpbmVDdXJ2ZVk6IG51bWJlcikge1xuXG4gICAgY29uc3QgY29vcmRROiBJQ29vcmRpbmF0ZXNTdmcgPSB7fTtcblxuICAgIHN3aXRjaCAoY29ybmVyKSB7XG4gICAgICBjYXNlICdyaWdodC11bmRlcic6XG4gICAgICAgIGNvb3JkUS54MSA9IHN0YXJ0LnggKyBsaW5lQ3VydmVYO1xuICAgICAgICBjb29yZFEueTEgPSBzdGFydC55O1xuICAgICAgICBjb29yZFEueCA9IGNvb3JkUS54MTtcbiAgICAgICAgY29vcmRRLnkgPSBjb29yZFEueTEgKyBsaW5lQ3VydmVZO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAndW5kZXItbGVmdCc6XG4gICAgICAgIGNvb3JkUS54MSA9IHN0YXJ0Lng7XG4gICAgICAgIGNvb3JkUS55MSA9IHN0YXJ0LnkgKyBsaW5lQ3VydmVZO1xuICAgICAgICBjb29yZFEueCA9IGNvb3JkUS54MSAtIGxpbmVDdXJ2ZVg7XG4gICAgICAgIGNvb3JkUS55ID0gY29vcmRRLnkxO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbGVmdC1hYm92ZSc6XG4gICAgICAgIGNvb3JkUS54MSA9IHN0YXJ0LnggLSBsaW5lQ3VydmVYO1xuICAgICAgICBjb29yZFEueTEgPSBzdGFydC55O1xuICAgICAgICBjb29yZFEueCA9IGNvb3JkUS54MTtcbiAgICAgICAgY29vcmRRLnkgPSBjb29yZFEueTEgLSBsaW5lQ3VydmVZO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYWJvdmUtcmlnaHQnOlxuICAgICAgICBjb29yZFEueDEgPSBzdGFydC54O1xuICAgICAgICBjb29yZFEueTEgPSBzdGFydC55IC0gbGluZUN1cnZlWTtcbiAgICAgICAgY29vcmRRLnggPSBjb29yZFEueDEgKyBsaW5lQ3VydmVYO1xuICAgICAgICBjb29yZFEueSA9IGNvb3JkUS55MTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3VuZGVyLXJpZ2h0JzpcbiAgICAgICAgY29vcmRRLngxID0gc3RhcnQueDtcbiAgICAgICAgY29vcmRRLnkxID0gc3RhcnQueSArIGxpbmVDdXJ2ZVk7XG4gICAgICAgIGNvb3JkUS54ID0gY29vcmRRLngxICsgbGluZUN1cnZlWDtcbiAgICAgICAgY29vcmRRLnkgPSBjb29yZFEueTE7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyaWdodC1hYm92ZSc6XG4gICAgICAgIGNvb3JkUS54MSA9IHN0YXJ0LnggKyBsaW5lQ3VydmVYO1xuICAgICAgICBjb29yZFEueTEgPSBzdGFydC55O1xuICAgICAgICBjb29yZFEueCA9IGNvb3JkUS54MTtcbiAgICAgICAgY29vcmRRLnkgPSBjb29yZFEueTEgLSBsaW5lQ3VydmVZO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYWJvdmUtbGVmdCc6XG4gICAgICAgIGNvb3JkUS54MSA9IHN0YXJ0Lng7XG4gICAgICAgIGNvb3JkUS55MSA9IHN0YXJ0LnkgLSBsaW5lQ3VydmVZO1xuICAgICAgICBjb29yZFEueCA9IGNvb3JkUS54MSAtIGxpbmVDdXJ2ZVg7XG4gICAgICAgIGNvb3JkUS55ID0gY29vcmRRLnkxO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbGVmdC11bmRlcic6XG4gICAgICAgIGNvb3JkUS54MSA9IHN0YXJ0LnggLSBsaW5lQ3VydmVYO1xuICAgICAgICBjb29yZFEueTEgPSBzdGFydC55O1xuICAgICAgICBjb29yZFEueCA9IGNvb3JkUS54MTtcbiAgICAgICAgY29vcmRRLnkgPSBjb29yZFEueTEgKyBsaW5lQ3VydmVZO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvb3JkUTtcbiAgfVxuXG4gIC8qKlRyw6FuaCBraOG7kWkgcGjDrWEgYsOqbiBwaOG6o2kgKi9cbiAgc3RhdGljIGJ5UGFzc0VsZW1lbnRPblJpZ2h0U2lkZShzdGFydFg6IG51bWJlciwgc3RhcnRZOiBudW1iZXIsIGVuZFk6IG51bWJlciwgbGluZUN1cnZlOiBudW1iZXIsIGVsZW1lbnRCbG9ja1JvYWQ6IElSZWN0LCBkaXJlY3Rpb25YOiBzdHJpbmcsIHNlcGFyYXRlZFBvaW50czogQXJyYXk8SVBvaW50cz4sIGtleT86IHN0cmluZywgY29vcmRMWD86IG51bWJlcikge1xuICAgIGNvbnN0IHRvcEVsZW1lbnRCbG9ja1JvYWQgPSAoZWxlbWVudEJsb2NrUm9hZC55ID8/IDApO1xuICAgIGNvbnN0IGJvdHRvbUVsZW1lbnRCbG9ja1JvYWQgPSAoZWxlbWVudEJsb2NrUm9hZC55ID8/IDApICsgKGVsZW1lbnRCbG9ja1JvYWQuaGVpZ2h0ID8/IDApO1xuICAgIGNvbnN0IGRpcmVjdGlvblkgPSB0aGlzLmNoZWNrVXBEb3duTGVmdFJpZ2h0KHN0YXJ0WSwgZW5kWSwgJ3knKTtcbiAgICBjb25zdCBRMSA9IHRoaXMuZHJhd0xpbmVRKHsgeDogc3RhcnRYLCB5OiBzdGFydFkgPz8gMCB9LCBgJHtkaXJlY3Rpb25YfS0ke2RpcmVjdGlvblkgPT09ICd1bmRlcicgPyAndW5kZXInIDogJ2Fib3ZlJ31gLCBsaW5lQ3VydmUsIGxpbmVDdXJ2ZSk7XG4gICAgY29uc3QgTDEgPSB7XG4gICAgICB4OiBRMS54ID8/IDAsXG4gICAgICB5OiAoZGlyZWN0aW9uWSA9PT0gJ3VuZGVyJyA/IGJvdHRvbUVsZW1lbnRCbG9ja1JvYWQgOiB0b3BFbGVtZW50QmxvY2tSb2FkKVxuICAgIH07XG5cbiAgICBpZiAoTW9DYW52YXNDb25uZWN0TmF2aWdhdGlvbk5ld0VsZW1lbnRVdGlsLlNUQVJUX01PREUgIT09ICdib3R0b20tbGVmdCcpIHtcbiAgICAgIGlmICgoZGlyZWN0aW9uWSA9PT0gJ3VuZGVyJyAmJiBib3R0b21FbGVtZW50QmxvY2tSb2FkIC0gKFExLnkgPz8gMCkgPD0gMClcbiAgICAgICAgfHwgKGRpcmVjdGlvblkgPT09ICdhYm92ZScgJiYgdG9wRWxlbWVudEJsb2NrUm9hZCAtIChRMS55ID8/IDApID49IDApKSB7XG4gICAgICAgIEwxLnkgPSBRMS55ID8/IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChNYXRoLmFicygoTDEueSA/PyAwKSAtIGVuZFkpIDw9IDEwKSB7XG4gICAgICAgIEwxLnkgPSBNb0NhbnZhc0NhbGN1bGF0b3JCcmFuY2hVdGlsLm1hdGhPcGVyYXRvcnNDYWxjdWxhdGlvbihkaXJlY3Rpb25YLCBMMS55LCBsaW5lQ3VydmUpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBRMiA9IHRoaXMuZHJhd0xpbmVRKHsgeDogTDEueCwgeTogTDEueSA/PyAwIH0sIGAke2RpcmVjdGlvblkgPT09ICd1bmRlcicgPyAndW5kZXInIDogJ2Fib3ZlJ30tJHtkaXJlY3Rpb25YfWAsIGxpbmVDdXJ2ZSwgbGluZUN1cnZlKTtcblxuICAgIGNvbnN0IHBhdGhRMSA9IGBRICR7UTEueDF9LCR7UTEueTF9ICR7UTEueH0sJHtRMS55fSBMICR7TDEueH0gJHtMMS55fWA7XG4gICAgY29uc3QgcGF0aFEyID0gYFEgJHtRMi54MX0sJHtRMi55MX0gJHtRMi54fSwke1EyLnl9YDtcblxuICAgIHNlcGFyYXRlZFBvaW50cy5wdXNoKHsgc3RhcnQ6IHsgeDogY29vcmRMWCA/PyBzdGFydFgsIHk6IHN0YXJ0WSB9LCBlbmQ6IHsgeDogUTEueCA/PyAwLCB5OiBRMS55ID8/IDAgfSwgbW9kZTogJ2hvcml6b250YWwtc2luZ2xlLWN1cnZlJywgaWQ6IGtleSwgbmFtZTogJ3FyJyB9KTtcbiAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiB7IHg6IFExLnggPz8gMCwgeTogUTEueSA/PyAwIH0sIGVuZDogeyB4OiBMMS54ID8/IDAsIHk6IEwxLnkgfSwgbW9kZTogJ2hvcml6b250YWwnLCBpZDoga2V5LCBuYW1lOiAnbHInIH0pO1xuICAgIHNlcGFyYXRlZFBvaW50cy5wdXNoKHsgc3RhcnQ6IHsgeDogTDEueCA/PyAwLCB5OiBMMS55IH0sIGVuZDogeyB4OiBRMi54ID8/IDAsIHk6IFEyLnkgPz8gMCB9LCBtb2RlOiAndmVydGljYWwtc2luZ2xlLWN1cnZlJywgaWQ6IGtleSwgbmFtZTogJ3EycicgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aEJ5UGFzc1E6IGAke3BhdGhRMX0gJHtwYXRoUTJ9YCxcbiAgICAgIGVuZFBhdGg6IHtcbiAgICAgICAgeDogUTIueCA/PyAwLFxuICAgICAgICB5OiBRMi55ID8/IDBcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqVHLDoW5oIGto4buRaSBwaMOtYSBiw6puIHRyw6puICovXG4gIHN0YXRpYyBieVBhc3NFbGVtZW50T25Ub3BCb3R0b21TaWRlKHN0YXJ0WDogbnVtYmVyLCBzdGFydFk6IG51bWJlciwgZW5kWDogbnVtYmVyLCBsaW5lQ3VydmU6IG51bWJlciwgZWxlbWVudEJsb2NrUm9hZDogSVJlY3QsIGRpcmVjdGlvblk6IHN0cmluZywgc2VwYXJhdGVkUG9pbnRzOiBBcnJheTxJUG9pbnRzPiwga2V5Pzogc3RyaW5nKSB7XG4gICAgY29uc3QgbGVmdEVsZW1lbnRCbG9ja1JvYWQgPSAoZWxlbWVudEJsb2NrUm9hZC54ID8/IDApO1xuICAgIGNvbnN0IHJpZ2h0RWxlbWVudEJsb2NrUm9hZCA9IChlbGVtZW50QmxvY2tSb2FkLnggPz8gMCkgKyAoZWxlbWVudEJsb2NrUm9hZC53aWR0aCA/PyAwKTtcbiAgICBjb25zdCBkaXJlY3Rpb25YID0gdGhpcy5jaGVja1VwRG93bkxlZnRSaWdodChzdGFydFgsIGVuZFgsICd4JykgPT09ICdsZWZ0JyA/ICdsZWZ0JyA6ICdyaWdodCc7IC8vIHhlbSBuw6puIHRyw6FuaCBzYW5nIHRyw6FpIGhheSBwaOG6o2lcblxuICAgIGNvbnN0IFExID0gdGhpcy5kcmF3TGluZVEoeyB4OiBzdGFydFgsIHk6IHN0YXJ0WSA/PyAwIH0sIGAke2RpcmVjdGlvbll9LSR7ZGlyZWN0aW9uWH1gLCBsaW5lQ3VydmUsIGxpbmVDdXJ2ZSk7XG4gICAgY29uc3QgTDEgPSB7XG4gICAgICB4OiAoZGlyZWN0aW9uWCA9PT0gJ2xlZnQnID8gbGVmdEVsZW1lbnRCbG9ja1JvYWQgOiByaWdodEVsZW1lbnRCbG9ja1JvYWQpLFxuICAgICAgeTogUTEueSA/PyAwXG4gICAgfTtcblxuICAgIGlmICgoZGlyZWN0aW9uWCA9PT0gJ3JpZ2h0JyAmJiByaWdodEVsZW1lbnRCbG9ja1JvYWQgLSAoUTEueCA/PyAwKSA8PSAwKSB8fCAoZGlyZWN0aW9uWCA9PT0gJ2xlZnQnICYmIGxlZnRFbGVtZW50QmxvY2tSb2FkIC0gKFExLnggPz8gMCkgPj0gMCkpIHtcbiAgICAgIEwxLnggPSBRMS54ID8/IDA7XG4gICAgfVxuICAgIGNvbnN0IFEyID0gdGhpcy5kcmF3TGluZVEoeyB4OiBMMS54LCB5OiBMMS55ID8/IDAgfSwgYCR7ZGlyZWN0aW9uWH0tJHtkaXJlY3Rpb25ZfWAsIGxpbmVDdXJ2ZSwgbGluZUN1cnZlKTtcblxuICAgIGlmIChNYXRoLmFicygoUTIueCA/PyAwKSAtIGxlZnRFbGVtZW50QmxvY2tSb2FkKSA8PSAxMCkge1xuICAgICAgUTIueCA9IE1vQ2FudmFzQ2FsY3VsYXRvckJyYW5jaFV0aWwubWF0aE9wZXJhdG9yc0NhbGN1bGF0aW9uKGRpcmVjdGlvblgsIFEyLngsIGxpbmVDdXJ2ZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aFExID0gYFEgJHtRMS54MX0sJHtRMS55MX0gJHtRMS54fSwke1ExLnl9IEwgJHtMMS54fSAke0wxLnl9YDtcbiAgICBjb25zdCBwYXRoUTIgPSBgUSAke1EyLngxfSwke1EyLnkxfSAke1EyLnh9LCR7UTIueX1gO1xuXG4gICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogeyB4OiBzdGFydFgsIHk6IHN0YXJ0WSB9LCBlbmQ6IHsgeDogUTEueCA/PyAwLCB5OiBRMS55ID8/IDAgfSwgbW9kZTogJ3ZlcnRpY2FsLXNpbmdsZS1jdXJ2ZScsIGlkOiBrZXkgPz8gJ3FiJyB9KTtcbiAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiB7IHg6IFExLnggPz8gMCwgeTogUTEueSA/PyAwIH0sIGVuZDogeyB4OiBMMS54ID8/IDAsIHk6IEwxLnkgPz8gMCB9LCBtb2RlOiAnaG9yaXpvbnRhbC1zaW5nbGUtY3VydmUnLCBpZDoga2V5ID8/ICdsYicgfSk7XG4gICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogeyB4OiBMMS54ID8/IDAsIHk6IEwxLnkgPz8gMCB9LCBlbmQ6IHsgeDogUTIueCA/PyAwLCB5OiBRMi55ID8/IDAgfSwgbW9kZTogJ2hvcml6b250YWwtc2luZ2xlLWN1cnZlJywgaWQ6IGtleSA/PyAncTJiJyB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBwYXRoQnlQYXNzUTogYCR7cGF0aFExfSAke3BhdGhRMn1gLFxuICAgICAgZW5kUGF0aDoge1xuICAgICAgICB4OiBRMi54ID8/IDAsXG4gICAgICAgIHk6IFEyLnkgPz8gMFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBraeG7g20gdHJhIMSRxrDhu51uZyB0aOG6s25nIHbDoCBraOG7kWkgY8OzIGPhuq90IG5oYXUga2jDtG5nXG4gIHN0YXRpYyBjaGVja0xpbmVQYXNzQmxvY2tIb3Jpem9udGFsKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCB4T3JZT2ZMaW5lOiBudW1iZXIsIGRpcmVjdGlvbjogJ3gnIHwgJ3knLCBvYnN0YWNsZVJlY3Q6IElSZWN0W10sIHJldHVybkFsbEVsZW1lbnRCbG9ja1JvYWQ/OiBib29sZWFuKSB7XG4gICAgY29uc3QgbWluaW11bURpc3RhbmNlRnJvbUJsb2NrID0gODtcblxuICAgIHN0YXJ0ICs9IG1pbmltdW1EaXN0YW5jZUZyb21CbG9jayArIDE7IC8vIHRyw6FuaCBraOG7kWkgeHXhuqV0IHBow6F0IHbDoG8gbGlzdFxuICAgIGNvbnN0IGxpc3RQb2ludHNPZkxpbmUgPSByYW5nZShzdGFydCwgZW5kICsgMSk7XG5cbiAgICBjb25zdCBlbGVtZW50QmxvY2tSb2FkID0gb2JzdGFjbGVSZWN0LmZpbHRlcihpdGVtID0+IHtcbiAgICAgIGNvbnN0IGxlZnQgPSAoaXRlbS54ID8/IDApIC0gbWluaW11bURpc3RhbmNlRnJvbUJsb2NrO1xuICAgICAgY29uc3QgcmlnaHQgPSAoaXRlbS54ID8/IDApICsgKGl0ZW0ud2lkdGggPz8gMCkgKyBtaW5pbXVtRGlzdGFuY2VGcm9tQmxvY2s7XG4gICAgICBjb25zdCB0b3AgPSAoaXRlbS55ID8/IDApIC0gbWluaW11bURpc3RhbmNlRnJvbUJsb2NrO1xuICAgICAgY29uc3QgYm90dG9tID0gKGl0ZW0ueSA/PyAwKSArIChpdGVtLmhlaWdodCA/PyAwKSArIG1pbmltdW1EaXN0YW5jZUZyb21CbG9jaztcblxuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3gnICYmIGxpc3RQb2ludHNPZkxpbmUuZmluZChlbCA9PiAobGVmdCA8PSBlbCAmJiBlbCA8PSByaWdodCkpICYmICh0b3AgPD0geE9yWU9mTGluZSAmJiB4T3JZT2ZMaW5lIDw9IGJvdHRvbSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoZGlyZWN0aW9uID09PSAneScgJiYgbGlzdFBvaW50c09mTGluZS5maW5kKGVsID0+ICh0b3AgPD0gZWwgJiYgZWwgPD0gYm90dG9tKSkgJiYgKGxlZnQgPD0geE9yWU9mTGluZSAmJiB4T3JZT2ZMaW5lIDw9IHJpZ2h0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuXG4gICAgaWYgKCFlbGVtZW50QmxvY2tSb2FkIHx8ICFlbGVtZW50QmxvY2tSb2FkLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAocmV0dXJuQWxsRWxlbWVudEJsb2NrUm9hZCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnRCbG9ja1JvYWQ7XG4gICAgfVxuXG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3knKSB7XG4gICAgICByZXR1cm4gZWxlbWVudEJsb2NrUm9hZC5yZWR1Y2UoKGE6IElSZWN0LCBiOiBJUmVjdCkgPT4gKE1hdGguYWJzKCgoYS55ID8/IDApIC0gc3RhcnQpKSkgPCAoTWF0aC5hYnMoKChiLnkgPz8gMCkgLSBzdGFydCkpKSA/IGEgOiBiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudEJsb2NrUm9hZC5yZWR1Y2UoKGE6IElSZWN0LCBiOiBJUmVjdCkgPT4gKE1hdGguYWJzKCgoYS54ID8/IDApIC0gc3RhcnQpKSkgPCAoTWF0aC5hYnMoKChiLnggPz8gMCkgLSBzdGFydCkpKSA/IGEgOiBiKTtcbiAgfVxuXG4gIC8vIGtp4buDbSB0cmEgaMaw4bubbmcgdGjhurNuZyB24bq9IHbhu4EgxJFp4buDbSBlbmQgeGVtIGPDsyBi4buLIGNo4bqvbiBi4bufaSBraOG7kWkgbsOgbyBraMO0bmcsIG7hur91IGPDsyB0aMOsIHBo4bqjaSBsw7lpIGzhuqFpIMSRaeG7g20gZW5kIG5ow6kuXG4gIHN0YXRpYyBjaGVja0Jsb2Nrc0VsZW1lbnRTdHJhaWdodFkoc3RhcnRYOiBudW1iZXIsIHN0YXJ0WTogbnVtYmVyLCBlbmRQb3NpdGlvbjogeyB4OiBudW1iZXIsIHk6IG51bWJlciB9LCBvYnN0YWNsZVJlY3Q6IElSZWN0W10pIHtcbiAgICBjb25zdCBlbGVtZW50QmxvY2tSb2FkID0gdGhpcy5jaGVja0xpbmVQYXNzQmxvY2tIb3Jpem9udGFsKHN0YXJ0WSwgZW5kUG9zaXRpb24ueSwgc3RhcnRYLCAneScsIG9ic3RhY2xlUmVjdCwgdHJ1ZSkgYXMgSVJlY3RbXTtcblxuICAgIGlmICghZWxlbWVudEJsb2NrUm9hZCB8fCAhZWxlbWVudEJsb2NrUm9hZC5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudEJsb2NrUm9hZC5yZWR1Y2UoKGE6IElSZWN0LCBiOiBJUmVjdCkgPT4gKE1hdGguYWJzKChhLnggPz8gMCAtIHN0YXJ0WCkpKSA8IChNYXRoLmFicygoYi54ID8/IDAgLSBzdGFydFgpKSkgPyBhIDogYik7XG4gIH1cblxuICAvLyBraeG7g20gdHJhIGjGsOG7m25nIG5nYW5nIHbhur0gduG7gSDEkWnhu4NtIGVuZCB4ZW0gY8OzIGLhu4sgY2jhuq9uIGLhu59pIGto4buRaSBuw6BvIGtow7RuZywgbuG6v3UgY8OzIHRow6wgcGjhuqNpIGzDuWkgbOG6oWkgxJFp4buDbSBlbmQgbmjDqS5cbiAgc3RhdGljIGNoZWNrQmxvY2tzRWxlbWVudFgoc3RhcnRYOiBudW1iZXIsIHN0YXJ0WTogbnVtYmVyLCBlbmRQb3NpdGlvbjogeyB4OiBudW1iZXIsIHk6IG51bWJlciB9LCBvYnN0YWNsZVJlY3Q6IElSZWN0W10pIHtcbiAgICBjb25zdCBlbGVtZW50QmxvY2tSb2FkID0gdGhpcy5jaGVja0xpbmVQYXNzQmxvY2tIb3Jpem9udGFsKHN0YXJ0WCwgZW5kUG9zaXRpb24ueCwgc3RhcnRZLCAneCcsIG9ic3RhY2xlUmVjdCwgdHJ1ZSkgYXMgSVJlY3RbXTtcblxuICAgIGlmICghZWxlbWVudEJsb2NrUm9hZCB8fCAhZWxlbWVudEJsb2NrUm9hZC5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudEJsb2NrUm9hZC5yZWR1Y2UoKGE6IElSZWN0LCBiOiBJUmVjdCkgPT4gKE1hdGguYWJzKCgoYS55ID8/IDApIC0gc3RhcnRZKSkpIDwgKE1hdGguYWJzKCgoYi55ID8/IDApIC0gc3RhcnRZKSkpID8gYSA6IGIpO1xuICB9XG5cbiAgLy8ga2nhu4NtIHRyYSBoxrDhu5tuZyBzYW5nIHBo4bqjaSBsw6AgdHLDoW5oIGto4buRaVxuICBzdGF0aWMgY2hlY2tBbmRBdm9pZEJsb2Nrc0xlZnQoc3RhcnRYOiBudW1iZXIsIHN0YXJ0WTogbnVtYmVyLCBsaW5lQ3VydmU6IG51bWJlciwgZW5kUG9zaXRpb246IElQb3NpdGlvblhZLCBvYnN0YWNsZVJlY3Q6IElSZWN0W10sIHNlcGFyYXRlZFBvaW50czogQXJyYXk8SVBvaW50cz4pOiBJUG9pbnQge1xuICAgIGNvbnN0IGNvb3JkTFg6IElQb2ludCA9IHsgeDogZW5kUG9zaXRpb24ueCwgeTogc3RhcnRZIH07XG4gICAgY29uc3QgZWxlbWVudEJsb2NrUm9hZCA9IHRoaXMuY2hlY2tMaW5lUGFzc0Jsb2NrSG9yaXpvbnRhbChzdGFydFgsIGVuZFBvc2l0aW9uLngsIHN0YXJ0WSwgJ3gnLCBvYnN0YWNsZVJlY3QpIGFzIElSZWN0O1xuXG4gICAgaWYgKCFlbGVtZW50QmxvY2tSb2FkKSB7XG4gICAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiB7IHg6IHN0YXJ0WCwgeTogc3RhcnRZIH0sIGVuZDogY29vcmRMWCwgbW9kZTogJ2hvcml6b250YWwnLCBpZDogJzE0JyB9KTtcblxuICAgICAgcmV0dXJuIGNvb3JkTFg7XG4gICAgfVxuXG4gICAgY29uc3QgZGlyZWN0aW9uWCA9IE1vQ2FudmFzQ2FsY3VsYXRvckRpcmVjdGlvbkVsZW1lbnRVdGlsLmNoZWNrVXBEb3duTGVmdFJpZ2h0KHN0YXJ0WCwgZW5kUG9zaXRpb24ueCwgJ3gnKTtcbiAgICBjb25zdCBzcGVjaWZpY1hFbGVtZW50ID0gZGlyZWN0aW9uWCA9PT0gJ3JpZ2h0JyA/IChlbGVtZW50QmxvY2tSb2FkLnggPz8gMCkgOiAoKGVsZW1lbnRCbG9ja1JvYWQueCA/PyAwKSArIChlbGVtZW50QmxvY2tSb2FkLndpZHRoID8/IDApKTtcblxuICAgIGNvb3JkTFgueCA9IHNwZWNpZmljWEVsZW1lbnQgKyAoTW9DYW52YXNDb25uZWN0TmF2aWdhdGlvbk5ld0VsZW1lbnRVdGlsLkVMRU1FTlRfTUFSR0lOX0JFVFdFRU5fQlJBTkNIX0RFRkFVTFQgLyAyKSArIChsaW5lQ3VydmUgLyAyKTtcbiAgICBpZiAoZGlyZWN0aW9uWCA9PT0gJ3JpZ2h0Jykge1xuICAgICAgY29vcmRMWC54ID0gc3BlY2lmaWNYRWxlbWVudCAtIChNb0NhbnZhc0Nvbm5lY3ROYXZpZ2F0aW9uTmV3RWxlbWVudFV0aWwuRUxFTUVOVF9NQVJHSU5fQkVUV0VFTl9CUkFOQ0hfREVGQVVMVCAvIDIpIC0gKGxpbmVDdXJ2ZSAvIDIpO1xuICAgIH1cblxuICAgIGxldCBzdGFydFhCeXBhc3NFbGVtZW50ID0gY29vcmRMWC54O1xuXG4gICAgaWYgKChkaXJlY3Rpb25YID09PSAnbGVmdCcgJiYgc3RhcnRYIC0gKGNvb3JkTFgueCA/PyAwKSA8PSAwKSB8fCAoZGlyZWN0aW9uWCA9PT0gJ3JpZ2h0JyAmJiBzdGFydFggLSAoY29vcmRMWC54ID8/IDApID49IDApKSB7XG4gICAgICBjb29yZExYLnggPSBzdGFydFg7XG4gICAgICBzdGFydFhCeXBhc3NFbGVtZW50ID0gTW9DYW52YXNDYWxjdWxhdG9yQnJhbmNoVXRpbC5tYXRoT3BlcmF0b3JzQ2FsY3VsYXRpb24oZGlyZWN0aW9uWCwgY29vcmRMWC54LCBsaW5lQ3VydmUpO1xuICAgIH1cblxuICAgIGxldCBsaW5lQnlQYXNzQmxvY2s6IElQb2ludHNbXSA9IFtdO1xuICAgIGxldCB7IGVuZFBhdGggfSA9IE1vQ2FudmFzQ2FsY3VsYXRvckRpcmVjdGlvbkVsZW1lbnRVdGlsLmJ5UGFzc0VsZW1lbnRPblJpZ2h0U2lkZShzdGFydFhCeXBhc3NFbGVtZW50ID8/IDAsIGNvb3JkTFgueSA/PyAwLCBlbmRQb3NpdGlvbi55LCBsaW5lQ3VydmUsIGVsZW1lbnRCbG9ja1JvYWQsIGRpcmVjdGlvblgsIGxpbmVCeVBhc3NCbG9jaywgdW5kZWZpbmVkLCBjb29yZExYLngpO1xuXG4gICAgaWYgKE1vQ2FudmFzQ29ubmVjdE5hdmlnYXRpb25OZXdFbGVtZW50VXRpbC5TVEFSVF9NT0RFID09PSAnYm90dG9tLWxlZnQnICYmIGVsZW1lbnRCbG9ja1JvYWQueCArIChlbGVtZW50QmxvY2tSb2FkLndpZHRoKSAvIDIgPT09IGVuZFBvc2l0aW9uLnggJiYgTWF0aC5hYnMoZW5kUG9zaXRpb24ueSAtIGVsZW1lbnRCbG9ja1JvYWQueSkgPD0gMjApIHsgLy8gY2hlY2sgeGVtIGto4buRaSBjaOG6r24gY8OzIHBo4bqjaSBsw6Aga2jhu5FpIMSRw61jaCBoYXkga2jDtG5nP1xuICAgICAgbGluZUJ5UGFzc0Jsb2NrID0gW107XG4gICAgICBjb25zdCBkYXRhID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuYnlQYXNzRWxlbWVudE9uUmlnaHRTaWRlTmV3TW9kZShzdGFydFhCeXBhc3NFbGVtZW50ID8/IDAsIGNvb3JkTFgueSA/PyAwLCBlbmRQb3NpdGlvbi55LCBsaW5lQnlQYXNzQmxvY2ssIHVuZGVmaW5lZCwgY29vcmRMWC54KTtcblxuICAgICAgZW5kUGF0aCA9IGRhdGEuZW5kUGF0aDtcbiAgICB9XG4gICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goLi4ubGluZUJ5UGFzc0Jsb2NrKTtcbiAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiB7IHg6IHN0YXJ0WCwgeTogc3RhcnRZIH0sIGVuZDogY29vcmRMWCwgbW9kZTogJ2hvcml6b250YWwnLCBpZDogJzE1JyB9KTtcbiAgICBjb25zdCBkYXRhRW5kUGF0aCA9IHRoaXMuY2hlY2tBbmRBdm9pZEJsb2Nrc0xlZnQoZW5kUGF0aC54ID8/IDAsIGVuZFBhdGgueSA/PyAwLCBsaW5lQ3VydmUsIGVuZFBvc2l0aW9uLCBvYnN0YWNsZVJlY3QsIHNlcGFyYXRlZFBvaW50cyk7XG5cbiAgICByZXR1cm4gZGF0YUVuZFBhdGg7XG4gIH1cblxuICAvLyBraeG7g20gdHJhIGjGsOG7m25nIHNhbmcgcGjhuqNpIGzDoCB0csOhbmgga2jhu5FpXG4gIHN0YXRpYyBjaGVja0FuZEF2b2lkQmxvY2tzKHN0YXJ0WDogbnVtYmVyLCBzdGFydFk6IG51bWJlciwgbGluZUN1cnZlOiBudW1iZXIsIGVuZFBvc2l0aW9uOiB7IHg6IG51bWJlciwgeTogbnVtYmVyIH0sIG9ic3RhY2xlUmVjdDogSVJlY3RbXSwgc2VwYXJhdGVkUG9pbnRzOiBBcnJheTxJUG9pbnRzPiwgcGF0aFByZT86IHN0cmluZyk6IHsgcGF0aDogc3RyaW5nLCBlbmRQYXRoOiBJUG9pbnQgfSB7XG4gICAgY29uc3QgY29vcmRMWDogSVBvaW50ID0geyB4OiBlbmRQb3NpdGlvbi54IC0gMzAsIHk6IHN0YXJ0WSB9O1xuICAgIGNvbnN0IGVsZW1lbnRCbG9ja1JvYWQgPSB0aGlzLmNoZWNrTGluZVBhc3NCbG9ja0hvcml6b250YWwoc3RhcnRYLCBlbmRQb3NpdGlvbi54LCBzdGFydFksICd4Jywgb2JzdGFjbGVSZWN0KSBhcyBJUmVjdDtcblxuICAgIGlmICghZWxlbWVudEJsb2NrUm9hZCkge1xuICAgICAgY29uc3QgZWxlbWVudEJsb2NrUm9hZFN0cmFpZ2h0TGluZVkgPSB0aGlzLmNoZWNrQmxvY2tzRWxlbWVudFN0cmFpZ2h0WSgoY29vcmRMWC54ID8/IDApICsgMTAsIGNvb3JkTFgueSA/PyAwLCBlbmRQb3NpdGlvbiwgb2JzdGFjbGVSZWN0KTsgLy8gdMOtbmggxJFp4buDbSBlbmRfeCBk4buxIGtp4bq/biB0aGVvIHRyxrDhu51uZyBo4bujcCDEkeG6uXAgbmjhuqV0IHhlbSBuw7MgY8OzIGNo4bqvbiBi4bufaSBraOG7kWkgbsOgbyBraGkga8OpbyB4deG7kW5nIGtow7RuZ1xuXG4gICAgICBpZiAoZWxlbWVudEJsb2NrUm9hZFN0cmFpZ2h0TGluZVkgJiYgKGVsZW1lbnRCbG9ja1JvYWRTdHJhaWdodExpbmVZLnggPz8gMCkgPiBzdGFydFgpIHtcbiAgICAgICAgbGV0IHRvWCA9IChlbGVtZW50QmxvY2tSb2FkU3RyYWlnaHRMaW5lWS54ID8/IDApIC0gKE1vQ2FudmFzQ29ubmVjdE5hdmlnYXRpb25OZXdFbGVtZW50VXRpbC5FTEVNRU5UX01BUkdJTl9CRVRXRUVOX0JSQU5DSF9ERUZBVUxUIC8gMikgLSAobGluZUN1cnZlIC8gMik7XG5cbiAgICAgICAgaWYgKCgoZWxlbWVudEJsb2NrUm9hZFN0cmFpZ2h0TGluZVk/LnggPz8gMCkgLSBzdGFydFgpIDwgTW9DYW52YXNDb25uZWN0TmF2aWdhdGlvbk5ld0VsZW1lbnRVdGlsLkVMRU1FTlRfTUFSR0lOX0JFVFdFRU5fQlJBTkNIX0RFRkFVTFQpIHtcbiAgICAgICAgICB0b1ggPSAoZWxlbWVudEJsb2NrUm9hZFN0cmFpZ2h0TGluZVkueCA/PyAwKSAtICgoKGVsZW1lbnRCbG9ja1JvYWRTdHJhaWdodExpbmVZPy54ID8/IDApIC0gc3RhcnRYKSAvIDIpO1xuICAgICAgICB9XG4gICAgICAgIGNvb3JkTFgueCA9IHRvWDtcbiAgICAgIH1cblxuICAgICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogeyB4OiBzdGFydFgsIHk6IHN0YXJ0WSB9LCBlbmQ6IGNvb3JkTFgsIG1vZGU6ICdob3Jpem9udGFsJywgaWQ6ICdjaGVja0FuZEF2b2lkQmxvY2tzJywgbmFtZTogJ2VuZCcgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdGg6IHBhdGhQcmUgPyBgJHtwYXRoUHJlfSBMICR7Y29vcmRMWC54fSAke2Nvb3JkTFgueX1gIDogYEwgJHtjb29yZExYLnh9ICR7Y29vcmRMWC55fWAsXG4gICAgICAgIGVuZFBhdGg6IGNvb3JkTFhcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGRpcmVjdGlvblggPSBNb0NhbnZhc0NhbGN1bGF0b3JEaXJlY3Rpb25FbGVtZW50VXRpbC5jaGVja1VwRG93bkxlZnRSaWdodChzdGFydFgsIGVuZFBvc2l0aW9uLngsICd4Jyk7XG5cbiAgICBjb29yZExYLnggPSAoZWxlbWVudEJsb2NrUm9hZC54ID8/IDApIC0gKE1vQ2FudmFzQ29ubmVjdE5hdmlnYXRpb25OZXdFbGVtZW50VXRpbC5FTEVNRU5UX01BUkdJTl9CRVRXRUVOX0JSQU5DSF9ERUZBVUxUIC8gMikgLSAobGluZUN1cnZlIC8gMik7XG5cbiAgICBsZXQgc2VwYXJhdGVkUG9pbnRzQnlQYXNzRWxlbWVudE9uUmlnaHRTaWRlOiBBcnJheTxJUG9pbnRzPiA9IFtdO1xuXG4gICAgY29uc3QgeyBwYXRoQnlQYXNzUSwgZW5kUGF0aCB9ID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuYnlQYXNzRWxlbWVudE9uUmlnaHRTaWRlKGNvb3JkTFgueCwgY29vcmRMWC55ID8/IDAsIGVuZFBvc2l0aW9uLnksIGxpbmVDdXJ2ZSwgZWxlbWVudEJsb2NrUm9hZCwgZGlyZWN0aW9uWCwgc2VwYXJhdGVkUG9pbnRzQnlQYXNzRWxlbWVudE9uUmlnaHRTaWRlLCAnY2hlY2tBbmRBdm9pZEJsb2NrcycsIGNvb3JkTFgueCk7XG4gICAgbGV0IGxpbmUgPSBwYXRoUHJlID8gYCR7cGF0aFByZX0gTCAke2Nvb3JkTFgueH0gJHtjb29yZExYLnl9ICR7cGF0aEJ5UGFzc1F9YCA6IGBMICR7Y29vcmRMWC54fSAke2Nvb3JkTFgueX0gJHtwYXRoQnlQYXNzUX1gO1xuXG4gICAgLy8gdMOtbmggdHLGsOG7m2MgdHLGsOG7nW5nIGjhu6NwIHNhdSDEkeG7gyBsw7lpIGxpbmVcbiAgICBjb25zdCBlbGVtZW50QmxvY2tSb2FkUHJlID0gdGhpcy5jaGVja0xpbmVQYXNzQmxvY2tIb3Jpem9udGFsKGVuZFBhdGgueCA/PyAwLCBlbmRQb3NpdGlvbi54LCBlbmRQYXRoLnkgPz8gMCwgJ3gnLCBvYnN0YWNsZVJlY3QpIGFzIElSZWN0O1xuXG4gICAgaWYgKCFlbGVtZW50QmxvY2tSb2FkUHJlKSB7XG4gICAgICBjb25zdCBlbGVtZW50QmxvY2tSb2FkU3RyYWlnaHRMaW5lWSA9IHRoaXMuY2hlY2tCbG9ja3NFbGVtZW50U3RyYWlnaHRZKChlbmRQb3NpdGlvbi54ID8/IDApICsgMTAsIGVuZFBhdGgueSA/PyAwLCBlbmRQb3NpdGlvbiwgb2JzdGFjbGVSZWN0KTtcblxuICAgICAgaWYgKGVsZW1lbnRCbG9ja1JvYWRTdHJhaWdodExpbmVZKSB7XG4gICAgICAgIGNvbnN0IFhOZXcgPSAoZWxlbWVudEJsb2NrUm9hZFN0cmFpZ2h0TGluZVkueCA/PyAwKSAtIChNb0NhbnZhc0Nvbm5lY3ROYXZpZ2F0aW9uTmV3RWxlbWVudFV0aWwuRUxFTUVOVF9NQVJHSU5fQkVUV0VFTl9CUkFOQ0hfREVGQVVMVCAvIDIpIC0gKGxpbmVDdXJ2ZSAvIDIpO1xuXG4gICAgICAgIGlmIChYTmV3IDwgKGVuZFBhdGgueCA/PyAwKSkge1xuICAgICAgICAgIHNlcGFyYXRlZFBvaW50c0J5UGFzc0VsZW1lbnRPblJpZ2h0U2lkZSA9IFtdO1xuICAgICAgICAgIHNlcGFyYXRlZFBvaW50cy5wdXNoKHsgc3RhcnQ6IHsgeDogc3RhcnRYLCB5OiBzdGFydFkgfSwgZW5kOiBjb29yZExYLCBtb2RlOiAnaG9yaXpvbnRhbCcsIGlkOiAnY2hlY2tBbmRBdm9pZEJsb2NrcycsIG5hbWU6ICd1JyB9KTtcblxuICAgICAgICAgIGxpbmUgPSBwYXRoUHJlID8gYCR7cGF0aFByZX0gTCAke2Nvb3JkTFgueH0gJHtjb29yZExYLnl9YCA6IGBMICR7Y29vcmRMWC54fSAke2Nvb3JkTFgueX1gO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhdGg6IGxpbmUsXG4gICAgICAgICAgICBlbmRQYXRoOiBjb29yZExYXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBzZXBhcmF0ZWRQb2ludHMuc3BsaWNlKHNlcGFyYXRlZFBvaW50cy5sZW5ndGgsIDAsIC4uLnNlcGFyYXRlZFBvaW50c0J5UGFzc0VsZW1lbnRPblJpZ2h0U2lkZSk7XG4gICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogeyB4OiBzdGFydFgsIHk6IHN0YXJ0WSB9LCBlbmQ6IGNvb3JkTFgsIG1vZGU6ICdob3Jpem9udGFsJywgaWQ6ICdjaGVja0FuZEF2b2lkQmxvY2tzJywgbmFtZTogJ3AnIH0pO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNoZWNrQW5kQXZvaWRCbG9ja3MoZW5kUGF0aC54ID8/IDAsIGVuZFBhdGgueSA/PyAwLCBsaW5lQ3VydmUsIGVuZFBvc2l0aW9uLCBvYnN0YWNsZVJlY3QsIHNlcGFyYXRlZFBvaW50cywgYCR7bGluZX1gLCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogZGF0YS5wYXRoLFxuICAgICAgZW5kUGF0aDogZGF0YS5lbmRQYXRoXG4gICAgfTtcbiAgfVxuXG4gIC8vIGtp4buDbSB0cmEgaMaw4bubbmcgdGjhurNuZyB2w6AgdHLDoW5oIGto4buRaVxuICBzdGF0aWMgY2hlY2tBbmRBdm9pZEJsb2Nrc1koc3RhcnRYOiBudW1iZXIsIHN0YXJ0WTogbnVtYmVyLCBsaW5lQ3VydmU6IG51bWJlciwgZW5kUG9zaXRpb246IHsgeDogbnVtYmVyLCB5OiBudW1iZXIgfSwgZGlyZWN0aW9uWTogc3RyaW5nLCBvYnN0YWNsZVJlY3Q6IElSZWN0W10sIHNlcGFyYXRlZFBvaW50czogQXJyYXk8SVBvaW50cz4sIHBhdGhQcmU/OiBzdHJpbmcpOiB7IHBhdGg6IHN0cmluZywgZW5kUGF0aDogSVBvaW50IH0ge1xuICAgIGNvbnN0IGNvb3JkTFg6IElQb2ludCA9IHsgeDogc3RhcnRYLCB5OiBlbmRQb3NpdGlvbi55IH07XG4gICAgY29uc3QgZWxlbWVudEJsb2NrUm9hZCA9IHRoaXMuY2hlY2tMaW5lUGFzc0Jsb2NrSG9yaXpvbnRhbChzdGFydFksIGVuZFBvc2l0aW9uLnksIHN0YXJ0WCwgJ3knLCBvYnN0YWNsZVJlY3QpIGFzIElSZWN0O1xuXG4gICAgaWYgKChkaXJlY3Rpb25ZID09PSAndW5kZXInICYmIHN0YXJ0WSA+IGVuZFBvc2l0aW9uLnkpIHx8IChkaXJlY3Rpb25ZID09PSAnYWJvdmUnICYmIHN0YXJ0WSA8IGVuZFBvc2l0aW9uLnkpKSB7XG4gICAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiB7IHg6IHN0YXJ0WCwgeTogc3RhcnRZIH0sIGVuZDogY29vcmRMWCwgbW9kZTogJ2hvcml6b250YWwnLCBpZDogJ2snIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoOiBwYXRoUHJlID8/ICcnLFxuICAgICAgICBlbmRQYXRoOiB7IHg6IHN0YXJ0WCwgeTogc3RhcnRZIH1cbiAgICAgIH07XG4gICAgfVxuICAgIGlmICghZWxlbWVudEJsb2NrUm9hZCkge1xuICAgICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogeyB4OiBzdGFydFgsIHk6IHN0YXJ0WSB9LCBlbmQ6IGNvb3JkTFgsIG1vZGU6ICdob3Jpem9udGFsJywgaWQ6ICdyJyB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aDogcGF0aFByZSA/IGAke3BhdGhQcmV9IEwgJHtjb29yZExYLnh9ICR7Y29vcmRMWC55fWAgOiBgTCAke2Nvb3JkTFgueH0gJHtjb29yZExYLnl9YCxcbiAgICAgICAgZW5kUGF0aDogY29vcmRMWFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB5ID0gZGlyZWN0aW9uWSA9PT0gJ2Fib3ZlJyA/IChlbGVtZW50QmxvY2tSb2FkLnkgPz8gMCkgKyAoZWxlbWVudEJsb2NrUm9hZC5oZWlnaHQgPz8gMCkgOiAoZWxlbWVudEJsb2NrUm9hZC55ID8/IDApO1xuXG4gICAgY29vcmRMWC55ID0gTW9DYW52YXNDYWxjdWxhdG9yQnJhbmNoVXRpbC5tYXRoT3BlcmF0b3JzQ2FsY3VsYXRpb24oZGlyZWN0aW9uWSwgeSwgbGluZUN1cnZlICogMik7XG5cbiAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiB7IHg6IHN0YXJ0WCwgeTogc3RhcnRZIH0sIGVuZDogY29vcmRMWCwgbW9kZTogJ2hvcml6b250YWwnLCBpZDogJ3JhJyB9KTtcbiAgICBjb25zdCB7IHBhdGhCeVBhc3NRLCBlbmRQYXRoIH0gPSBNb0NhbnZhc0NhbGN1bGF0b3JEaXJlY3Rpb25FbGVtZW50VXRpbC5ieVBhc3NFbGVtZW50T25Ub3BCb3R0b21TaWRlKGNvb3JkTFgueCA/PyAwLCBjb29yZExYLnkgPz8gMCwgZW5kUG9zaXRpb24ueCwgbGluZUN1cnZlLCBlbGVtZW50QmxvY2tSb2FkLCBkaXJlY3Rpb25ZLCBzZXBhcmF0ZWRQb2ludHMpO1xuXG4gICAgLy8gc2F1IGtoaSDEkcOjIHRyw6FuaCB0aMOsIHRp4bq/cCB04bulYyBrw6lvIGTDoGkgY2hvIHThu51pIMSRaeG7g20gZW5kIHgsIGzhuqFpIGtp4buDbSB0cmEgeGVtIGPDsyBraOG7kWkgbsOgbyBjaOG6r24ga2jDtG5nP1xuICAgIGNvbnN0IGxpbmUgPSBwYXRoUHJlID8gYCR7cGF0aFByZX0gTCAke2Nvb3JkTFgueH0gJHtjb29yZExYLnl9ICR7cGF0aEJ5UGFzc1F9YCA6IGBMICR7Y29vcmRMWC54fSAke2Nvb3JkTFgueX0gJHtwYXRoQnlQYXNzUX1gO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNoZWNrQW5kQXZvaWRCbG9ja3NZKGVuZFBhdGgueCA/PyAwLCBlbmRQYXRoLnkgPz8gMCwgbGluZUN1cnZlLCBlbmRQb3NpdGlvbiwgZGlyZWN0aW9uWSwgb2JzdGFjbGVSZWN0LCBzZXBhcmF0ZWRQb2ludHMsIGAke2xpbmV9YCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogZGF0YS5wYXRoLFxuICAgICAgZW5kUGF0aDogZGF0YS5lbmRQYXRoXG4gICAgfTtcbiAgfVxuXG4gIC8vIGtp4buDbSB0cmEgaMaw4bubbmcgdGjhurNuZyB2w6AgdHLDoW5oIGto4buRaVxuICBzdGF0aWMgY2hlY2tBbmRBdm9pZEJsb2Nrc1lMZWZ0KHN0YXJ0WDogbnVtYmVyLCBzdGFydFk6IG51bWJlciwgbGluZUN1cnZlOiBudW1iZXIsIGVuZFBvc2l0aW9uOiBJUG9zaXRpb25YWSwgZGlyZWN0aW9uWTogc3RyaW5nLCBvYnN0YWNsZVJlY3Q6IElSZWN0W10sIHNlcGFyYXRlZFBvaW50czogQXJyYXk8SVBvaW50cz4sIHBhdGhQcmU/OiBzdHJpbmcpOiB7IHBhdGg6IHN0cmluZywgZW5kUGF0aDogSVBvc2l0aW9uWFkgfSB7XG4gICAgY29uc3Qga2V5ID0gJ2NoZWNrQW5kQXZvaWRCbG9ja3NZTGVmdCc7XG5cbiAgICBjb25zdCBjb29yZExYOiBJUG9zaXRpb25YWSA9IHsgeDogc3RhcnRYLCB5OiBlbmRQb3NpdGlvbi55IH07XG4gICAgY29uc3QgZWxlbWVudEJsb2NrUm9hZCA9IE1vQ2FudmFzQ2FsY3VsYXRvckRpcmVjdGlvbkVsZW1lbnRVdGlsLmNoZWNrTGluZVBhc3NCbG9ja0hvcml6b250YWwoc3RhcnRZLCBlbmRQb3NpdGlvbi55LCBzdGFydFgsICd5Jywgb2JzdGFjbGVSZWN0KSBhcyBJUmVjdDtcblxuICAgIGlmICghZWxlbWVudEJsb2NrUm9hZCkge1xuICAgICAgY29uc3QgZWxlbWVudEJsb2NrUm9hZFN0cmFpZ2h0TGluZVggPSBNb0NhbnZhc0NhbGN1bGF0b3JEaXJlY3Rpb25FbGVtZW50VXRpbC5jaGVja0Jsb2Nrc0VsZW1lbnRYKGNvb3JkTFgueCA/PyAwLCAoY29vcmRMWC55ID8/IDApLCBlbmRQb3NpdGlvbiwgb2JzdGFjbGVSZWN0KTtcblxuICAgICAgaWYgKGVsZW1lbnRCbG9ja1JvYWRTdHJhaWdodExpbmVYKSB7XG4gICAgICAgIGNvbnN0IHRvcEVsZW1lbnRCbG9ja1JvYWQgPSAoZWxlbWVudEJsb2NrUm9hZFN0cmFpZ2h0TGluZVgueSA/PyAwKTtcbiAgICAgICAgY29uc3QgYm90dG9tRWxlbWVudEJsb2NrUm9hZCA9IChlbGVtZW50QmxvY2tSb2FkU3RyYWlnaHRMaW5lWC55ID8/IDApICsgKGVsZW1lbnRCbG9ja1JvYWRTdHJhaWdodExpbmVYLmhlaWdodCA/PyAwKTtcblxuICAgICAgICBsZXQgdG9ZID0gKGRpcmVjdGlvblkgPT09ICd1bmRlcicgPyB0b3BFbGVtZW50QmxvY2tSb2FkIDogYm90dG9tRWxlbWVudEJsb2NrUm9hZCk7XG5cbiAgICAgICAgdG9ZID0gTW9DYW52YXNDYWxjdWxhdG9yQnJhbmNoVXRpbC5tYXRoT3BlcmF0b3JzQ2FsY3VsYXRpb24oZGlyZWN0aW9uWSwgdG9ZLCBsaW5lQ3VydmUgKiAyKTtcblxuICAgICAgICBpZiAodG9ZID4gc3RhcnRZICYmIE1vQ2FudmFzQ29ubmVjdE5hdmlnYXRpb25OZXdFbGVtZW50VXRpbC5TVEFSVF9NT0RFICE9PSAnYm90dG9tLWxlZnQnKSB7XG4gICAgICAgICAgY29vcmRMWC55ID0gdG9ZO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNlcGFyYXRlZFBvaW50cy5wdXNoKHsgc3RhcnQ6IHsgeDogc3RhcnRYLCB5OiBzdGFydFkgfSwgZW5kOiBjb29yZExYLCBtb2RlOiAnaG9yaXpvbnRhbCcsIGlkOiBrZXksIG5hbWU6ICdhJyB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aDogcGF0aFByZSA/IGAke3BhdGhQcmV9IEwgJHtjb29yZExYLnh9ICR7Y29vcmRMWC55fWAgOiBgTCAke2Nvb3JkTFgueH0gJHtjb29yZExYLnl9YCxcbiAgICAgICAgZW5kUGF0aDogY29vcmRMWFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB5ID0gZGlyZWN0aW9uWSA9PT0gJ2Fib3ZlJyA/IChlbGVtZW50QmxvY2tSb2FkLnkgPz8gMCkgKyAoZWxlbWVudEJsb2NrUm9hZC5oZWlnaHQgPz8gMCkgOiAoZWxlbWVudEJsb2NrUm9hZC55ID8/IDApO1xuICAgIGNvbnN0IGVsZW1lbnRCbG9ja1JvYWRTdHJhaWdodExpbmVYID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tCbG9ja3NFbGVtZW50WChjb29yZExYLnggPz8gMCwgKGNvb3JkTFgueSA/PyAwKSwgZW5kUG9zaXRpb24sIG9ic3RhY2xlUmVjdCk7XG4gICAgbGV0IGlnbm9yZUJ5cGFzc0VsZW1lbnQgPSBmYWxzZTtcblxuICAgIGlmIChlbGVtZW50QmxvY2tSb2FkU3RyYWlnaHRMaW5lWCAmJiBlbGVtZW50QmxvY2tSb2FkU3RyYWlnaHRMaW5lWC5pZCA9PT0gZWxlbWVudEJsb2NrUm9hZC5pZCkge1xuICAgICAgaWdub3JlQnlwYXNzRWxlbWVudCA9IHRydWU7XG4gICAgfVxuICAgIGNvb3JkTFgueSA9IE1vQ2FudmFzQ2FsY3VsYXRvckJyYW5jaFV0aWwubWF0aE9wZXJhdG9yc0NhbGN1bGF0aW9uKGRpcmVjdGlvblksIHksIGxpbmVDdXJ2ZSAqIDIpO1xuXG4gICAgbGV0IHNlcGFyYXRlZFBvaW50c0J5UGFzc0VsZW1lbnRPblJpZ2h0U2lkZTogQXJyYXk8SVBvaW50cz4gPSBbXTtcblxuICAgIGNvbnN0IHsgcGF0aEJ5UGFzc1EsIGVuZFBhdGggfSA9IE1vQ2FudmFzQ2FsY3VsYXRvckRpcmVjdGlvbkVsZW1lbnRVdGlsLmJ5UGFzc0VsZW1lbnRPblRvcEJvdHRvbVNpZGUoY29vcmRMWC54ID8/IDAsIGNvb3JkTFgueSA/PyAwLCBlbmRQb3NpdGlvbi54LCBsaW5lQ3VydmUsIGVsZW1lbnRCbG9ja1JvYWQsIGRpcmVjdGlvblksIHNlcGFyYXRlZFBvaW50c0J5UGFzc0VsZW1lbnRPblJpZ2h0U2lkZSwga2V5KTtcbiAgICBsZXQgZW5kID0gY29vcmRMWDtcbiAgICBsZXQgbGluZSA9IHBhdGhQcmUgPyBgJHtwYXRoUHJlfSBMICR7Y29vcmRMWC54fSAke2Nvb3JkTFgueX1gIDogYEwgJHtjb29yZExYLnh9ICR7Y29vcmRMWC55fWA7XG5cbiAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiB7IHg6IHN0YXJ0WCwgeTogc3RhcnRZIH0sIGVuZDogY29vcmRMWCwgbW9kZTogJ2hvcml6b250YWwnLCBpZDoga2V5LCBuYW1lOiAnYicgfSk7XG5cbiAgICBpZiAoaWdub3JlQnlwYXNzRWxlbWVudCkge1xuICAgICAgc2VwYXJhdGVkUG9pbnRzQnlQYXNzRWxlbWVudE9uUmlnaHRTaWRlID0gW107XG4gICAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiBjb29yZExYLCBlbmQsIG1vZGU6ICdob3Jpem9udGFsJywgaWQ6IGtleSwgbmFtZTogJ2MnIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoOiBsaW5lLFxuICAgICAgICBlbmRQYXRoOiBlbmRcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZW5kID0gZW5kUGF0aDtcbiAgICBsaW5lICs9IGAgJHtwYXRoQnlQYXNzUX1gO1xuICAgIHNlcGFyYXRlZFBvaW50cy5zcGxpY2Uoc2VwYXJhdGVkUG9pbnRzLmxlbmd0aCwgMCwgLi4uc2VwYXJhdGVkUG9pbnRzQnlQYXNzRWxlbWVudE9uUmlnaHRTaWRlKTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5jaGVja0FuZEF2b2lkQmxvY2tzWUxlZnQoZW5kLnggPz8gMCwgZW5kLnkgPz8gMCwgbGluZUN1cnZlLCBlbmRQb3NpdGlvbiwgZGlyZWN0aW9uWSwgb2JzdGFjbGVSZWN0LCBzZXBhcmF0ZWRQb2ludHMsIGAke2xpbmV9YCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogZGF0YS5wYXRoLFxuICAgICAgZW5kUGF0aDogZGF0YS5lbmRQYXRoXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBieVBhc3NFbGVtZW50T25SaWdodFNpZGVOZXdNb2RlKHN0YXJ0WDogbnVtYmVyLCBzdGFydFk6IG51bWJlciwgZW5kWTogbnVtYmVyLCBzZXBhcmF0ZWRQb2ludHM6IEFycmF5PElQb2ludHM+LCBrZXk/OiBzdHJpbmcsIGNvb3JkTFg/OiBudW1iZXIpIHtcbiAgICBjb25zdCBzdGFydCA9IHsgeDogY29vcmRMWCA/PyBzdGFydFgsIHk6IHN0YXJ0WSB9O1xuICAgIGNvbnN0IGVuZCA9IHsgeDogKHN0YXJ0LnggPz8gMCkgLSAyMCwgeTogZW5kWSB9O1xuXG4gICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogc3RhcnQsIGVuZDogZW5kLCBtb2RlOiAnaG9yaXpvbnRhbCcsIGlkOiBrZXksIG5hbWU6ICdxMnInIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGhCeVBhc3NROiBgYCxcbiAgICAgIGVuZFBhdGg6IGVuZFxuICAgIH07XG4gIH1cbn0iXX0=