@ai-table/grid 0.0.11 → 0.0.13
Sign up to get free protection for your applications and to get access to all the features.
- package/angular-konva/components/container.component.d.ts +7 -0
- package/angular-konva/components/container.component.d.ts.map +1 -0
- package/angular-konva/components/container.token.d.ts +3 -0
- package/angular-konva/components/container.token.d.ts.map +1 -0
- package/angular-konva/components/index.d.ts +4 -0
- package/angular-konva/components/index.d.ts.map +1 -0
- package/angular-konva/components/shape.component.d.ts +61 -0
- package/angular-konva/components/shape.component.d.ts.map +1 -0
- package/angular-konva/components/stage.component.d.ts +40 -0
- package/angular-konva/components/stage.component.d.ts.map +1 -0
- package/angular-konva/index.d.ts +5 -0
- package/angular-konva/index.d.ts.map +1 -0
- package/angular-konva/interfaces/component.d.ts +49 -0
- package/angular-konva/interfaces/component.d.ts.map +1 -0
- package/angular-konva/interfaces/config.d.ts +26 -0
- package/angular-konva/interfaces/config.d.ts.map +1 -0
- package/angular-konva/interfaces/event-object.d.ts +7 -0
- package/angular-konva/interfaces/event-object.d.ts.map +1 -0
- package/angular-konva/interfaces/index.d.ts +5 -0
- package/angular-konva/interfaces/index.d.ts.map +1 -0
- package/angular-konva/interfaces/shape.d.ts +42 -0
- package/angular-konva/interfaces/shape.d.ts.map +1 -0
- package/angular-konva/utils/apply-node-props.d.ts +4 -0
- package/angular-konva/utils/apply-node-props.d.ts.map +1 -0
- package/angular-konva/utils/common.d.ts +8 -0
- package/angular-konva/utils/common.d.ts.map +1 -0
- package/angular-konva/utils/index.d.ts +5 -0
- package/angular-konva/utils/index.d.ts.map +1 -0
- package/angular-konva/utils/types.d.ts +4 -0
- package/angular-konva/utils/types.d.ts.map +1 -0
- package/angular-konva/utils/update-picture.d.ts +4 -0
- package/angular-konva/utils/update-picture.d.ts.map +1 -0
- package/components/cell-editors/abstract-cell-editor.component.d.ts +7 -5
- package/components/cell-editors/abstract-cell-editor.component.d.ts.map +1 -1
- package/components/cell-editors/cell-editor.scss +38 -25
- package/components/cell-editors/cell-editor.variables.scss +5 -0
- package/components/cell-editors/date/date-editor.component.d.ts.map +1 -1
- package/components/cell-editors/link/edit-link/edit-link.component.d.ts +33 -0
- package/components/cell-editors/link/edit-link/edit-link.component.d.ts.map +1 -0
- package/components/cell-editors/link/link-editor.component.d.ts +36 -0
- package/components/cell-editors/link/link-editor.component.d.ts.map +1 -0
- package/components/cell-editors/link/link-editor.component.scss +21 -0
- package/components/cell-editors/progress/progress-editor.component.d.ts +0 -1
- package/components/cell-editors/progress/progress-editor.component.d.ts.map +1 -1
- package/components/cell-editors/progress/progress-editor.component.scss +12 -4
- package/components/cell-editors/rating/rating-editor.component.d.ts +0 -1
- package/components/cell-editors/rating/rating-editor.component.d.ts.map +1 -1
- package/components/cell-editors/rating/rating-editor.component.scss +10 -0
- package/components/cell-editors/select/select-editor.component.d.ts +1 -3
- package/components/cell-editors/select/select-editor.component.d.ts.map +1 -1
- package/components/cell-editors/text/text-editor.component.d.ts +0 -1
- package/components/cell-editors/text/text-editor.component.d.ts.map +1 -1
- package/components/cell-views/select/option.component.d.ts.map +1 -1
- package/components/cell-views/select/option.scss +10 -0
- package/components/field-menu/field-menu.component.d.ts +8 -3
- package/components/field-menu/field-menu.component.d.ts.map +1 -1
- package/components/field-property-editor/field-property-editor.component.d.ts +4 -2
- package/components/field-property-editor/field-property-editor.component.d.ts.map +1 -1
- package/components/index.d.ts +3 -1
- package/components/index.d.ts.map +1 -1
- package/constants/colors.d.ts +18 -0
- package/constants/colors.d.ts.map +1 -0
- package/constants/grid.d.ts +17 -1
- package/constants/grid.d.ts.map +1 -1
- package/constants/icon.d.ts +19 -0
- package/constants/icon.d.ts.map +1 -0
- package/constants/index.d.ts +5 -1
- package/constants/index.d.ts.map +1 -1
- package/constants/table.d.ts +60 -0
- package/constants/table.d.ts.map +1 -0
- package/constants/text.d.ts +22 -0
- package/constants/text.d.ts.map +1 -0
- package/core/context.d.ts +14 -0
- package/core/context.d.ts.map +1 -0
- package/core/coordinate.d.ts +96 -0
- package/core/coordinate.d.ts.map +1 -0
- package/core/index.d.ts +3 -2
- package/core/index.d.ts.map +1 -1
- package/core/types/ai-table.d.ts +56 -0
- package/core/types/ai-table.d.ts.map +1 -0
- package/core/types/core.d.ts +29 -23
- package/core/types/core.d.ts.map +1 -1
- package/core/types/index.d.ts +1 -1
- package/core/types/index.d.ts.map +1 -1
- package/core/utils/common.d.ts +1 -2
- package/core/utils/common.d.ts.map +1 -1
- package/core/utils/field.d.ts +1 -1
- package/core/utils/field.d.ts.map +1 -1
- package/core/utils/index.d.ts +0 -1
- package/core/utils/index.d.ts.map +1 -1
- package/core/utils/queries.d.ts +5 -5
- package/core/utils/queries.d.ts.map +1 -1
- package/dom-grid.component.d.ts +11 -0
- package/dom-grid.component.d.ts.map +1 -0
- package/esm2022/angular-konva/components/container.component.mjs +29 -0
- package/esm2022/angular-konva/components/container.token.mjs +3 -0
- package/esm2022/angular-konva/components/index.mjs +4 -0
- package/esm2022/angular-konva/components/shape.component.mjs +142 -0
- package/esm2022/angular-konva/components/stage.component.mjs +123 -0
- package/esm2022/angular-konva/index.mjs +5 -0
- package/esm2022/angular-konva/interfaces/component.mjs +4 -0
- package/esm2022/angular-konva/interfaces/config.mjs +2 -0
- package/esm2022/angular-konva/interfaces/event-object.mjs +2 -0
- package/esm2022/angular-konva/interfaces/index.mjs +5 -0
- package/esm2022/angular-konva/interfaces/shape.mjs +42 -0
- package/esm2022/angular-konva/utils/apply-node-props.mjs +67 -0
- package/esm2022/angular-konva/utils/common.mjs +48 -0
- package/esm2022/angular-konva/utils/index.mjs +5 -0
- package/esm2022/angular-konva/utils/types.mjs +2 -0
- package/esm2022/angular-konva/utils/update-picture.mjs +7 -0
- package/esm2022/components/cell-editors/abstract-cell-editor.component.mjs +12 -7
- package/esm2022/components/cell-editors/date/date-editor.component.mjs +6 -3
- package/esm2022/components/cell-editors/link/edit-link/edit-link.component.mjs +66 -0
- package/esm2022/components/cell-editors/link/link-editor.component.mjs +117 -0
- package/esm2022/components/cell-editors/number/number-editor.component.mjs +2 -2
- package/esm2022/components/cell-editors/progress/progress-editor.component.mjs +3 -6
- package/esm2022/components/cell-editors/rating/rating-editor.component.mjs +4 -7
- package/esm2022/components/cell-editors/select/select-editor.component.mjs +11 -16
- package/esm2022/components/cell-editors/text/text-editor.component.mjs +10 -11
- package/esm2022/components/cell-views/select/option.component.mjs +6 -5
- package/esm2022/components/field-menu/field-menu.component.mjs +11 -8
- package/esm2022/components/field-property-editor/field-property-editor.component.mjs +17 -12
- package/esm2022/components/index.mjs +4 -2
- package/esm2022/constants/colors.mjs +18 -0
- package/esm2022/constants/editor.mjs +2 -3
- package/esm2022/constants/grid.mjs +22 -4
- package/esm2022/constants/icon.mjs +26 -0
- package/esm2022/constants/index.mjs +6 -2
- package/esm2022/constants/table.mjs +62 -0
- package/esm2022/constants/text.mjs +23 -0
- package/esm2022/core/context.mjs +25 -0
- package/esm2022/core/coordinate.mjs +222 -0
- package/esm2022/core/index.mjs +4 -3
- package/esm2022/core/types/ai-table.mjs +44 -0
- package/esm2022/core/types/core.mjs +6 -1
- package/esm2022/core/types/index.mjs +2 -2
- package/esm2022/core/utils/common.mjs +3 -20
- package/esm2022/core/utils/field.mjs +9 -5
- package/esm2022/core/utils/index.mjs +1 -2
- package/esm2022/core/utils/queries.mjs +4 -4
- package/esm2022/dom-grid.component.mjs +82 -0
- package/esm2022/grid-base.component.mjs +154 -0
- package/esm2022/grid.component.mjs +336 -160
- package/esm2022/public-api.mjs +9 -5
- package/esm2022/renderer/components/add-field-column.component.mjs +68 -0
- package/esm2022/renderer/components/cells.component.mjs +35 -0
- package/esm2022/renderer/components/field-head.component.mjs +130 -0
- package/esm2022/renderer/components/field-icon.component.mjs +66 -0
- package/esm2022/renderer/components/frozen-cells.component.mjs +36 -0
- package/esm2022/renderer/components/frozen-heads.component.mjs +117 -0
- package/esm2022/renderer/components/frozen-placeholder-cells.component.mjs +38 -0
- package/esm2022/renderer/components/heads.component.mjs +38 -0
- package/esm2022/renderer/components/hover-row-heads.component.mjs +107 -0
- package/esm2022/renderer/components/icon.component.mjs +80 -0
- package/esm2022/renderer/components/index.mjs +14 -0
- package/esm2022/renderer/components/other-rows.component.mjs +68 -0
- package/esm2022/renderer/components/placeholder-cells.component.mjs +33 -0
- package/esm2022/renderer/components/text.component.mjs +45 -0
- package/esm2022/renderer/creations/create-active-cell-border.mjs +68 -0
- package/esm2022/renderer/creations/create-cells.mjs +135 -0
- package/esm2022/renderer/creations/create-heads.mjs +45 -0
- package/esm2022/renderer/drawers/add-row-layout-drawer.mjs +97 -0
- package/esm2022/renderer/drawers/cell-drawer.mjs +586 -0
- package/esm2022/renderer/drawers/drawer.mjs +936 -0
- package/esm2022/renderer/drawers/layout-drawer.mjs +58 -0
- package/esm2022/renderer/drawers/record-row-layout-drawer.mjs +101 -0
- package/esm2022/renderer/index.mjs +4 -0
- package/esm2022/renderer/renderer.component.mjs +174 -0
- package/esm2022/services/event.service.mjs +115 -11
- package/esm2022/services/field.service.mjs +28 -5
- package/esm2022/services/index.mjs +4 -0
- package/esm2022/services/selection.service.mjs +8 -1
- package/esm2022/types/avatar.mjs +27 -0
- package/esm2022/types/canvas.mjs +2 -0
- package/esm2022/types/cell.mjs +2 -0
- package/esm2022/types/component-config.mjs +7 -0
- package/esm2022/types/field.mjs +1 -1
- package/esm2022/types/grid.mjs +16 -2
- package/esm2022/types/index.mjs +8 -2
- package/esm2022/types/layout.mjs +2 -0
- package/esm2022/types/row.mjs +6 -0
- package/esm2022/utils/build.mjs +39 -0
- package/esm2022/utils/cell.mjs +71 -0
- package/esm2022/utils/common.mjs +49 -0
- package/esm2022/utils/get-placeholder-cells.mjs +66 -0
- package/esm2022/utils/get-text-width.mjs +30 -0
- package/esm2022/utils/image-cache.mjs +57 -0
- package/esm2022/utils/index.mjs +12 -0
- package/esm2022/utils/os.mjs +16 -0
- package/esm2022/utils/position.mjs +48 -0
- package/esm2022/utils/style.mjs +25 -0
- package/esm2022/utils/text-measure.mjs +122 -0
- package/esm2022/utils/visible-range.mjs +38 -0
- package/fesm2022/ai-table-grid.mjs +5526 -693
- package/fesm2022/ai-table-grid.mjs.map +1 -1
- package/grid-base.component.d.ts +52 -0
- package/grid-base.component.d.ts.map +1 -0
- package/grid.component.d.ts +43 -40
- package/grid.component.d.ts.map +1 -1
- package/package.json +5 -2
- package/public-api.d.ts +8 -4
- package/public-api.d.ts.map +1 -1
- package/renderer/components/add-field-column.component.d.ts +16 -0
- package/renderer/components/add-field-column.component.d.ts.map +1 -0
- package/renderer/components/cells.component.d.ts +14 -0
- package/renderer/components/cells.component.d.ts.map +1 -0
- package/renderer/components/field-head.component.d.ts +73 -0
- package/renderer/components/field-head.component.d.ts.map +1 -0
- package/renderer/components/field-icon.component.d.ts +17 -0
- package/renderer/components/field-icon.component.d.ts.map +1 -0
- package/renderer/components/frozen-cells.component.d.ts +14 -0
- package/renderer/components/frozen-cells.component.d.ts.map +1 -0
- package/renderer/components/frozen-heads.component.d.ts +47 -0
- package/renderer/components/frozen-heads.component.d.ts.map +1 -0
- package/renderer/components/frozen-placeholder-cells.component.d.ts +22 -0
- package/renderer/components/frozen-placeholder-cells.component.d.ts.map +1 -0
- package/renderer/components/heads.component.d.ts +9 -0
- package/renderer/components/heads.component.d.ts.map +1 -0
- package/renderer/components/hover-row-heads.component.d.ts +11 -0
- package/renderer/components/hover-row-heads.component.d.ts.map +1 -0
- package/renderer/components/icon.component.d.ts +37 -0
- package/renderer/components/icon.component.d.ts.map +1 -0
- package/renderer/components/index.d.ts +14 -0
- package/renderer/components/index.d.ts.map +1 -0
- package/renderer/components/other-rows.component.d.ts +31 -0
- package/renderer/components/other-rows.component.d.ts.map +1 -0
- package/renderer/components/placeholder-cells.component.d.ts +22 -0
- package/renderer/components/placeholder-cells.component.d.ts.map +1 -0
- package/renderer/components/text.component.d.ts +99 -0
- package/renderer/components/text.component.d.ts.map +1 -0
- package/renderer/creations/create-active-cell-border.d.ts +7 -0
- package/renderer/creations/create-active-cell-border.d.ts.map +1 -0
- package/renderer/creations/create-cells.d.ts +8 -0
- package/renderer/creations/create-cells.d.ts.map +1 -0
- package/renderer/creations/create-heads.d.ts +3 -0
- package/renderer/creations/create-heads.d.ts.map +1 -0
- package/renderer/drawers/add-row-layout-drawer.d.ts +12 -0
- package/renderer/drawers/add-row-layout-drawer.d.ts.map +1 -0
- package/renderer/drawers/cell-drawer.d.ts +22 -0
- package/renderer/drawers/cell-drawer.d.ts.map +1 -0
- package/renderer/drawers/drawer.d.ts +136 -0
- package/renderer/drawers/drawer.d.ts.map +1 -0
- package/renderer/drawers/layout-drawer.d.ts +22 -0
- package/renderer/drawers/layout-drawer.d.ts.map +1 -0
- package/renderer/drawers/record-row-layout-drawer.d.ts +14 -0
- package/renderer/drawers/record-row-layout-drawer.d.ts.map +1 -0
- package/renderer/index.d.ts +4 -0
- package/renderer/index.d.ts.map +1 -0
- package/renderer/renderer.component.d.ts +64 -0
- package/renderer/renderer.component.d.ts.map +1 -0
- package/services/event.service.d.ts +17 -3
- package/services/event.service.d.ts.map +1 -1
- package/services/field.service.d.ts +5 -4
- package/services/field.service.d.ts.map +1 -1
- package/services/index.d.ts +4 -0
- package/services/index.d.ts.map +1 -0
- package/services/selection.service.d.ts.map +1 -1
- package/styles/styles.scss +71 -11
- package/types/avatar.d.ts +24 -0
- package/types/avatar.d.ts.map +1 -0
- package/types/canvas.d.ts +83 -0
- package/types/canvas.d.ts.map +1 -0
- package/types/cell.d.ts +43 -0
- package/types/cell.d.ts.map +1 -0
- package/types/component-config.d.ts +50 -0
- package/types/component-config.d.ts.map +1 -0
- package/types/field.d.ts +27 -1
- package/types/field.d.ts.map +1 -1
- package/types/grid.d.ts +80 -2
- package/types/grid.d.ts.map +1 -1
- package/types/index.d.ts +7 -1
- package/types/index.d.ts.map +1 -1
- package/types/layout.d.ts +11 -0
- package/types/layout.d.ts.map +1 -0
- package/types/row.d.ts +27 -0
- package/types/row.d.ts.map +1 -0
- package/utils/build.d.ts +5 -0
- package/utils/build.d.ts.map +1 -0
- package/utils/cell.d.ts +19 -0
- package/utils/cell.d.ts.map +1 -0
- package/utils/common.d.ts +20 -0
- package/utils/common.d.ts.map +1 -0
- package/utils/get-placeholder-cells.d.ts +16 -0
- package/utils/get-placeholder-cells.d.ts.map +1 -0
- package/utils/get-text-width.d.ts +9 -0
- package/utils/get-text-width.d.ts.map +1 -0
- package/utils/image-cache.d.ts +16 -0
- package/utils/image-cache.d.ts.map +1 -0
- package/utils/index.d.ts +12 -0
- package/utils/index.d.ts.map +1 -0
- package/utils/os.d.ts +4 -0
- package/utils/os.d.ts.map +1 -0
- package/utils/position.d.ts +20 -0
- package/utils/position.d.ts.map +1 -0
- package/utils/style.d.ts +4 -0
- package/utils/style.d.ts.map +1 -0
- package/utils/text-measure.d.ts +32 -0
- package/utils/text-measure.d.ts.map +1 -0
- package/utils/visible-range.d.ts +13 -0
- package/utils/visible-range.d.ts.map +1 -0
- package/components/cell-editors/link/number-editor.component.d.ts +0 -8
- package/components/cell-editors/link/number-editor.component.d.ts.map +0 -1
- package/constants/field.d.ts +0 -20
- package/constants/field.d.ts.map +0 -1
- package/core/action/field.d.ts +0 -12
- package/core/action/field.d.ts.map +0 -1
- package/core/action/general.d.ts +0 -5
- package/core/action/general.d.ts.map +0 -1
- package/core/action/index.d.ts +0 -12
- package/core/action/index.d.ts.map +0 -1
- package/core/action/record.d.ts +0 -12
- package/core/action/record.d.ts.map +0 -1
- package/core/types/action.d.ts +0 -64
- package/core/types/action.d.ts.map +0 -1
- package/core/utils/weak-map.d.ts +0 -3
- package/core/utils/weak-map.d.ts.map +0 -1
- package/esm2022/components/cell-editors/link/number-editor.component.mjs +0 -25
- package/esm2022/constants/field.mjs +0 -25
- package/esm2022/core/action/field.mjs +0 -57
- package/esm2022/core/action/general.mjs +0 -116
- package/esm2022/core/action/index.mjs +0 -9
- package/esm2022/core/action/record.mjs +0 -44
- package/esm2022/core/types/action.mjs +0 -18
- package/esm2022/core/utils/weak-map.mjs +0 -2
@@ -0,0 +1,936 @@
|
|
1
|
+
import GraphemeSplitter from 'grapheme-splitter';
|
2
|
+
import { AI_TABLE_OFFSET, AI_TABLE_TAG_FONT_SIZE, AI_TABLE_TAG_PADDING, DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE, DEFAULT_FONT_WEIGHT, DEFAULT_TEXT_ALIGN_CENTER, DEFAULT_TEXT_ALIGN_LEFT, DEFAULT_TEXT_DECORATION, DEFAULT_TEXT_VERTICAL_ALIGN_MIDDLE, DEFAULT_TEXT_VERTICAL_ALIGN_TOP, DEFAULT_WRAP_TEXT_MAX_ROW, FONT_SIZE_SM, WebOutlinedPath } from '../../constants';
|
3
|
+
import { AITable } from '../../core';
|
4
|
+
import { AITableAvatarSize, AITableAvatarType } from '../../types';
|
5
|
+
import { getTextWidth, imageCache, textDataCache, TextMeasure } from '../../utils';
|
6
|
+
// 用于正确地分割字符串,包括表情符号
|
7
|
+
export const graphemeSplitter = new GraphemeSplitter();
|
8
|
+
/**
|
9
|
+
* 用于在 Canvas 上进行的各种绘图操作,包含了文本绘制、矩形绘制、路径绘制以及一些几何计算等功能
|
10
|
+
*/
|
11
|
+
export class Drawer {
|
12
|
+
constructor() {
|
13
|
+
this.ctx = TextMeasure().context;
|
14
|
+
this.needDraw = false;
|
15
|
+
this.colors = AITable.getColors();
|
16
|
+
}
|
17
|
+
initCtx(ctx) {
|
18
|
+
this.needDraw = Boolean(ctx);
|
19
|
+
this.ctx = ctx || TextMeasure().context;
|
20
|
+
/**
|
21
|
+
* textBaseline 指定为 middle,兼容浏览器差异
|
22
|
+
*/
|
23
|
+
this.ctx.textBaseline = DEFAULT_TEXT_VERTICAL_ALIGN_MIDDLE;
|
24
|
+
}
|
25
|
+
// 设置样式
|
26
|
+
setStyle(options) {
|
27
|
+
const { fontSize, fontWeight, fillStyle, strokeStyle } = options;
|
28
|
+
if (fontSize || fontWeight) {
|
29
|
+
this.ctx.font = `${fontWeight || DEFAULT_FONT_WEIGHT} ${fontSize || DEFAULT_FONT_SIZE}px ${DEFAULT_FONT_FAMILY}`;
|
30
|
+
}
|
31
|
+
if (fillStyle) {
|
32
|
+
this.ctx.fillStyle = fillStyle;
|
33
|
+
}
|
34
|
+
if (strokeStyle) {
|
35
|
+
this.ctx.strokeStyle = strokeStyle;
|
36
|
+
}
|
37
|
+
}
|
38
|
+
// 文本省略
|
39
|
+
textEllipsis(options) {
|
40
|
+
const { text, maxWidth, fontSize = DEFAULT_FONT_SIZE, fontWeight = DEFAULT_FONT_WEIGHT } = options;
|
41
|
+
if (text == null)
|
42
|
+
return {
|
43
|
+
text: '',
|
44
|
+
textWidth: 0,
|
45
|
+
isEllipsis: false
|
46
|
+
};
|
47
|
+
const fontStyle = `${fontWeight} ${fontSize}px ${DEFAULT_FONT_FAMILY}`;
|
48
|
+
if (!maxWidth) {
|
49
|
+
return {
|
50
|
+
text,
|
51
|
+
textWidth: getTextWidth(this.ctx, text, fontStyle),
|
52
|
+
isEllipsis: false
|
53
|
+
};
|
54
|
+
}
|
55
|
+
const ellipsis = '…';
|
56
|
+
const textSize = text.length;
|
57
|
+
// 预先确定传入文本的阈值宽度
|
58
|
+
let guessSize = Math.ceil(maxWidth / fontSize);
|
59
|
+
let guessText = text.substr(0, guessSize);
|
60
|
+
let guessWidth = getTextWidth(this.ctx, guessText, fontStyle);
|
61
|
+
while (guessWidth <= maxWidth) {
|
62
|
+
if (textSize <= guessSize) {
|
63
|
+
return {
|
64
|
+
text,
|
65
|
+
textWidth: guessWidth,
|
66
|
+
isEllipsis: false
|
67
|
+
};
|
68
|
+
}
|
69
|
+
guessSize++;
|
70
|
+
guessText = text.substr(0, guessSize);
|
71
|
+
guessWidth = getTextWidth(this.ctx, guessText, fontStyle);
|
72
|
+
}
|
73
|
+
const ellipsisWidth = getTextWidth(this.ctx, ellipsis, fontStyle);
|
74
|
+
while (guessSize >= 0 && guessWidth + ellipsisWidth > maxWidth) {
|
75
|
+
guessSize--;
|
76
|
+
guessText = text.substr(0, guessSize);
|
77
|
+
guessWidth = getTextWidth(this.ctx, guessText, fontStyle);
|
78
|
+
}
|
79
|
+
return {
|
80
|
+
text: `${guessText || text[0]}${ellipsis}`,
|
81
|
+
textWidth: maxWidth,
|
82
|
+
isEllipsis: true
|
83
|
+
};
|
84
|
+
}
|
85
|
+
// 绘制线段
|
86
|
+
line(options) {
|
87
|
+
const { x, y, points, stroke, closed = false } = options;
|
88
|
+
const length = points.length;
|
89
|
+
this.ctx.save();
|
90
|
+
this.ctx.beginPath();
|
91
|
+
if (stroke)
|
92
|
+
this.ctx.strokeStyle = stroke;
|
93
|
+
this.ctx.lineWidth = 1;
|
94
|
+
this.ctx.translate(x, y);
|
95
|
+
this.ctx.moveTo(points[0], points[1]);
|
96
|
+
for (let n = 2; n < length; n += 2) {
|
97
|
+
this.ctx.lineTo(points[n], points[n + 1]);
|
98
|
+
}
|
99
|
+
if (closed) {
|
100
|
+
this.ctx.closePath();
|
101
|
+
}
|
102
|
+
this.ctx.stroke();
|
103
|
+
this.ctx.restore();
|
104
|
+
}
|
105
|
+
// 绘制圆
|
106
|
+
arc(options) {
|
107
|
+
const { x, y, stroke, fill, radius } = options;
|
108
|
+
this.ctx.beginPath();
|
109
|
+
if (fill)
|
110
|
+
this.setStyle({ fillStyle: fill });
|
111
|
+
if (stroke)
|
112
|
+
this.setStyle({ strokeStyle: stroke });
|
113
|
+
this.ctx.arc(x, y, radius, 0, 2 * Math.PI, false);
|
114
|
+
if (fill) {
|
115
|
+
this.ctx.fill();
|
116
|
+
}
|
117
|
+
if (stroke) {
|
118
|
+
this.ctx.stroke();
|
119
|
+
}
|
120
|
+
}
|
121
|
+
// 绘制矩形
|
122
|
+
rect(options) {
|
123
|
+
const { x, y, width, height, radius, fill, stroke } = options;
|
124
|
+
this.ctx.beginPath();
|
125
|
+
if (fill)
|
126
|
+
this.setStyle({ fillStyle: fill });
|
127
|
+
if (stroke)
|
128
|
+
this.setStyle({ strokeStyle: stroke });
|
129
|
+
if (!radius) {
|
130
|
+
this.ctx.rect(x, y, width, height);
|
131
|
+
}
|
132
|
+
else {
|
133
|
+
let topLeft = 0;
|
134
|
+
let topRight = 0;
|
135
|
+
let bottomLeft = 0;
|
136
|
+
let bottomRight = 0;
|
137
|
+
if (typeof radius === 'number') {
|
138
|
+
topLeft = topRight = bottomLeft = bottomRight = Math.min(radius, width / 2, height / 2);
|
139
|
+
}
|
140
|
+
else {
|
141
|
+
topLeft = Math.min(radius[0] || 0, width / 2, height / 2);
|
142
|
+
topRight = Math.min(radius[1] || 0, width / 2, height / 2);
|
143
|
+
bottomRight = Math.min(radius[2] || 0, width / 2, height / 2);
|
144
|
+
bottomLeft = Math.min(radius[3] || 0, width / 2, height / 2);
|
145
|
+
}
|
146
|
+
this.ctx.moveTo(x + topLeft, y);
|
147
|
+
this.ctx.lineTo(x + width - topRight, y);
|
148
|
+
this.ctx.arc(x + width - topRight, y + topRight, topRight, (Math.PI * 3) / 2, 0, false);
|
149
|
+
this.ctx.lineTo(x + width, y + height - bottomRight);
|
150
|
+
this.ctx.arc(x + width - bottomRight, y + height - bottomRight, bottomRight, 0, Math.PI / 2, false);
|
151
|
+
this.ctx.lineTo(x + bottomLeft, y + height);
|
152
|
+
this.ctx.arc(x + bottomLeft, y + height - bottomLeft, bottomLeft, Math.PI / 2, Math.PI, false);
|
153
|
+
this.ctx.lineTo(x, y + topLeft);
|
154
|
+
this.ctx.arc(x + topLeft, y + topLeft, topLeft, Math.PI, (Math.PI * 3) / 2, false);
|
155
|
+
}
|
156
|
+
this.ctx.closePath();
|
157
|
+
if (fill) {
|
158
|
+
this.ctx.fill();
|
159
|
+
}
|
160
|
+
if (stroke) {
|
161
|
+
this.ctx.stroke();
|
162
|
+
}
|
163
|
+
}
|
164
|
+
customRect(options) {
|
165
|
+
const { x, y, width, height, fill, strokes } = options;
|
166
|
+
if (fill)
|
167
|
+
this.setStyle({ fillStyle: fill });
|
168
|
+
this.ctx.fillRect(x, y, width, height);
|
169
|
+
if (strokes) {
|
170
|
+
const { top, right, bottom, left } = strokes;
|
171
|
+
// 上边框
|
172
|
+
this.ctx.beginPath();
|
173
|
+
this.setStyle({ strokeStyle: top ?? this.colors.transparent });
|
174
|
+
this.ctx.moveTo(x, y);
|
175
|
+
this.ctx.lineTo(x + width, y);
|
176
|
+
this.ctx.stroke();
|
177
|
+
// 右边框
|
178
|
+
this.ctx.beginPath();
|
179
|
+
this.setStyle({ strokeStyle: right ?? this.colors.transparent });
|
180
|
+
this.ctx.moveTo(x + width, y);
|
181
|
+
this.ctx.lineTo(x + width, y + height);
|
182
|
+
this.ctx.stroke();
|
183
|
+
// 下边框
|
184
|
+
this.ctx.beginPath();
|
185
|
+
this.setStyle({ strokeStyle: bottom ?? this.colors.transparent });
|
186
|
+
this.ctx.moveTo(x, y + height);
|
187
|
+
this.ctx.lineTo(x + width, y + height);
|
188
|
+
this.ctx.stroke();
|
189
|
+
// 左边框
|
190
|
+
this.ctx.beginPath();
|
191
|
+
this.setStyle({ strokeStyle: left ?? this.colors.transparent });
|
192
|
+
this.ctx.moveTo(x, y);
|
193
|
+
this.ctx.lineTo(x, y + height);
|
194
|
+
this.ctx.stroke();
|
195
|
+
}
|
196
|
+
}
|
197
|
+
// 换行文本绘制
|
198
|
+
wrapText(options) {
|
199
|
+
const { x, y, text, maxWidth, lineHeight, maxRow = DEFAULT_WRAP_TEXT_MAX_ROW, fontSize = DEFAULT_FONT_SIZE, fillStyle = this.colors.gray800, textAlign = DEFAULT_TEXT_ALIGN_LEFT, verticalAlign = DEFAULT_TEXT_VERTICAL_ALIGN_TOP, fontWeight = DEFAULT_FONT_WEIGHT, textDecoration = DEFAULT_TEXT_DECORATION, fieldType, needDraw = false } = options;
|
200
|
+
let offsetX = 0;
|
201
|
+
let offsetY = 0;
|
202
|
+
const baselineOffset = verticalAlign === DEFAULT_TEXT_VERTICAL_ALIGN_TOP ? fontSize / 2 : 0;
|
203
|
+
const fontStyle = `${fontWeight}-${fontSize}px`;
|
204
|
+
const isUnderline = textDecoration === 'underline';
|
205
|
+
const textRenderer = (textDataList) => {
|
206
|
+
textDataList.forEach((data) => {
|
207
|
+
const { offsetX, offsetY, text, width, linkUrl } = data;
|
208
|
+
this.ctx.fillText(text, x + offsetX, y + offsetY + baselineOffset);
|
209
|
+
if (linkUrl || isUnderline) {
|
210
|
+
this.line({
|
211
|
+
x: x + offsetX,
|
212
|
+
y: y + offsetY + AI_TABLE_OFFSET,
|
213
|
+
points: [0, fontSize, width, fontSize],
|
214
|
+
stroke: fillStyle
|
215
|
+
});
|
216
|
+
}
|
217
|
+
});
|
218
|
+
};
|
219
|
+
if (fillStyle)
|
220
|
+
this.setStyle({ fillStyle });
|
221
|
+
this.ctx.textAlign = textAlign;
|
222
|
+
const cacheKey = `${fontStyle}-${maxRow}-${maxWidth || 0}-${fieldType}-${text}`;
|
223
|
+
const cacheTextData = textDataCache.get(cacheKey);
|
224
|
+
if (cacheTextData) {
|
225
|
+
if (this.needDraw && needDraw) {
|
226
|
+
textRenderer(cacheTextData.data);
|
227
|
+
}
|
228
|
+
return cacheTextData;
|
229
|
+
}
|
230
|
+
const resultData = [];
|
231
|
+
// 准确切分包含表情符号的字符串
|
232
|
+
const arrText = graphemeSplitter.splitGraphemes(text);
|
233
|
+
const textLength = arrText.length;
|
234
|
+
const ellipsisWidth = this.ctx.measureText('…').width;
|
235
|
+
let showText = ''; // 每个片段显示的文本
|
236
|
+
let showTextWidth = 0; // 每段的宽度
|
237
|
+
let showLineWidth = 0; // 当前每行显示文字的宽度
|
238
|
+
let rowCount = 0;
|
239
|
+
const isEllipsis = this.textEllipsis({ text, maxWidth: maxWidth }).isEllipsis;
|
240
|
+
for (let n = 0; n < textLength; n++) {
|
241
|
+
const curText = arrText[n];
|
242
|
+
const isLineBreak = ['\n', '\r'].includes(curText);
|
243
|
+
const singleText = isLineBreak ? '' : curText;
|
244
|
+
const composeText = showText + singleText;
|
245
|
+
const isLimitRow = maxRow ? rowCount >= maxRow - 1 : false;
|
246
|
+
const singleTextWidth = isLineBreak ? 0 : this.ctx.measureText(singleText).width;
|
247
|
+
showLineWidth += singleTextWidth;
|
248
|
+
const diffWidth = isLimitRow ? showLineWidth + (isEllipsis ? ellipsisWidth : 0) : showLineWidth;
|
249
|
+
const isLineEnd = diffWidth > maxWidth;
|
250
|
+
// 遇到换行符或行尾
|
251
|
+
if ((isLineEnd || isLineBreak) && rowCount < maxRow) {
|
252
|
+
const isLastLetter = n === arrText.length - 1;
|
253
|
+
resultData.push({
|
254
|
+
offsetX,
|
255
|
+
offsetY,
|
256
|
+
width: Math.ceil(showTextWidth),
|
257
|
+
text: isLimitRow ? (isLastLetter ? composeText : `${showText}…`) : showText
|
258
|
+
});
|
259
|
+
showText = singleText;
|
260
|
+
offsetX = 0;
|
261
|
+
showTextWidth = singleTextWidth;
|
262
|
+
showLineWidth = singleTextWidth;
|
263
|
+
if (isLimitRow) {
|
264
|
+
showText = '';
|
265
|
+
break;
|
266
|
+
}
|
267
|
+
rowCount++;
|
268
|
+
offsetY += lineHeight;
|
269
|
+
continue;
|
270
|
+
}
|
271
|
+
showText = composeText;
|
272
|
+
showTextWidth += singleTextWidth;
|
273
|
+
}
|
274
|
+
if (showText) {
|
275
|
+
resultData.push({
|
276
|
+
offsetX,
|
277
|
+
offsetY,
|
278
|
+
width: Math.ceil(showTextWidth),
|
279
|
+
text: showText
|
280
|
+
});
|
281
|
+
}
|
282
|
+
if (this.needDraw && needDraw) {
|
283
|
+
textRenderer(resultData);
|
284
|
+
}
|
285
|
+
const res = {
|
286
|
+
height: rowCount < maxRow ? offsetY + lineHeight : offsetY,
|
287
|
+
data: resultData
|
288
|
+
};
|
289
|
+
textDataCache.set(cacheKey, res);
|
290
|
+
return res;
|
291
|
+
}
|
292
|
+
// 绘制单行文本
|
293
|
+
text(options) {
|
294
|
+
const { x, y, text, fontSize = DEFAULT_FONT_SIZE, fillStyle = this.colors.gray800, textAlign = DEFAULT_TEXT_ALIGN_LEFT, verticalAlign = DEFAULT_TEXT_VERTICAL_ALIGN_TOP, fontWeight = DEFAULT_FONT_WEIGHT, textDecoration = DEFAULT_TEXT_DECORATION } = options;
|
295
|
+
const fontStyle = `${fontWeight} ${fontSize}px ${DEFAULT_FONT_FAMILY}`;
|
296
|
+
if (textDecoration === 'underline') {
|
297
|
+
const textWidth = getTextWidth(this.ctx, text, fontStyle);
|
298
|
+
this.line({
|
299
|
+
x: x,
|
300
|
+
y: y + AI_TABLE_OFFSET,
|
301
|
+
points: [0, fontSize, textWidth, fontSize],
|
302
|
+
stroke: fillStyle
|
303
|
+
});
|
304
|
+
}
|
305
|
+
const baselineOffset = verticalAlign === DEFAULT_TEXT_VERTICAL_ALIGN_TOP ? fontSize / 2 : 0;
|
306
|
+
if (fillStyle)
|
307
|
+
this.setStyle({ fillStyle });
|
308
|
+
this.ctx.textAlign = textAlign;
|
309
|
+
this.ctx.font = fontStyle;
|
310
|
+
this.ctx.fillText(text, x, y + baselineOffset);
|
311
|
+
}
|
312
|
+
// 绘制标签
|
313
|
+
tag(options) {
|
314
|
+
const { x, y, width, height, text, radius, background, color = this.colors.gray800, fontSize = AI_TABLE_TAG_FONT_SIZE, fontWeight = DEFAULT_FONT_WEIGHT, stroke } = options;
|
315
|
+
// 背景
|
316
|
+
this.rect({
|
317
|
+
x,
|
318
|
+
y,
|
319
|
+
width,
|
320
|
+
height,
|
321
|
+
radius,
|
322
|
+
fill: background,
|
323
|
+
stroke
|
324
|
+
});
|
325
|
+
this.text({
|
326
|
+
x: x + AI_TABLE_TAG_PADDING,
|
327
|
+
y: y + (height - fontSize) / 2,
|
328
|
+
text,
|
329
|
+
fillStyle: color,
|
330
|
+
fontSize,
|
331
|
+
fontWeight
|
332
|
+
});
|
333
|
+
return {
|
334
|
+
width,
|
335
|
+
height
|
336
|
+
};
|
337
|
+
}
|
338
|
+
image(options, crossOrigin, allowDefault) {
|
339
|
+
const { x, y, url, width, height, opacity = 1, clipFunc } = options;
|
340
|
+
const colors = AITable.getColors();
|
341
|
+
if (!url) {
|
342
|
+
return;
|
343
|
+
}
|
344
|
+
const image = imageCache.getImage(url);
|
345
|
+
// Not loaded successfully
|
346
|
+
if (image === false) {
|
347
|
+
if (allowDefault) {
|
348
|
+
this.path({
|
349
|
+
x,
|
350
|
+
y: y + 2,
|
351
|
+
data: WebOutlinedPath,
|
352
|
+
size: 16,
|
353
|
+
fill: colors.gray600
|
354
|
+
});
|
355
|
+
}
|
356
|
+
return;
|
357
|
+
}
|
358
|
+
// Unloaded
|
359
|
+
if (image == null) {
|
360
|
+
return imageCache.loadImage(url, url, { crossOrigin });
|
361
|
+
}
|
362
|
+
const isOrigin = opacity === 1;
|
363
|
+
if (!clipFunc && isOrigin) {
|
364
|
+
return this.ctx.drawImage(image, x, y, width, height);
|
365
|
+
}
|
366
|
+
if (!clipFunc && !isOrigin) {
|
367
|
+
this.ctx.save();
|
368
|
+
this.ctx.globalAlpha = opacity;
|
369
|
+
this.ctx.drawImage(image, x, y, width, height);
|
370
|
+
this.ctx.restore();
|
371
|
+
return;
|
372
|
+
}
|
373
|
+
if (clipFunc) {
|
374
|
+
this.ctx.save();
|
375
|
+
this.ctx.beginPath();
|
376
|
+
clipFunc(this.ctx);
|
377
|
+
this.ctx.clip();
|
378
|
+
this.ctx.globalAlpha = opacity;
|
379
|
+
this.ctx.drawImage(image, x, y, width, height);
|
380
|
+
this.ctx.restore();
|
381
|
+
}
|
382
|
+
}
|
383
|
+
avatar(options) {
|
384
|
+
const { x = 0, y = 0, id, url, title, bgColor = this.colors.white, size = AITableAvatarSize.size36, type = AITableAvatarType.member, opacity = 1 } = options;
|
385
|
+
if (title == null || id == null)
|
386
|
+
return null;
|
387
|
+
const colors = AITable.getColors();
|
388
|
+
const avatarSrc = url || '';
|
389
|
+
const avatarName = title;
|
390
|
+
const avatarBg = avatarSrc ? colors.white : bgColor;
|
391
|
+
switch (type) {
|
392
|
+
case AITableAvatarType.member: {
|
393
|
+
const radius = size / 2;
|
394
|
+
if (!avatarSrc) {
|
395
|
+
this.ctx.fillStyle = avatarBg;
|
396
|
+
this.ctx.beginPath();
|
397
|
+
this.ctx.arc(x + radius, y + radius, radius, 0, Math.PI * 2, false);
|
398
|
+
this.ctx.closePath();
|
399
|
+
this.ctx.fill();
|
400
|
+
return this.text({
|
401
|
+
x: x + radius,
|
402
|
+
y: y + radius,
|
403
|
+
text: avatarName,
|
404
|
+
textAlign: DEFAULT_TEXT_ALIGN_CENTER,
|
405
|
+
verticalAlign: DEFAULT_TEXT_VERTICAL_ALIGN_MIDDLE,
|
406
|
+
fontSize: FONT_SIZE_SM,
|
407
|
+
fillStyle: colors.white
|
408
|
+
});
|
409
|
+
}
|
410
|
+
return this.image({
|
411
|
+
name: avatarSrc,
|
412
|
+
x,
|
413
|
+
y,
|
414
|
+
url: avatarSrc,
|
415
|
+
width: size,
|
416
|
+
height: size,
|
417
|
+
clipFunc: (ctx) => {
|
418
|
+
ctx.fillStyle = avatarBg;
|
419
|
+
ctx.arc(x + radius, y + radius, radius, 0, Math.PI * 2, false);
|
420
|
+
ctx.fill();
|
421
|
+
},
|
422
|
+
opacity
|
423
|
+
});
|
424
|
+
}
|
425
|
+
}
|
426
|
+
}
|
427
|
+
/**
|
428
|
+
* 方法将椭圆弧的端点参数化形式转换为中心参数化形式
|
429
|
+
* 接受弧线的端点参数,并计算出弧线的中心点坐标、起始角度、终止角度等参数
|
430
|
+
* 返回值:一个包含中心点坐标、半径、旋转角度、起始角度以及角度差的对象,这些参数可以直接用于绘制椭圆弧
|
431
|
+
* @returns [cx, cy, rx, ry, theta, dTheta, psi, fs]
|
432
|
+
*/
|
433
|
+
convertEndpointToCenterParameterization(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg) {
|
434
|
+
const psi = psiDeg * (Math.PI / 180.0);
|
435
|
+
const xp = (Math.cos(psi) * (x1 - x2)) / 2.0 + (Math.sin(psi) * (y1 - y2)) / 2.0;
|
436
|
+
const yp = (-1 * Math.sin(psi) * (x1 - x2)) / 2.0 + (Math.cos(psi) * (y1 - y2)) / 2.0;
|
437
|
+
const lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry);
|
438
|
+
if (lambda > 1) {
|
439
|
+
rx *= Math.sqrt(lambda);
|
440
|
+
ry *= Math.sqrt(lambda);
|
441
|
+
}
|
442
|
+
let f = Math.sqrt((rx * rx * (ry * ry) - rx * rx * (yp * yp) - ry * ry * (xp * xp)) / (rx * rx * (yp * yp) + ry * ry * (xp * xp)));
|
443
|
+
if (fa === fs) {
|
444
|
+
f *= -1;
|
445
|
+
}
|
446
|
+
if (isNaN(f)) {
|
447
|
+
f = 0;
|
448
|
+
}
|
449
|
+
const cxp = (f * rx * yp) / ry;
|
450
|
+
const cyp = (f * -ry * xp) / rx;
|
451
|
+
const cx = (x1 + x2) / 2.0 + Math.cos(psi) * cxp - Math.sin(psi) * cyp;
|
452
|
+
const cy = (y1 + y2) / 2.0 + Math.sin(psi) * cxp + Math.cos(psi) * cyp;
|
453
|
+
const vMag = function (v) {
|
454
|
+
return Math.sqrt(v[0] * v[0] + v[1] * v[1]);
|
455
|
+
};
|
456
|
+
const vRatio = function (u, v) {
|
457
|
+
return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v));
|
458
|
+
};
|
459
|
+
const vAngle = function (u, v) {
|
460
|
+
return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) * Math.acos(vRatio(u, v));
|
461
|
+
};
|
462
|
+
const theta = vAngle([1, 0], [(xp - cxp) / rx, (yp - cyp) / ry]);
|
463
|
+
const u = [(xp - cxp) / rx, (yp - cyp) / ry];
|
464
|
+
const v = [(-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry];
|
465
|
+
let dTheta = vAngle(u, v);
|
466
|
+
if (vRatio(u, v) <= -1) {
|
467
|
+
dTheta = Math.PI;
|
468
|
+
}
|
469
|
+
if (vRatio(u, v) >= 1) {
|
470
|
+
dTheta = 0;
|
471
|
+
}
|
472
|
+
if (fs === 0 && dTheta > 0) {
|
473
|
+
dTheta = dTheta - 2 * Math.PI;
|
474
|
+
}
|
475
|
+
if (fs === 1 && dTheta < 0) {
|
476
|
+
dTheta = dTheta + 2 * Math.PI;
|
477
|
+
}
|
478
|
+
return [cx, cy, rx, ry, theta, dTheta, psi, fs];
|
479
|
+
}
|
480
|
+
/**
|
481
|
+
* 计算两个点 (x1, y1) 和 (x2, y2) 之间的直线距离
|
482
|
+
* @returns 两个点 (x1, y1) 和 (x2, y2) 之间的直线距离,单位与输入的坐标值相同
|
483
|
+
*/
|
484
|
+
getLineLength(x1, y1, x2, y2) {
|
485
|
+
return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
|
486
|
+
}
|
487
|
+
/**
|
488
|
+
* 计算三次贝塞尔曲线上给定参数 t 对应的点的坐标.
|
489
|
+
* 可以在指定的 t 参数下计算出曲线上精确的一个点,这个点可以用于绘制平滑曲线的一部分
|
490
|
+
* @param pct - 0 到 1 之间的参数,用于指定曲线上的点的位置
|
491
|
+
* @param P1x - 曲线的起点 x 坐标
|
492
|
+
* @param P1y - 曲线的起点 y 坐标
|
493
|
+
* @param P2x - 曲线的第一个控制点 x 坐标
|
494
|
+
* @param P2y - 曲线的第一个控制点 y 坐标
|
495
|
+
* @param P3x - 曲线的第二个控制点 x 坐标
|
496
|
+
* @param P3y - 曲线的第二个控制点 y 坐标
|
497
|
+
* @param P4x - 曲线的终点 x 坐标
|
498
|
+
* @param P4y - 曲线的终点 y 坐标
|
499
|
+
* @returns
|
500
|
+
*/
|
501
|
+
getPointOnCubicBezier(pct, P1x, P1y, P2x, P2y, P3x, P3y, P4x, P4y) {
|
502
|
+
function CB1(t) {
|
503
|
+
return t * t * t;
|
504
|
+
}
|
505
|
+
function CB2(t) {
|
506
|
+
return 3 * t * t * (1 - t);
|
507
|
+
}
|
508
|
+
function CB3(t) {
|
509
|
+
return 3 * t * (1 - t) * (1 - t);
|
510
|
+
}
|
511
|
+
function CB4(t) {
|
512
|
+
return (1 - t) * (1 - t) * (1 - t);
|
513
|
+
}
|
514
|
+
const x = P4x * CB1(pct) + P3x * CB2(pct) + P2x * CB3(pct) + P1x * CB4(pct);
|
515
|
+
const y = P4y * CB1(pct) + P3y * CB2(pct) + P2y * CB3(pct) + P1y * CB4(pct);
|
516
|
+
return {
|
517
|
+
x: x,
|
518
|
+
y: y
|
519
|
+
};
|
520
|
+
}
|
521
|
+
/**
|
522
|
+
* 计算二次贝塞尔曲线上给定参数 t 对应的点的坐标
|
523
|
+
* @param pct - 0 到 1 之间的参数,用于指定曲线上的点的位置
|
524
|
+
* @param P1x - 曲线的起点 x 坐标
|
525
|
+
* @param P1y - 曲线的起点 y 坐标
|
526
|
+
* @param P2x - 曲线的控制点 x 坐标
|
527
|
+
* @param P2y - 曲线的控制点 y 坐标
|
528
|
+
* @param P3x - 曲线的终点 x 坐标
|
529
|
+
* @param P3y - 曲线的终点 y 坐标
|
530
|
+
* @returns
|
531
|
+
*/
|
532
|
+
getPointOnQuadraticBezier(pct, P1x, P1y, P2x, P2y, P3x, P3y) {
|
533
|
+
function QB1(t) {
|
534
|
+
return t * t;
|
535
|
+
}
|
536
|
+
function QB2(t) {
|
537
|
+
return 2 * t * (1 - t);
|
538
|
+
}
|
539
|
+
function QB3(t) {
|
540
|
+
return (1 - t) * (1 - t);
|
541
|
+
}
|
542
|
+
const x = P3x * QB1(pct) + P2x * QB2(pct) + P1x * QB3(pct);
|
543
|
+
const y = P3y * QB1(pct) + P2y * QB2(pct) + P1y * QB3(pct);
|
544
|
+
return {
|
545
|
+
x: x,
|
546
|
+
y: y
|
547
|
+
};
|
548
|
+
}
|
549
|
+
/**
|
550
|
+
* 计算椭圆弧上给定角度 θ 对应的点的坐标
|
551
|
+
* @param cx - 椭圆的中心点 x 坐标
|
552
|
+
* @param cy - 椭圆的中心点 y 坐标
|
553
|
+
* @param rx - 椭圆的 x 轴半径
|
554
|
+
* @param ry - 椭圆的 y 轴半径
|
555
|
+
* @param theta - 椭圆弧的起始角度
|
556
|
+
* @param psi - 椭圆弧的旋转角度
|
557
|
+
* @returns
|
558
|
+
*/
|
559
|
+
getPointOnEllipticalArc(cx, cy, rx, ry, theta, psi) {
|
560
|
+
const cosPsi = Math.cos(psi);
|
561
|
+
const sinPsi = Math.sin(psi);
|
562
|
+
const pt = {
|
563
|
+
x: rx * Math.cos(theta),
|
564
|
+
y: ry * Math.sin(theta)
|
565
|
+
};
|
566
|
+
return {
|
567
|
+
x: cx + (pt.x * cosPsi - pt.y * sinPsi),
|
568
|
+
y: cy + (pt.x * sinPsi + pt.y * cosPsi)
|
569
|
+
};
|
570
|
+
}
|
571
|
+
/**
|
572
|
+
* 计算基于不同路径命令的长度
|
573
|
+
* @param x - 起点 x 坐标
|
574
|
+
* @param y - 起点 y 坐标
|
575
|
+
* @param cmd - 路径命令
|
576
|
+
* @param points - 与路径命令相关的点的坐标或控制参数
|
577
|
+
* @returns
|
578
|
+
*/
|
579
|
+
calcLength(x, y, cmd, points) {
|
580
|
+
let len, p1, p2, t;
|
581
|
+
switch (cmd) {
|
582
|
+
case 'L':
|
583
|
+
return this.getLineLength(x, y, points[0], points[1]);
|
584
|
+
case 'C':
|
585
|
+
len = 0.0;
|
586
|
+
p1 = this.getPointOnCubicBezier(0, x, y, points[0], points[1], points[2], points[3], points[4], points[5]);
|
587
|
+
for (t = 0.01; t <= 1; t += 0.01) {
|
588
|
+
p2 = this.getPointOnCubicBezier(t, x, y, points[0], points[1], points[2], points[3], points[4], points[5]);
|
589
|
+
len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);
|
590
|
+
p1 = p2;
|
591
|
+
}
|
592
|
+
return len;
|
593
|
+
case 'Q':
|
594
|
+
len = 0.0;
|
595
|
+
p1 = this.getPointOnQuadraticBezier(0, x, y, points[0], points[1], points[2], points[3]);
|
596
|
+
for (t = 0.01; t <= 1; t += 0.01) {
|
597
|
+
p2 = this.getPointOnQuadraticBezier(t, x, y, points[0], points[1], points[2], points[3]);
|
598
|
+
len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);
|
599
|
+
p1 = p2;
|
600
|
+
}
|
601
|
+
return len;
|
602
|
+
case 'A':
|
603
|
+
len = 0.0;
|
604
|
+
const start = points[4];
|
605
|
+
const dTheta = points[5];
|
606
|
+
const end = points[4] + dTheta;
|
607
|
+
let inc = Math.PI / 180.0;
|
608
|
+
if (Math.abs(start - end) < inc) {
|
609
|
+
inc = Math.abs(start - end);
|
610
|
+
}
|
611
|
+
p1 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], start, 0);
|
612
|
+
if (dTheta < 0) {
|
613
|
+
for (t = start - inc; t > end; t -= inc) {
|
614
|
+
p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], t, 0);
|
615
|
+
len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);
|
616
|
+
p1 = p2;
|
617
|
+
}
|
618
|
+
}
|
619
|
+
else {
|
620
|
+
for (t = start + inc; t < end; t += inc) {
|
621
|
+
p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], t, 0);
|
622
|
+
len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);
|
623
|
+
p1 = p2;
|
624
|
+
}
|
625
|
+
}
|
626
|
+
p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], end, 0);
|
627
|
+
len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);
|
628
|
+
return len;
|
629
|
+
}
|
630
|
+
return 0;
|
631
|
+
}
|
632
|
+
/**
|
633
|
+
* 解析 SVG 路径数据字符串,将其转换为一个包含路径命令和坐标点的数组对象
|
634
|
+
* @param data - SVG 路径数据字符串
|
635
|
+
* @returns
|
636
|
+
*/
|
637
|
+
parsePathData(data) {
|
638
|
+
if (!data) {
|
639
|
+
return [];
|
640
|
+
}
|
641
|
+
let cs = data;
|
642
|
+
const cc = ['m', 'M', 'l', 'L', 'v', 'V', 'h', 'H', 'z', 'Z', 'c', 'C', 'q', 'Q', 't', 'T', 's', 'S', 'a', 'A'];
|
643
|
+
cs = cs.replace(new RegExp(' ', 'g'), ',');
|
644
|
+
for (let n = 0; n < cc.length; n++) {
|
645
|
+
cs = cs.replace(new RegExp(cc[n], 'g'), '|' + cc[n]);
|
646
|
+
}
|
647
|
+
const arr = cs.split('|');
|
648
|
+
const ca = [];
|
649
|
+
const coords = [];
|
650
|
+
let cpx = 0;
|
651
|
+
let cpy = 0;
|
652
|
+
const re = /([-+]?((\d+\.\d+)|((\d+)|(\.\d+)))(?:e[-+]?\d+)?)/gi;
|
653
|
+
let match;
|
654
|
+
for (let n = 1; n < arr.length; n++) {
|
655
|
+
let str = arr[n];
|
656
|
+
let c = str.charAt(0);
|
657
|
+
str = str.slice(1);
|
658
|
+
coords.length = 0;
|
659
|
+
while ((match = re.exec(str))) {
|
660
|
+
coords.push(match[0]);
|
661
|
+
}
|
662
|
+
const p = [];
|
663
|
+
for (let j = 0, jlen = coords.length; j < jlen; j++) {
|
664
|
+
if (coords[j] === '00') {
|
665
|
+
p.push(0, 0);
|
666
|
+
continue;
|
667
|
+
}
|
668
|
+
const parsed = parseFloat(coords[j]);
|
669
|
+
if (!isNaN(parsed)) {
|
670
|
+
p.push(parsed);
|
671
|
+
}
|
672
|
+
else {
|
673
|
+
p.push(0);
|
674
|
+
}
|
675
|
+
}
|
676
|
+
while (p.length > 0) {
|
677
|
+
if (isNaN(p[0])) {
|
678
|
+
break;
|
679
|
+
}
|
680
|
+
let cmd = null;
|
681
|
+
let points = [];
|
682
|
+
const startX = cpx;
|
683
|
+
const startY = cpy;
|
684
|
+
let prevCmd, ctlPtx, ctlPty;
|
685
|
+
let rx, ry, psi, fa, fs, x1, y1;
|
686
|
+
switch (c) {
|
687
|
+
case 'l':
|
688
|
+
cpx += p.shift();
|
689
|
+
cpy += p.shift();
|
690
|
+
cmd = 'L';
|
691
|
+
points.push(cpx, cpy);
|
692
|
+
break;
|
693
|
+
case 'L':
|
694
|
+
cpx = p.shift();
|
695
|
+
cpy = p.shift();
|
696
|
+
points.push(cpx, cpy);
|
697
|
+
break;
|
698
|
+
case 'm':
|
699
|
+
const dx = p.shift();
|
700
|
+
const dy = p.shift();
|
701
|
+
cpx += dx;
|
702
|
+
cpy += dy;
|
703
|
+
cmd = 'M';
|
704
|
+
if (ca.length > 2 && ca[ca.length - 1].command === 'z') {
|
705
|
+
for (let idx = ca.length - 2; idx >= 0; idx--) {
|
706
|
+
if (ca[idx].command === 'M') {
|
707
|
+
cpx = ca[idx].points[0] + dx;
|
708
|
+
cpy = ca[idx].points[1] + dy;
|
709
|
+
break;
|
710
|
+
}
|
711
|
+
}
|
712
|
+
}
|
713
|
+
points.push(cpx, cpy);
|
714
|
+
c = 'l';
|
715
|
+
break;
|
716
|
+
case 'M':
|
717
|
+
cpx = p.shift();
|
718
|
+
cpy = p.shift();
|
719
|
+
cmd = 'M';
|
720
|
+
points.push(cpx, cpy);
|
721
|
+
c = 'L';
|
722
|
+
break;
|
723
|
+
case 'h':
|
724
|
+
cpx += p.shift();
|
725
|
+
cmd = 'L';
|
726
|
+
points.push(cpx, cpy);
|
727
|
+
break;
|
728
|
+
case 'H':
|
729
|
+
cpx = p.shift();
|
730
|
+
cmd = 'L';
|
731
|
+
points.push(cpx, cpy);
|
732
|
+
break;
|
733
|
+
case 'v':
|
734
|
+
cpy += p.shift();
|
735
|
+
cmd = 'L';
|
736
|
+
points.push(cpx, cpy);
|
737
|
+
break;
|
738
|
+
case 'V':
|
739
|
+
cpy = p.shift();
|
740
|
+
cmd = 'L';
|
741
|
+
points.push(cpx, cpy);
|
742
|
+
break;
|
743
|
+
case 'C':
|
744
|
+
points.push(p.shift(), p.shift(), p.shift(), p.shift());
|
745
|
+
cpx = p.shift();
|
746
|
+
cpy = p.shift();
|
747
|
+
points.push(cpx, cpy);
|
748
|
+
break;
|
749
|
+
case 'c':
|
750
|
+
points.push(cpx + p.shift(), cpy + p.shift(), cpx + p.shift(), cpy + p.shift());
|
751
|
+
cpx += p.shift();
|
752
|
+
cpy += p.shift();
|
753
|
+
cmd = 'C';
|
754
|
+
points.push(cpx, cpy);
|
755
|
+
break;
|
756
|
+
case 'S':
|
757
|
+
ctlPtx = cpx;
|
758
|
+
ctlPty = cpy;
|
759
|
+
prevCmd = ca[ca.length - 1];
|
760
|
+
if (prevCmd.command === 'C') {
|
761
|
+
ctlPtx = cpx + (cpx - prevCmd.points[2]);
|
762
|
+
ctlPty = cpy + (cpy - prevCmd.points[3]);
|
763
|
+
}
|
764
|
+
points.push(ctlPtx, ctlPty, p.shift(), p.shift());
|
765
|
+
cpx = p.shift();
|
766
|
+
cpy = p.shift();
|
767
|
+
cmd = 'C';
|
768
|
+
points.push(cpx, cpy);
|
769
|
+
break;
|
770
|
+
case 's':
|
771
|
+
ctlPtx = cpx;
|
772
|
+
ctlPty = cpy;
|
773
|
+
prevCmd = ca[ca.length - 1];
|
774
|
+
if (prevCmd.command === 'C') {
|
775
|
+
ctlPtx = cpx + (cpx - prevCmd.points[2]);
|
776
|
+
ctlPty = cpy + (cpy - prevCmd.points[3]);
|
777
|
+
}
|
778
|
+
points.push(ctlPtx, ctlPty, cpx + p.shift(), cpy + p.shift());
|
779
|
+
cpx += p.shift();
|
780
|
+
cpy += p.shift();
|
781
|
+
cmd = 'C';
|
782
|
+
points.push(cpx, cpy);
|
783
|
+
break;
|
784
|
+
case 'Q':
|
785
|
+
points.push(p.shift(), p.shift());
|
786
|
+
cpx = p.shift();
|
787
|
+
cpy = p.shift();
|
788
|
+
points.push(cpx, cpy);
|
789
|
+
break;
|
790
|
+
case 'q':
|
791
|
+
points.push(cpx + p.shift(), cpy + p.shift());
|
792
|
+
cpx += p.shift();
|
793
|
+
cpy += p.shift();
|
794
|
+
cmd = 'Q';
|
795
|
+
points.push(cpx, cpy);
|
796
|
+
break;
|
797
|
+
case 'T':
|
798
|
+
ctlPtx = cpx;
|
799
|
+
ctlPty = cpy;
|
800
|
+
prevCmd = ca[ca.length - 1];
|
801
|
+
if (prevCmd.command === 'Q') {
|
802
|
+
ctlPtx = cpx + (cpx - prevCmd.points[0]);
|
803
|
+
ctlPty = cpy + (cpy - prevCmd.points[1]);
|
804
|
+
}
|
805
|
+
cpx = p.shift();
|
806
|
+
cpy = p.shift();
|
807
|
+
cmd = 'Q';
|
808
|
+
points.push(ctlPtx, ctlPty, cpx, cpy);
|
809
|
+
break;
|
810
|
+
case 't':
|
811
|
+
ctlPtx = cpx;
|
812
|
+
ctlPty = cpy;
|
813
|
+
prevCmd = ca[ca.length - 1];
|
814
|
+
if (prevCmd.command === 'Q') {
|
815
|
+
ctlPtx = cpx + (cpx - prevCmd.points[0]);
|
816
|
+
ctlPty = cpy + (cpy - prevCmd.points[1]);
|
817
|
+
}
|
818
|
+
cpx += p.shift();
|
819
|
+
cpy += p.shift();
|
820
|
+
cmd = 'Q';
|
821
|
+
points.push(ctlPtx, ctlPty, cpx, cpy);
|
822
|
+
break;
|
823
|
+
case 'A':
|
824
|
+
rx = p.shift();
|
825
|
+
ry = p.shift();
|
826
|
+
psi = p.shift();
|
827
|
+
fa = p.shift();
|
828
|
+
fs = p.shift();
|
829
|
+
x1 = cpx;
|
830
|
+
y1 = cpy;
|
831
|
+
cpx = p.shift();
|
832
|
+
cpy = p.shift();
|
833
|
+
cmd = 'A';
|
834
|
+
points = this.convertEndpointToCenterParameterization(x1, y1, cpx, cpy, fa, fs, rx, ry, psi);
|
835
|
+
break;
|
836
|
+
case 'a':
|
837
|
+
rx = p.shift();
|
838
|
+
ry = p.shift();
|
839
|
+
psi = p.shift();
|
840
|
+
fa = p.shift();
|
841
|
+
fs = p.shift();
|
842
|
+
x1 = cpx;
|
843
|
+
y1 = cpy;
|
844
|
+
cpx += p.shift();
|
845
|
+
cpy += p.shift();
|
846
|
+
cmd = 'A';
|
847
|
+
points = this.convertEndpointToCenterParameterization(x1, y1, cpx, cpy, fa, fs, rx, ry, psi);
|
848
|
+
break;
|
849
|
+
}
|
850
|
+
ca.push({
|
851
|
+
command: cmd || c,
|
852
|
+
points: points,
|
853
|
+
start: {
|
854
|
+
x: startX,
|
855
|
+
y: startY
|
856
|
+
},
|
857
|
+
pathLength: this.calcLength(startX, startY, cmd || c, points)
|
858
|
+
});
|
859
|
+
}
|
860
|
+
if (c === 'z' || c === 'Z') {
|
861
|
+
ca.push({
|
862
|
+
command: 'z',
|
863
|
+
points: [],
|
864
|
+
start: undefined,
|
865
|
+
pathLength: 0
|
866
|
+
});
|
867
|
+
}
|
868
|
+
}
|
869
|
+
return ca;
|
870
|
+
}
|
871
|
+
/**
|
872
|
+
* 根据传入的路径数据 data 在画布上绘制路径
|
873
|
+
* @param options
|
874
|
+
*/
|
875
|
+
path(options) {
|
876
|
+
const { x, y, scaleX = 1, scaleY = 1, data, fill } = options;
|
877
|
+
const dataArray = this.parsePathData(data);
|
878
|
+
this.ctx.save();
|
879
|
+
this.ctx.beginPath();
|
880
|
+
this.ctx.fillStyle = fill;
|
881
|
+
this.ctx.translate(x, y);
|
882
|
+
this.ctx.scale(scaleX, scaleY);
|
883
|
+
let isClosed = false;
|
884
|
+
for (let n = 0; n < dataArray.length; n++) {
|
885
|
+
const c = dataArray[n].command;
|
886
|
+
const p = dataArray[n].points;
|
887
|
+
switch (c) {
|
888
|
+
case 'L':
|
889
|
+
this.ctx.lineTo(p[0], p[1]);
|
890
|
+
break;
|
891
|
+
case 'M':
|
892
|
+
this.ctx.moveTo(p[0], p[1]);
|
893
|
+
break;
|
894
|
+
case 'C':
|
895
|
+
this.ctx.bezierCurveTo(p[0], p[1], p[2], p[3], p[4], p[5]);
|
896
|
+
break;
|
897
|
+
case 'Q':
|
898
|
+
this.ctx.quadraticCurveTo(p[0], p[1], p[2], p[3]);
|
899
|
+
break;
|
900
|
+
case 'A':
|
901
|
+
const cx = p[0];
|
902
|
+
const cy = p[1];
|
903
|
+
const rx = p[2];
|
904
|
+
const ry = p[3];
|
905
|
+
const theta = p[4];
|
906
|
+
const dTheta = p[5];
|
907
|
+
const psi = p[6];
|
908
|
+
const fs = p[7];
|
909
|
+
const r = rx > ry ? rx : ry;
|
910
|
+
const scaleX = rx > ry ? 1 : rx / ry;
|
911
|
+
const scaleY = rx > ry ? ry / rx : 1;
|
912
|
+
this.ctx.translate(cx, cy);
|
913
|
+
this.ctx.rotate(psi);
|
914
|
+
this.ctx.scale(scaleX, scaleY);
|
915
|
+
this.ctx.arc(0, 0, r, theta, theta + dTheta, (1 - fs));
|
916
|
+
this.ctx.scale(1 / scaleX, 1 / scaleY);
|
917
|
+
this.ctx.rotate(-psi);
|
918
|
+
this.ctx.translate(-cx, -cy);
|
919
|
+
break;
|
920
|
+
case 'z':
|
921
|
+
isClosed = true;
|
922
|
+
this.ctx.closePath();
|
923
|
+
break;
|
924
|
+
}
|
925
|
+
}
|
926
|
+
if (!isClosed) {
|
927
|
+
this.ctx.stroke();
|
928
|
+
}
|
929
|
+
else {
|
930
|
+
this.ctx.fill();
|
931
|
+
}
|
932
|
+
this.ctx.restore();
|
933
|
+
}
|
934
|
+
}
|
935
|
+
export const drawer = new Drawer();
|
936
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhd2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ3JpZC9zcmMvcmVuZGVyZXIvZHJhd2Vycy9kcmF3ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxnQkFBZ0IsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQ0gsZUFBZSxFQUNmLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDcEIsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2Qix1QkFBdUIsRUFDdkIsa0NBQWtDLEVBQ2xDLCtCQUErQixFQUMvQix5QkFBeUIsRUFDekIsWUFBWSxFQUNaLGVBQWUsRUFDbEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3JDLE9BQU8sRUFFSCxpQkFBaUIsRUFDakIsaUJBQWlCLEVBVXBCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFbkYsb0JBQW9CO0FBQ3BCLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztBQUV2RDs7R0FFRztBQUNILE1BQU0sT0FBTyxNQUFNO0lBQW5CO1FBQ0ksUUFBRyxHQUE2QixXQUFXLEVBQUUsQ0FBQyxPQUFRLENBQUM7UUFDdkQsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixXQUFNLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBbWpDakMsQ0FBQztJQWpqQ1UsT0FBTyxDQUFDLEdBQTZCO1FBQ3hDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLFdBQVcsRUFB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QUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUM5RCxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLENBQUM7WUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsUUFBUSxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3hGLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLE1BQU0sR0FBRyxXQUFXLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLFdBQVcsRUFBRSxDQUFDLEdBQUcsTUFBTSxHQUFHLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3BHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxHQUFHLENB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QUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEIsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUVELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVuSSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNaLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNaLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1gsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLENBQUM7UUFFRCxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQy9CLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUVoQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDdkUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBRXZFLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBVztZQUM5QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFXLEVBQUUsQ0FBVztZQUM3QyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFXLEVBQUUsQ0FBVztZQUM3QyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDN0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdkQsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUxQixJQUFJLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNyQixNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNyQixDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2xDLENBQUM7UUFDRCxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sR0FBRyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbEMsQ0FBQztRQUNELE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVB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QUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO3dCQUM1QixJQUFJLE9BQU8sQ0FBQyxPQUFPLEtBQUssR0FBRyxFQUFFLENBQUM7NEJBQzFCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUN6QyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDN0MsQ0FBQzt3QkFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO3dCQUNsRCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNoQixHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNoQixHQUFHLEdBQUcsR0FBRyxDQUFDO3dCQUNWLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO3dCQUN0QixNQUFNO29CQUNWLEtBQUssR0FBRzt3QkFDSixNQUFNLEdBQUcsR0FBRyxDQUFDO3dCQUNiLE1BQU0sR0FBRyxHQUFHLENBQUM7d0JBQ2IsT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO3dCQUM1QixJQUFJLE9BQU8sQ0FBQyxPQUFPLEtBQUssR0FBRyxFQUFFLENBQUM7NEJBQzFCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUN6QyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDN0MsQ0FBQzt3QkFDRCxNQUFNLENBQUMsSUFBSSxD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QU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEdyYXBoZW1lU3BsaXR0ZXIgZnJvbSAnZ3JhcGhlbWUtc3BsaXR0ZXInO1xuaW1wb3J0IHtcbiAgICBBSV9UQUJMRV9PRkZTRVQsXG4gICAgQUlfVEFCTEVfVEFHX0ZPTlRfU0laRSxcbiAgICBBSV9UQUJMRV9UQUdfUEFERElORyxcbiAgICBERUZBVUxUX0ZPTlRfRkFNSUxZLFxuICAgIERFRkFVTFRfRk9OVF9TSVpFLFxuICAgIERFRkFVTFRfRk9OVF9XRUlHSFQsXG4gICAgREVGQVVMVF9URVhUX0FMSUdOX0NFTlRFUixcbiAgICBERUZBVUxUX1RFWFRfQUxJR05fTEVGVCxcbiAgICBERUZBVUxUX1RFWFRfREVDT1JBVElPTixcbiAgICBERUZBVUxUX1RFWFRfVkVSVElDQUxfQUxJR05fTUlERExFLFxuICAgIERFRkFVTFRfVEVYVF9WRVJUSUNBTF9BTElHTl9UT1AsXG4gICAgREVGQVVMVF9XUkFQX1RFWFRfTUFYX1JPVyxcbiAgICBGT05UX1NJWkVfU00sXG4gICAgV2ViT3V0bGluZWRQYXRoXG59IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBBSVRhYmxlIH0gZnJvbSAnLi4vLi4vY29yZSc7XG5pbXBvcnQge1xuICAgIEFJVGFibGVBcmMsXG4gICAgQUlUYWJsZUF2YXRhclNpemUsXG4gICAgQUlUYWJsZUF2YXRhclR5cGUsXG4gICAgQUlUYWJsZUN0eFN0eWxlLFxuICAgIEFJVGFibGVJbWFnZSxcbiAgICBBSVRhYmxlTGFiZWwsXG4gICAgQUlUYWJsZUxpbmUsXG4gICAgQUlUYWJsZVJlY3QsXG4gICAgQUlUYWJsZVRleHQsXG4gICAgQUlUYWJsZVRleHRFbGxpcHNpcyxcbiAgICBBSVRhYmxlV3JhcFRleHQsXG4gICAgQUlUYWJsZVdyYXBUZXh0RGF0YVxufSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBnZXRUZXh0V2lkdGgsIGltYWdlQ2FjaGUsIHRleHREYXRhQ2FjaGUsIFRleHRNZWFzdXJlIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG4vLyDnlKjkuo7mraPnoa7lnLDliIblibLlrZfnrKbkuLLvvIzljIXmi6zooajmg4XnrKblj7dcbmV4cG9ydCBjb25zdCBncmFwaGVtZVNwbGl0dGVyID0gbmV3IEdyYXBoZW1lU3BsaXR0ZXIoKTtcblxuLyoqXG4gKiDnlKjkuo7lnKggQ2FudmFzIOS4iui/m+ihjOeahOWQhOenjee7mOWbvuaTjeS9nO+8jOWMheWQq+S6huaWh+acrOe7mOWItuOAgeefqeW9oue7mOWItuOAgei3r+W+hOe7mOWItuS7peWPiuS4gOS6m+WHoOS9leiuoeeul+etieWKn+iDvVxuICovXG5leHBvcnQgY2xhc3MgRHJhd2VyIHtcbiAgICBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCA9IFRleHRNZWFzdXJlKCkuY29udGV4dCE7XG4gICAgbmVlZERyYXcgPSBmYWxzZTtcbiAgICBjb2xvcnMgPSBBSVRhYmxlLmdldENvbG9ycygpO1xuXG4gICAgcHVibGljIGluaXRDdHgoY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQpIHtcbiAgICAgICAgdGhpcy5uZWVkRHJhdyA9IEJvb2xlYW4oY3R4KTtcbiAgICAgICAgdGhpcy5jdHggPSBjdHggfHwgVGV4dE1lYXN1cmUoKS5jb250ZXh0ITtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRleHRCYXNlbGluZSDmjIflrprkuLogbWlkZGxl77yM5YW85a655rWP6KeI5Zmo5beu5byCXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmN0eC50ZXh0QmFzZWxpbmUgPSBERUZBVUxUX1RFWFRfVkVSVElDQUxfQUxJR05fTUlERExFO1xuICAgIH1cblxuICAgIC8vIOiuvue9ruagt+W8j1xuICAgIHB1YmxpYyBzZXRTdHlsZShvcHRpb25zOiBBSVRhYmxlQ3R4U3R5bGUpIHtcbiAgICAgICAgY29uc3QgeyBmb250U2l6ZSwgZm9udFdlaWdodCwgZmlsbFN0eWxlLCBzdHJva2VTdHlsZSB9ID0gb3B0aW9ucztcblxuICAgICAgICBpZiAoZm9udFNpemUgfHwgZm9udFdlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5jdHguZm9udCA9IGAke2ZvbnRXZWlnaHQgfHwgREVGQVVMVF9GT05UX1dFSUdIVH0gJHtmb250U2l6ZSB8fCBERUZBVUxUX0ZPTlRfU0laRX1weCAke0RFRkFVTFRfRk9OVF9GQU1JTFl9YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsbFN0eWxlKSB7XG4gICAgICAgICAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBmaWxsU3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cm9rZVN0eWxlKSB7XG4gICAgICAgICAgICB0aGlzLmN0eC5zdHJva2VTdHlsZSA9IHN0cm9rZVN0eWxlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8g5paH5pys55yB55WlXG4gICAgcHVibGljIHRleHRFbGxpcHNpcyhvcHRpb25zOiBBSVRhYmxlVGV4dEVsbGlwc2lzKSB7XG4gICAgICAgIGNvbnN0IHsgdGV4dCwgbWF4V2lkdGgsIGZvbnRTaXplID0gREVGQVVMVF9GT05UX1NJWkUsIGZvbnRXZWlnaHQgPSBERUZBVUxUX0ZPTlRfV0VJR0hUIH0gPSBvcHRpb25zO1xuXG4gICAgICAgIGlmICh0ZXh0ID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRleHQ6ICcnLFxuICAgICAgICAgICAgICAgIHRleHRXaWR0aDogMCxcbiAgICAgICAgICAgICAgICBpc0VsbGlwc2lzOiBmYWxzZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZm9udFN0eWxlID0gYCR7Zm9udFdlaWdodH0gJHtmb250U2l6ZX1weCAke0RFRkFVTFRfRk9OVF9GQU1JTFl9YDtcblxuICAgICAgICBpZiAoIW1heFdpZHRoKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICAgICAgdGV4dFdpZHRoOiBnZXRUZXh0V2lkdGgodGhpcy5jdHgsIHRleHQsIGZvbnRTdHlsZSksXG4gICAgICAgICAgICAgICAgaXNFbGxpcHNpczogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbGxpcHNpcyA9ICfigKYnO1xuICAgICAgICBjb25zdCB0ZXh0U2l6ZSA9IHRleHQubGVuZ3RoO1xuICAgICAgICAvLyDpooTlhYjnoa7lrprkvKDlhaXmlofmnKznmoTpmIjlgLzlrr3luqZcbiAgICAgICAgbGV0IGd1ZXNzU2l6ZSA9IE1hdGguY2VpbChtYXhXaWR0aCAvIGZvbnRTaXplKTtcbiAgICAgICAgbGV0IGd1ZXNzVGV4dCA9IHRleHQuc3Vic3RyKDAsIGd1ZXNzU2l6ZSk7XG4gICAgICAgIGxldCBndWVzc1dpZHRoID0gZ2V0VGV4dFdpZHRoKHRoaXMuY3R4LCBndWVzc1RleHQsIGZvbnRTdHlsZSk7XG5cbiAgICAgICAgd2hpbGUgKGd1ZXNzV2lkdGggPD0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIGlmICh0ZXh0U2l6ZSA8PSBndWVzc1NpemUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICAgICAgICB0ZXh0V2lkdGg6IGd1ZXNzV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGlzRWxsaXBzaXM6IGZhbHNlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGd1ZXNzU2l6ZSsrO1xuICAgICAgICAgICAgZ3Vlc3NUZXh0ID0gdGV4dC5zdWJzdHIoMCwgZ3Vlc3NTaXplKTtcbiAgICAgICAgICAgIGd1ZXNzV2lkdGggPSBnZXRUZXh0V2lkdGgodGhpcy5jdHgsIGd1ZXNzVGV4dCwgZm9udFN0eWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVsbGlwc2lzV2lkdGggPSBnZXRUZXh0V2lkdGgodGhpcy5jdHgsIGVsbGlwc2lzLCBmb250U3R5bGUpO1xuICAgICAgICB3aGlsZSAoZ3Vlc3NTaXplID49IDAgJiYgZ3Vlc3NXaWR0aCArIGVsbGlwc2lzV2lkdGggPiBtYXhXaWR0aCkge1xuICAgICAgICAgICAgZ3Vlc3NTaXplLS07XG4gICAgICAgICAgICBndWVzc1RleHQgPSB0ZXh0LnN1YnN0cigwLCBndWVzc1NpemUpO1xuICAgICAgICAgICAgZ3Vlc3NXaWR0aCA9IGdldFRleHRXaWR0aCh0aGlzLmN0eCwgZ3Vlc3NUZXh0LCBmb250U3R5bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRleHQ6IGAke2d1ZXNzVGV4dCB8fCB0ZXh0WzBdfSR7ZWxsaXBzaXN9YCxcbiAgICAgICAgICAgIHRleHRXaWR0aDogbWF4V2lkdGgsXG4gICAgICAgICAgICBpc0VsbGlwc2lzOiB0cnVlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8g57uY5Yi257q/5q61XG4gICAgcHVibGljIGxpbmUob3B0aW9uczogQUlUYWJsZUxpbmUpIHtcbiAgICAgICAgY29uc3QgeyB4LCB5LCBwb2ludHMsIHN0cm9rZSwgY2xvc2VkID0gZmFsc2UgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHBvaW50cy5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgICB0aGlzLmN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgaWYgKHN0cm9rZSkgdGhpcy5jdHguc3Ryb2tlU3R5bGUgPSBzdHJva2U7XG4gICAgICAgIHRoaXMuY3R4LmxpbmVXaWR0aCA9IDE7XG4gICAgICAgIHRoaXMuY3R4LnRyYW5zbGF0ZSh4LCB5KTtcbiAgICAgICAgdGhpcy5jdHgubW92ZVRvKHBvaW50c1swXSwgcG9pbnRzWzFdKTtcblxuICAgICAgICBmb3IgKGxldCBuID0gMjsgbiA8IGxlbmd0aDsgbiArPSAyKSB7XG4gICAgICAgICAgICB0aGlzLmN0eC5saW5lVG8ocG9pbnRzW25dLCBwb2ludHNbbiArIDFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjbG9zZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3R4LnN0cm9rZSgpO1xuICAgICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XG4gICAgfVxuXG4gICAgLy8g57uY5Yi25ZyGXG4gICAgcHVibGljIGFyYyhvcHRpb25zOiBBSVRhYmxlQXJjKSB7XG4gICAgICAgIGNvbnN0IHsgeCwgeSwgc3Ryb2tlLCBmaWxsLCByYWRpdXMgfSA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBpZiAoZmlsbCkgdGhpcy5zZXRTdHlsZSh7IGZpbGxTdHlsZTogZmlsbCB9KTtcbiAgICAgICAgaWYgKHN0cm9rZSkgdGhpcy5zZXRTdHlsZSh7IHN0cm9rZVN0eWxlOiBzdHJva2UgfSk7XG4gICAgICAgIHRoaXMuY3R4LmFyYyh4LCB5LCByYWRpdXMsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSk7XG4gICAgICAgIGlmIChmaWxsKSB7XG4gICAgICAgICAgICB0aGlzLmN0eC5maWxsKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cm9rZSkge1xuICAgICAgICAgICAgdGhpcy5jdHguc3Ryb2tlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDnu5jliLbnn6nlvaJcbiAgICBwdWJsaWMgcmVjdChvcHRpb25zOiBBSVRhYmxlUmVjdCkge1xuICAgICAgICBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQsIHJhZGl1cywgZmlsbCwgc3Ryb2tlIH0gPSBvcHRpb25zO1xuXG4gICAgICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBpZiAoZmlsbCkgdGhpcy5zZXRTdHlsZSh7IGZpbGxTdHlsZTogZmlsbCB9KTtcbiAgICAgICAgaWYgKHN0cm9rZSkgdGhpcy5zZXRTdHlsZSh7IHN0cm9rZVN0eWxlOiBzdHJva2UgfSk7XG5cbiAgICAgICAgaWYgKCFyYWRpdXMpIHtcbiAgICAgICAgICAgIHRoaXMuY3R4LnJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgdG9wTGVmdCA9IDA7XG4gICAgICAgICAgICBsZXQgdG9wUmlnaHQgPSAwO1xuICAgICAgICAgICAgbGV0IGJvdHRvbUxlZnQgPSAwO1xuICAgICAgICAgICAgbGV0IGJvdHRvbVJpZ2h0ID0gMDtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiByYWRpdXMgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgdG9wTGVmdCA9IHRvcFJpZ2h0ID0gYm90dG9tTGVmdCA9IGJvdHRvbVJpZ2h0ID0gTWF0aC5taW4ocmFkaXVzLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0b3BMZWZ0ID0gTWF0aC5taW4ocmFkaXVzWzBdIHx8IDAsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XG4gICAgICAgICAgICAgICAgdG9wUmlnaHQgPSBNYXRoLm1pbihyYWRpdXNbMV0gfHwgMCwgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAgICAgICAgICAgICAgICBib3R0b21SaWdodCA9IE1hdGgubWluKHJhZGl1c1syXSB8fCAwLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuICAgICAgICAgICAgICAgIGJvdHRvbUxlZnQgPSBNYXRoLm1pbihyYWRpdXNbM10gfHwgMCwgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jdHgubW92ZVRvKHggKyB0b3BMZWZ0LCB5KTtcbiAgICAgICAgICAgIHRoaXMuY3R4LmxpbmVUbyh4ICsgd2lkdGggLSB0b3BSaWdodCwgeSk7XG4gICAgICAgICAgICB0aGlzLmN0eC5hcmMoeCArIHdpZHRoIC0gdG9wUmlnaHQsIHkgKyB0b3BSaWdodCwgdG9wUmlnaHQsIChNYXRoLlBJICogMykgLyAyLCAwLCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmN0eC5saW5lVG8oeCArIHdpZHRoLCB5ICsgaGVpZ2h0IC0gYm90dG9tUmlnaHQpO1xuICAgICAgICAgICAgdGhpcy5jdHguYXJjKHggKyB3aWR0aCAtIGJvdHRvbVJpZ2h0LCB5ICsgaGVpZ2h0IC0gYm90dG9tUmlnaHQsIGJvdHRvbVJpZ2h0LCAwLCBNYXRoLlBJIC8gMiwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5jdHgubGluZVRvKHggKyBib3R0b21MZWZ0LCB5ICsgaGVpZ2h0KTtcbiAgICAgICAgICAgIHRoaXMuY3R4LmFyYyh4ICsgYm90dG9tTGVmdCwgeSArIGhlaWdodCAtIGJvdHRvbUxlZnQsIGJvdHRvbUxlZnQsIE1hdGguUEkgLyAyLCBNYXRoLlBJLCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmN0eC5saW5lVG8oeCwgeSArIHRvcExlZnQpO1xuICAgICAgICAgICAgdGhpcy5jdHguYXJjKHggKyB0b3BMZWZ0LCB5ICsgdG9wTGVmdCwgdG9wTGVmdCwgTWF0aC5QSSwgKE1hdGguUEkgKiAzKSAvIDIsIGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3R4LmNsb3NlUGF0aCgpO1xuXG4gICAgICAgIGlmIChmaWxsKSB7XG4gICAgICAgICAgICB0aGlzLmN0eC5maWxsKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cm9rZSkge1xuICAgICAgICAgICAgdGhpcy5jdHguc3Ryb2tlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY3VzdG9tUmVjdChvcHRpb25zOiBBSVRhYmxlUmVjdCkge1xuICAgICAgICBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGwsIHN0cm9rZXMgfSA9IG9wdGlvbnM7XG4gICAgICAgIGlmIChmaWxsKSB0aGlzLnNldFN0eWxlKHsgZmlsbFN0eWxlOiBmaWxsIH0pO1xuICAgICAgICB0aGlzLmN0eC5maWxsUmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgaWYgKHN0cm9rZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0IH0gPSBzdHJva2VzO1xuICAgICAgICAgICAgLy8g5LiK6L655qGGXG4gICAgICAgICAgICB0aGlzLmN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3R5bGUoeyBzdHJva2VTdHlsZTogdG9wID8/IHRoaXMuY29sb3JzLnRyYW5zcGFyZW50IH0pO1xuICAgICAgICAgICAgdGhpcy5jdHgubW92ZVRvKHgsIHkpO1xuICAgICAgICAgICAgdGhpcy5jdHgubGluZVRvKHggKyB3aWR0aCwgeSk7XG4gICAgICAgICAgICB0aGlzLmN0eC5zdHJva2UoKTtcbiAgICAgICAgICAgIC8vIOWPs+i+ueahhlxuICAgICAgICAgICAgdGhpcy5jdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICB0aGlzLnNldFN0eWxlKHsgc3Ryb2tlU3R5bGU6IHJpZ2h0ID8/IHRoaXMuY29sb3JzLnRyYW5zcGFyZW50IH0pO1xuICAgICAgICAgICAgdGhpcy5jdHgubW92ZVRvKHggKyB3aWR0aCwgeSk7XG4gICAgICAgICAgICB0aGlzLmN0eC5saW5lVG8oeCArIHdpZHRoLCB5ICsgaGVpZ2h0KTtcbiAgICAgICAgICAgIHRoaXMuY3R4LnN0cm9rZSgpO1xuICAgICAgICAgICAgLy8g5LiL6L655qGGXG4gICAgICAgICAgICB0aGlzLmN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3R5bGUoeyBzdHJva2VTdHlsZTogYm90dG9tID8/IHRoaXMuY29sb3JzLnRyYW5zcGFyZW50IH0pO1xuICAgICAgICAgICAgdGhpcy5jdHgubW92ZVRvKHgsIHkgKyBoZWlnaHQpO1xuICAgICAgICAgICAgdGhpcy5jdHgubGluZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCk7XG4gICAgICAgICAgICB0aGlzLmN0eC5zdHJva2UoKTtcbiAgICAgICAgICAgIC8vIOW3pui+ueahhlxuICAgICAgICAgICAgdGhpcy5jdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICB0aGlzLnNldFN0eWxlKHsgc3Ryb2tlU3R5bGU6IGxlZnQgPz8gdGhpcy5jb2xvcnMudHJhbnNwYXJlbnQgfSk7XG4gICAgICAgICAgICB0aGlzLmN0eC5tb3ZlVG8oeCwgeSk7XG4gICAgICAgICAgICB0aGlzLmN0eC5saW5lVG8oeCwgeSArIGhlaWdodCk7XG4gICAgICAgICAgICB0aGlzLmN0eC5zdHJva2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIOaNouihjOaWh+acrOe7mOWItlxuICAgIHB1YmxpYyB3cmFwVGV4dChvcHRpb25zOiBBSVRhYmxlV3JhcFRleHQpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgeCxcbiAgICAgICAgICAgIHksXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgbWF4V2lkdGgsXG4gICAgICAgICAgICBsaW5lSGVpZ2h0LFxuICAgICAgICAgICAgbWF4Um93ID0gREVGQVVMVF9XUkFQX1RFWFRfTUFYX1JPVyxcbiAgICAgICAgICAgIGZvbnRTaXplID0gREVGQVVMVF9GT05UX1NJWkUsXG4gICAgICAgICAgICBmaWxsU3R5bGUgPSB0aGlzLmNvbG9ycy5ncmF5ODAwLFxuICAgICAgICAgICAgdGV4dEFsaWduID0gREVGQVVMVF9URVhUX0FMSUdOX0xFRlQsXG4gICAgICAgICAgICB2ZXJ0aWNhbEFsaWduID0gREVGQVVMVF9URVhUX1ZFUlRJQ0FMX0FMSUdOX1RPUCxcbiAgICAgICAgICAgIGZvbnRXZWlnaHQgPSBERUZBVUxUX0ZPTlRfV0VJR0hULFxuICAgICAgICAgICAgdGV4dERlY29yYXRpb24gPSBERUZBVUxUX1RFWFRfREVDT1JBVElPTixcbiAgICAgICAgICAgIGZpZWxkVHlwZSxcbiAgICAgICAgICAgIG5lZWREcmF3ID0gZmFsc2VcbiAgICAgICAgfSA9IG9wdGlvbnM7XG4gICAgICAgIGxldCBvZmZzZXRYID0gMDtcbiAgICAgICAgbGV0IG9mZnNldFkgPSAwO1xuICAgICAgICBjb25zdCBiYXNlbGluZU9mZnNldCA9IHZlcnRpY2FsQWxpZ24gPT09IERFRkFVTFRfVEVYVF9WRVJUSUNBTF9BTElHTl9UT1AgPyBmb250U2l6ZSAvIDIgOiAwO1xuICAgICAgICBjb25zdCBmb250U3R5bGUgPSBgJHtmb250V2VpZ2h0fS0ke2ZvbnRTaXplfXB4YDtcbiAgICAgICAgY29uc3QgaXNVbmRlcmxpbmUgPSB0ZXh0RGVjb3JhdGlvbiA9PT0gJ3VuZGVybGluZSc7XG4gICAgICAgIGNvbnN0IHRleHRSZW5kZXJlciA9ICh0ZXh0RGF0YUxpc3Q6IGFueVtdKSA9PiB7XG4gICAgICAgICAgICB0ZXh0RGF0YUxpc3QuZm9yRWFjaCgoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgb2Zmc2V0WCwgb2Zmc2V0WSwgdGV4dCwgd2lkdGgsIGxpbmtVcmwgfSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgdGhpcy5jdHguZmlsbFRleHQodGV4dCwgeCArIG9mZnNldFgsIHkgKyBvZmZzZXRZICsgYmFzZWxpbmVPZmZzZXQpO1xuICAgICAgICAgICAgICAgIGlmIChsaW5rVXJsIHx8IGlzVW5kZXJsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGluZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICB4OiB4ICsgb2Zmc2V0WCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IHkgKyBvZmZzZXRZICsgQUlfVEFCTEVfT0ZGU0VULFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzOiBbMCwgZm9udFNpemUsIHdpZHRoLCBmb250U2l6ZV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U6IGZpbGxTdHlsZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZmlsbFN0eWxlKSB0aGlzLnNldFN0eWxlKHsgZmlsbFN0eWxlIH0pO1xuICAgICAgICB0aGlzLmN0eC50ZXh0QWxpZ24gPSB0ZXh0QWxpZ247XG5cbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBgJHtmb250U3R5bGV9LSR7bWF4Um93fS0ke21heFdpZHRoIHx8IDB9LSR7ZmllbGRUeXBlfS0ke3RleHR9YDtcbiAgICAgICAgY29uc3QgY2FjaGVUZXh0RGF0YSA9IHRleHREYXRhQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICAgICAgaWYgKGNhY2hlVGV4dERhdGEpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5lZWREcmF3ICYmIG5lZWREcmF3KSB7XG4gICAgICAgICAgICAgICAgdGV4dFJlbmRlcmVyKGNhY2hlVGV4dERhdGEuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVUZXh0RGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdERhdGE6IEFJVGFibGVXcmFwVGV4dERhdGEgPSBbXTtcbiAgICAgICAgLy8g5YeG56Gu5YiH5YiG5YyF5ZCr6KGo5oOF56ym5Y+355qE5a2X56ym5LiyXG4gICAgICAgIGNvbnN0IGFyclRleHQgPSBncmFwaGVtZVNwbGl0dGVyLnNwbGl0R3JhcGhlbWVzKHRleHQpO1xuICAgICAgICBjb25zdCB0ZXh0TGVuZ3RoID0gYXJyVGV4dC5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGVsbGlwc2lzV2lkdGggPSB0aGlzLmN0eC5tZWFzdXJlVGV4dCgn4oCmJykud2lkdGg7XG4gICAgICAgIGxldCBzaG93VGV4dCA9ICcnOyAvLyDmr4/kuKrniYfmrrXmmL7npLrnmoTmlofmnKxcbiAgICAgICAgbGV0IHNob3dUZXh0V2lkdGggPSAwOyAvLyDmr4/mrrXnmoTlrr3luqZcbiAgICAgICAgbGV0IHNob3dMaW5lV2lkdGggPSAwOyAvLyDlvZPliY3mr4/ooYzmmL7npLrmloflrZfnmoTlrr3luqZcbiAgICAgICAgbGV0IHJvd0NvdW50ID0gMDtcblxuICAgICAgICBjb25zdCBpc0VsbGlwc2lzID0gdGhpcy50ZXh0RWxsaXBzaXMoeyB0ZXh0LCBtYXhXaWR0aDogbWF4V2lkdGggfSkuaXNFbGxpcHNpcztcblxuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHRleHRMZW5ndGg7IG4rKykge1xuICAgICAgICAgICAgY29uc3QgY3VyVGV4dCA9IGFyclRleHRbbl07XG4gICAgICAgICAgICBjb25zdCBpc0xpbmVCcmVhayA9IFsnXFxuJywgJ1xcciddLmluY2x1ZGVzKGN1clRleHQpO1xuICAgICAgICAgICAgY29uc3Qgc2luZ2xlVGV4dCA9IGlzTGluZUJyZWFrID8gJycgOiBjdXJUZXh0O1xuICAgICAgICAgICAgY29uc3QgY29tcG9zZVRleHQgPSBzaG93VGV4dCArIHNpbmdsZVRleHQ7XG4gICAgICAgICAgICBjb25zdCBpc0xpbWl0Um93ID0gbWF4Um93ID8gcm93Q291bnQgPj0gbWF4Um93IC0gMSA6IGZhbHNlO1xuICAgICAgICAgICAgY29uc3Qgc2luZ2xlVGV4dFdpZHRoID0gaXNMaW5lQnJlYWsgPyAwIDogdGhpcy5jdHgubWVhc3VyZVRleHQoc2luZ2xlVGV4dCkud2lkdGg7XG4gICAgICAgICAgICBzaG93TGluZVdpZHRoICs9IHNpbmdsZVRleHRXaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGRpZmZXaWR0aCA9IGlzTGltaXRSb3cgPyBzaG93TGluZVdpZHRoICsgKGlzRWxsaXBzaXMgPyBlbGxpcHNpc1dpZHRoIDogMCkgOiBzaG93TGluZVdpZHRoO1xuICAgICAgICAgICAgY29uc3QgaXNMaW5lRW5kID0gZGlmZldpZHRoID4gbWF4V2lkdGg7XG5cbiAgICAgICAgICAgIC8vIOmBh+WIsOaNouihjOespuaIluihjOWwvlxuICAgICAgICAgICAgaWYgKChpc0xpbmVFbmQgfHwgaXNMaW5lQnJlYWspICYmIHJvd0NvdW50IDwgbWF4Um93KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNMYXN0TGV0dGVyID0gbiA9PT0gYXJyVGV4dC5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIHJlc3VsdERhdGEucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFgsXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFksXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBNYXRoLmNlaWwoc2hvd1RleHRXaWR0aCksXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGlzTGltaXRSb3cgPyAoaXNMYXN0TGV0dGVyID8gY29tcG9zZVRleHQgOiBgJHtzaG93VGV4dH3igKZgKSA6IHNob3dUZXh0XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc2hvd1RleHQgPSBzaW5nbGVUZXh0O1xuICAgICAgICAgICAgICAgIG9mZnNldFggPSAwO1xuICAgICAgICAgICAgICAgIHNob3dUZXh0V2lkdGggPSBzaW5nbGVUZXh0V2lkdGg7XG4gICAgICAgICAgICAgICAgc2hvd0xpbmVXaWR0aCA9IHNpbmdsZVRleHRXaWR0aDtcblxuICAgICAgICAgICAgICAgIGlmIChpc0xpbWl0Um93KSB7XG4gICAgICAgICAgICAgICAgICAgIHNob3dUZXh0ID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByb3dDb3VudCsrO1xuICAgICAgICAgICAgICAgIG9mZnNldFkgKz0gbGluZUhlaWdodDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2hvd1RleHQgPSBjb21wb3NlVGV4dDtcbiAgICAgICAgICAgIHNob3dUZXh0V2lkdGggKz0gc2luZ2xlVGV4dFdpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNob3dUZXh0KSB7XG4gICAgICAgICAgICByZXN1bHREYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgIG9mZnNldFgsXG4gICAgICAgICAgICAgICAgb2Zmc2V0WSxcbiAgICAgICAgICAgICAgICB3aWR0aDogTWF0aC5jZWlsKHNob3dUZXh0V2lkdGgpLFxuICAgICAgICAgICAgICAgIHRleHQ6IHNob3dUZXh0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm5lZWREcmF3ICYmIG5lZWREcmF3KSB7XG4gICAgICAgICAgICB0ZXh0UmVuZGVyZXIocmVzdWx0RGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXMgPSB7XG4gICAgICAgICAgICBoZWlnaHQ6IHJvd0NvdW50IDwgbWF4Um93ID8gb2Zmc2V0WSArIGxpbmVIZWlnaHQgOiBvZmZzZXRZLFxuICAgICAgICAgICAgZGF0YTogcmVzdWx0RGF0YVxuICAgICAgICB9O1xuXG4gICAgICAgIHRleHREYXRhQ2FjaGUuc2V0KGNhY2hlS2V5LCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vIOe7mOWItuWNleihjOaWh+acrFxuICAgIHB1YmxpYyB0ZXh0KG9wdGlvbnM6IEFJVGFibGVUZXh0KSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHgsXG4gICAgICAgICAgICB5LFxuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIGZvbnRTaXplID0gREVGQVVMVF9GT05UX1NJWkUsXG4gICAgICAgICAgICBmaWxsU3R5bGUgPSB0aGlzLmNvbG9ycy5ncmF5ODAwLFxuICAgICAgICAgICAgdGV4dEFsaWduID0gREVGQVVMVF9URVhUX0FMSUdOX0xFRlQsXG4gICAgICAgICAgICB2ZXJ0aWNhbEFsaWduID0gREVGQVVMVF9URVhUX1ZFUlRJQ0FMX0FMSUdOX1RPUCxcbiAgICAgICAgICAgIGZvbnRXZWlnaHQgPSBERUZBVUxUX0ZPTlRfV0VJR0hULFxuICAgICAgICAgICAgdGV4dERlY29yYXRpb24gPSBERUZBVUxUX1RFWFRfREVDT1JBVElPTlxuICAgICAgICB9ID0gb3B0aW9ucztcblxuICAgICAgICBjb25zdCBmb250U3R5bGUgPSBgJHtmb250V2VpZ2h0fSAke2ZvbnRTaXplfXB4ICR7REVGQVVMVF9GT05UX0ZBTUlMWX1gO1xuXG4gICAgICAgIGlmICh0ZXh0RGVjb3JhdGlvbiA9PT0gJ3VuZGVybGluZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHRleHRXaWR0aCA9IGdldFRleHRXaWR0aCh0aGlzLmN0eCwgdGV4dCwgZm9udFN0eWxlKTtcbiAgICAgICAgICAgIHRoaXMubGluZSh7XG4gICAgICAgICAgICAgICAgeDogeCxcbiAgICAgICAgICAgICAgICB5OiB5ICsgQUlfVEFCTEVfT0ZGU0VULFxuICAgICAgICAgICAgICAgIHBvaW50czogWzAsIGZvbnRTaXplLCB0ZXh0V2lkdGgsIGZvbnRTaXplXSxcbiAgICAgICAgICAgICAgICBzdHJva2U6IGZpbGxTdHlsZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXNlbGluZU9mZnNldCA9IHZlcnRpY2FsQWxpZ24gPT09IERFRkFVTFRfVEVYVF9WRVJUSUNBTF9BTElHTl9UT1AgPyBmb250U2l6ZSAvIDIgOiAwO1xuICAgICAgICBpZiAoZmlsbFN0eWxlKSB0aGlzLnNldFN0eWxlKHsgZmlsbFN0eWxlIH0pO1xuICAgICAgICB0aGlzLmN0eC50ZXh0QWxpZ24gPSB0ZXh0QWxpZ247XG4gICAgICAgIHRoaXMuY3R4LmZvbnQgPSBmb250U3R5bGU7XG4gICAgICAgIHRoaXMuY3R4LmZpbGxUZXh0KHRleHQsIHgsIHkgKyBiYXNlbGluZU9mZnNldCk7XG4gICAgfVxuXG4gICAgLy8g57uY5Yi25qCH562+XG4gICAgcHVibGljIHRhZyhvcHRpb25zOiBBSVRhYmxlTGFiZWwpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB4LFxuICAgICAgICAgICAgeSxcbiAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIHJhZGl1cyxcbiAgICAgICAgICAgIGJhY2tncm91bmQsXG4gICAgICAgICAgICBjb2xvciA9IHRoaXMuY29sb3JzLmdyYXk4MDAsXG4gICAgICAgICAgICBmb250U2l6ZSA9IEFJX1RBQkxFX1RBR19GT05UX1NJWkUsXG4gICAgICAgICAgICBmb250V2VpZ2h0ID0gREVGQVVMVF9GT05UX1dFSUdIVCxcbiAgICAgICAgICAgIHN0cm9rZVxuICAgICAgICB9ID0gb3B0aW9ucztcblxuICAgICAgICAvLyDog4zmma9cbiAgICAgICAgdGhpcy5yZWN0KHtcbiAgICAgICAgICAgIHgsXG4gICAgICAgICAgICB5LFxuICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICByYWRpdXMsXG4gICAgICAgICAgICBmaWxsOiBiYWNrZ3JvdW5kLFxuICAgICAgICAgICAgc3Ryb2tlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudGV4dCh7XG4gICAgICAgICAgICB4OiB4ICsgQUlfVEFCTEVfVEFHX1BBRERJTkcsXG4gICAgICAgICAgICB5OiB5ICsgKGhlaWdodCAtIGZvbnRTaXplKSAvIDIsXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgZmlsbFN0eWxlOiBjb2xvcixcbiAgICAgICAgICAgIGZvbnRTaXplLFxuICAgICAgICAgICAgZm9udFdlaWdodFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW1hZ2Uob3B0aW9uczogQUlUYWJsZUltYWdlLCBjcm9zc09yaWdpbj86IGJvb2xlYW4sIGFsbG93RGVmYXVsdD86IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgeyB4LCB5LCB1cmwsIHdpZHRoLCBoZWlnaHQsIG9wYWNpdHkgPSAxLCBjbGlwRnVuYyB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgY29sb3JzID0gQUlUYWJsZS5nZXRDb2xvcnMoKTtcbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbWFnZSA9IGltYWdlQ2FjaGUuZ2V0SW1hZ2UodXJsKTtcbiAgICAgICAgLy8gTm90IGxvYWRlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgaWYgKGltYWdlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKGFsbG93RGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGF0aCh7XG4gICAgICAgICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgICAgICAgIHk6IHkgKyAyLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBXZWJPdXRsaW5lZFBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHNpemU6IDE2LFxuICAgICAgICAgICAgICAgICAgICBmaWxsOiBjb2xvcnMuZ3JheTYwMFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVubG9hZGVkXG4gICAgICAgIGlmIChpbWFnZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gaW1hZ2VDYWNoZS5sb2FkSW1hZ2UodXJsLCB1cmwsIHsgY3Jvc3NPcmlnaW4gfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNPcmlnaW4gPSBvcGFjaXR5ID09PSAxO1xuXG4gICAgICAgIGlmICghY2xpcEZ1bmMgJiYgaXNPcmlnaW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmN0eC5kcmF3SW1hZ2UoaW1hZ2UsIHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjbGlwRnVuYyAmJiAhaXNPcmlnaW4pIHtcbiAgICAgICAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgICAgICAgIHRoaXMuY3R4Lmdsb2JhbEFscGhhID0gb3BhY2l0eTtcbiAgICAgICAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZShpbWFnZSwgeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2xpcEZ1bmMpIHtcbiAgICAgICAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgICAgICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgY2xpcEZ1bmModGhpcy5jdHgpO1xuICAgICAgICAgICAgdGhpcy5jdHguY2xpcCgpO1xuICAgICAgICAgICAgdGhpcy5jdHguZ2xvYmFsQWxwaGEgPSBvcGFjaXR5O1xuICAgICAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKGltYWdlLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhdmF0YXIob3B0aW9uczoge1xuICAgICAgICB4OiBudW1iZXI7XG4gICAgICAgIHk6IG51bWJlcjtcbiAgICAgICAgdXJsOiBzdHJpbmc7XG4gICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgICAgIHR5cGU/OiBBSVRhYmxlQXZhdGFyVHlwZTtcbiAgICAgICAgc2l6ZT86IEFJVGFibGVBdmF0YXJTaXplO1xuICAgICAgICBvcGFjaXR5PzogbnVtYmVyO1xuICAgICAgICBiZ0NvbG9yPzogc3RyaW5nO1xuICAgIH0pIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgeCA9IDAsXG4gICAgICAgICAgICB5ID0gMCxcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICBiZ0NvbG9yID0gdGhpcy5jb2xvcnMud2hpdGUsXG4gICAgICAgICAgICBzaXplID0gQUlUYWJsZUF2YXRhclNpemUuc2l6ZTM2LFxuICAgICAgICAgICAgdHlwZSA9IEFJVGFibGVBdmF0YXJUeXBlLm1lbWJlcixcbiAgICAgICAgICAgIG9wYWNpdHkgPSAxXG4gICAgICAgIH0gPSBvcHRpb25zO1xuXG4gICAgICAgIGlmICh0aXRsZSA9PSBudWxsIHx8IGlkID09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBjb2xvcnMgPSBBSVRhYmxlLmdldENvbG9ycygpO1xuICAgICAgICBjb25zdCBhdmF0YXJTcmMgPSB1cmwgfHwgJyc7XG4gICAgICAgIGNvbnN0IGF2YXRhck5hbWUgPSB0aXRsZTtcbiAgICAgICAgY29uc3QgYXZhdGFyQmcgPSBhdmF0YXJTcmMgPyBjb2xvcnMud2hpdGUgOiBiZ0NvbG9yO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBBSVRhYmxlQXZhdGFyVHlwZS5tZW1iZXI6IHtcbiAgICAgICAgICAgICAgICBjb25zdCByYWRpdXMgPSBzaXplIC8gMjtcbiAgICAgICAgICAgICAgICBpZiAoIWF2YXRhclNyYykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBhdmF0YXJCZztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LmFyYyh4ICsgcmFkaXVzLCB5ICsgcmFkaXVzLCByYWRpdXMsIDAsIE1hdGguUEkgKiAyLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5maWxsKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgeDogeCArIHJhZGl1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IHkgKyByYWRpdXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBhdmF0YXJOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiBERUZBVUxUX1RFWFRfQUxJR05fQ0VOVEVSLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWxBbGlnbjogREVGQVVMVF9URVhUX1ZFUlRJQ0FMX0FMSUdOX01JRERMRSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBGT05UX1NJWkVfU00sXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsU3R5bGU6IGNvbG9ycy53aGl0ZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2Uoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBhdmF0YXJTcmMsXG4gICAgICAgICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgICAgICAgIHksXG4gICAgICAgICAgICAgICAgICAgIHVybDogYXZhdGFyU3JjLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBzaXplLFxuICAgICAgICAgICAgICAgICAgICBjbGlwRnVuYzogKGN0eCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGF2YXRhckJnO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmFyYyh4ICsgcmFkaXVzLCB5ICsgcmFkaXVzLCByYWRpdXMsIDAsIE1hdGguUEkgKiAyLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbCgpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBvcGFjaXR5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmlrnms5XlsIbmpK3lnIblvKfnmoTnq6/ngrnlj4LmlbDljJblvaLlvI/ovazmjaLkuLrkuK3lv4Plj4LmlbDljJblvaLlvI9cbiAgICAgKiDmjqXlj5flvKfnur/nmoTnq6/ngrnlj4LmlbDvvIzlubborqHnrpflh7rlvKfnur/nmoTkuK3lv4PngrnlnZDmoIfjgIHotbflp4vop5LluqbjgIHnu4jmraLop5LluqbnrYnlj4LmlbBcbiAgICAgKiDov5Tlm57lgLzvvJrkuIDkuKrljIXlkKvkuK3lv4PngrnlnZDmoIfjgIHljYrlvoTjgIHml4vovazop5LluqbjgIHotbflp4vop5Lluqbku6Xlj4rop5Lluqblt67nmoTlr7nosaHvvIzov5nkupvlj4LmlbDlj6/ku6Xnm7TmjqXnlKjkuo7nu5jliLbmpK3lnIblvKdcbiAgICAgKiBAcmV0dXJucyBbY3gsIGN5LCByeCwgcnksIHRoZXRhLCBkVGhldGEsIHBzaSwgZnNdXG4gICAgICovXG4gICAgcHJpdmF0ZSBjb252ZXJ0RW5kcG9pbnRUb0NlbnRlclBhcmFtZXRlcml6YXRpb24oXG4gICAgICAgIHgxOiBudW1iZXIsXG4gICAgICAgIHkxOiBudW1iZXIsXG4gICAgICAgIHgyOiBudW1iZXIsXG4gICAgICAgIHkyOiBudW1iZXIsXG4gICAgICAgIGZhOiBhbnksXG4gICAgICAgIGZzOiBudW1iZXIsXG4gICAgICAgIHJ4OiBudW1iZXIsXG4gICAgICAgIHJ5OiBudW1iZXIsXG4gICAgICAgIHBzaURlZzogbnVtYmVyXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IHBzaSA9IHBzaURlZyAqIChNYXRoLlBJIC8gMTgwLjApO1xuICAgICAgICBjb25zdCB4cCA9IChNYXRoLmNvcyhwc2kpICogKHgxIC0geDIpKSAvIDIuMCArIChNYXRoLnNpbihwc2kpICogKHkxIC0geTIpKSAvIDIuMDtcbiAgICAgICAgY29uc3QgeXAgPSAoLTEgKiBNYXRoLnNpbihwc2kpICogKHgxIC0geDIpKSAvIDIuMCArIChNYXRoLmNvcyhwc2kpICogKHkxIC0geTIpKSAvIDIuMDtcblxuICAgICAgICBjb25zdCBsYW1iZGEgPSAoeHAgKiB4cCkgLyAocnggKiByeCkgKyAoeXAgKiB5cCkgLyAocnkgKiByeSk7XG5cbiAgICAgICAgaWYgKGxhbWJkYSA+IDEpIHtcbiAgICAgICAgICAgIHJ4ICo9IE1hdGguc3FydChsYW1iZGEpO1xuICAgICAgICAgICAgcnkgKj0gTWF0aC5zcXJ0KGxhbWJkYSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZiA9IE1hdGguc3FydCgocnggKiByeCAqIChyeSAqIHJ5KSAtIHJ4ICogcnggKiAoeXAgKiB5cCkgLSByeSAqIHJ5ICogKHhwICogeHApKSAvIChyeCAqIHJ4ICogKHlwICogeXApICsgcnkgKiByeSAqICh4cCAqIHhwKSkpO1xuXG4gICAgICAgIGlmIChmYSA9PT0gZnMpIHtcbiAgICAgICAgICAgIGYgKj0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTmFOKGYpKSB7XG4gICAgICAgICAgICBmID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN4cCA9IChmICogcnggKiB5cCkgLyByeTtcbiAgICAgICAgY29uc3QgY3lwID0gKGYgKiAtcnkgKiB4cCkgLyByeDtcblxuICAgICAgICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDIuMCArIE1hdGguY29zKHBzaSkgKiBjeHAgLSBNYXRoLnNpbihwc2kpICogY3lwO1xuICAgICAgICBjb25zdCBjeSA9ICh5MSArIHkyKSAvIDIuMCArIE1hdGguc2luKHBzaSkgKiBjeHAgKyBNYXRoLmNvcyhwc2kpICogY3lwO1xuXG4gICAgICAgIGNvbnN0IHZNYWcgPSBmdW5jdGlvbiAodjogbnVtYmVyW10pIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnNxcnQodlswXSAqIHZbMF0gKyB2WzFdICogdlsxXSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHZSYXRpbyA9IGZ1bmN0aW9uICh1OiBudW1iZXJbXSwgdjogbnVtYmVyW10pIHtcbiAgICAgICAgICAgIHJldHVybiAodVswXSAqIHZbMF0gKyB1WzFdICogdlsxXSkgLyAodk1hZyh1KSAqIHZNYWcodikpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCB2QW5nbGUgPSBmdW5jdGlvbiAodTogbnVtYmVyW10sIHY6IG51bWJlcltdKSB7XG4gICAgICAgICAgICByZXR1cm4gKHVbMF0gKiB2WzFdIDwgdVsxXSAqIHZbMF0gPyAtMSA6IDEpICogTWF0aC5hY29zKHZSYXRpbyh1LCB2KSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHRoZXRhID0gdkFuZ2xlKFsxLCAwXSwgWyh4cCAtIGN4cCkgLyByeCwgKHlwIC0gY3lwKSAvIHJ5XSk7XG4gICAgICAgIGNvbnN0IHUgPSBbKHhwIC0gY3hwKSAvIHJ4LCAoeXAgLSBjeXApIC8gcnldO1xuICAgICAgICBjb25zdCB2ID0gWygtMSAqIHhwIC0gY3hwKSAvIHJ4LCAoLTEgKiB5cCAtIGN5cCkgLyByeV07XG4gICAgICAgIGxldCBkVGhldGEgPSB2QW5nbGUodSwgdik7XG5cbiAgICAgICAgaWYgKHZSYXRpbyh1LCB2KSA8PSAtMSkge1xuICAgICAgICAgICAgZFRoZXRhID0gTWF0aC5QSTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodlJhdGlvKHUsIHYpID49IDEpIHtcbiAgICAgICAgICAgIGRUaGV0YSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZzID09PSAwICYmIGRUaGV0YSA+IDApIHtcbiAgICAgICAgICAgIGRUaGV0YSA9IGRUaGV0YSAtIDIgKiBNYXRoLlBJO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmcyA9PT0gMSAmJiBkVGhldGEgPCAwKSB7XG4gICAgICAgICAgICBkVGhldGEgPSBkVGhldGEgKyAyICogTWF0aC5QSTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2N4LCBjeSwgcngsIHJ5LCB0aGV0YSwgZFRoZXRhLCBwc2ksIGZzXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorqHnrpfkuKTkuKrngrkgKHgxLCB5MSkg5ZKMICh4MiwgeTIpIOS5i+mXtOeahOebtOe6v+i3neemu1xuICAgICAqIEByZXR1cm5zIOS4pOS4queCuSAoeDEsIHkxKSDlkowgKHgyLCB5Mikg5LmL6Ze055qE55u057q/6Led56a777yM5Y2V5L2N5LiO6L6T5YWl55qE5Z2Q5qCH5YC855u45ZCMXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRMaW5lTGVuZ3RoKHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydCgoeDIgLSB4MSkgKiAoeDIgLSB4MSkgKyAoeTIgLSB5MSkgKiAoeTIgLSB5MSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuoeeul+S4ieasoei0neWhnuWwlOabsue6v+S4iue7meWumuWPguaVsCB0IOWvueW6lOeahOeCueeahOWdkOaghy5cbiAgICAgKiDlj6/ku6XlnKjmjIflrprnmoQgdCDlj4LmlbDkuIvorqHnrpflh7rmm7Lnur/kuIrnsr7noa7nmoTkuIDkuKrngrnvvIzov5nkuKrngrnlj6/ku6XnlKjkuo7nu5jliLblubPmu5Hmm7Lnur/nmoTkuIDpg6jliIZcbiAgICAgKiBAcGFyYW0gcGN0IC0gMCDliLAgMSDkuYvpl7TnmoTlj4LmlbDvvIznlKjkuo7mjIflrprmm7Lnur/kuIrnmoTngrnnmoTkvY3nva5cbiAgICAgKiBAcGFyYW0gUDF4IC0g5puy57q/55qE6LW354K5IHgg5Z2Q5qCHXG4gICAgICogQHBhcmFtIFAxeSAtIOabsue6v+eahOi1t+eCuSB5IOWdkOagh1xuICAgICAqIEBwYXJhbSBQMnggLSDmm7Lnur/nmoTnrKzkuIDkuKrmjqfliLbngrkgeCDlnZDmoIdcbiAgICAgKiBAcGFyYW0gUDJ5IC0g5puy57q/55qE56ys5LiA5Liq5o6n5Yi254K5IHkg5Z2Q5qCHXG4gICAgICogQHBhcmFtIFAzeCAtIOabsue6v+eahOesrOS6jOS4quaOp+WItueCuSB4IOWdkOagh1xuICAgICAqIEBwYXJhbSBQM3kgLSDmm7Lnur/nmoTnrKzkuozkuKrmjqfliLbngrkgeSDlnZDmoIdcbiAgICAgKiBAcGFyYW0gUDR4IC0g5puy57q/55qE57uI54K5IHgg5Z2Q5qCHXG4gICAgICogQHBhcmFtIFA0eSAtIOabsue6v+eahOe7iOeCuSB5IOWdkOagh1xuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRQb2ludE9uQ3ViaWNCZXppZXIoXG4gICAgICAgIHBjdDogbnVtYmVyLFxuICAgICAgICBQMXg6IG51bWJlcixcbiAgICAgICAgUDF5OiBudW1iZXIsXG4gICAgICAgIFAyeDogbnVtYmVyLFxuICAgICAgICBQMnk6IG51bWJlcixcbiAgICAgICAgUDN4OiBudW1iZXIsXG4gICAgICAgIFAzeTogbnVtYmVyLFxuICAgICAgICBQNHg6IG51bWJlcixcbiAgICAgICAgUDR5OiBudW1iZXJcbiAgICApIHtcbiAgICAgICAgZnVuY3Rpb24gQ0IxKHQ6IG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHQgKiB0ICogdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIENCMih0OiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAzICogdCAqIHQgKiAoMSAtIHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gQ0IzKHQ6IG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIDMgKiB0ICogKDEgLSB0KSAqICgxIC0gdCk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBDQjQodDogbnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gKDEgLSB0KSAqICgxIC0gdCkgKiAoMSAtIHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeCA9IFA0eCAqIENCMShwY3QpICsgUDN4ICogQ0IyKHBjdCkgKyBQMnggKiBDQjMocGN0KSArIFAxeCAqIENCNChwY3QpO1xuICAgICAgICBjb25zdCB5ID0gUDR5ICogQ0IxKHBjdCkgKyBQM3kgKiBDQjIocGN0KSArIFAyeSAqIENCMyhwY3QpICsgUDF5ICogQ0I0KHBjdCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IHgsXG4gICAgICAgICAgICB5OiB5XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6K6h566X5LqM5qyh6LSd5aGe5bCU5puy57q/5LiK57uZ5a6a5Y+C5pWwIHQg5a+55bqU55qE54K555qE5Z2Q5qCHXG4gICAgICogQHBhcmFtIHBjdCAtIDAg5YiwIDEg5LmL6Ze055qE5Y+C5pWw77yM55So5LqO5oyH5a6a5puy57q/5LiK55qE54K555qE5L2N572uXG4gICAgICogQHBhcmFtIFAxeCAtIOabsue6v+eahOi1t+eCuSB4IOWdkOagh1xuICAgICAqIEBwYXJhbSBQMXkgLSDmm7Lnur/nmoTotbfngrkgeSDlnZDmoIdcbiAgICAgKiBAcGFyYW0gUDJ4IC0g5puy57q/55qE5o6n5Yi254K5IHgg5Z2Q5qCHXG4gICAgICogQHBhcmFtIFAyeSAtIOabsue6v+eahOaOp+WItueCuSB5IOWdkOagh1xuICAgICAqIEBwYXJhbSBQM3ggLSDmm7Lnur/nmoTnu4jngrkgeCDlnZDmoIdcbiAgICAgKiBAcGFyYW0gUDN5IC0g5puy57q/55qE57uI54K5IHkg5Z2Q5qCHXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFBvaW50T25RdWFkcmF0aWNCZXppZXIocGN0OiBudW1iZXIsIFAxeDogbnVtYmVyLCBQMXk6IG51bWJlciwgUDJ4OiBudW1iZXIsIFAyeTogbnVtYmVyLCBQM3g6IG51bWJlciwgUDN5OiBudW1iZXIpIHtcbiAgICAgICAgZnVuY3Rpb24gUUIxKHQ6IG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHQgKiB0O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gUUIyKHQ6IG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIDIgKiB0ICogKDEgLSB0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIFFCMyh0OiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAoMSAtIHQpICogKDEgLSB0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHggPSBQM3ggKiBRQjEocGN0KSArIFAyeCAqIFFCMihwY3QpICsgUDF4ICogUUIzKHBjdCk7XG4gICAgICAgIGNvbnN0IHkgPSBQM3kgKiBRQjEocGN0KSArIFAyeSAqIFFCMihwY3QpICsgUDF5ICogUUIzKHBjdCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IHgsXG4gICAgICAgICAgICB5OiB5XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6K6h566X5qSt5ZyG5byn5LiK57uZ5a6a6KeS5bqmIM64IOWvueW6lOeahOeCueeahOWdkOagh1xuICAgICAqIEBwYXJhbSBjeCAtIOakreWchueahOS4reW/g+eCuSB4IOWdkOagh1xuICAgICAqIEBwYXJhbSBjeSAtIOakreWchueahOS4reW/g+eCuSB5IOWdkOagh1xuICAgICAqIEBwYXJhbSByeCAtIOakreWchueahCB4IOi9tOWNiuW+hFxuICAgICAqIEBwYXJhbSByeSAtIOakreWchueahCB5IOi9tOWNiuW+hFxuICAgICAqIEBwYXJhbSB0aGV0YSAtIOakreWchuW8p+eahOi1t+Wni+inkuW6plxuICAgICAqIEBwYXJhbSBwc2kgLSDmpK3lnIblvKfnmoTml4vovazop5LluqZcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0UG9pbnRPbkVsbGlwdGljYWxBcmMoY3g6IG51bWJlciwgY3k6IG51bWJlciwgcng6IG51bWJlciwgcnk6IG51bWJlciwgdGhldGE6IG51bWJlciwgcHNpOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgY29zUHNpID0gTWF0aC5jb3MocHNpKTtcbiAgICAgICAgY29uc3Qgc2luUHNpID0gTWF0aC5zaW4ocHNpKTtcbiAgICAgICAgY29uc3QgcHQgPSB7XG4gICAgICAgICAgICB4OiByeCAqIE1hdGguY29zKHRoZXRhKSxcbiAgICAgICAgICAgIHk6IHJ5ICogTWF0aC5zaW4odGhldGEpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBjeCArIChwdC54ICogY29zUHNpIC0gcHQueSAqIHNpblBzaSksXG4gICAgICAgICAgICB5OiBjeSArIChwdC54ICogc2luUHNpICsgcHQueSAqIGNvc1BzaSlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorqHnrpfln7rkuo7kuI3lkIzot6/lvoTlkb3ku6TnmoTplb/luqZcbiAgICAgKiBAcGFyYW0geCAtIOi1t+eCuSB4IOWdkOagh1xuICAgICAqIEBwYXJhbSB5IC0g6LW354K5IHkg5Z2Q5qCHXG4gICAgICogQHBhcmFtIGNtZCAtIOi3r+W+hOWRveS7pFxuICAgICAqIEBwYXJhbSBwb2ludHMgLSDkuI7ot6/lvoTlkb3ku6Tnm7jlhbPnmoTngrnnmoTlnZDmoIfmiJbmjqfliLblj4LmlbBcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIHByaXZhdGUgY2FsY0xlbmd0aCh4OiBudW1iZXIsIHk6IG51bWJlciwgY21kOiBzdHJpbmcsIHBvaW50czogbnVtYmVyW10pIHtcbiAgICAgICAgbGV0IGxlbiwgcDEsIHAyLCB0O1xuXG4gICAgICAgIHN3aXRjaCAoY21kKSB7XG4gICAgICAgICAgICBjYXNlICdMJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRMaW5lTGVuZ3RoKHgsIHksIHBvaW50c1swXSwgcG9pbnRzWzFdKTtcbiAgICAgICAgICAgIGNhc2UgJ0MnOlxuICAgICAgICAgICAgICAgIGxlbiA9IDAuMDtcbiAgICAgICAgICAgICAgICBwMSA9IHRoaXMuZ2V0UG9pbnRPbkN1YmljQmV6aWVyKDAsIHgsIHksIHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSwgcG9pbnRzWzRdLCBwb2ludHNbNV0pO1xuICAgICAgICAgICAgICAgIGZvciAodCA9IDAuMDE7IHQgPD0gMTsgdCArPSAwLjAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHAyID0gdGhpcy5nZXRQb2ludE9uQ3ViaWNCZXppZXIodCwgeCwgeSwgcG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdLCBwb2ludHNbNF0sIHBvaW50c1s1XSk7XG4gICAgICAgICAgICAgICAgICAgIGxlbiArPSB0aGlzLmdldExpbmVMZW5ndGgocDEueCwgcDEueSwgcDIueCwgcDIueSk7XG4gICAgICAgICAgICAgICAgICAgIHAxID0gcDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBsZW47XG4gICAgICAgICAgICBjYXNlICdRJzpcbiAgICAgICAgICAgICAgICBsZW4gPSAwLjA7XG4gICAgICAgICAgICAgICAgcDEgPSB0aGlzLmdldFBvaW50T25RdWFkcmF0aWNCZXppZXIoMCwgeCwgeSwgcG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdKTtcbiAgICAgICAgICAgICAgICBmb3IgKHQgPSAwLjAxOyB0IDw9IDE7IHQgKz0gMC4wMSkge1xuICAgICAgICAgICAgICAgICAgICBwMiA9IHRoaXMuZ2V0UG9pbnRPblF1YWRyYXRpY0Jlemllcih0LCB4LCB5LCBwb2ludHNbMF0sIHBvaW50c1sxXSwgcG9pbnRzWzJdLCBwb2ludHNbM10pO1xuICAgICAgICAgICAgICAgICAgICBsZW4gKz0gdGhpcy5nZXRMaW5lTGVuZ3RoKHAxLngsIHAxLnksIHAyLngsIHAyLnkpO1xuICAgICAgICAgICAgICAgICAgICBwMSA9IHAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbGVuO1xuICAgICAgICAgICAgY2FzZSAnQSc6XG4gICAgICAgICAgICAgICAgbGVuID0gMC4wO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gcG9pbnRzWzRdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRUaGV0YSA9IHBvaW50c1s1XTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSBwb2ludHNbNF0gKyBkVGhldGE7XG4gICAgICAgICAgICAgICAgbGV0IGluYyA9IE1hdGguUEkgLyAxODAuMDtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoc3RhcnQgLSBlbmQpIDwgaW5jKSB7XG4gICAgICAgICAgICAgICAgICAgIGluYyA9IE1hdGguYWJzKHN0YXJ0IC0gZW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcDEgPSB0aGlzLmdldFBvaW50T25FbGxpcHRpY2FsQXJjKHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSwgc3RhcnQsIDApO1xuICAgICAgICAgICAgICAgIGlmIChkVGhldGEgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodCA9IHN0YXJ0IC0gaW5jOyB0ID4gZW5kOyB0IC09IGluYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcDIgPSB0aGlzLmdldFBvaW50T25FbGxpcHRpY2FsQXJjKHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSwgdCwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZW4gKz0gdGhpcy5nZXRMaW5lTGVuZ3RoKHAxLngsIHAxLnksIHAyLngsIHAyLnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcDEgPSBwMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodCA9IHN0YXJ0ICsgaW5jOyB0IDwgZW5kOyB0ICs9IGluYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcDIgPSB0aGlzLmdldFBvaW50T25FbGxpcHRpY2FsQXJjKHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSwgdCwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZW4gKz0gdGhpcy5nZXRMaW5lTGVuZ3RoKHAxLngsIHAxLnksIHAyLngsIHAyLnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcDEgPSBwMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwMiA9IHRoaXMuZ2V0UG9pbnRPbkVsbGlwdGljYWxBcmMocG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdLCBlbmQsIDApO1xuICAgICAgICAgICAgICAgIGxlbiArPSB0aGlzLmdldExpbmVMZW5ndGgocDEueCwgcDEueSwgcDIueCwgcDIueSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDop6PmnpAgU1ZHIOi3r+W+hOaVsOaNruWtl+espuS4su+8jOWwhuWFtui9rOaNouS4uuS4gOS4quWMheWQq+i3r+W+hOWRveS7pOWSjOWdkOagh+eCueeahOaVsOe7hOWvueixoVxuICAgICAqIEBwYXJhbSBkYXRhIC0gU1ZHIOi3r+W+hOaVsOaNruWtl+espuS4slxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYXJzZVBhdGhEYXRhKGRhdGE6IHN0cmluZykge1xuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjcyA9IGRhdGE7XG4gICAgICAgIGNvbnN0IGNjID0gWydtJywgJ00nLCAnbCcsICdMJywgJ3YnLCAnVicsICdoJywgJ0gnLCAneicsICdaJywgJ2MnLCAnQycsICdxJywgJ1EnLCAndCcsICdUJywgJ3MnLCAnUycsICdhJywgJ0EnXTtcblxuICAgICAgICBjcyA9IGNzLnJlcGxhY2UobmV3IFJlZ0V4cCgnICcsICdnJyksICcsJyk7XG4gICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgY2MubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICAgIGNzID0gY3MucmVwbGFjZShuZXcgUmVnRXhwKGNjW25dLCAnZycpLCAnfCcgKyBjY1tuXSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJyID0gY3Muc3BsaXQoJ3wnKTtcbiAgICAgICAgY29uc3QgY2E6IGFueSA9IFtdO1xuICAgICAgICBjb25zdCBjb29yZHM6IGFueSA9IFtdO1xuICAgICAgICBsZXQgY3B4ID0gMDtcbiAgICAgICAgbGV0IGNweSA9IDA7XG5cbiAgICAgICAgY29uc3QgcmUgPSAvKFstK10/KChcXGQrXFwuXFxkKyl8KChcXGQrKXwoXFwuXFxkKykpKSg/OmVbLStdP1xcZCspPykvZ2k7XG4gICAgICAgIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgICAgICAgZm9yIChsZXQgbiA9IDE7IG4gPCBhcnIubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICAgIGxldCBzdHIgPSBhcnJbbl07XG4gICAgICAgICAgICBsZXQgYyA9IHN0ci5jaGFyQXQoMCk7XG4gICAgICAgICAgICBzdHIgPSBzdHIuc2xpY2UoMSk7XG5cbiAgICAgICAgICAgIGNvb3Jkcy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgd2hpbGUgKChtYXRjaCA9IHJlLmV4ZWMoc3RyKSkpIHtcbiAgICAgICAgICAgICAgICBjb29yZHMucHVzaChtYXRjaFswXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHA6IGFueSA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgamxlbiA9IGNvb3Jkcy5sZW5ndGg7IGogPCBqbGVuOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY29vcmRzW2pdID09PSAnMDAnKSB7XG4gICAgICAgICAgICAgICAgICAgIHAucHVzaCgwLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRmxvYXQoY29vcmRzW2pdKTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKHBhcnNlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcC5wdXNoKHBhcnNlZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcC5wdXNoKDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2hpbGUgKHAubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGlmIChpc05hTihwWzBdKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgY21kOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgcG9pbnRzOiBhbnkgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydFggPSBjcHg7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRZID0gY3B5O1xuICAgICAgICAgICAgICAgIGxldCBwcmV2Q21kLCBjdGxQdHgsIGN0bFB0eTtcbiAgICAgICAgICAgICAgICBsZXQgcngsIHJ5LCBwc2ksIGZhLCBmcywgeDEsIHkxO1xuXG4gICAgICAgICAgICAgICAgc3dpdGNoIChjKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2wnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY3B4ICs9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNweSArPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAnTCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjcHgsIGNweSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHggPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHkgPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjcHgsIGNweSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeCA9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5ID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B4ICs9IGR4O1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B5ICs9IGR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gJ00nO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhLmxlbmd0aCA+IDIgJiYgY2FbY2EubGVuZ3RoIC0gMV0uY29tbWFuZCA9PT0gJ3onKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaWR4ID0gY2EubGVuZ3RoIC0gMjsgaWR4ID49IDA7IGlkeC0tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYVtpZHhdLmNvbW1hbmQgPT09ICdNJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B4ID0gY2FbaWR4XS5wb2ludHNbMF0gKyBkeDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNweSA9IGNhW2lkeF0ucG9pbnRzWzFdICsgZHk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKGNweCwgY3B5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAnbCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHggPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHkgPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAnTSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjcHgsIGNweSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjID0gJ0wnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHggKz0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gJ0wnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2goY3B4LCBjcHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ0gnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY3B4ID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gJ0wnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2goY3B4LCBjcHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3YnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY3B5ICs9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICdMJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKGNweCwgY3B5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdWJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNweSA9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICdMJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKGNweCwgY3B5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdDJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKHAuc2hpZnQoKSwgcC5zaGlmdCgpLCBwLnNoaWZ0KCksIHAuc2hpZnQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHggPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHkgPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjcHgsIGNweSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjcHggKyBwLnNoaWZ0KCksIGNweSArIHAuc2hpZnQoKSwgY3B4ICsgcC5zaGlmdCgpLCBjcHkgKyBwLnNoaWZ0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B4ICs9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNweSArPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAnQyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjcHgsIGNweSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnUyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjdGxQdHggPSBjcHg7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdGxQdHkgPSBjcHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2Q21kID0gY2FbY2EubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldkNtZC5jb21tYW5kID09PSAnQycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGxQdHggPSBjcHggKyAoY3B4IC0gcHJldkNtZC5wb2ludHNbMl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0bFB0eSA9IGNweSArIChjcHkgLSBwcmV2Q21kLnBvaW50c1szXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjdGxQdHgsIGN0bFB0eSwgcC5zaGlmdCgpLCBwLnNoaWZ0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B4ID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B5ID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gJ0MnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2goY3B4LCBjcHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY3RsUHR4ID0gY3B4O1xuICAgICAgICAgICAgICAgICAgICAgICAgY3RsUHR5ID0gY3B5O1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldkNtZCA9IGNhW2NhLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZDbWQuY29tbWFuZCA9PT0gJ0MnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RsUHR4ID0gY3B4ICsgKGNweCAtIHByZXZDbWQucG9pbnRzWzJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGxQdHkgPSBjcHkgKyAoY3B5IC0gcHJldkNtZC5wb2ludHNbM10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2goY3RsUHR4LCBjdGxQdHksIGNweCArIHAuc2hpZnQoKSwgY3B5ICsgcC5zaGlmdCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNweCArPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHkgKz0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gJ0MnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2goY3B4LCBjcHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2gocC5zaGlmdCgpLCBwLnNoaWZ0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B4ID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B5ID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2goY3B4LCBjcHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3EnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2goY3B4ICsgcC5zaGlmdCgpLCBjcHkgKyBwLnNoaWZ0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B4ICs9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNweSArPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAnUSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjcHgsIGNweSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnVCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjdGxQdHggPSBjcHg7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdGxQdHkgPSBjcHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2Q21kID0gY2FbY2EubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldkNtZC5jb21tYW5kID09PSAnUScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGxQdHggPSBjcHggKyAoY3B4IC0gcHJldkNtZC5wb2ludHNbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0bFB0eSA9IGNweSArIChjcHkgLSBwcmV2Q21kLnBvaW50c1sxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHggPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHkgPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAnUSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjdGxQdHgsIGN0bFB0eSwgY3B4LCBjcHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY3RsUHR4ID0gY3B4O1xuICAgICAgICAgICAgICAgICAgICAgICAgY3RsUHR5ID0gY3B5O1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldkNtZCA9IGNhW2NhLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZDbWQuY29tbWFuZCA9PT0gJ1EnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RsUHR4ID0gY3B4ICsgKGNweCAtIHByZXZDbWQucG9pbnRzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGxQdHkgPSBjcHkgKyAoY3B5IC0gcHJldkNtZC5wb2ludHNbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY3B4ICs9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNweSArPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAnUSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjdGxQdHgsIGN0bFB0eSwgY3B4LCBjcHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ0EnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcnggPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByeSA9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBzaSA9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZnMgPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB4MSA9IGNweDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkxID0gY3B5O1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B4ID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B5ID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gJ0EnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzID0gdGhpcy5jb252ZXJ0RW5kcG9pbnRUb0NlbnRlclBhcmFtZXRlcml6YXRpb24oeDEsIHkxLCBjcHgsIGNweSwgZmEsIGZzLCByeCwgcnksIHBzaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYSc6XG4gICAgICAgICAgICAgICAgICAgICAgICByeCA9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ5ID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHNpID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmEgPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcyA9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHgxID0gY3B4O1xuICAgICAgICAgICAgICAgICAgICAgICAgeTEgPSBjcHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHggKz0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B5ICs9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICdBJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cyA9IHRoaXMuY29udmVydEVuZHBvaW50VG9DZW50ZXJQYXJhbWV0ZXJpemF0aW9uKHgxLCB5MSwgY3B4LCBjcHksIGZhLCBmcywgcngsIHJ5LCBwc2kpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2EucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IGNtZCB8fCBjLFxuICAgICAgICAgICAgICAgICAgICBwb2ludHM6IHBvaW50cyxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IHN0YXJ0WCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IHN0YXJ0WVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBwYXRoTGVuZ3RoOiB0aGlzLmNhbGNMZW5ndGgoc3RhcnRYLCBzdGFydFksIGNtZCB8fCBjLCBwb2ludHMpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjID09PSAneicgfHwgYyA9PT0gJ1onKSB7XG4gICAgICAgICAgICAgICAgY2EucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICd6JyxcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aExlbmd0aDogMFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOagueaNruS8oOWFpeeahOi3r+W+hOaVsOaNriBkYXRhIOWcqOeUu+W4g+S4iue7mOWItui3r+W+hFxuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIHBhdGgob3B0aW9uczogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgZGF0YTogc3RyaW5nOyBzaXplPzogbnVtYmVyOyBzY2FsZVg/OiBudW1iZXI7IHNjYWxlWT86IG51bWJlcjsgZmlsbDogc3RyaW5nIH0pIHtcbiAgICAgICAgY29uc3QgeyB4LCB5LCBzY2FsZVggPSAxLCBzY2FsZVkgPSAxLCBkYXRhLCBmaWxsIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBkYXRhQXJyYXkgPSB0aGlzLnBhcnNlUGF0aERhdGEoZGF0YSk7XG5cbiAgICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgICB0aGlzLmN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgdGhpcy5jdHguZmlsbFN0eWxlID0gZmlsbDtcbiAgICAgICAgdGhpcy5jdHgudHJhbnNsYXRlKHgsIHkpO1xuICAgICAgICB0aGlzLmN0eC5zY2FsZShzY2FsZVgsIHNjYWxlWSk7XG4gICAgICAgIGxldCBpc0Nsb3NlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGRhdGFBcnJheS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGRhdGFBcnJheVtuXS5jb21tYW5kO1xuICAgICAgICAgICAgY29uc3QgcCA9IGRhdGFBcnJheVtuXS5wb2ludHM7XG4gICAgICAgICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdMJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHgubGluZVRvKHBbMF0sIHBbMV0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHgubW92ZVRvKHBbMF0sIHBbMV0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdDJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHguYmV6aWVyQ3VydmVUbyhwWzBdLCBwWzFdLCBwWzJdLCBwWzNdLCBwWzRdLCBwWzVdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnUSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LnF1YWRyYXRpY0N1cnZlVG8ocFswXSwgcFsxXSwgcFsyXSwgcFszXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0EnOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjeCA9IHBbMF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN5ID0gcFsxXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnggPSBwWzJdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByeSA9IHBbM107XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRoZXRhID0gcFs0XTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZFRoZXRhID0gcFs1XTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHNpID0gcFs2XTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnMgPSBwWzddO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gcnggPiByeSA/IHJ4IDogcnk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjYWxlWCA9IHJ4ID4gcnkgPyAxIDogcnggLyByeTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NhbGVZID0gcnggPiByeSA/IHJ5IC8gcnggOiAxO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LnRyYW5zbGF0ZShjeCwgY3kpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5yb3RhdGUocHNpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHguc2NhbGUoc2NhbGVYLCBzY2FsZVkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5hcmMoMCwgMCwgciwgdGhldGEsIHRoZXRhICsgZFRoZXRhLCAoMSAtIGZzKSBhcyBhbnkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5zY2FsZSgxIC8gc2NhbGVYLCAxIC8gc2NhbGVZKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHgucm90YXRlKC1wc2kpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC50cmFuc2xhdGUoLWN4LCAtY3kpO1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3onOlxuICAgICAgICAgICAgICAgICAgICBpc0Nsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNDbG9zZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY3R4LnN0cm9rZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdHguZmlsbCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBkcmF3ZXIgPSBuZXcgRHJhd2VyKCk7XG4iXX0=
|