all files / src/js/base/module/ Editor.js

73.29% Statements 321/438
46.6% Branches 89/191
67.42% Functions 60/89
73.23% Lines 320/437
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839       97× 97× 97× 97× 97× 97× 97× 97× 97× 97× 97× 97× 97× 97× 97× 97× 97× 97× 97× 97× 97× 97× 97× 97× 97× 97×   97×         97× 1261× 1261× 15× 15× 15×     1261×   97×     97×   97× 582× 582×       582×     97×   97×   97×   97×   97×             97×             97×             97×               97×                 97×             97×                   97×                                                           97×                 97×             97×         97×                             97×                   97×                           97×   97×                       32× 32×                 97×   97× 97× 16×   97× 21×     97× 97×     97×     97×     97×       97× 97×                                               23× 23×           23×     18×             154×   21×     21×                                               75×                   262× 262× 44×   262×                                                       61×   61×           61× 61× 61× 46×                                                           1940× 44× 44× 44×                                                                                                                                                                                                                                                                                                                                                         131×             65× 65×                             61×            
(function(global){global.wrappers['/Users/lqez/Dev/summernote/src/js/base/module/Editor.js']=[function(require,module,exports,__dirname,__filename){ "use strict";
exports.__esModule = true;
var jquery_1 = require("jquery");
var env_1 = require("../core/env");
var key_1 = require("../core/key");
var func_1 = require("../core/func");
var lists_1 = require("../core/lists");
var dom_1 = require("../core/dom");
var range_1 = require("../core/range");
var async_1 = require("../core/async");
var History_1 = require("../editing/History");
var Style_1 = require("../editing/Style");
var Typing_1 = require("../editing/Typing");
var Table_1 = require("../editing/Table");
var Bullet_1 = require("../editing/Bullet");
var KEY_BOGUS = 'bogus';
/**
 * @class Editor
 */
var Editor = /** @class */ (function () {
    function Editor(context) {
        var _this = this;
        this.context = context;
        this.$note = context.layoutInfo.note;
        this.$editor = context.layoutInfo.editor;
        this.$editable = context.layoutInfo.editable;
        this.options = context.options;
        this.lang = this.options.langInfo;
        this.editable = this.$editable[0];
        this.lastRange = null;
        this.style = new Style_1["default"]();
        this.table = new Table_1["default"]();
        this.typing = new Typing_1["default"](context);
        this.bullet = new Bullet_1["default"]();
        this.history = new History_1["default"](this.$editable);
        this.context.memo('help.undo', this.lang.help.undo);
        this.context.memo('help.redo', this.lang.help.redo);
        this.context.memo('help.tab', this.lang.help.tab);
        this.context.memo('help.untab', this.lang.help.untab);
        this.context.memo('help.insertParagraph', this.lang.help.insertParagraph);
        this.context.memo('help.insertOrderedList', this.lang.help.insertOrderedList);
        this.context.memo('help.insertUnorderedList', this.lang.help.insertUnorderedList);
        this.context.memo('help.indent', this.lang.help.indent);
        this.context.memo('help.outdent', this.lang.help.outdent);
        this.context.memo('help.formatPara', this.lang.help.formatPara);
        this.context.memo('help.insertHorizontalRule', this.lang.help.insertHorizontalRule);
        this.context.memo('help.fontName', this.lang.help.fontName);
        // native commands(with execCommand), generate function for execCommand
        var commands = [
            'bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript',
            'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull',
            'formatBlock', 'removeFormat', 'backColor',
        ];
        for (var idx = 0, len = commands.length; idx < len; idx++) {
            this[commands[idx]] = (function (sCmd) {
                return function (value) {
                    _this.beforeCommand();
                    document.execCommand(sCmd, false, value);
                    _this.afterCommand(true);
                };
            })(commands[idx]);
            this.context.memo('help.' + commands[idx], this.lang.help[commands[idx]]);
        }
        this.fontName = this.wrapCommand(function (value) {
            return _this.fontStyling('font-family', "\'" + value + "\'");
        });
        this.fontSize = this.wrapCommand(function (value) {
            return _this.fontStyling('font-size', value + 'px');
        });
        for (var idx = 1; idx <= 6; idx++) {
            this['formatH' + idx] = (function (idx) {
                return function () {
                    _this.formatBlock('H' + idx);
                };
            })(idx);
            this.context.memo('help.formatH' + idx, this.lang.help['formatH' + idx]);
        }
        ;
        this.insertParagraph = this.wrapCommand(function () {
            _this.typing.insertParagraph(_this.editable);
        });
        this.insertOrderedList = this.wrapCommand(function () {
            _this.bullet.insertOrderedList(_this.editable);
        });
        this.insertUnorderedList = this.wrapCommand(function () {
            _this.bullet.insertUnorderedList(_this.editable);
        });
        this.indent = this.wrapCommand(function () {
            _this.bullet.indent(_this.editable);
        });
        this.outdent = this.wrapCommand(function () {
            _this.bullet.outdent(_this.editable);
        });
        /**
         * insertNode
         * insert node
         * @param {Node} node
         */
        this.insertNode = this.wrapCommand(function (node) {
            if (_this.isLimited(jquery_1["default"](node).text().length)) {
                return;
            }
            var rng = _this.getLastRange();
            rng.insertNode(node);
            range_1["default"].createFromNodeAfter(node).select();
            _this.setLastRange();
        });
        /**
         * insert text
         * @param {String} text
         */
        this.insertText = this.wrapCommand(function (text) {
            if (_this.isLimited(text.length)) {
                return;
            }
            var rng = _this.getLastRange();
            var textNode = rng.insertNode(dom_1["default"].createText(text));
            range_1["default"].create(textNode, dom_1["default"].nodeLength(textNode)).select();
            _this.setLastRange();
        });
        /**
         * paste HTML
         * @param {String} markup
         */
        this.pasteHTML = this.wrapCommand(function (markup) {
            if (_this.isLimited(markup.length)) {
                return;
            }
            markup = _this.context.invoke('codeview.purify', markup);
            var contents = _this.getLastRange().pasteHTML(markup);
            range_1["default"].createFromNodeAfter(lists_1["default"].last(contents)).select();
            _this.setLastRange();
        });
        /**
         * formatBlock
         *
         * @param {String} tagName
         */
        this.formatBlock = this.wrapCommand(function (tagName, $target) {
            var onApplyCustomStyle = _this.options.callbacks.onApplyCustomStyle;
            Iif (onApplyCustomStyle) {
                onApplyCustomStyle.call(_this, $target, _this.context, _this.onFormatBlock);
            }
            else {
                _this.onFormatBlock(tagName, $target);
            }
        });
        /**
         * insert horizontal rule
         */
        this.insertHorizontalRule = this.wrapCommand(function () {
            var hrNode = _this.getLastRange().insertNode(dom_1["default"].create('HR'));
            Eif (hrNode.nextSibling) {
                range_1["default"].create(hrNode.nextSibling, 0).normalize().select();
                _this.setLastRange();
            }
        });
        /**
         * lineHeight
         * @param {String} value
         */
        this.lineHeight = this.wrapCommand(function (value) {
            _this.style.stylePara(_this.getLastRange(), {
                lineHeight: value
            });
        });
        /**
         * create link (command)
         *
         * @param {Object} linkInfo
         */
        this.createLink = this.wrapCommand(function (linkInfo) {
            var linkUrl = linkInfo.url;
            var linkText = linkInfo.text;
            var isNewWindow = linkInfo.isNewWindow;
            var rng = linkInfo.range || _this.getLastRange();
            var additionalTextLength = linkText.length - rng.toString().length;
            if (additionalTextLength > 0 && _this.isLimited(additionalTextLength)) {
                return;
            }
            var isTextChanged = rng.toString() !== linkText;
            // handle spaced urls from input
            Eif (typeof linkUrl === 'string') {
                linkUrl = linkUrl.trim();
            }
            Iif (_this.options.onCreateLink) {
                linkUrl = _this.options.onCreateLink(linkUrl);
            }
            else {
                // if url doesn't have any protocol and not even a relative or a label, use http:// as default
                linkUrl = /^([A-Za-z][A-Za-z0-9+-.]*\:|#|\/)/.test(linkUrl)
                    ? linkUrl : 'http://' + linkUrl;
            }
            var anchors = [];
            Eif (isTextChanged) {
                rng = rng.deleteContents();
                var anchor = rng.insertNode(jquery_1["default"]('<A>' + linkText + '</A>')[0]);
                anchors.push(anchor);
            }
            else {
                anchors = _this.style.styleNodes(rng, {
                    nodeName: 'A',
                    expandClosestSibling: true,
                    onlyPartialContains: true
                });
            }
            jquery_1["default"].each(anchors, function (idx, anchor) {
                jquery_1["default"](anchor).attr('href', linkUrl);
                if (isNewWindow) {
                    jquery_1["default"](anchor).attr('target', '_blank');
                }
                else {
                    jquery_1["default"](anchor).removeAttr('target');
                }
            });
            var startRange = range_1["default"].createFromNodeBefore(lists_1["default"].head(anchors));
            var startPoint = startRange.getStartPoint();
            var endRange = range_1["default"].createFromNodeAfter(lists_1["default"].last(anchors));
            var endPoint = endRange.getEndPoint();
            range_1["default"].create(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset).select();
            _this.setLastRange();
        });
        /**
         * setting color
         *
         * @param {Object} sObjColor  color code
         * @param {String} sObjColor.foreColor foreground color
         * @param {String} sObjColor.backColor background color
         */
        this.color = this.wrapCommand(function (colorInfo) {
            var foreColor = colorInfo.foreColor;
            var backColor = colorInfo.backColor;
            Eif (foreColor) {
                document.execCommand('foreColor', false, foreColor);
            }
            Eif (backColor) {
                document.execCommand('backColor', false, backColor);
            }
        });
        /**
         * Set foreground color
         *
         * @param {String} colorCode foreground color code
         */
        this.foreColor = this.wrapCommand(function (colorInfo) {
            document.execCommand('styleWithCSS', false, true);
            document.execCommand('foreColor', false, colorInfo);
        });
        /**
         * insert Table
         *
         * @param {String} dimension of table (ex : "5x5")
         */
        this.insertTable = this.wrapCommand(function (dim) {
            var dimension = dim.split('x');
            var rng = _this.getLastRange().deleteContents();
            rng.insertNode(_this.table.createTable(dimension[0], dimension[1], _this.options));
        });
        /**
         * remove media object and Figure Elements if media object is img with Figure.
         */
        this.removeMedia = this.wrapCommand(function () {
            var $target = jquery_1["default"](_this.restoreTarget()).parent();
            if ($target.parent('figure').length) {
                $target.parent('figure').remove();
            }
            else {
                $target = jquery_1["default"](_this.restoreTarget()).detach();
            }
            _this.context.triggerEvent('media.delete', $target, _this.$editable);
        });
        /**
         * float me
         *
         * @param {String} value
         */
        this.floatMe = this.wrapCommand(function (value) {
            var $target = jquery_1["default"](_this.restoreTarget());
            $target.toggleClass('note-float-left', value === 'left');
            $target.toggleClass('note-float-right', value === 'right');
            $target.css('float', (value === 'none' ? '' : value));
        });
        /**
         * resize overlay element
         * @param {String} value
         */
        this.resize = this.wrapCommand(function (value) {
            var $target = jquery_1["default"](_this.restoreTarget());
            value = parseFloat(value);
            if (value === 0) {
                $target.css('width', '');
            }
            else {
                $target.css({
                    width: value * 100 + '%',
                    height: ''
                });
            }
        });
    }
    Editor.prototype.initialize = function () {
        var _this = this;
        // bind custom events
        this.$editable.on('keydown', function (event) {
            Iif (event.keyCode === key_1["default"].code.ENTER) {
                _this.context.triggerEvent('enter', event);
            }
            _this.context.triggerEvent('keydown', event);
            Eif (!event.isDefaultPrevented()) {
                Eif (_this.options.shortcuts) {
                    _this.handleKeyMap(event);
                }
                else {
                    _this.preventDefaultEditableShortCuts(event);
                }
            }
            Iif (_this.isLimited(1, event)) {
                return false;
            }
        }).on('keyup', function (event) {
            _this.setLastRange();
            _this.context.triggerEvent('keyup', event);
        }).on('focus', function (event) {
            _this.setLastRange();
            _this.context.triggerEvent('focus', event);
        }).on('blur', function (event) {
            _this.context.triggerEvent('blur', event);
        }).on('mousedown', function (event) {
            _this.context.triggerEvent('mousedown', event);
        }).on('mouseup', function (event) {
            _this.setLastRange();
            _this.context.triggerEvent('mouseup', event);
        }).on('scroll', function (event) {
            _this.context.triggerEvent('scroll', event);
        }).on('paste', function (event) {
            _this.setLastRange();
            _this.context.triggerEvent('paste', event);
        });
        this.$editable.attr('spellcheck', this.options.spellCheck);
        // init content before set event
        this.$editable.html(dom_1["default"].html(this.$note) || dom_1["default"].emptyPara);
        this.$editable.on(env_1["default"].inputEventName, func_1["default"].debounce(function () {
            _this.context.triggerEvent('change', _this.$editable.html(), _this.$editable);
        }, 10));
        this.$editor.on('focusin', function (event) {
            _this.context.triggerEvent('focusin', event);
        }).on('focusout', function (event) {
            _this.context.triggerEvent('focusout', event);
        });
        Eif (!this.options.airMode) {
            Iif (this.options.width) {
                this.$editor.outerWidth(this.options.width);
            }
            Iif (this.options.height) {
                this.$editable.outerHeight(this.options.height);
            }
            Iif (this.options.maxHeight) {
                this.$editable.css('max-height', this.options.maxHeight);
            }
            Iif (this.options.minHeight) {
                this.$editable.css('min-height', this.options.minHeight);
            }
        }
        this.history.recordUndo();
        this.setLastRange();
    };
    Editor.prototype.destroy = function () {
        this.$editable.off();
    };
    Editor.prototype.handleKeyMap = function (event) {
        var keyMap = this.options.keyMap[env_1["default"].isMac ? 'mac' : 'pc'];
        var keys = [];
        Iif (event.metaKey) {
            keys.push('CMD');
        }
        Iif (event.ctrlKey && !event.altKey) {
            keys.push('CTRL');
        }
        Iif (event.shiftKey) {
            keys.push('SHIFT');
        }
        var keyName = key_1["default"].nameFromCode[event.keyCode];
        Iif (keyName) {
            keys.push(keyName);
        }
        var eventName = keyMap[keys.join('+')];
        Iif (eventName) {
            if (this.context.invoke(eventName) !== false) {
                event.preventDefault();
            }
        }
        else Iif (key_1["default"].isEdit(event.keyCode)) {
            this.afterCommand();
        }
    };
    Editor.prototype.preventDefaultEditableShortCuts = function (event) {
        // B(Bold, 66) / I(Italic, 73) / U(Underline, 85)
        if ((event.ctrlKey || event.metaKey) &&
            lists_1["default"].contains([66, 73, 85], event.keyCode)) {
            event.preventDefault();
        }
    };
    Editor.prototype.isLimited = function (pad, event) {
        pad = pad || 0;
        if (typeof event !== 'undefined') {
            Iif (key_1["default"].isMove(event.keyCode) ||
                (event.ctrlKey || event.metaKey) ||
                lists_1["default"].contains([key_1["default"].code.BACKSPACE, key_1["default"].code.DELETE], event.keyCode)) {
                return false;
            }
        }
        if (this.options.maxTextLength > 0) {
            Eif ((this.$editable.text().length + pad) >= this.options.maxTextLength) {
                return true;
            }
        }
        return false;
    };
    /**
     * create range
     * @return {WrappedRange}
     */
    Editor.prototype.createRange = function () {
        this.focus();
        this.setLastRange();
        return this.getLastRange();
    };
    Editor.prototype.setLastRange = function () {
        this.lastRange = range_1["default"].create(this.editable);
    };
    Editor.prototype.getLastRange = function () {
        Iif (!this.lastRange) {
            this.setLastRange();
        }
        return this.lastRange;
    };
    /**
     * saveRange
     *
     * save current range
     *
     * @param {Boolean} [thenCollapse=false]
     */
    Editor.prototype.saveRange = function (thenCollapse) {
        Iif (thenCollapse) {
            this.getLastRange().collapse().select();
        }
    };
    /**
     * restoreRange
     *
     * restore lately range
     */
    Editor.prototype.restoreRange = function () {
        if (this.lastRange) {
            this.lastRange.select();
            this.focus();
        }
    };
    Editor.prototype.saveTarget = function (node) {
        this.$editable.data('target', node);
    };
    Editor.prototype.clearTarget = function () {
        this.$editable.removeData('target');
    };
    Editor.prototype.restoreTarget = function () {
        return this.$editable.data('target');
    };
    /**
     * currentStyle
     *
     * current style
     * @return {Object|Boolean} unfocus
     */
    Editor.prototype.currentStyle = function () {
        var rng = range_1["default"].create();
        if (rng) {
            rng = rng.normalize();
        }
        return rng ? this.style.current(rng) : this.style.fromNode(this.$editable);
    };
    /**
     * style from node
     *
     * @param {jQuery} $node
     * @return {Object}
     */
    Editor.prototype.styleFromNode = function ($node) {
        return this.style.fromNode($node);
    };
    /**
     * undo
     */
    Editor.prototype.undo = function () {
        this.context.triggerEvent('before.command', this.$editable.html());
        this.history.undo();
        this.context.triggerEvent('change', this.$editable.html(), this.$editable);
    };
    /*
    * commit
    */
    Editor.prototype.commit = function () {
        this.context.triggerEvent('before.command', this.$editable.html());
        this.history.commit();
        this.context.triggerEvent('change', this.$editable.html(), this.$editable);
    };
    /**
     * redo
     */
    Editor.prototype.redo = function () {
        this.context.triggerEvent('before.command', this.$editable.html());
        this.history.redo();
        this.context.triggerEvent('change', this.$editable.html(), this.$editable);
    };
    /**
     * before command
     */
    Editor.prototype.beforeCommand = function () {
        this.context.triggerEvent('before.command', this.$editable.html());
        // keep focus on editable before command execution
        this.focus();
    };
    /**
     * after command
     * @param {Boolean} isPreventTrigger
     */
    Editor.prototype.afterCommand = function (isPreventTrigger) {
        this.normalizeContent();
        this.history.recordUndo();
        if (!isPreventTrigger) {
            this.context.triggerEvent('change', this.$editable.html(), this.$editable);
        }
    };
    /**
     * handle tab key
     */
    Editor.prototype.tab = function () {
        var rng = this.getLastRange();
        Iif (rng.isCollapsed() && rng.isOnCell()) {
            this.table.tab(rng);
        }
        else {
            Iif (this.options.tabSize === 0) {
                return false;
            }
            Eif (!this.isLimited(this.options.tabSize)) {
                this.beforeCommand();
                this.typing.insertTab(rng, this.options.tabSize);
                this.afterCommand();
            }
        }
    };
    /**
     * handle shift+tab key
     */
    Editor.prototype.untab = function () {
        var rng = this.getLastRange();
        if (rng.isCollapsed() && rng.isOnCell()) {
            this.table.tab(rng, true);
        }
        else {
            if (this.options.tabSize === 0) {
                return false;
            }
        }
    };
    /**
     * run given function between beforeCommand and afterCommand
     */
    Editor.prototype.wrapCommand = function (fn) {
        return function () {
            this.beforeCommand();
            fn.apply(this, arguments);
            this.afterCommand();
        };
    };
    /**
     * insert image
     *
     * @param {String} src
     * @param {String|Function} param
     * @return {Promise}
     */
    Editor.prototype.insertImage = function (src, param) {
        var _this = this;
        return async_1.createImage(src, param).then(function ($image) {
            _this.beforeCommand();
            Iif (typeof param === 'function') {
                param($image);
            }
            else {
                Eif (typeof param === 'string') {
                    $image.attr('data-filename', param);
                }
                $image.css('width', Math.min(_this.$editable.width(), $image.width()));
            }
            $image.show();
            range_1["default"].create(_this.editable).insertNode($image[0]);
            range_1["default"].createFromNodeAfter($image[0]).select();
            _this.setLastRange();
            _this.afterCommand();
        }).fail(function (e) {
            _this.context.triggerEvent('image.upload.error', e);
        });
    };
    /**
     * insertImages
     * @param {File[]} files
     */
    Editor.prototype.insertImagesAsDataURL = function (files) {
        var _this = this;
        jquery_1["default"].each(files, function (idx, file) {
            var filename = file.name;
            if (_this.options.maximumImageFileSize && _this.options.maximumImageFileSize < file.size) {
                _this.context.triggerEvent('image.upload.error', _this.lang.image.maximumFileSizeError);
            }
            else {
                async_1.readFileAsDataURL(file).then(function (dataURL) {
                    return _this.insertImage(dataURL, filename);
                }).fail(function () {
                    _this.context.triggerEvent('image.upload.error');
                });
            }
        });
    };
    /**
     * insertImagesOrCallback
     * @param {File[]} files
     */
    Editor.prototype.insertImagesOrCallback = function (files) {
        var callbacks = this.options.callbacks;
        // If onImageUpload set,
        if (callbacks.onImageUpload) {
            this.context.triggerEvent('image.upload', files);
            // else insert Image as dataURL
        }
        else {
            this.insertImagesAsDataURL(files);
        }
    };
    /**
     * return selected plain text
     * @return {String} text
     */
    Editor.prototype.getSelectedText = function () {
        var rng = this.getLastRange();
        // if range on anchor, expand range with anchor
        if (rng.isOnAnchor()) {
            rng = range_1["default"].createFromNode(dom_1["default"].ancestor(rng.sc, dom_1["default"].isAnchor));
        }
        return rng.toString();
    };
    Editor.prototype.onFormatBlock = function (tagName, $target) {
        // [workaround] for MSIE, IE need `<`
        document.execCommand('FormatBlock', false, env_1["default"].isMSIE ? '<' + tagName + '>' : tagName);
        // support custom class
        if ($target && $target.length) {
            // find the exact element has given tagName
            if ($target[0].tagName.toUpperCase() !== tagName.toUpperCase()) {
                $target = $target.find(tagName);
            }
            Eif ($target && $target.length) {
                var className = $target[0].className || '';
                Eif (className) {
                    var currentRange = this.createRange();
                    var $parent = jquery_1["default"]([currentRange.sc, currentRange.ec]).closest(tagName);
                    $parent.addClass(className);
                }
            }
        }
    };
    Editor.prototype.formatPara = function () {
        this.formatBlock('P');
    };
    Editor.prototype.fontStyling = function (target, value) {
        var rng = this.getLastRange();
        Eif (rng) {
            var spans = this.style.styleNodes(rng);
            jquery_1["default"](spans).css(target, value);
            // [workaround] added styled bogus span for style
            //  - also bogus character needed for cursor position
            Eif (rng.isCollapsed()) {
                var firstSpan = lists_1["default"].head(spans);
                Eif (firstSpan && !dom_1["default"].nodeLength(firstSpan)) {
                    firstSpan.innerHTML = dom_1["default"].ZERO_WIDTH_NBSP_CHAR;
                    range_1["default"].createFromNodeAfter(firstSpan.firstChild).select();
                    this.setLastRange();
                    this.$editable.data(KEY_BOGUS, firstSpan);
                }
            }
        }
    };
    /**
     * unlink
     *
     * @type command
     */
    Editor.prototype.unlink = function () {
        var rng = this.getLastRange();
        if (rng.isOnAnchor()) {
            var anchor = dom_1["default"].ancestor(rng.sc, dom_1["default"].isAnchor);
            rng = range_1["default"].createFromNode(anchor);
            rng.select();
            this.setLastRange();
            this.beforeCommand();
            document.execCommand('unlink');
            this.afterCommand();
        }
    };
    /**
     * returns link info
     *
     * @return {Object}
     * @return {WrappedRange} return.range
     * @return {String} return.text
     * @return {Boolean} [return.isNewWindow=true]
     * @return {String} [return.url=""]
     */
    Editor.prototype.getLinkInfo = function () {
        var rng = this.getLastRange().expand(dom_1["default"].isAnchor);
        // Get the first anchor on range(for edit).
        var $anchor = jquery_1["default"](lists_1["default"].head(rng.nodes(dom_1["default"].isAnchor)));
        var linkInfo = {
            range: rng,
            text: rng.toString(),
            url: $anchor.length ? $anchor.attr('href') : ''
        };
        // When anchor exists,
        Eif ($anchor.length) {
            // Set isNewWindow by checking its target.
            linkInfo.isNewWindow = $anchor.attr('target') === '_blank';
        }
        return linkInfo;
    };
    Editor.prototype.addRow = function (position) {
        var rng = this.getLastRange(this.$editable);
        if (rng.isCollapsed() && rng.isOnCell()) {
            this.beforeCommand();
            this.table.addRow(rng, position);
            this.afterCommand();
        }
    };
    Editor.prototype.addCol = function (position) {
        var rng = this.getLastRange(this.$editable);
        if (rng.isCollapsed() && rng.isOnCell()) {
            this.beforeCommand();
            this.table.addCol(rng, position);
            this.afterCommand();
        }
    };
    Editor.prototype.deleteRow = function () {
        var rng = this.getLastRange(this.$editable);
        if (rng.isCollapsed() && rng.isOnCell()) {
            this.beforeCommand();
            this.table.deleteRow(rng);
            this.afterCommand();
        }
    };
    Editor.prototype.deleteCol = function () {
        var rng = this.getLastRange(this.$editable);
        if (rng.isCollapsed() && rng.isOnCell()) {
            this.beforeCommand();
            this.table.deleteCol(rng);
            this.afterCommand();
        }
    };
    Editor.prototype.deleteTable = function () {
        var rng = this.getLastRange(this.$editable);
        if (rng.isCollapsed() && rng.isOnCell()) {
            this.beforeCommand();
            this.table.deleteTable(rng);
            this.afterCommand();
        }
    };
    /**
     * @param {Position} pos
     * @param {jQuery} $target - target element
     * @param {Boolean} [bKeepRatio] - keep ratio
     */
    Editor.prototype.resizeTo = function (pos, $target, bKeepRatio) {
        var imageSize;
        if (bKeepRatio) {
            var newRatio = pos.y / pos.x;
            var ratio = $target.data('ratio');
            imageSize = {
                width: ratio > newRatio ? pos.x : pos.y / ratio,
                height: ratio > newRatio ? pos.x * ratio : pos.y
            };
        }
        else {
            imageSize = {
                width: pos.x,
                height: pos.y
            };
        }
        $target.css(imageSize);
    };
    /**
     * returns whether editable area has focus or not.
     */
    Editor.prototype.hasFocus = function () {
        return this.$editable.is(':focus');
    };
    /**
     * set focus
     */
    Editor.prototype.focus = function () {
        // [workaround] Screen will move when page is scolled in IE.
        //  - do focus when not focused
        Eif (!this.hasFocus()) {
            this.$editable.focus();
        }
    };
    /**
     * returns whether contents is empty or not.
     * @return {Boolean}
     */
    Editor.prototype.isEmpty = function () {
        return dom_1["default"].isEmpty(this.$editable[0]) || dom_1["default"].emptyPara === this.$editable.html();
    };
    /**
     * Removes all contents and restores the editable instance to an _emptyPara_.
     */
    Editor.prototype.empty = function () {
        this.context.invoke('code', dom_1["default"].emptyPara);
    };
    /**
     * normalize content
     */
    Editor.prototype.normalizeContent = function () {
        this.$editable[0].normalize();
    };
    return Editor;
}());
exports["default"] = Editor;
 
},'src/js/base/module/Editor.js',{"jquery":"/Users/lqez/Dev/summernote/node_modules/jquery/dist/jquery.js","../core/env":"/Users/lqez/Dev/summernote/src/js/base/core/env.js","../core/key":"/Users/lqez/Dev/summernote/src/js/base/core/key.js","../core/func":"/Users/lqez/Dev/summernote/src/js/base/core/func.js","../core/lists":"/Users/lqez/Dev/summernote/src/js/base/core/lists.js","../core/dom":"/Users/lqez/Dev/summernote/src/js/base/core/dom.js","../core/range":"/Users/lqez/Dev/summernote/src/js/base/core/range.js","../core/async":"/Users/lqez/Dev/summernote/src/js/base/core/async.js","../editing/History":"/Users/lqez/Dev/summernote/src/js/base/editing/History.js","../editing/Style":"/Users/lqez/Dev/summernote/src/js/base/editing/Style.js","../editing/Typing":"/Users/lqez/Dev/summernote/src/js/base/editing/Typing.js","../editing/Table":"/Users/lqez/Dev/summernote/src/js/base/editing/Table.js","../editing/Bullet":"/Users/lqez/Dev/summernote/src/js/base/editing/Bullet.js"}];})(this);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiRWRpdG9yLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsaUNBQXVCO0FBQ3ZCLG1DQUE4QjtBQUM5QixtQ0FBOEI7QUFDOUIscUNBQWdDO0FBQ2hDLHVDQUFrQztBQUNsQyxtQ0FBOEI7QUFDOUIsdUNBQWtDO0FBQ2xDLHVDQUErRDtBQUMvRCw4Q0FBeUM7QUFDekMsMENBQXFDO0FBQ3JDLDRDQUF1QztBQUN2QywwQ0FBcUM7QUFDckMsNENBQXVDO0FBRXZDLElBQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQztBQUUxQjs7R0FFRztBQUNIO0lBQ0UsZ0JBQVksT0FBTztRQUFuQixpQkFrVEM7UUFqVEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFFdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztRQUNyQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7UUFDN0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFFbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBRXRCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxrQkFBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLGtCQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksbUJBQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksbUJBQU0sRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxvQkFBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUUzQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM5RSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2xGLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNwRixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFNUQsdUVBQXVFO1FBQ3ZFLElBQU0sUUFBUSxHQUFHO1lBQ2YsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxXQUFXO1lBQzFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGFBQWE7WUFDN0QsYUFBYSxFQUFFLGNBQWMsRUFBRSxXQUFXO1NBQzNDLENBQUM7UUFFRixLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ3pELElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUMsSUFBSTtnQkFDMUIsT0FBTyxVQUFDLEtBQUs7b0JBQ1gsS0FBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUNyQixRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3pDLEtBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFCLENBQUMsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMzRTtRQUVELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFDLEtBQUs7WUFDckMsT0FBTyxLQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQUMsS0FBSztZQUNyQyxPQUFPLEtBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztRQUVILEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDakMsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQUMsR0FBRztnQkFDM0IsT0FBTztvQkFDTCxLQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFDOUIsQ0FBQyxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDUixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzFFO1FBQUEsQ0FBQztRQUVGLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUN0QyxLQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUN4QyxLQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEtBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQzFDLEtBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQzdCLEtBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUM5QixLQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7UUFFSDs7OztXQUlHO1FBQ0gsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQUMsSUFBSTtZQUN0QyxJQUFJLEtBQUksQ0FBQyxTQUFTLENBQUMsbUJBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDekMsT0FBTzthQUNSO1lBQ0QsSUFBTSxHQUFHLEdBQUcsS0FBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2hDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckIsa0JBQUssQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN6QyxLQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7UUFFSDs7O1dBR0c7UUFDSCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBQyxJQUFJO1lBQ3RDLElBQUksS0FBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQy9CLE9BQU87YUFDUjtZQUNELElBQU0sR0FBRyxHQUFHLEtBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNoQyxJQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLGdCQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdEQsa0JBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLGdCQUFHLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDMUQsS0FBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBQ0g7OztXQUdHO1FBQ0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQUMsTUFBTTtZQUN2QyxJQUFJLEtBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNqQyxPQUFPO2FBQ1I7WUFDRCxNQUFNLEdBQUcsS0FBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDeEQsSUFBTSxRQUFRLEdBQUcsS0FBSSxDQUFDLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN2RCxrQkFBSyxDQUFDLG1CQUFtQixDQUFDLGtCQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekQsS0FBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBRUg7Ozs7V0FJRztRQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFDLE9BQU8sRUFBRSxPQUFPO1lBQ25ELElBQU0sa0JBQWtCLEdBQUcsS0FBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUM7WUFDckUsSUFBSSxrQkFBa0IsRUFBRTtnQkFDdEIsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUksRUFBRSxPQUFPLEVBQUUsS0FBSSxDQUFDLE9BQU8sRUFBRSxLQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDMUU7aUJBQU07Z0JBQ0wsS0FBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7YUFDdEM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVIOztXQUVHO1FBQ0gsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDM0MsSUFBTSxNQUFNLEdBQUcsS0FBSSxDQUFDLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQyxnQkFBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRTtnQkFDdEIsa0JBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDekQsS0FBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3JCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSDs7O1dBR0c7UUFDSCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBQyxLQUFLO1lBQ3ZDLEtBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRTtnQkFDeEMsVUFBVSxFQUFFLEtBQUs7YUFDbEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSDs7OztXQUlHO1FBQ0gsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQUMsUUFBUTtZQUMxQyxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQzNCLElBQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDL0IsSUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztZQUN6QyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBSyxJQUFJLEtBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNoRCxJQUFNLG9CQUFvQixHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNyRSxJQUFJLG9CQUFvQixHQUFHLENBQUMsSUFBSSxLQUFJLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLEVBQUU7Z0JBQ3BFLE9BQU87YUFDUjtZQUNELElBQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxRQUFRLENBQUM7WUFFbEQsZ0NBQWdDO1lBQ2hDLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO2dCQUMvQixPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO2FBQzFCO1lBRUQsSUFBSSxLQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTtnQkFDN0IsT0FBTyxHQUFHLEtBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzlDO2lCQUFNO2dCQUNMLDhGQUE4RjtnQkFDOUYsT0FBTyxHQUFHLG1DQUFtQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7b0JBQ3pELENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7YUFDbkM7WUFFRCxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDakIsSUFBSSxhQUFhLEVBQUU7Z0JBQ2pCLEdBQUcsR0FBRyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQzNCLElBQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsbUJBQUMsQ0FBQyxLQUFLLEdBQUcsUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9ELE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDdEI7aUJBQU07Z0JBQ0wsT0FBTyxHQUFHLEtBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDbkMsUUFBUSxFQUFFLEdBQUc7b0JBQ2Isb0JBQW9CLEVBQUUsSUFBSTtvQkFDMUIsbUJBQW1CLEVBQUUsSUFBSTtpQkFDMUIsQ0FBQyxDQUFDO2FBQ0o7WUFFRCxtQkFBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBQyxHQUFHLEVBQUUsTUFBTTtnQkFDMUIsbUJBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNoQyxJQUFJLFdBQVcsRUFBRTtvQkFDZixtQkFBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7aUJBQ3BDO3FCQUFNO29CQUNMLG1CQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUNoQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBTSxVQUFVLEdBQUcsa0JBQUssQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ25FLElBQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM5QyxJQUFNLFFBQVEsR0FBRyxrQkFBSyxDQUFDLG1CQUFtQixDQUFDLGtCQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDaEUsSUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBRXhDLGtCQUFLLENBQUMsTUFBTSxDQUNWLFVBQVUsQ0FBQyxJQUFJLEVBQ2YsVUFBVSxDQUFDLE1BQU0sRUFDakIsUUFBUSxDQUFDLElBQUksRUFDYixRQUFRLENBQUMsTUFBTSxDQUNoQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1gsS0FBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBRUg7Ozs7OztXQU1HO1FBQ0gsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQUMsU0FBUztZQUN0QyxJQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDO1lBQ3RDLElBQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUM7WUFFdEMsSUFBSSxTQUFTLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQUU7WUFDdkUsSUFBSSxTQUFTLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQUU7UUFDekUsQ0FBQyxDQUFDLENBQUM7UUFFSDs7OztXQUlHO1FBQ0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQUMsU0FBUztZQUMxQyxRQUFRLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEQsUUFBUSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDO1FBRUg7Ozs7V0FJRztRQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFDLEdBQUc7WUFDdEMsSUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVqQyxJQUFNLEdBQUcsR0FBRyxLQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDakQsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ25GLENBQUMsQ0FBQyxDQUFDO1FBRUg7O1dBRUc7UUFDSCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDbEMsSUFBSSxPQUFPLEdBQUcsbUJBQUMsQ0FBQyxLQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMvQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFO2dCQUNuQyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQ25DO2lCQUFNO2dCQUNMLE9BQU8sR0FBRyxtQkFBQyxDQUFDLEtBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQzVDO1lBQ0QsS0FBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLE9BQU8sRUFBRSxLQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckUsQ0FBQyxDQUFDLENBQUM7UUFFSDs7OztXQUlHO1FBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQUMsS0FBSztZQUNwQyxJQUFNLE9BQU8sR0FBRyxtQkFBQyxDQUFDLEtBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQ3hDLE9BQU8sQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxLQUFLLE1BQU0sQ0FBQyxDQUFDO1lBQ3pELE9BQU8sQ0FBQyxXQUFXLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxLQUFLLE9BQU8sQ0FBQyxDQUFDO1lBQzNELE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3hELENBQUMsQ0FBQyxDQUFDO1FBRUg7OztXQUdHO1FBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQUMsS0FBSztZQUNuQyxJQUFNLE9BQU8sR0FBRyxtQkFBQyxDQUFDLEtBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQ3hDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO2dCQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQzFCO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxHQUFHLENBQUM7b0JBQ1YsS0FBSyxFQUFFLEtBQUssR0FBRyxHQUFHLEdBQUcsR0FBRztvQkFDeEIsTUFBTSxFQUFFLEVBQUU7aUJBQ1gsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCwyQkFBVSxHQUFWO1FBQUEsaUJBc0VDO1FBckVDLHFCQUFxQjtRQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsVUFBQyxLQUFLO1lBQ2pDLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxnQkFBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ3BDLEtBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQzthQUMzQztZQUNELEtBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUU1QyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLEVBQUU7Z0JBQy9CLElBQUksS0FBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7b0JBQzFCLEtBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzFCO3FCQUFNO29CQUNMLEtBQUksQ0FBQywrQkFBK0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDN0M7YUFDRjtZQUNELElBQUksS0FBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQzVCLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7UUFDSCxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLFVBQUMsS0FBSztZQUNuQixLQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsS0FBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsVUFBQyxLQUFLO1lBQ25CLEtBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixLQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxVQUFDLEtBQUs7WUFDbEIsS0FBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsVUFBQyxLQUFLO1lBQ3ZCLEtBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLFVBQUMsS0FBSztZQUNyQixLQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsS0FBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBQyxLQUFLO1lBQ3BCLEtBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLFVBQUMsS0FBSztZQUNuQixLQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsS0FBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFM0QsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGdCQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxnQkFBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTNELElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGdCQUFHLENBQUMsY0FBYyxFQUFFLGlCQUFJLENBQUMsUUFBUSxDQUFDO1lBQ2xELEtBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxLQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3RSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVSLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxVQUFDLEtBQUs7WUFDL0IsS0FBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBQyxLQUFLO1lBQ3RCLEtBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUN6QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO2dCQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzdDO1lBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtnQkFDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNqRDtZQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQzFEO1lBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDMUQ7U0FDRjtRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCx3QkFBTyxHQUFQO1FBQ0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsNkJBQVksR0FBWixVQUFhLEtBQUs7UUFDaEIsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsZ0JBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0QsSUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRWhCLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FBRTtRQUN4QyxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUFFO1FBQzFELElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FBRTtRQUUzQyxJQUFNLE9BQU8sR0FBRyxnQkFBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEQsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3BCO1FBRUQsSUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN6QyxJQUFJLFNBQVMsRUFBRTtZQUNiLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssS0FBSyxFQUFFO2dCQUM1QyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDeEI7U0FDRjthQUFNLElBQUksZ0JBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNyQjtJQUNILENBQUM7SUFFRCxnREFBK0IsR0FBL0IsVUFBZ0MsS0FBSztRQUNuQyxpREFBaUQ7UUFDakQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUNsQyxrQkFBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzdDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN4QjtJQUNILENBQUM7SUFFRCwwQkFBUyxHQUFULFVBQVUsR0FBRyxFQUFFLEtBQUs7UUFDbEIsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFFZixJQUFJLE9BQU8sS0FBSyxLQUFLLFdBQVcsRUFBRTtZQUNoQyxJQUFJLGdCQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7Z0JBQ3pCLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUNoQyxrQkFBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGdCQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxnQkFBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ3hFLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjtRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsQ0FBQyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRTtnQkFDdEUsT0FBTyxJQUFJLENBQUM7YUFDYjtTQUNGO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0Q7OztPQUdHO0lBQ0gsNEJBQVcsR0FBWDtRQUNFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsNkJBQVksR0FBWjtRQUNFLElBQUksQ0FBQyxTQUFTLEdBQUcsa0JBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCw2QkFBWSxHQUFaO1FBQ0UsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3JCO1FBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCwwQkFBUyxHQUFULFVBQVUsWUFBWTtRQUNwQixJQUFJLFlBQVksRUFBRTtZQUNoQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDekM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILDZCQUFZLEdBQVo7UUFDRSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDZDtJQUNILENBQUM7SUFFRCwyQkFBVSxHQUFWLFVBQVcsSUFBSTtRQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsNEJBQVcsR0FBWDtRQUNFLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCw4QkFBYSxHQUFiO1FBQ0UsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCw2QkFBWSxHQUFaO1FBQ0UsSUFBSSxHQUFHLEdBQUcsa0JBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN6QixJQUFJLEdBQUcsRUFBRTtZQUNQLEdBQUcsR0FBRyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDdkI7UUFDRCxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCw4QkFBYSxHQUFiLFVBQWMsS0FBSztRQUNqQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7T0FFRztJQUNILHFCQUFJLEdBQUo7UUFDRSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVEOztNQUVFO0lBQ0YsdUJBQU0sR0FBTjtRQUNFLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxxQkFBSSxHQUFKO1FBQ0UsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRDs7T0FFRztJQUNILDhCQUFhLEdBQWI7UUFDRSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbkUsa0RBQWtEO1FBQ2xELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNmLENBQUM7SUFFRDs7O09BR0c7SUFDSCw2QkFBWSxHQUFaLFVBQWEsZ0JBQWdCO1FBQzNCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUM1RTtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILG9CQUFHLEdBQUg7UUFDRSxJQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDaEMsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3JCO2FBQU07WUFDTCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxLQUFLLENBQUMsRUFBRTtnQkFDOUIsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUNyQjtTQUNGO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsc0JBQUssR0FBTDtRQUNFLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNoQyxJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzNCO2FBQU07WUFDTCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxLQUFLLENBQUMsRUFBRTtnQkFDOUIsT0FBTyxLQUFLLENBQUM7YUFDZDtTQUNGO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsNEJBQVcsR0FBWCxVQUFZLEVBQUU7UUFDWixPQUFPO1lBQ0wsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsNEJBQVcsR0FBWCxVQUFZLEdBQUcsRUFBRSxLQUFLO1FBQXRCLGlCQXFCQztRQXBCQyxPQUFPLG1CQUFXLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFDLE1BQU07WUFDekMsS0FBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRXJCLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxFQUFFO2dCQUMvQixLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDZjtpQkFBTTtnQkFDTCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtvQkFDN0IsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7aUJBQ3JDO2dCQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ3ZFO1lBRUQsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2Qsa0JBQUssQ0FBQyxNQUFNLENBQUMsS0FBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRCxrQkFBSyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzlDLEtBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixLQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUMsQ0FBQztZQUNSLEtBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILHNDQUFxQixHQUFyQixVQUFzQixLQUFLO1FBQTNCLGlCQWFDO1FBWkMsbUJBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQUMsR0FBRyxFQUFFLElBQUk7WUFDdEIsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUMzQixJQUFJLEtBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLElBQUksS0FBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUN0RixLQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxLQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2FBQ3ZGO2lCQUFNO2dCQUNMLHlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFDLE9BQU87b0JBQ25DLE9BQU8sS0FBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQzdDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztvQkFDTixLQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2dCQUNsRCxDQUFDLENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsdUNBQXNCLEdBQXRCLFVBQXVCLEtBQUs7UUFDMUIsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDekMsd0JBQXdCO1FBQ3hCLElBQUksU0FBUyxDQUFDLGFBQWEsRUFBRTtZQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDakQsK0JBQStCO1NBQ2hDO2FBQU07WUFDTCxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbkM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0NBQWUsR0FBZjtRQUNFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUU5QiwrQ0FBK0M7UUFDL0MsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDcEIsR0FBRyxHQUFHLGtCQUFLLENBQUMsY0FBYyxDQUFDLGdCQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsZ0JBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBQ2hFO1FBRUQsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELDhCQUFhLEdBQWIsVUFBYyxPQUFPLEVBQUUsT0FBTztRQUM1QixxQ0FBcUM7UUFDckMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLGdCQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdkYsdUJBQXVCO1FBQ3ZCLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDN0IsMkNBQTJDO1lBQzNDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsS0FBSyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUU7Z0JBQzlELE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ2pDO1lBRUQsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtnQkFDN0IsSUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7Z0JBQzdDLElBQUksU0FBUyxFQUFFO29CQUNiLElBQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFFeEMsSUFBTSxPQUFPLEdBQUcsbUJBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUN2RSxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUM3QjthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsMkJBQVUsR0FBVjtRQUNFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELDRCQUFXLEdBQVgsVUFBWSxNQUFNLEVBQUUsS0FBSztRQUN2QixJQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFaEMsSUFBSSxHQUFHLEVBQUU7WUFDUCxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6QyxtQkFBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFNUIsaURBQWlEO1lBQ2pELHFEQUFxRDtZQUNyRCxJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDckIsSUFBTSxTQUFTLEdBQUcsa0JBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3BDLElBQUksU0FBUyxJQUFJLENBQUMsZ0JBQUcsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUU7b0JBQzNDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsZ0JBQUcsQ0FBQyxvQkFBb0IsQ0FBQztvQkFDL0Msa0JBQUssQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ3pELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2lCQUMzQzthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILHVCQUFNLEdBQU47UUFDRSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDOUIsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDcEIsSUFBTSxNQUFNLEdBQUcsZ0JBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxnQkFBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xELEdBQUcsR0FBRyxrQkFBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFcEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsNEJBQVcsR0FBWDtRQUNFLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUMsZ0JBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRCwyQ0FBMkM7UUFDM0MsSUFBTSxPQUFPLEdBQUcsbUJBQUMsQ0FBQyxrQkFBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGdCQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELElBQU0sUUFBUSxHQUFHO1lBQ2YsS0FBSyxFQUFFLEdBQUc7WUFDVixJQUFJLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRTtZQUNwQixHQUFHLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtTQUNoRCxDQUFDO1FBRUYsc0JBQXNCO1FBQ3RCLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUNsQiwwQ0FBMEM7WUFDMUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFFBQVEsQ0FBQztTQUM1RDtRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCx1QkFBTSxHQUFOLFVBQU8sUUFBUTtRQUNiLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUN2QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNyQjtJQUNILENBQUM7SUFFRCx1QkFBTSxHQUFOLFVBQU8sUUFBUTtRQUNiLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUN2QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNyQjtJQUNILENBQUM7SUFFRCwwQkFBUyxHQUFUO1FBQ0UsSUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBRUQsMEJBQVMsR0FBVDtRQUNFLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUN2QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztJQUVELDRCQUFXLEdBQVg7UUFDRSxJQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QyxJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDdkMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNyQjtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gseUJBQVEsR0FBUixVQUFTLEdBQUcsRUFBRSxPQUFPLEVBQUUsVUFBVTtRQUMvQixJQUFJLFNBQVMsQ0FBQztRQUNkLElBQUksVUFBVSxFQUFFO1lBQ2QsSUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEMsU0FBUyxHQUFHO2dCQUNWLEtBQUssRUFBRSxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUs7Z0JBQy9DLE1BQU0sRUFBRSxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDakQsQ0FBQztTQUNIO2FBQU07WUFDTCxTQUFTLEdBQUc7Z0JBQ1YsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNaLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQzthQUNkLENBQUM7U0FDSDtRQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ0gseUJBQVEsR0FBUjtRQUNFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsc0JBQUssR0FBTDtRQUNFLDREQUE0RDtRQUM1RCwrQkFBK0I7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILHdCQUFPLEdBQVA7UUFDRSxPQUFPLGdCQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxnQkFBRyxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ25GLENBQUM7SUFFRDs7T0FFRztJQUNILHNCQUFLLEdBQUw7UUFDRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsZ0JBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxpQ0FBZ0IsR0FBaEI7UUFDRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFDSCxhQUFDO0FBQUQsQ0FBQyxBQTMzQkQsSUEyM0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBlbnYgZnJvbSAnLi4vY29yZS9lbnYnO1xuaW1wb3J0IGtleSBmcm9tICcuLi9jb3JlL2tleSc7XG5pbXBvcnQgZnVuYyBmcm9tICcuLi9jb3JlL2Z1bmMnO1xuaW1wb3J0IGxpc3RzIGZyb20gJy4uL2NvcmUvbGlzdHMnO1xuaW1wb3J0IGRvbSBmcm9tICcuLi9jb3JlL2RvbSc7XG5pbXBvcnQgcmFuZ2UgZnJvbSAnLi4vY29yZS9yYW5nZSc7XG5pbXBvcnQgeyByZWFkRmlsZUFzRGF0YVVSTCwgY3JlYXRlSW1hZ2UgfSBmcm9tICcuLi9jb3JlL2FzeW5jJztcbmltcG9ydCBIaXN0b3J5IGZyb20gJy4uL2VkaXRpbmcvSGlzdG9yeSc7XG5pbXBvcnQgU3R5bGUgZnJvbSAnLi4vZWRpdGluZy9TdHlsZSc7XG5pbXBvcnQgVHlwaW5nIGZyb20gJy4uL2VkaXRpbmcvVHlwaW5nJztcbmltcG9ydCBUYWJsZSBmcm9tICcuLi9lZGl0aW5nL1RhYmxlJztcbmltcG9ydCBCdWxsZXQgZnJvbSAnLi4vZWRpdGluZy9CdWxsZXQnO1xuXG5jb25zdCBLRVlfQk9HVVMgPSAnYm9ndXMnO1xuXG4vKipcbiAqIEBjbGFzcyBFZGl0b3JcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWRpdG9yIHtcbiAgY29uc3RydWN0b3IoY29udGV4dCkge1xuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG5cbiAgICB0aGlzLiRub3RlID0gY29udGV4dC5sYXlvdXRJbmZvLm5vdGU7XG4gICAgdGhpcy4kZWRpdG9yID0gY29udGV4dC5sYXlvdXRJbmZvLmVkaXRvcjtcbiAgICB0aGlzLiRlZGl0YWJsZSA9IGNvbnRleHQubGF5b3V0SW5mby5lZGl0YWJsZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnM7XG4gICAgdGhpcy5sYW5nID0gdGhpcy5vcHRpb25zLmxhbmdJbmZvO1xuXG4gICAgdGhpcy5lZGl0YWJsZSA9IHRoaXMuJGVkaXRhYmxlWzBdO1xuICAgIHRoaXMubGFzdFJhbmdlID0gbnVsbDtcblxuICAgIHRoaXMuc3R5bGUgPSBuZXcgU3R5bGUoKTtcbiAgICB0aGlzLnRhYmxlID0gbmV3IFRhYmxlKCk7XG4gICAgdGhpcy50eXBpbmcgPSBuZXcgVHlwaW5nKGNvbnRleHQpO1xuICAgIHRoaXMuYnVsbGV0ID0gbmV3IEJ1bGxldCgpO1xuICAgIHRoaXMuaGlzdG9yeSA9IG5ldyBIaXN0b3J5KHRoaXMuJGVkaXRhYmxlKTtcblxuICAgIHRoaXMuY29udGV4dC5tZW1vKCdoZWxwLnVuZG8nLCB0aGlzLmxhbmcuaGVscC51bmRvKTtcbiAgICB0aGlzLmNvbnRleHQubWVtbygnaGVscC5yZWRvJywgdGhpcy5sYW5nLmhlbHAucmVkbyk7XG4gICAgdGhpcy5jb250ZXh0Lm1lbW8oJ2hlbHAudGFiJywgdGhpcy5sYW5nLmhlbHAudGFiKTtcbiAgICB0aGlzLmNvbnRleHQubWVtbygnaGVscC51bnRhYicsIHRoaXMubGFuZy5oZWxwLnVudGFiKTtcbiAgICB0aGlzLmNvbnRleHQubWVtbygnaGVscC5pbnNlcnRQYXJhZ3JhcGgnLCB0aGlzLmxhbmcuaGVscC5pbnNlcnRQYXJhZ3JhcGgpO1xuICAgIHRoaXMuY29udGV4dC5tZW1vKCdoZWxwLmluc2VydE9yZGVyZWRMaXN0JywgdGhpcy5sYW5nLmhlbHAuaW5zZXJ0T3JkZXJlZExpc3QpO1xuICAgIHRoaXMuY29udGV4dC5tZW1vKCdoZWxwLmluc2VydFVub3JkZXJlZExpc3QnLCB0aGlzLmxhbmcuaGVscC5pbnNlcnRVbm9yZGVyZWRMaXN0KTtcbiAgICB0aGlzLmNvbnRleHQubWVtbygnaGVscC5pbmRlbnQnLCB0aGlzLmxhbmcuaGVscC5pbmRlbnQpO1xuICAgIHRoaXMuY29udGV4dC5tZW1vKCdoZWxwLm91dGRlbnQnLCB0aGlzLmxhbmcuaGVscC5vdXRkZW50KTtcbiAgICB0aGlzLmNvbnRleHQubWVtbygnaGVscC5mb3JtYXRQYXJhJywgdGhpcy5sYW5nLmhlbHAuZm9ybWF0UGFyYSk7XG4gICAgdGhpcy5jb250ZXh0Lm1lbW8oJ2hlbHAuaW5zZXJ0SG9yaXpvbnRhbFJ1bGUnLCB0aGlzLmxhbmcuaGVscC5pbnNlcnRIb3Jpem9udGFsUnVsZSk7XG4gICAgdGhpcy5jb250ZXh0Lm1lbW8oJ2hlbHAuZm9udE5hbWUnLCB0aGlzLmxhbmcuaGVscC5mb250TmFtZSk7XG5cbiAgICAvLyBuYXRpdmUgY29tbWFuZHMod2l0aCBleGVjQ29tbWFuZCksIGdlbmVyYXRlIGZ1bmN0aW9uIGZvciBleGVjQ29tbWFuZFxuICAgIGNvbnN0IGNvbW1hbmRzID0gW1xuICAgICAgJ2JvbGQnLCAnaXRhbGljJywgJ3VuZGVybGluZScsICdzdHJpa2V0aHJvdWdoJywgJ3N1cGVyc2NyaXB0JywgJ3N1YnNjcmlwdCcsXG4gICAgICAnanVzdGlmeUxlZnQnLCAnanVzdGlmeUNlbnRlcicsICdqdXN0aWZ5UmlnaHQnLCAnanVzdGlmeUZ1bGwnLFxuICAgICAgJ2Zvcm1hdEJsb2NrJywgJ3JlbW92ZUZvcm1hdCcsICdiYWNrQ29sb3InLFxuICAgIF07XG5cbiAgICBmb3IgKGxldCBpZHggPSAwLCBsZW4gPSBjb21tYW5kcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgIHRoaXNbY29tbWFuZHNbaWR4XV0gPSAoKHNDbWQpID0+IHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSkgPT4ge1xuICAgICAgICAgIHRoaXMuYmVmb3JlQ29tbWFuZCgpO1xuICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKHNDbWQsIGZhbHNlLCB2YWx1ZSk7XG4gICAgICAgICAgdGhpcy5hZnRlckNvbW1hbmQodHJ1ZSk7XG4gICAgICAgIH07XG4gICAgICB9KShjb21tYW5kc1tpZHhdKTtcbiAgICAgIHRoaXMuY29udGV4dC5tZW1vKCdoZWxwLicgKyBjb21tYW5kc1tpZHhdLCB0aGlzLmxhbmcuaGVscFtjb21tYW5kc1tpZHhdXSk7XG4gICAgfVxuXG4gICAgdGhpcy5mb250TmFtZSA9IHRoaXMud3JhcENvbW1hbmQoKHZhbHVlKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5mb250U3R5bGluZygnZm9udC1mYW1pbHknLCBcIlxcJ1wiICsgdmFsdWUgKyBcIlxcJ1wiKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZm9udFNpemUgPSB0aGlzLndyYXBDb21tYW5kKCh2YWx1ZSkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZm9udFN0eWxpbmcoJ2ZvbnQtc2l6ZScsIHZhbHVlICsgJ3B4Jyk7XG4gICAgfSk7XG5cbiAgICBmb3IgKGxldCBpZHggPSAxOyBpZHggPD0gNjsgaWR4KyspIHtcbiAgICAgIHRoaXNbJ2Zvcm1hdEgnICsgaWR4XSA9ICgoaWR4KSA9PiB7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5mb3JtYXRCbG9jaygnSCcgKyBpZHgpO1xuICAgICAgICB9O1xuICAgICAgfSkoaWR4KTtcbiAgICAgIHRoaXMuY29udGV4dC5tZW1vKCdoZWxwLmZvcm1hdEgnICsgaWR4LCB0aGlzLmxhbmcuaGVscFsnZm9ybWF0SCcgKyBpZHhdKTtcbiAgICB9O1xuXG4gICAgdGhpcy5pbnNlcnRQYXJhZ3JhcGggPSB0aGlzLndyYXBDb21tYW5kKCgpID0+IHtcbiAgICAgIHRoaXMudHlwaW5nLmluc2VydFBhcmFncmFwaCh0aGlzLmVkaXRhYmxlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuaW5zZXJ0T3JkZXJlZExpc3QgPSB0aGlzLndyYXBDb21tYW5kKCgpID0+IHtcbiAgICAgIHRoaXMuYnVsbGV0Lmluc2VydE9yZGVyZWRMaXN0KHRoaXMuZWRpdGFibGUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5pbnNlcnRVbm9yZGVyZWRMaXN0ID0gdGhpcy53cmFwQ29tbWFuZCgoKSA9PiB7XG4gICAgICB0aGlzLmJ1bGxldC5pbnNlcnRVbm9yZGVyZWRMaXN0KHRoaXMuZWRpdGFibGUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5pbmRlbnQgPSB0aGlzLndyYXBDb21tYW5kKCgpID0+IHtcbiAgICAgIHRoaXMuYnVsbGV0LmluZGVudCh0aGlzLmVkaXRhYmxlKTtcbiAgICB9KTtcblxuICAgIHRoaXMub3V0ZGVudCA9IHRoaXMud3JhcENvbW1hbmQoKCkgPT4ge1xuICAgICAgdGhpcy5idWxsZXQub3V0ZGVudCh0aGlzLmVkaXRhYmxlKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIGluc2VydE5vZGVcbiAgICAgKiBpbnNlcnQgbm9kZVxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgICAqL1xuICAgIHRoaXMuaW5zZXJ0Tm9kZSA9IHRoaXMud3JhcENvbW1hbmQoKG5vZGUpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzTGltaXRlZCgkKG5vZGUpLnRleHQoKS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJuZyA9IHRoaXMuZ2V0TGFzdFJhbmdlKCk7XG4gICAgICBybmcuaW5zZXJ0Tm9kZShub2RlKTtcbiAgICAgIHJhbmdlLmNyZWF0ZUZyb21Ob2RlQWZ0ZXIobm9kZSkuc2VsZWN0KCk7XG4gICAgICB0aGlzLnNldExhc3RSYW5nZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogaW5zZXJ0IHRleHRcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dFxuICAgICAqL1xuICAgIHRoaXMuaW5zZXJ0VGV4dCA9IHRoaXMud3JhcENvbW1hbmQoKHRleHQpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzTGltaXRlZCh0ZXh0Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgcm5nID0gdGhpcy5nZXRMYXN0UmFuZ2UoKTtcbiAgICAgIGNvbnN0IHRleHROb2RlID0gcm5nLmluc2VydE5vZGUoZG9tLmNyZWF0ZVRleHQodGV4dCkpO1xuICAgICAgcmFuZ2UuY3JlYXRlKHRleHROb2RlLCBkb20ubm9kZUxlbmd0aCh0ZXh0Tm9kZSkpLnNlbGVjdCgpO1xuICAgICAgdGhpcy5zZXRMYXN0UmFuZ2UoKTtcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiBwYXN0ZSBIVE1MXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG1hcmt1cFxuICAgICAqL1xuICAgIHRoaXMucGFzdGVIVE1MID0gdGhpcy53cmFwQ29tbWFuZCgobWFya3VwKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc0xpbWl0ZWQobWFya3VwLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbWFya3VwID0gdGhpcy5jb250ZXh0Lmludm9rZSgnY29kZXZpZXcucHVyaWZ5JywgbWFya3VwKTtcbiAgICAgIGNvbnN0IGNvbnRlbnRzID0gdGhpcy5nZXRMYXN0UmFuZ2UoKS5wYXN0ZUhUTUwobWFya3VwKTtcbiAgICAgIHJhbmdlLmNyZWF0ZUZyb21Ob2RlQWZ0ZXIobGlzdHMubGFzdChjb250ZW50cykpLnNlbGVjdCgpO1xuICAgICAgdGhpcy5zZXRMYXN0UmFuZ2UoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIGZvcm1hdEJsb2NrXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGFnTmFtZVxuICAgICAqL1xuICAgIHRoaXMuZm9ybWF0QmxvY2sgPSB0aGlzLndyYXBDb21tYW5kKCh0YWdOYW1lLCAkdGFyZ2V0KSA9PiB7XG4gICAgICBjb25zdCBvbkFwcGx5Q3VzdG9tU3R5bGUgPSB0aGlzLm9wdGlvbnMuY2FsbGJhY2tzLm9uQXBwbHlDdXN0b21TdHlsZTtcbiAgICAgIGlmIChvbkFwcGx5Q3VzdG9tU3R5bGUpIHtcbiAgICAgICAgb25BcHBseUN1c3RvbVN0eWxlLmNhbGwodGhpcywgJHRhcmdldCwgdGhpcy5jb250ZXh0LCB0aGlzLm9uRm9ybWF0QmxvY2spO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbkZvcm1hdEJsb2NrKHRhZ05hbWUsICR0YXJnZXQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogaW5zZXJ0IGhvcml6b250YWwgcnVsZVxuICAgICAqL1xuICAgIHRoaXMuaW5zZXJ0SG9yaXpvbnRhbFJ1bGUgPSB0aGlzLndyYXBDb21tYW5kKCgpID0+IHtcbiAgICAgIGNvbnN0IGhyTm9kZSA9IHRoaXMuZ2V0TGFzdFJhbmdlKCkuaW5zZXJ0Tm9kZShkb20uY3JlYXRlKCdIUicpKTtcbiAgICAgIGlmIChock5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgcmFuZ2UuY3JlYXRlKGhyTm9kZS5uZXh0U2libGluZywgMCkubm9ybWFsaXplKCkuc2VsZWN0KCk7XG4gICAgICAgIHRoaXMuc2V0TGFzdFJhbmdlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBsaW5lSGVpZ2h0XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gICAgICovXG4gICAgdGhpcy5saW5lSGVpZ2h0ID0gdGhpcy53cmFwQ29tbWFuZCgodmFsdWUpID0+IHtcbiAgICAgIHRoaXMuc3R5bGUuc3R5bGVQYXJhKHRoaXMuZ2V0TGFzdFJhbmdlKCksIHtcbiAgICAgICAgbGluZUhlaWdodDogdmFsdWUsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIGNyZWF0ZSBsaW5rIChjb21tYW5kKVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGxpbmtJbmZvXG4gICAgICovXG4gICAgdGhpcy5jcmVhdGVMaW5rID0gdGhpcy53cmFwQ29tbWFuZCgobGlua0luZm8pID0+IHtcbiAgICAgIGxldCBsaW5rVXJsID0gbGlua0luZm8udXJsO1xuICAgICAgY29uc3QgbGlua1RleHQgPSBsaW5rSW5mby50ZXh0O1xuICAgICAgY29uc3QgaXNOZXdXaW5kb3cgPSBsaW5rSW5mby5pc05ld1dpbmRvdztcbiAgICAgIGxldCBybmcgPSBsaW5rSW5mby5yYW5nZSB8fCB0aGlzLmdldExhc3RSYW5nZSgpO1xuICAgICAgY29uc3QgYWRkaXRpb25hbFRleHRMZW5ndGggPSBsaW5rVGV4dC5sZW5ndGggLSBybmcudG9TdHJpbmcoKS5sZW5ndGg7XG4gICAgICBpZiAoYWRkaXRpb25hbFRleHRMZW5ndGggPiAwICYmIHRoaXMuaXNMaW1pdGVkKGFkZGl0aW9uYWxUZXh0TGVuZ3RoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpc1RleHRDaGFuZ2VkID0gcm5nLnRvU3RyaW5nKCkgIT09IGxpbmtUZXh0O1xuXG4gICAgICAvLyBoYW5kbGUgc3BhY2VkIHVybHMgZnJvbSBpbnB1dFxuICAgICAgaWYgKHR5cGVvZiBsaW5rVXJsID09PSAnc3RyaW5nJykge1xuICAgICAgICBsaW5rVXJsID0gbGlua1VybC50cmltKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25DcmVhdGVMaW5rKSB7XG4gICAgICAgIGxpbmtVcmwgPSB0aGlzLm9wdGlvbnMub25DcmVhdGVMaW5rKGxpbmtVcmwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgdXJsIGRvZXNuJ3QgaGF2ZSBhbnkgcHJvdG9jb2wgYW5kIG5vdCBldmVuIGEgcmVsYXRpdmUgb3IgYSBsYWJlbCwgdXNlIGh0dHA6Ly8gYXMgZGVmYXVsdFxuICAgICAgICBsaW5rVXJsID0gL14oW0EtWmEtel1bQS1aYS16MC05Ky0uXSpcXDp8I3xcXC8pLy50ZXN0KGxpbmtVcmwpXG4gICAgICAgICAgPyBsaW5rVXJsIDogJ2h0dHA6Ly8nICsgbGlua1VybDtcbiAgICAgIH1cblxuICAgICAgbGV0IGFuY2hvcnMgPSBbXTtcbiAgICAgIGlmIChpc1RleHRDaGFuZ2VkKSB7XG4gICAgICAgIHJuZyA9IHJuZy5kZWxldGVDb250ZW50cygpO1xuICAgICAgICBjb25zdCBhbmNob3IgPSBybmcuaW5zZXJ0Tm9kZSgkKCc8QT4nICsgbGlua1RleHQgKyAnPC9BPicpWzBdKTtcbiAgICAgICAgYW5jaG9ycy5wdXNoKGFuY2hvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbmNob3JzID0gdGhpcy5zdHlsZS5zdHlsZU5vZGVzKHJuZywge1xuICAgICAgICAgIG5vZGVOYW1lOiAnQScsXG4gICAgICAgICAgZXhwYW5kQ2xvc2VzdFNpYmxpbmc6IHRydWUsXG4gICAgICAgICAgb25seVBhcnRpYWxDb250YWluczogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgICQuZWFjaChhbmNob3JzLCAoaWR4LCBhbmNob3IpID0+IHtcbiAgICAgICAgJChhbmNob3IpLmF0dHIoJ2hyZWYnLCBsaW5rVXJsKTtcbiAgICAgICAgaWYgKGlzTmV3V2luZG93KSB7XG4gICAgICAgICAgJChhbmNob3IpLmF0dHIoJ3RhcmdldCcsICdfYmxhbmsnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkKGFuY2hvcikucmVtb3ZlQXR0cigndGFyZ2V0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzdGFydFJhbmdlID0gcmFuZ2UuY3JlYXRlRnJvbU5vZGVCZWZvcmUobGlzdHMuaGVhZChhbmNob3JzKSk7XG4gICAgICBjb25zdCBzdGFydFBvaW50ID0gc3RhcnRSYW5nZS5nZXRTdGFydFBvaW50KCk7XG4gICAgICBjb25zdCBlbmRSYW5nZSA9IHJhbmdlLmNyZWF0ZUZyb21Ob2RlQWZ0ZXIobGlzdHMubGFzdChhbmNob3JzKSk7XG4gICAgICBjb25zdCBlbmRQb2ludCA9IGVuZFJhbmdlLmdldEVuZFBvaW50KCk7XG5cbiAgICAgIHJhbmdlLmNyZWF0ZShcbiAgICAgICAgc3RhcnRQb2ludC5ub2RlLFxuICAgICAgICBzdGFydFBvaW50Lm9mZnNldCxcbiAgICAgICAgZW5kUG9pbnQubm9kZSxcbiAgICAgICAgZW5kUG9pbnQub2Zmc2V0XG4gICAgICApLnNlbGVjdCgpO1xuICAgICAgdGhpcy5zZXRMYXN0UmFuZ2UoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIHNldHRpbmcgY29sb3JcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzT2JqQ29sb3IgIGNvbG9yIGNvZGVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc09iakNvbG9yLmZvcmVDb2xvciBmb3JlZ3JvdW5kIGNvbG9yXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHNPYmpDb2xvci5iYWNrQ29sb3IgYmFja2dyb3VuZCBjb2xvclxuICAgICAqL1xuICAgIHRoaXMuY29sb3IgPSB0aGlzLndyYXBDb21tYW5kKChjb2xvckluZm8pID0+IHtcbiAgICAgIGNvbnN0IGZvcmVDb2xvciA9IGNvbG9ySW5mby5mb3JlQ29sb3I7XG4gICAgICBjb25zdCBiYWNrQ29sb3IgPSBjb2xvckluZm8uYmFja0NvbG9yO1xuXG4gICAgICBpZiAoZm9yZUNvbG9yKSB7IGRvY3VtZW50LmV4ZWNDb21tYW5kKCdmb3JlQ29sb3InLCBmYWxzZSwgZm9yZUNvbG9yKTsgfVxuICAgICAgaWYgKGJhY2tDb2xvcikgeyBkb2N1bWVudC5leGVjQ29tbWFuZCgnYmFja0NvbG9yJywgZmFsc2UsIGJhY2tDb2xvcik7IH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFNldCBmb3JlZ3JvdW5kIGNvbG9yXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29sb3JDb2RlIGZvcmVncm91bmQgY29sb3IgY29kZVxuICAgICAqL1xuICAgIHRoaXMuZm9yZUNvbG9yID0gdGhpcy53cmFwQ29tbWFuZCgoY29sb3JJbmZvKSA9PiB7XG4gICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnc3R5bGVXaXRoQ1NTJywgZmFsc2UsIHRydWUpO1xuICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2ZvcmVDb2xvcicsIGZhbHNlLCBjb2xvckluZm8pO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogaW5zZXJ0IFRhYmxlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZGltZW5zaW9uIG9mIHRhYmxlIChleCA6IFwiNXg1XCIpXG4gICAgICovXG4gICAgdGhpcy5pbnNlcnRUYWJsZSA9IHRoaXMud3JhcENvbW1hbmQoKGRpbSkgPT4ge1xuICAgICAgY29uc3QgZGltZW5zaW9uID0gZGltLnNwbGl0KCd4Jyk7XG5cbiAgICAgIGNvbnN0IHJuZyA9IHRoaXMuZ2V0TGFzdFJhbmdlKCkuZGVsZXRlQ29udGVudHMoKTtcbiAgICAgIHJuZy5pbnNlcnROb2RlKHRoaXMudGFibGUuY3JlYXRlVGFibGUoZGltZW5zaW9uWzBdLCBkaW1lbnNpb25bMV0sIHRoaXMub3B0aW9ucykpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogcmVtb3ZlIG1lZGlhIG9iamVjdCBhbmQgRmlndXJlIEVsZW1lbnRzIGlmIG1lZGlhIG9iamVjdCBpcyBpbWcgd2l0aCBGaWd1cmUuXG4gICAgICovXG4gICAgdGhpcy5yZW1vdmVNZWRpYSA9IHRoaXMud3JhcENvbW1hbmQoKCkgPT4ge1xuICAgICAgbGV0ICR0YXJnZXQgPSAkKHRoaXMucmVzdG9yZVRhcmdldCgpKS5wYXJlbnQoKTtcbiAgICAgIGlmICgkdGFyZ2V0LnBhcmVudCgnZmlndXJlJykubGVuZ3RoKSB7XG4gICAgICAgICR0YXJnZXQucGFyZW50KCdmaWd1cmUnKS5yZW1vdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICR0YXJnZXQgPSAkKHRoaXMucmVzdG9yZVRhcmdldCgpKS5kZXRhY2goKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29udGV4dC50cmlnZ2VyRXZlbnQoJ21lZGlhLmRlbGV0ZScsICR0YXJnZXQsIHRoaXMuJGVkaXRhYmxlKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIGZsb2F0IG1lXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAgICAgKi9cbiAgICB0aGlzLmZsb2F0TWUgPSB0aGlzLndyYXBDb21tYW5kKCh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgJHRhcmdldCA9ICQodGhpcy5yZXN0b3JlVGFyZ2V0KCkpO1xuICAgICAgJHRhcmdldC50b2dnbGVDbGFzcygnbm90ZS1mbG9hdC1sZWZ0JywgdmFsdWUgPT09ICdsZWZ0Jyk7XG4gICAgICAkdGFyZ2V0LnRvZ2dsZUNsYXNzKCdub3RlLWZsb2F0LXJpZ2h0JywgdmFsdWUgPT09ICdyaWdodCcpO1xuICAgICAgJHRhcmdldC5jc3MoJ2Zsb2F0JywgKHZhbHVlID09PSAnbm9uZScgPyAnJyA6IHZhbHVlKSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiByZXNpemUgb3ZlcmxheSBlbGVtZW50XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gICAgICovXG4gICAgdGhpcy5yZXNpemUgPSB0aGlzLndyYXBDb21tYW5kKCh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgJHRhcmdldCA9ICQodGhpcy5yZXN0b3JlVGFyZ2V0KCkpO1xuICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gMCkge1xuICAgICAgICAkdGFyZ2V0LmNzcygnd2lkdGgnLCAnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkdGFyZ2V0LmNzcyh7XG4gICAgICAgICAgd2lkdGg6IHZhbHVlICogMTAwICsgJyUnLFxuICAgICAgICAgIGhlaWdodDogJycsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICAvLyBiaW5kIGN1c3RvbSBldmVudHNcbiAgICB0aGlzLiRlZGl0YWJsZS5vbigna2V5ZG93bicsIChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IGtleS5jb2RlLkVOVEVSKSB7XG4gICAgICAgIHRoaXMuY29udGV4dC50cmlnZ2VyRXZlbnQoJ2VudGVyJywgZXZlbnQpO1xuICAgICAgfVxuICAgICAgdGhpcy5jb250ZXh0LnRyaWdnZXJFdmVudCgna2V5ZG93bicsIGV2ZW50KTtcblxuICAgICAgaWYgKCFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3J0Y3V0cykge1xuICAgICAgICAgIHRoaXMuaGFuZGxlS2V5TWFwKGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnByZXZlbnREZWZhdWx0RWRpdGFibGVTaG9ydEN1dHMoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc0xpbWl0ZWQoMSwgZXZlbnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KS5vbigna2V5dXAnLCAoZXZlbnQpID0+IHtcbiAgICAgIHRoaXMuc2V0TGFzdFJhbmdlKCk7XG4gICAgICB0aGlzLmNvbnRleHQudHJpZ2dlckV2ZW50KCdrZXl1cCcsIGV2ZW50KTtcbiAgICB9KS5vbignZm9jdXMnLCAoZXZlbnQpID0+IHtcbiAgICAgIHRoaXMuc2V0TGFzdFJhbmdlKCk7XG4gICAgICB0aGlzLmNvbnRleHQudHJpZ2dlckV2ZW50KCdmb2N1cycsIGV2ZW50KTtcbiAgICB9KS5vbignYmx1cicsIChldmVudCkgPT4ge1xuICAgICAgdGhpcy5jb250ZXh0LnRyaWdnZXJFdmVudCgnYmx1cicsIGV2ZW50KTtcbiAgICB9KS5vbignbW91c2Vkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgICB0aGlzLmNvbnRleHQudHJpZ2dlckV2ZW50KCdtb3VzZWRvd24nLCBldmVudCk7XG4gICAgfSkub24oJ21vdXNldXAnLCAoZXZlbnQpID0+IHtcbiAgICAgIHRoaXMuc2V0TGFzdFJhbmdlKCk7XG4gICAgICB0aGlzLmNvbnRleHQudHJpZ2dlckV2ZW50KCdtb3VzZXVwJywgZXZlbnQpO1xuICAgIH0pLm9uKCdzY3JvbGwnLCAoZXZlbnQpID0+IHtcbiAgICAgIHRoaXMuY29udGV4dC50cmlnZ2VyRXZlbnQoJ3Njcm9sbCcsIGV2ZW50KTtcbiAgICB9KS5vbigncGFzdGUnLCAoZXZlbnQpID0+IHtcbiAgICAgIHRoaXMuc2V0TGFzdFJhbmdlKCk7XG4gICAgICB0aGlzLmNvbnRleHQudHJpZ2dlckV2ZW50KCdwYXN0ZScsIGV2ZW50KTtcbiAgICB9KTtcblxuICAgIHRoaXMuJGVkaXRhYmxlLmF0dHIoJ3NwZWxsY2hlY2snLCB0aGlzLm9wdGlvbnMuc3BlbGxDaGVjayk7XG5cbiAgICAvLyBpbml0IGNvbnRlbnQgYmVmb3JlIHNldCBldmVudFxuICAgIHRoaXMuJGVkaXRhYmxlLmh0bWwoZG9tLmh0bWwodGhpcy4kbm90ZSkgfHwgZG9tLmVtcHR5UGFyYSk7XG5cbiAgICB0aGlzLiRlZGl0YWJsZS5vbihlbnYuaW5wdXRFdmVudE5hbWUsIGZ1bmMuZGVib3VuY2UoKCkgPT4ge1xuICAgICAgdGhpcy5jb250ZXh0LnRyaWdnZXJFdmVudCgnY2hhbmdlJywgdGhpcy4kZWRpdGFibGUuaHRtbCgpLCB0aGlzLiRlZGl0YWJsZSk7XG4gICAgfSwgMTApKTtcblxuICAgIHRoaXMuJGVkaXRvci5vbignZm9jdXNpbicsIChldmVudCkgPT4ge1xuICAgICAgdGhpcy5jb250ZXh0LnRyaWdnZXJFdmVudCgnZm9jdXNpbicsIGV2ZW50KTtcbiAgICB9KS5vbignZm9jdXNvdXQnLCAoZXZlbnQpID0+IHtcbiAgICAgIHRoaXMuY29udGV4dC50cmlnZ2VyRXZlbnQoJ2ZvY3Vzb3V0JywgZXZlbnQpO1xuICAgIH0pO1xuXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuYWlyTW9kZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy53aWR0aCkge1xuICAgICAgICB0aGlzLiRlZGl0b3Iub3V0ZXJXaWR0aCh0aGlzLm9wdGlvbnMud2lkdGgpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5oZWlnaHQpIHtcbiAgICAgICAgdGhpcy4kZWRpdGFibGUub3V0ZXJIZWlnaHQodGhpcy5vcHRpb25zLmhlaWdodCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm1heEhlaWdodCkge1xuICAgICAgICB0aGlzLiRlZGl0YWJsZS5jc3MoJ21heC1oZWlnaHQnLCB0aGlzLm9wdGlvbnMubWF4SGVpZ2h0KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubWluSGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuJGVkaXRhYmxlLmNzcygnbWluLWhlaWdodCcsIHRoaXMub3B0aW9ucy5taW5IZWlnaHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaGlzdG9yeS5yZWNvcmRVbmRvKCk7XG4gICAgdGhpcy5zZXRMYXN0UmFuZ2UoKTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy4kZWRpdGFibGUub2ZmKCk7XG4gIH1cblxuICBoYW5kbGVLZXlNYXAoZXZlbnQpIHtcbiAgICBjb25zdCBrZXlNYXAgPSB0aGlzLm9wdGlvbnMua2V5TWFwW2Vudi5pc01hYyA/ICdtYWMnIDogJ3BjJ107XG4gICAgY29uc3Qga2V5cyA9IFtdO1xuXG4gICAgaWYgKGV2ZW50Lm1ldGFLZXkpIHsga2V5cy5wdXNoKCdDTUQnKTsgfVxuICAgIGlmIChldmVudC5jdHJsS2V5ICYmICFldmVudC5hbHRLZXkpIHsga2V5cy5wdXNoKCdDVFJMJyk7IH1cbiAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHsga2V5cy5wdXNoKCdTSElGVCcpOyB9XG5cbiAgICBjb25zdCBrZXlOYW1lID0ga2V5Lm5hbWVGcm9tQ29kZVtldmVudC5rZXlDb2RlXTtcbiAgICBpZiAoa2V5TmFtZSkge1xuICAgICAga2V5cy5wdXNoKGtleU5hbWUpO1xuICAgIH1cblxuICAgIGNvbnN0IGV2ZW50TmFtZSA9IGtleU1hcFtrZXlzLmpvaW4oJysnKV07XG4gICAgaWYgKGV2ZW50TmFtZSkge1xuICAgICAgaWYgKHRoaXMuY29udGV4dC5pbnZva2UoZXZlbnROYW1lKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGtleS5pc0VkaXQoZXZlbnQua2V5Q29kZSkpIHtcbiAgICAgIHRoaXMuYWZ0ZXJDb21tYW5kKCk7XG4gICAgfVxuICB9XG5cbiAgcHJldmVudERlZmF1bHRFZGl0YWJsZVNob3J0Q3V0cyhldmVudCkge1xuICAgIC8vIEIoQm9sZCwgNjYpIC8gSShJdGFsaWMsIDczKSAvIFUoVW5kZXJsaW5lLCA4NSlcbiAgICBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiZcbiAgICAgIGxpc3RzLmNvbnRhaW5zKFs2NiwgNzMsIDg1XSwgZXZlbnQua2V5Q29kZSkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG5cbiAgaXNMaW1pdGVkKHBhZCwgZXZlbnQpIHtcbiAgICBwYWQgPSBwYWQgfHwgMDtcblxuICAgIGlmICh0eXBlb2YgZXZlbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAoa2V5LmlzTW92ZShldmVudC5rZXlDb2RlKSB8fFxuICAgICAgICAgIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHx8XG4gICAgICAgICAgbGlzdHMuY29udGFpbnMoW2tleS5jb2RlLkJBQ0tTUEFDRSwga2V5LmNvZGUuREVMRVRFXSwgZXZlbnQua2V5Q29kZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMubWF4VGV4dExlbmd0aCA+IDApIHtcbiAgICAgIGlmICgodGhpcy4kZWRpdGFibGUudGV4dCgpLmxlbmd0aCArIHBhZCkgPj0gdGhpcy5vcHRpb25zLm1heFRleHRMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogY3JlYXRlIHJhbmdlXG4gICAqIEByZXR1cm4ge1dyYXBwZWRSYW5nZX1cbiAgICovXG4gIGNyZWF0ZVJhbmdlKCkge1xuICAgIHRoaXMuZm9jdXMoKTtcbiAgICB0aGlzLnNldExhc3RSYW5nZSgpO1xuICAgIHJldHVybiB0aGlzLmdldExhc3RSYW5nZSgpO1xuICB9XG5cbiAgc2V0TGFzdFJhbmdlKCkge1xuICAgIHRoaXMubGFzdFJhbmdlID0gcmFuZ2UuY3JlYXRlKHRoaXMuZWRpdGFibGUpO1xuICB9XG5cbiAgZ2V0TGFzdFJhbmdlKCkge1xuICAgIGlmICghdGhpcy5sYXN0UmFuZ2UpIHtcbiAgICAgIHRoaXMuc2V0TGFzdFJhbmdlKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxhc3RSYW5nZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzYXZlUmFuZ2VcbiAgICpcbiAgICogc2F2ZSBjdXJyZW50IHJhbmdlXG4gICAqXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3RoZW5Db2xsYXBzZT1mYWxzZV1cbiAgICovXG4gIHNhdmVSYW5nZSh0aGVuQ29sbGFwc2UpIHtcbiAgICBpZiAodGhlbkNvbGxhcHNlKSB7XG4gICAgICB0aGlzLmdldExhc3RSYW5nZSgpLmNvbGxhcHNlKCkuc2VsZWN0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHJlc3RvcmVSYW5nZVxuICAgKlxuICAgKiByZXN0b3JlIGxhdGVseSByYW5nZVxuICAgKi9cbiAgcmVzdG9yZVJhbmdlKCkge1xuICAgIGlmICh0aGlzLmxhc3RSYW5nZSkge1xuICAgICAgdGhpcy5sYXN0UmFuZ2Uuc2VsZWN0KCk7XG4gICAgICB0aGlzLmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgc2F2ZVRhcmdldChub2RlKSB7XG4gICAgdGhpcy4kZWRpdGFibGUuZGF0YSgndGFyZ2V0Jywgbm9kZSk7XG4gIH1cblxuICBjbGVhclRhcmdldCgpIHtcbiAgICB0aGlzLiRlZGl0YWJsZS5yZW1vdmVEYXRhKCd0YXJnZXQnKTtcbiAgfVxuXG4gIHJlc3RvcmVUYXJnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuJGVkaXRhYmxlLmRhdGEoJ3RhcmdldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIGN1cnJlbnRTdHlsZVxuICAgKlxuICAgKiBjdXJyZW50IHN0eWxlXG4gICAqIEByZXR1cm4ge09iamVjdHxCb29sZWFufSB1bmZvY3VzXG4gICAqL1xuICBjdXJyZW50U3R5bGUoKSB7XG4gICAgbGV0IHJuZyA9IHJhbmdlLmNyZWF0ZSgpO1xuICAgIGlmIChybmcpIHtcbiAgICAgIHJuZyA9IHJuZy5ub3JtYWxpemUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJuZyA/IHRoaXMuc3R5bGUuY3VycmVudChybmcpIDogdGhpcy5zdHlsZS5mcm9tTm9kZSh0aGlzLiRlZGl0YWJsZSk7XG4gIH1cblxuICAvKipcbiAgICogc3R5bGUgZnJvbSBub2RlXG4gICAqXG4gICAqIEBwYXJhbSB7alF1ZXJ5fSAkbm9kZVxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBzdHlsZUZyb21Ob2RlKCRub2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuc3R5bGUuZnJvbU5vZGUoJG5vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIHVuZG9cbiAgICovXG4gIHVuZG8oKSB7XG4gICAgdGhpcy5jb250ZXh0LnRyaWdnZXJFdmVudCgnYmVmb3JlLmNvbW1hbmQnLCB0aGlzLiRlZGl0YWJsZS5odG1sKCkpO1xuICAgIHRoaXMuaGlzdG9yeS51bmRvKCk7XG4gICAgdGhpcy5jb250ZXh0LnRyaWdnZXJFdmVudCgnY2hhbmdlJywgdGhpcy4kZWRpdGFibGUuaHRtbCgpLCB0aGlzLiRlZGl0YWJsZSk7XG4gIH1cblxuICAvKlxuICAqIGNvbW1pdFxuICAqL1xuICBjb21taXQoKSB7XG4gICAgdGhpcy5jb250ZXh0LnRyaWdnZXJFdmVudCgnYmVmb3JlLmNvbW1hbmQnLCB0aGlzLiRlZGl0YWJsZS5odG1sKCkpO1xuICAgIHRoaXMuaGlzdG9yeS5jb21taXQoKTtcbiAgICB0aGlzLmNvbnRleHQudHJpZ2dlckV2ZW50KCdjaGFuZ2UnLCB0aGlzLiRlZGl0YWJsZS5odG1sKCksIHRoaXMuJGVkaXRhYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZWRvXG4gICAqL1xuICByZWRvKCkge1xuICAgIHRoaXMuY29udGV4dC50cmlnZ2VyRXZlbnQoJ2JlZm9yZS5jb21tYW5kJywgdGhpcy4kZWRpdGFibGUuaHRtbCgpKTtcbiAgICB0aGlzLmhpc3RvcnkucmVkbygpO1xuICAgIHRoaXMuY29udGV4dC50cmlnZ2VyRXZlbnQoJ2NoYW5nZScsIHRoaXMuJGVkaXRhYmxlLmh0bWwoKSwgdGhpcy4kZWRpdGFibGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIGJlZm9yZSBjb21tYW5kXG4gICAqL1xuICBiZWZvcmVDb21tYW5kKCkge1xuICAgIHRoaXMuY29udGV4dC50cmlnZ2VyRXZlbnQoJ2JlZm9yZS5jb21tYW5kJywgdGhpcy4kZWRpdGFibGUuaHRtbCgpKTtcbiAgICAvLyBrZWVwIGZvY3VzIG9uIGVkaXRhYmxlIGJlZm9yZSBjb21tYW5kIGV4ZWN1dGlvblxuICAgIHRoaXMuZm9jdXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBhZnRlciBjb21tYW5kXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNQcmV2ZW50VHJpZ2dlclxuICAgKi9cbiAgYWZ0ZXJDb21tYW5kKGlzUHJldmVudFRyaWdnZXIpIHtcbiAgICB0aGlzLm5vcm1hbGl6ZUNvbnRlbnQoKTtcbiAgICB0aGlzLmhpc3RvcnkucmVjb3JkVW5kbygpO1xuICAgIGlmICghaXNQcmV2ZW50VHJpZ2dlcikge1xuICAgICAgdGhpcy5jb250ZXh0LnRyaWdnZXJFdmVudCgnY2hhbmdlJywgdGhpcy4kZWRpdGFibGUuaHRtbCgpLCB0aGlzLiRlZGl0YWJsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGhhbmRsZSB0YWIga2V5XG4gICAqL1xuICB0YWIoKSB7XG4gICAgY29uc3Qgcm5nID0gdGhpcy5nZXRMYXN0UmFuZ2UoKTtcbiAgICBpZiAocm5nLmlzQ29sbGFwc2VkKCkgJiYgcm5nLmlzT25DZWxsKCkpIHtcbiAgICAgIHRoaXMudGFibGUudGFiKHJuZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudGFiU2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5pc0xpbWl0ZWQodGhpcy5vcHRpb25zLnRhYlNpemUpKSB7XG4gICAgICAgIHRoaXMuYmVmb3JlQ29tbWFuZCgpO1xuICAgICAgICB0aGlzLnR5cGluZy5pbnNlcnRUYWIocm5nLCB0aGlzLm9wdGlvbnMudGFiU2l6ZSk7XG4gICAgICAgIHRoaXMuYWZ0ZXJDb21tYW5kKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGhhbmRsZSBzaGlmdCt0YWIga2V5XG4gICAqL1xuICB1bnRhYigpIHtcbiAgICBjb25zdCBybmcgPSB0aGlzLmdldExhc3RSYW5nZSgpO1xuICAgIGlmIChybmcuaXNDb2xsYXBzZWQoKSAmJiBybmcuaXNPbkNlbGwoKSkge1xuICAgICAgdGhpcy50YWJsZS50YWIocm5nLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy50YWJTaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogcnVuIGdpdmVuIGZ1bmN0aW9uIGJldHdlZW4gYmVmb3JlQ29tbWFuZCBhbmQgYWZ0ZXJDb21tYW5kXG4gICAqL1xuICB3cmFwQ29tbWFuZChmbikge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuYmVmb3JlQ29tbWFuZCgpO1xuICAgICAgZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIHRoaXMuYWZ0ZXJDb21tYW5kKCk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBpbnNlcnQgaW1hZ2VcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHNyY1xuICAgKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gcGFyYW1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIGluc2VydEltYWdlKHNyYywgcGFyYW0pIHtcbiAgICByZXR1cm4gY3JlYXRlSW1hZ2Uoc3JjLCBwYXJhbSkudGhlbigoJGltYWdlKSA9PiB7XG4gICAgICB0aGlzLmJlZm9yZUNvbW1hbmQoKTtcblxuICAgICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwYXJhbSgkaW1hZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAkaW1hZ2UuYXR0cignZGF0YS1maWxlbmFtZScsIHBhcmFtKTtcbiAgICAgICAgfVxuICAgICAgICAkaW1hZ2UuY3NzKCd3aWR0aCcsIE1hdGgubWluKHRoaXMuJGVkaXRhYmxlLndpZHRoKCksICRpbWFnZS53aWR0aCgpKSk7XG4gICAgICB9XG5cbiAgICAgICRpbWFnZS5zaG93KCk7XG4gICAgICByYW5nZS5jcmVhdGUodGhpcy5lZGl0YWJsZSkuaW5zZXJ0Tm9kZSgkaW1hZ2VbMF0pO1xuICAgICAgcmFuZ2UuY3JlYXRlRnJvbU5vZGVBZnRlcigkaW1hZ2VbMF0pLnNlbGVjdCgpO1xuICAgICAgdGhpcy5zZXRMYXN0UmFuZ2UoKTtcbiAgICAgIHRoaXMuYWZ0ZXJDb21tYW5kKCk7XG4gICAgfSkuZmFpbCgoZSkgPT4ge1xuICAgICAgdGhpcy5jb250ZXh0LnRyaWdnZXJFdmVudCgnaW1hZ2UudXBsb2FkLmVycm9yJywgZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogaW5zZXJ0SW1hZ2VzXG4gICAqIEBwYXJhbSB7RmlsZVtdfSBmaWxlc1xuICAgKi9cbiAgaW5zZXJ0SW1hZ2VzQXNEYXRhVVJMKGZpbGVzKSB7XG4gICAgJC5lYWNoKGZpbGVzLCAoaWR4LCBmaWxlKSA9PiB7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IGZpbGUubmFtZTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubWF4aW11bUltYWdlRmlsZVNpemUgJiYgdGhpcy5vcHRpb25zLm1heGltdW1JbWFnZUZpbGVTaXplIDwgZmlsZS5zaXplKSB7XG4gICAgICAgIHRoaXMuY29udGV4dC50cmlnZ2VyRXZlbnQoJ2ltYWdlLnVwbG9hZC5lcnJvcicsIHRoaXMubGFuZy5pbWFnZS5tYXhpbXVtRmlsZVNpemVFcnJvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWFkRmlsZUFzRGF0YVVSTChmaWxlKS50aGVuKChkYXRhVVJMKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0SW1hZ2UoZGF0YVVSTCwgZmlsZW5hbWUpO1xuICAgICAgICB9KS5mYWlsKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbnRleHQudHJpZ2dlckV2ZW50KCdpbWFnZS51cGxvYWQuZXJyb3InKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogaW5zZXJ0SW1hZ2VzT3JDYWxsYmFja1xuICAgKiBAcGFyYW0ge0ZpbGVbXX0gZmlsZXNcbiAgICovXG4gIGluc2VydEltYWdlc09yQ2FsbGJhY2soZmlsZXMpIHtcbiAgICBjb25zdCBjYWxsYmFja3MgPSB0aGlzLm9wdGlvbnMuY2FsbGJhY2tzO1xuICAgIC8vIElmIG9uSW1hZ2VVcGxvYWQgc2V0LFxuICAgIGlmIChjYWxsYmFja3Mub25JbWFnZVVwbG9hZCkge1xuICAgICAgdGhpcy5jb250ZXh0LnRyaWdnZXJFdmVudCgnaW1hZ2UudXBsb2FkJywgZmlsZXMpO1xuICAgICAgLy8gZWxzZSBpbnNlcnQgSW1hZ2UgYXMgZGF0YVVSTFxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluc2VydEltYWdlc0FzRGF0YVVSTChmaWxlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiBzZWxlY3RlZCBwbGFpbiB0ZXh0XG4gICAqIEByZXR1cm4ge1N0cmluZ30gdGV4dFxuICAgKi9cbiAgZ2V0U2VsZWN0ZWRUZXh0KCkge1xuICAgIGxldCBybmcgPSB0aGlzLmdldExhc3RSYW5nZSgpO1xuXG4gICAgLy8gaWYgcmFuZ2Ugb24gYW5jaG9yLCBleHBhbmQgcmFuZ2Ugd2l0aCBhbmNob3JcbiAgICBpZiAocm5nLmlzT25BbmNob3IoKSkge1xuICAgICAgcm5nID0gcmFuZ2UuY3JlYXRlRnJvbU5vZGUoZG9tLmFuY2VzdG9yKHJuZy5zYywgZG9tLmlzQW5jaG9yKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJuZy50b1N0cmluZygpO1xuICB9XG5cbiAgb25Gb3JtYXRCbG9jayh0YWdOYW1lLCAkdGFyZ2V0KSB7XG4gICAgLy8gW3dvcmthcm91bmRdIGZvciBNU0lFLCBJRSBuZWVkIGA8YFxuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdGb3JtYXRCbG9jaycsIGZhbHNlLCBlbnYuaXNNU0lFID8gJzwnICsgdGFnTmFtZSArICc+JyA6IHRhZ05hbWUpO1xuXG4gICAgLy8gc3VwcG9ydCBjdXN0b20gY2xhc3NcbiAgICBpZiAoJHRhcmdldCAmJiAkdGFyZ2V0Lmxlbmd0aCkge1xuICAgICAgLy8gZmluZCB0aGUgZXhhY3QgZWxlbWVudCBoYXMgZ2l2ZW4gdGFnTmFtZVxuICAgICAgaWYgKCR0YXJnZXRbMF0udGFnTmFtZS50b1VwcGVyQ2FzZSgpICE9PSB0YWdOYW1lLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgJHRhcmdldCA9ICR0YXJnZXQuZmluZCh0YWdOYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCR0YXJnZXQgJiYgJHRhcmdldC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gJHRhcmdldFswXS5jbGFzc05hbWUgfHwgJyc7XG4gICAgICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UmFuZ2UgPSB0aGlzLmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgICBjb25zdCAkcGFyZW50ID0gJChbY3VycmVudFJhbmdlLnNjLCBjdXJyZW50UmFuZ2UuZWNdKS5jbG9zZXN0KHRhZ05hbWUpO1xuICAgICAgICAgICRwYXJlbnQuYWRkQ2xhc3MoY2xhc3NOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvcm1hdFBhcmEoKSB7XG4gICAgdGhpcy5mb3JtYXRCbG9jaygnUCcpO1xuICB9XG5cbiAgZm9udFN0eWxpbmcodGFyZ2V0LCB2YWx1ZSkge1xuICAgIGNvbnN0IHJuZyA9IHRoaXMuZ2V0TGFzdFJhbmdlKCk7XG5cbiAgICBpZiAocm5nKSB7XG4gICAgICBjb25zdCBzcGFucyA9IHRoaXMuc3R5bGUuc3R5bGVOb2RlcyhybmcpO1xuICAgICAgJChzcGFucykuY3NzKHRhcmdldCwgdmFsdWUpO1xuXG4gICAgICAvLyBbd29ya2Fyb3VuZF0gYWRkZWQgc3R5bGVkIGJvZ3VzIHNwYW4gZm9yIHN0eWxlXG4gICAgICAvLyAgLSBhbHNvIGJvZ3VzIGNoYXJhY3RlciBuZWVkZWQgZm9yIGN1cnNvciBwb3NpdGlvblxuICAgICAgaWYgKHJuZy5pc0NvbGxhcHNlZCgpKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0U3BhbiA9IGxpc3RzLmhlYWQoc3BhbnMpO1xuICAgICAgICBpZiAoZmlyc3RTcGFuICYmICFkb20ubm9kZUxlbmd0aChmaXJzdFNwYW4pKSB7XG4gICAgICAgICAgZmlyc3RTcGFuLmlubmVySFRNTCA9IGRvbS5aRVJPX1dJRFRIX05CU1BfQ0hBUjtcbiAgICAgICAgICByYW5nZS5jcmVhdGVGcm9tTm9kZUFmdGVyKGZpcnN0U3Bhbi5maXJzdENoaWxkKS5zZWxlY3QoKTtcbiAgICAgICAgICB0aGlzLnNldExhc3RSYW5nZSgpO1xuICAgICAgICAgIHRoaXMuJGVkaXRhYmxlLmRhdGEoS0VZX0JPR1VTLCBmaXJzdFNwYW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHVubGlua1xuICAgKlxuICAgKiBAdHlwZSBjb21tYW5kXG4gICAqL1xuICB1bmxpbmsoKSB7XG4gICAgbGV0IHJuZyA9IHRoaXMuZ2V0TGFzdFJhbmdlKCk7XG4gICAgaWYgKHJuZy5pc09uQW5jaG9yKCkpIHtcbiAgICAgIGNvbnN0IGFuY2hvciA9IGRvbS5hbmNlc3Rvcihybmcuc2MsIGRvbS5pc0FuY2hvcik7XG4gICAgICBybmcgPSByYW5nZS5jcmVhdGVGcm9tTm9kZShhbmNob3IpO1xuICAgICAgcm5nLnNlbGVjdCgpO1xuICAgICAgdGhpcy5zZXRMYXN0UmFuZ2UoKTtcblxuICAgICAgdGhpcy5iZWZvcmVDb21tYW5kKCk7XG4gICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgndW5saW5rJyk7XG4gICAgICB0aGlzLmFmdGVyQ29tbWFuZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIGxpbmsgaW5mb1xuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqIEByZXR1cm4ge1dyYXBwZWRSYW5nZX0gcmV0dXJuLnJhbmdlXG4gICAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJuLnRleHRcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gW3JldHVybi5pc05ld1dpbmRvdz10cnVlXVxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IFtyZXR1cm4udXJsPVwiXCJdXG4gICAqL1xuICBnZXRMaW5rSW5mbygpIHtcbiAgICBjb25zdCBybmcgPSB0aGlzLmdldExhc3RSYW5nZSgpLmV4cGFuZChkb20uaXNBbmNob3IpO1xuICAgIC8vIEdldCB0aGUgZmlyc3QgYW5jaG9yIG9uIHJhbmdlKGZvciBlZGl0KS5cbiAgICBjb25zdCAkYW5jaG9yID0gJChsaXN0cy5oZWFkKHJuZy5ub2Rlcyhkb20uaXNBbmNob3IpKSk7XG4gICAgY29uc3QgbGlua0luZm8gPSB7XG4gICAgICByYW5nZTogcm5nLFxuICAgICAgdGV4dDogcm5nLnRvU3RyaW5nKCksXG4gICAgICB1cmw6ICRhbmNob3IubGVuZ3RoID8gJGFuY2hvci5hdHRyKCdocmVmJykgOiAnJyxcbiAgICB9O1xuXG4gICAgLy8gV2hlbiBhbmNob3IgZXhpc3RzLFxuICAgIGlmICgkYW5jaG9yLmxlbmd0aCkge1xuICAgICAgLy8gU2V0IGlzTmV3V2luZG93IGJ5IGNoZWNraW5nIGl0cyB0YXJnZXQuXG4gICAgICBsaW5rSW5mby5pc05ld1dpbmRvdyA9ICRhbmNob3IuYXR0cigndGFyZ2V0JykgPT09ICdfYmxhbmsnO1xuICAgIH1cblxuICAgIHJldHVybiBsaW5rSW5mbztcbiAgfVxuXG4gIGFkZFJvdyhwb3NpdGlvbikge1xuICAgIGNvbnN0IHJuZyA9IHRoaXMuZ2V0TGFzdFJhbmdlKHRoaXMuJGVkaXRhYmxlKTtcbiAgICBpZiAocm5nLmlzQ29sbGFwc2VkKCkgJiYgcm5nLmlzT25DZWxsKCkpIHtcbiAgICAgIHRoaXMuYmVmb3JlQ29tbWFuZCgpO1xuICAgICAgdGhpcy50YWJsZS5hZGRSb3cocm5nLCBwb3NpdGlvbik7XG4gICAgICB0aGlzLmFmdGVyQ29tbWFuZCgpO1xuICAgIH1cbiAgfVxuXG4gIGFkZENvbChwb3NpdGlvbikge1xuICAgIGNvbnN0IHJuZyA9IHRoaXMuZ2V0TGFzdFJhbmdlKHRoaXMuJGVkaXRhYmxlKTtcbiAgICBpZiAocm5nLmlzQ29sbGFwc2VkKCkgJiYgcm5nLmlzT25DZWxsKCkpIHtcbiAgICAgIHRoaXMuYmVmb3JlQ29tbWFuZCgpO1xuICAgICAgdGhpcy50YWJsZS5hZGRDb2wocm5nLCBwb3NpdGlvbik7XG4gICAgICB0aGlzLmFmdGVyQ29tbWFuZCgpO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZVJvdygpIHtcbiAgICBjb25zdCBybmcgPSB0aGlzLmdldExhc3RSYW5nZSh0aGlzLiRlZGl0YWJsZSk7XG4gICAgaWYgKHJuZy5pc0NvbGxhcHNlZCgpICYmIHJuZy5pc09uQ2VsbCgpKSB7XG4gICAgICB0aGlzLmJlZm9yZUNvbW1hbmQoKTtcbiAgICAgIHRoaXMudGFibGUuZGVsZXRlUm93KHJuZyk7XG4gICAgICB0aGlzLmFmdGVyQ29tbWFuZCgpO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZUNvbCgpIHtcbiAgICBjb25zdCBybmcgPSB0aGlzLmdldExhc3RSYW5nZSh0aGlzLiRlZGl0YWJsZSk7XG4gICAgaWYgKHJuZy5pc0NvbGxhcHNlZCgpICYmIHJuZy5pc09uQ2VsbCgpKSB7XG4gICAgICB0aGlzLmJlZm9yZUNvbW1hbmQoKTtcbiAgICAgIHRoaXMudGFibGUuZGVsZXRlQ29sKHJuZyk7XG4gICAgICB0aGlzLmFmdGVyQ29tbWFuZCgpO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZVRhYmxlKCkge1xuICAgIGNvbnN0IHJuZyA9IHRoaXMuZ2V0TGFzdFJhbmdlKHRoaXMuJGVkaXRhYmxlKTtcbiAgICBpZiAocm5nLmlzQ29sbGFwc2VkKCkgJiYgcm5nLmlzT25DZWxsKCkpIHtcbiAgICAgIHRoaXMuYmVmb3JlQ29tbWFuZCgpO1xuICAgICAgdGhpcy50YWJsZS5kZWxldGVUYWJsZShybmcpO1xuICAgICAgdGhpcy5hZnRlckNvbW1hbmQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zXG4gICAqIEBwYXJhbSB7alF1ZXJ5fSAkdGFyZ2V0IC0gdGFyZ2V0IGVsZW1lbnRcbiAgICogQHBhcmFtIHtCb29sZWFufSBbYktlZXBSYXRpb10gLSBrZWVwIHJhdGlvXG4gICAqL1xuICByZXNpemVUbyhwb3MsICR0YXJnZXQsIGJLZWVwUmF0aW8pIHtcbiAgICBsZXQgaW1hZ2VTaXplO1xuICAgIGlmIChiS2VlcFJhdGlvKSB7XG4gICAgICBjb25zdCBuZXdSYXRpbyA9IHBvcy55IC8gcG9zLng7XG4gICAgICBjb25zdCByYXRpbyA9ICR0YXJnZXQuZGF0YSgncmF0aW8nKTtcbiAgICAgIGltYWdlU2l6ZSA9IHtcbiAgICAgICAgd2lkdGg6IHJhdGlvID4gbmV3UmF0aW8gPyBwb3MueCA6IHBvcy55IC8gcmF0aW8sXG4gICAgICAgIGhlaWdodDogcmF0aW8gPiBuZXdSYXRpbyA/IHBvcy54ICogcmF0aW8gOiBwb3MueSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGltYWdlU2l6ZSA9IHtcbiAgICAgICAgd2lkdGg6IHBvcy54LFxuICAgICAgICBoZWlnaHQ6IHBvcy55LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAkdGFyZ2V0LmNzcyhpbWFnZVNpemUpO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybnMgd2hldGhlciBlZGl0YWJsZSBhcmVhIGhhcyBmb2N1cyBvciBub3QuXG4gICAqL1xuICBoYXNGb2N1cygpIHtcbiAgICByZXR1cm4gdGhpcy4kZWRpdGFibGUuaXMoJzpmb2N1cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIHNldCBmb2N1c1xuICAgKi9cbiAgZm9jdXMoKSB7XG4gICAgLy8gW3dvcmthcm91bmRdIFNjcmVlbiB3aWxsIG1vdmUgd2hlbiBwYWdlIGlzIHNjb2xsZWQgaW4gSUUuXG4gICAgLy8gIC0gZG8gZm9jdXMgd2hlbiBub3QgZm9jdXNlZFxuICAgIGlmICghdGhpcy5oYXNGb2N1cygpKSB7XG4gICAgICB0aGlzLiRlZGl0YWJsZS5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIHdoZXRoZXIgY29udGVudHMgaXMgZW1wdHkgb3Igbm90LlxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gZG9tLmlzRW1wdHkodGhpcy4kZWRpdGFibGVbMF0pIHx8IGRvbS5lbXB0eVBhcmEgPT09IHRoaXMuJGVkaXRhYmxlLmh0bWwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBjb250ZW50cyBhbmQgcmVzdG9yZXMgdGhlIGVkaXRhYmxlIGluc3RhbmNlIHRvIGFuIF9lbXB0eVBhcmFfLlxuICAgKi9cbiAgZW1wdHkoKSB7XG4gICAgdGhpcy5jb250ZXh0Lmludm9rZSgnY29kZScsIGRvbS5lbXB0eVBhcmEpO1xuICB9XG5cbiAgLyoqXG4gICAqIG5vcm1hbGl6ZSBjb250ZW50XG4gICAqL1xuICBub3JtYWxpemVDb250ZW50KCkge1xuICAgIHRoaXMuJGVkaXRhYmxlWzBdLm5vcm1hbGl6ZSgpO1xuICB9XG59XG4iXX0=