modal-step.component.js 128 KB
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
/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
import * as tslib_1 from "tslib";
import { Component, EventEmitter, Output, ViewChild } from '@angular/core';
import { ModalDirective } from 'ngx-bootstrap';
import { AppConfigService } from '../app-config/app-config.service';
import { Request } from '../_services/request.service';
import { Common } from '../_services/common.service';
import { FormBuilder, Validators } from '@angular/forms';
import { CustomValidators } from 'ng2-validation';
import { DxDataGridComponent } from 'devextreme-angular';
import * as _ from 'lodash';
import { DateService } from '../_services/date.service';
import { UploadAttachmentComponent } from '../upload-attachment/upload-attachment.component';
import { B2bService } from '../_services/b2b.service';
class Options {
}
if (false) {
    /**
     * title เธ—เธตเนˆเธ•เน‰เธญเธ‡เธเธฒเธฃเนเธชเธ”เธ‡
     * @type {?}
     */
    Options.prototype.title;
    /**
     * data
     * @type {?}
     */
    Options.prototype.data;
}
export class ModalStepComponent extends Options {
    /**
     * @param {?} appConfigService
     * @param {?} request
     * @param {?} formBuilder
     * @param {?} common
     * @param {?} date
     * @param {?} b2bService
     */
    constructor(appConfigService, request, formBuilder, common, date, b2bService) {
        super();
        this.appConfigService = appConfigService;
        this.request = request;
        this.formBuilder = formBuilder;
        this.common = common;
        this.date = date;
        this.b2bService = b2bService;
        this.onUpdateModal = new EventEmitter();
        this.submitted = false;
        this.submittedSend = false;
        this.submittedRecieve = false;
        this.title = '';
        this.selectList = [];
        this.sendList = [];
        this.recieveList = [];
        this.modalConfig = {
            ignoreBackdropClick: true
        };
        this.selectedStep = null;
        this.isMore = false;
        this.stepData = {};
        this.sendData = {};
        this.recieveData = {};
        this.lastStep = '';
        this.isSend = false;
        this.isRecieve = false;
        this.isEditSend = false;
        this.isEditRecieve = false;
        this.tmpData = {};
        this.filteredDepartments = [];
        this.departmentList = [];
        this.departmentUrl = "/db/ct_ext_department";
        this.causeUrl = "/db/ct_dropdown";
        this.causeFilter = "system_id,eq,23)$and(dropdown_type,like,เน€เธฃเธทเนˆเธญเธ‡เธชเนˆเธ‡เธ„เธทเธ™";
        this.tempId = -1;
        this.filter_ref_ext_department_id = false;
        this.filter_ref_ext_department_id_show = true;
        this.config = appConfigService.getConfig();
        this.attachmentUrl = _.get(this.config, 'apiServers.alfresco.url') || "https://203.154.32.126:2585/api/mfec/Alfresco";
        this.system_id = _.get(this.config, 'system_id');
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.th = this.common.fnLocalPCalendar('th');
        this.recieveForm = this.formBuilder.group({
            book_no: ['', [Validators.required]],
            recv_date: [''],
        });
        this.sendForm = this.formBuilder.group({
            send_to: [''],
            book_no: [''],
            send_date: [''],
            is_important: [''],
        });
        this.registerForm = this.formBuilder.group({
            name: [''],
            step_id: ['', Validators.required],
            step_date: [''],
            remark: [''],
            lastStep: [''],
            moreField: this.formBuilder.array([]),
            soc_recv_no: [''],
            soc_recv_date: [''],
            gtc_recv_no: [''],
            gtc_recv_date: [''],
            book_no: [''],
            book_date: [''],
            'for': [''],
            dept_name: [''],
            ministry: ['']
        });
    }
    /**
     * @param {?=} options
     * @return {?}
     */
    open(options) {
        return tslib_1.__awaiter(this, void 0, void 0, function* () {
            console.log(options);
            this.stepData = {};
            if (options) {
                this.title = options.title || '';
                this.lastStep = options.data.lastStep;
                this.stepData = JSON.parse(JSON.stringify(options.data));
                this.stepData.step_date = this.date.getNow();
                delete this.stepData['lastStep'];
                this.selectList = yield this.request.get('/db/ct_step?_where=(category_id,eq,' + options.data.category_id + ')&_sort=seq_no');
            }
            this.uploadAttachment.clearValue();
            this.modal.show();
        });
    }
    /**
     * @return {?}
     */
    f() { return this.registerForm.controls; }
    /**
     * @return {?}
     */
    fs() { return this.sendForm.controls; }
    /**
     * @return {?}
     */
    fr() { return this.recieveForm.controls; }
    /**
     * @return {?}
     */
    closeModal() {
        this.submitted = false;
        this.selectList = [];
        this.sendList = [];
        this.selectedStep = null;
        this.isMore = false;
        this.isSend = false;
        this.moreField = [];
        this.stepData = {};
        this.lastStep = '';
        this.modal.hide();
    }
    /**
     * @return {?}
     */
    closeSendModal() {
        this.submittedSend = false;
        this.sendData = {};
        this.isEditSend = false;
        this.tmpData = {};
        this.sendModal.hide();
    }
    /**
     * @return {?}
     */
    closeRecieveModal() {
        this.submittedRecieve = false;
        this.recieveData = {};
        this.isEditRecieve = false;
        this.tmpData = {};
        this.recieveModal.hide();
    }
    /**
     * @param {?} modal
     * @return {?}
     */
    onYesClick(modal) {
        modal.hide();
    }
    /**
     * @param {?} modal
     * @return {?}
     */
    onNoClick(modal) {
        modal.hide();
    }
    /**
     * @param {?} $event
     * @return {?}
     */
    onHidden($event) {
        console.log('LOG MESSAGE: ModalConfirm -> onHidden -> $event', $event);
    }
    /**
     * @param {?} value
     * @return {?}
     */
    valueSeleteMinistry(value) {
        this.filter_ref_ext_department_id_show = false;
        console.log('value', value);
        // this.stepData.ministry_id = value && value.id ? value.id : null
        if (value && value.id) {
            this.stepData.dept_name = null;
            this.filter_ref_ext_department_id = `&_where=(ref_ext_department_id,eq,${value.id})$and(type,in,2,3,4,5)`;
        }
        else {
            this.filter_ref_ext_department_id = false;
        }
        setTimeout(() => {
            this.filter_ref_ext_department_id_show = true;
        }, 50);
    }
    /**
     * @param {?} value
     * @return {?}
     */
    valueSeleteDeptName(value) {
        console.log('value', value);
        this.stepData.code_dept = value && value.id ? value.id : null;
    }
    /**
     * @return {?}
     */
    checkExtraField() {
        return tslib_1.__awaiter(this, void 0, void 0, function* () {
            this.stepData.step_id = this.selectedStep.id;
            this.stepData.step_name = this.selectedStep.name;
            console.log(this.isMore);
            this.moreField = [];
            if (this.selectedStep.flag && this.selectedStep.flag !== '') {
                for (let i = 0; i < this.selectedStep.flag.length; i++) {
                    /** @type {?} */
                    const flag = this.selectedStep.flag.charAt(i);
                    /** @type {?} */
                    const requireFlag = this.selectedStep.require_flag ? this.selectedStep.require_flag.charAt(i) : 0;
                    /** @type {?} */
                    const ct_step_flag = yield this.request.get('/db/ct_step_flag?_where=(flag,eq,' + flag + ')');
                    /** @type {?} */
                    const newField = ct_step_flag[0];
                    yield this.addField(newField, +requireFlag);
                    this.moreField.push(newField);
                    console.log(this.f);
                }
                this.isMore = true;
                this.isSend = false;
                this.isRecieve = false;
            }
            else {
                this.isMore = false;
                if (this.selectedStep.type_id === 8 || this.selectedStep.type_id === 13) {
                    this.departmentList = yield this.request.get('/db/ct_ext_department?_sort=name');
                    this.departmentList = this.departmentList.map(a => a.name);
                    this.isSend = true;
                    this.isRecieve = false;
                    // } else if (this.selectedStep.type_id === 9 || this.selectedStep.type_id === 14) {
                    //     const data = await this.request.post('/sql/getLastSend', this.stepData);
                    //     if (data.resultData && data.resultData.length > 0) {
                    //         const ct_step_data_id = data.resultData[0].id;
                    //         const ct_sendList = await this.request.get('/db/ct_send?_where=(ct_step_data_id,eq,' + ct_step_data_id + ')');
                    //         for (const ct_send of ct_sendList) {
                    //             const recvData: any = {
                    //                 ct_send_id: ct_send.id,
                    //                 send_book_no: ct_send.book_no,
                    //                 send_date: ct_send.send_date,
                    //                 recv_from: ct_send.send_to,
                    //                 name: ct_send.name
                    //             };
                    //             this.recieveList.push(recvData);
                    //         }
                    //     }
                    //     this.isRecieve = true;
                    //     this.isSend = false;
                }
                else {
                    this.isSend = false;
                    this.isRecieve = false;
                }
            }
        });
    }
    /**
     * @param {?} data
     * @return {?}
     */
    getFieldId(data) {
        /** @type {?} */
        let id = '';
        if (data.type === 'text') {
            id += 'txt';
        }
        else if (data.type === 'datetime') {
            id += 'txt';
        }
        else {
            id += 'txt';
        }
        /** @type {?} */
        const field = data.field_name.charAt(0).toLocaleUpperCase() + data.field_name.substring(1);
        id += field;
        return id;
    }
    /**
     * @param {?} data
     * @param {?} required
     * @return {?}
     */
    addField(data, required) {
        /** @type {?} */
        let control = /** @type {?} */ (this.registerForm.controls['moreField']);
        /** @type {?} */
        let newgroup;
        this.stepData[data.field_name] = null;
        if (data.type === 'text') {
            if (required) {
                /** @type {?} */
                const group = {};
                group[data.field_name] = ['', Validators.required];
                newgroup = this.formBuilder.group(group);
            }
            else {
                /** @type {?} */
                const group = {};
                group[data.field_name] = [''];
                newgroup = this.formBuilder.group(group);
            }
        }
        else if (data.type === 'datetime') {
            if (required) {
                /** @type {?} */
                const group = {};
                group[data.field_name] = ['', Validators.required, CustomValidators.date];
                newgroup = this.formBuilder.group(group);
            }
            else {
                /** @type {?} */
                const group = {};
                group[data.field_name] = [''];
                newgroup = this.formBuilder.group(group);
            }
            this.stepData[data.field_name] = this.date.getNow();
        }
        else if (data.type === 'number') {
            if (required) {
                /** @type {?} */
                const group = {};
                group[data.field_name] = [Validators.required];
                newgroup = this.formBuilder.group(group);
            }
            else {
                /** @type {?} */
                const group = {};
                group[data.field_name] = [''];
                newgroup = this.formBuilder.group(group);
            }
        }
        else if (data.type === 'special') {
            if (data.field_name === 'amount') {
                if (required) {
                    /** @type {?} */
                    const group = {};
                    group[data.field_name] = ['', Validators.required];
                    group['amount_type'] = ['', Validators.required];
                    newgroup = this.formBuilder.group(group);
                }
                else {
                    /** @type {?} */
                    const group = {};
                    group[data.field_name] = [''];
                    group['amount_type'] = [''];
                    newgroup = this.formBuilder.group(group);
                }
            }
            else if (data.field_name === 'follow') {
                if (required) {
                    /** @type {?} */
                    const group = {};
                    group[data.field_name] = ['', Validators.required];
                    group['follow_remark'] = ['', Validators.required];
                    newgroup = this.formBuilder.group(group);
                }
                else {
                    /** @type {?} */
                    const group = {};
                    group[data.field_name] = [''];
                    group['follow_remark'] = [''];
                    newgroup = this.formBuilder.group(group);
                }
            }
            else {
                if (required) {
                    /** @type {?} */
                    const group = {};
                    group[data.field_name] = ['', Validators.required];
                    newgroup = this.formBuilder.group(group);
                }
                else {
                    /** @type {?} */
                    const group = {};
                    group[data.field_name] = [''];
                    newgroup = this.formBuilder.group(group);
                }
            }
        }
        control.push(newgroup);
    }
    /**
     * @param {?} i
     * @param {?} field
     * @param {?=} validateType
     * @return {?}
     */
    getValidateMoreField(i, field, validateType) {
        /** @type {?} */
        let formMoreField = this.f()['moreField'];
        if (validateType) {
            formMoreField = formMoreField.controls[i];
            formMoreField = formMoreField.controls[field];
            if (formMoreField.errors) {
                return formMoreField.errors[validateType];
            }
            else {
                return formMoreField.errors;
            }
        }
        else {
            return formMoreField.errors;
        }
    }
    /**
     * @param {?} data
     * @return {?}
     */
    getRowIndex(data) {
        if (!data.data) {
            return '';
        }
        /** @type {?} */
        const no = data.row.dataIndex + 1;
        return no;
    }
    /**
     * @param {?} e
     * @return {?}
     */
    onCellPrepared(e) {
        if (e.rowType === 'data') {
            for (const i in e.component.columns) {
                if (e.column.dataField === e.component.columns[i]) {
                    e.cellElement.accessKey = e.component.columns[i];
                }
            }
        }
    }
    /**
     * @return {?}
     */
    addSend() {
        this.sendData.send_date = this.date.getNow();
        this.sendModal.show();
    }
    /**
     * @param {?} data
     * @return {?}
     */
    editSend(data) {
        this.tmpData = data;
        this.sendData = JSON.parse(JSON.stringify(data));
        // this.sendData.send_date = new Date(this.sendData.send_date);
        this.isEditSend = true;
        this.sendModal.show();
    }
    /**
     * @param {?} data
     * @return {?}
     */
    editRecieve(data) {
        this.tmpData = data;
        this.recieveData = JSON.parse(JSON.stringify(data));
        this.recieveData.recv_date = this.recieveData.recv_date ? new Date(this.recieveData.recv_date) : this.recieveData.recv_date;
        this.isEditRecieve = true;
        this.recieveModal.show();
    }
    /**
     * @param {?} event
     * @return {?}
     */
    filterDepartments(event) {
        this.filteredDepartments = [];
        for (let i = 0; i < this.departmentList.length; i++) {
            /** @type {?} */
            const department = this.departmentList[i];
            if (department.toLowerCase().indexOf(event.query.toLowerCase()) == 0) {
                this.filteredDepartments.push(department);
            }
        }
    }
    /**
     * @return {?}
     */
    onSubmit() {
        return tslib_1.__awaiter(this, void 0, void 0, function* () {
            this.submitted = true;
            // เธ–เน‰เธฒ form เน„เธกเนˆเธ„เธฃเธšเธซเธฃเธทเธญเธœเธดเธ”เธ•เธฒเธกเน€เธ‡เธทเนˆเธญเธ™เน„เธ‚เธ—เธตเนˆเธ•เธฑเน‰เธ‡เน„เธงเน‰เธˆเธฐเธˆเธšเธ—เธตเนˆเธ•เธฃเธ‡เธ™เธตเน‰
            console.log('this.registerForm.invalid: ', this.registerForm.invalid);
            if (this.registerForm.invalid) {
                return;
            }
            /** @type {?} */
            let postData = [];
            /** @type {?} */
            let data = _.cloneDeep(this.stepData);
            data.action = "add";
            /** @type {?} */
            let userData = this.b2bService.getVerifyToken();
            data.username = userData.username;
            if (data.remind_date)
                data.remind_date = this.date.getNow().add(data.remind_date, 'd').toDate();
            delete data["ct_main_id"];
            delete data["update_date"];
            /** @type {?} */
            let main = {
                "ct_step_data": [data]
            };
            postData.push(main);
            if (this.sendList && this.sendList.length > 0) {
                /** @type {?} */
                let ct_send = {
                    "ct_send": []
                };
                /** @type {?} */
                let ct_recieve = {
                    "ct_recieve": []
                };
                for (let data of this.sendList) {
                    data.name = data.name;
                    data.action = "add";
                    delete data.id;
                    ct_send.ct_send.push(data);
                }
                postData.push(ct_send);
            }
            if (this.recieveList && this.recieveList.length > 0) {
                /** @type {?} */
                let ct_recieve = {
                    "ct_recieve": []
                };
                for (let data of this.recieveList) {
                    delete data['send_book_no'];
                    delete data['send_date'];
                    data.name = data.name;
                    data.action = "add";
                    ct_recieve.ct_recieve.push(data);
                }
                postData.push(ct_recieve);
            }
            console.log('postData', postData);
            /** @type {?} */
            let postResponse = yield this.request.post("/ct/main", postData);
            if (this.stepData.update_date) {
                /** @type {?} */
                let stepList = yield this.getStepList();
                console.log("stepList", stepList);
                if (stepList.length > 0) {
                    yield this.request.put("/db/" + this.stepData.ref_table + "/" + this.stepData.ref_id, { status: stepList[0].step_name, status_date: stepList[0].step_date });
                    this.common.fnCheckResponse(postResponse, this.myModal);
                }
            }
            else {
                yield this.request.put("/db/" + this.stepData.ref_table + "/" + this.stepData.ref_id, { status: this.stepData.step_name });
                this.common.fnCheckResponse(postResponse, this.myModal);
            }
            // }else{
            //     this.onCreateModal.emit(postData);
            // }
        });
    }
    /**
     * @return {?}
     */
    getStepList() {
        return tslib_1.__awaiter(this, void 0, void 0, function* () {
            console.log('getStepList');
            /** @type {?} */
            let filter = {
                filter: {
                    ref_table: "=" + this.stepData.ref_table,
                    ref_id: this.stepData.ref_id,
                    system_id: this.stepData.system_id
                },
                order_by: ["step_date desc"]
            };
            /** @type {?} */
            const data = yield this.request.post('/search/ct_step_data', filter);
            return data.resultData || [];
        });
    }
    /**
     * @return {?}
     */
    onClickBack() {
        this.onUpdateModal.emit();
        this.closeModal();
    }
    /**
     * @return {?}
     */
    onSubmitSend() {
        return tslib_1.__awaiter(this, void 0, void 0, function* () {
            this.submittedSend = true;
            // เธ–เน‰เธฒ form เน„เธกเนˆเธ„เธฃเธšเธซเธฃเธทเธญเธœเธดเธ”เธ•เธฒเธกเน€เธ‡เธทเนˆเธญเธ™เน„เธ‚เธ—เธตเนˆเธ•เธฑเน‰เธ‡เน„เธงเน‰เธˆเธฐเธˆเธšเธ—เธตเนˆเธ•เธฃเธ‡เธ™เธตเน‰
            if (this.sendForm.invalid) {
                return;
            }
            if (this.isEditSend) {
                /** @type {?} */
                const tmpList = [];
                for (const tmpSend of this.sendList) {
                    if (tmpSend.id === this.tmpData.id) {
                        tmpList.push(this.sendData);
                    }
                    else {
                        tmpList.push(tmpSend);
                    }
                }
                this.sendList = tmpList;
            }
            else {
                this.sendData.id = this.tempId;
                this.tempId--;
                this.sendList.push(this.sendData);
            }
            this.closeSendModal();
        });
    }
    /**
     * @return {?}
     */
    onSubmitRecieve() {
        return tslib_1.__awaiter(this, void 0, void 0, function* () {
            this.submittedSend = true;
            // เธ–เน‰เธฒ form เน„เธกเนˆเธ„เธฃเธšเธซเธฃเธทเธญเธœเธดเธ”เธ•เธฒเธกเน€เธ‡เธทเนˆเธญเธ™เน„เธ‚เธ—เธตเนˆเธ•เธฑเน‰เธ‡เน„เธงเน‰เธˆเธฐเธˆเธšเธ—เธตเนˆเธ•เธฃเธ‡เธ™เธตเน‰
            if (this.recieveForm.invalid) {
                return;
            }
            if (this.isEditRecieve) {
                /** @type {?} */
                const tmpList = [];
                for (const tmpSend of this.recieveList) {
                    if (tmpSend.recv_from === this.tmpData.recv_from) {
                        tmpList.push(this.recieveData);
                    }
                    else {
                        tmpList.push(tmpSend);
                    }
                }
                this.recieveList = tmpList;
            }
            else {
                this.recieveList.push(this.recieveData);
            }
            this.closeRecieveModal();
        });
    }
    /**
     * @param {?} data
     * @return {?}
     */
    isImportant(data) {
        return data.is_important ? "เธชเธณเธ„เธฑเธ" : "";
    }
    /**
     * @param {?} data
     * @return {?}
     */
    onUploaded(data) {
        this.stepData.url = this.attachmentUrl + '/' + data.uuid;
        this.stepData.uuid = data.uuid;
    }
    /**
     * @param {?} field
     * @return {?}
     */
    checkDisable(field) {
        if (this.stepData[field.field_name] !== 'เน„เธกเนˆเธ—เธฒเธ‡เธเธฒเธฃ') {
            return true;
        }
        else {
            return false;
        }
    }
    /**
     * @param {?} data
     * @return {?}
     */
    getImageLink(data) {
        return tslib_1.__awaiter(this, void 0, void 0, function* () {
            /** @type {?} */
            let url = yield this.request.getAttachmentLinkToken(data.url);
            return url;
        });
    }
}
ModalStepComponent.decorators = [
    { type: Component, args: [{
                selector: 'modal-step',
                template: "<div class=\"modal fade\" bsModal #modal=\"bs-modal\" [config]=\"{backdrop: 'static'}\"\n     tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"dialog-static-name1\">\n    <div class=\"modal-dialog modal-lg\">\n        <div class=\"modal-content\">\n            <div class=\"modal-header\">\n                <h4 id=\"dialog-static-name\" class=\"modal-title pull-left\"><label>{{title}}</label></h4>\n                <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"closeModal()\">\n                    <span aria-hidden=\"true\">&times;</span>\n                </button>\n            </div>\n            <div class=\"modal-body\">\n                <div class=\"row\">\n                    <div class=\"col-lg-12\">\n                        <form class=\"m-form m-form--state m-form--fit m-form--label-align-right\" [formGroup]=\"registerForm\" (ngSubmit)=\"onSubmit()\">\n                            <div class=\"m-portlet__body\">\n\n                                <!-- \u0E2A\u0E16\u0E32\u0E19\u0E30\u0E25\u0E48\u0E32\u0E2A\u0E38\u0E14 -->\n                                <div class=\"row\">\n                                    <!--<div class=\"col-sm-3\">-->\n                                        <!--<span>\u0E2A\u0E16\u0E32\u0E19\u0E30\u0E1B\u0E31\u0E08\u0E08\u0E38\u0E1A\u0E31\u0E19 :</span>-->\n                                    <!--</div>-->\n                                    <div class=\"col-sm-6\">\n                                        <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && f().lastStep.errors }\">\n                                            <label class=\"control-label\">\u0E2A\u0E16\u0E32\u0E19\u0E30\u0E1B\u0E31\u0E08\u0E08\u0E38\u0E1A\u0E31\u0E19</label>\n                                            <input type=\"text\" formControlName=\"lastStep\" class=\"form-control m-input\" id=\"txtLastStatus\" [(ngModel)]=\"lastStep\" disabled>\n                                        </div>\n                                    </div>\n                                    <div class=\"col-sm-6\">\n                                        <!--<select id=\"selNewStatus\" style=\"width: 100%\">-->\n                                        <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && f().step_id.errors }\">\n                                            <label class=\"control-label\">\u0E2A\u0E16\u0E32\u0E19\u0E30\u0E43\u0E2B\u0E21\u0E48<span class=\"color-red\">&nbsp;*</span></label>\n                                            <select id=\"selNewStatus\" class=\"form-control\" style=\"width: 100%\" [(ngModel)]=\"selectedStep\" formControlName=\"step_id\" (change)=\"checkExtraField()\">\n                                                <option value=\"null\">\u0E01\u0E23\u0E38\u0E13\u0E32\u0E40\u0E25\u0E37\u0E2D\u0E01\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23</option>\n                                                <option *ngFor=\"let step of selectList\" [ngValue]=\"step\">{{step.name}}</option>\n                                            </select>\n                                            <!-- <div *ngIf=\"submitted && f().step_id.errors\" class=\"invalid-feedback\">\n                                                <div *ngIf=\"f().step_id.errors.required\"><font color=\"red\"> * \u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01</font></div>\n                                            </div> -->\n                                        </div>\n                                    </div>\n                                </div>\n                                <br>\n                                <!--<div class=\"row\">-->\n                                    <!-- \u0E2A\u0E16\u0E32\u0E19\u0E30\u0E43\u0E2B\u0E21\u0E48 -->\n                                    <!--<div class=\"col-sm-3\">-->\n                                        <!--<span>\u0E2A\u0E16\u0E32\u0E19\u0E30\u0E43\u0E2B\u0E21\u0E48 :</span>-->\n                                    <!--</div>-->\n                                <!--</div>-->\n                                <!--<br>-->\n                                <div class=\"row\">\n                                    <!-- \u0E27\u0E31\u0E19\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 -->\n                                    <!--<div class=\"col-sm-3\">-->\n                                        <!--<span>\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 :</span>-->\n                                    <!--</div>-->\n                                    <div class=\"col-sm-6\">\n                                        <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && f().step_date.errors }\">\n                                            <label class=\"control-label\" *ngIf=\"stepData.system_id === 161\">\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48</label>\n                                            <label class=\"control-label\" *ngIf=\"stepData.system_id !== 161\">\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23</label>\n                                            <soc-date-box [id]=\"'txtDate'\" [(value)]=\"stepData.step_date\"></soc-date-box>\n                                            <div *ngIf=\"submitted && f().step_date.errors\" >\n                                                <div *ngIf=\"f().step_date.errors.required\" class=\"lable-error\">Date is required</div>\n                                                <div *ngIf=\"f().step_date.errors.date\" class=\"lable-error\">Date is invalid</div>\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                                <br>\n                                \n                                \n                                \n                                <!--<div class=\"row\" *ngIf=\"stepData.system_id === 23\">-->\n                                    <!-- \u0E27\u0E31\u0E19\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 -->\n                                    <!--<div class=\"col-sm-3\">-->\n                                        <!--<span>\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 :</span>-->\n                                    <!--</div>-->\n                                <!--    <div class=\"col-sm-6\">-->\n                                <!--      <label class=\"control-label\">\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D</label>-->\n                                <!--      <input type=\"text\" class=\"form-control m-input\" id=\"book_no\" [(ngModel)]=\"stepData.book_no\"-->\n                                <!--      formControlName=\"book_no\">-->\n                                <!--  </div>-->\n                                <!--  <div class=\"col-sm-6\">-->\n                                <!--      <label class=\"control-label\">\u0E25\u0E07\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48</label>-->\n                                <!--      <soc-date-box [id]=\"'book_date'\" [(value)]=\"stepData.book_date\" formControlName=\"book_date\"></soc-date-box>-->\n                                      <!-- <input type=\"text\" class=\"form-control m-input\" id=\"book_date\" [(ngModel)]=\"stepData.book_date\"-->\n                                <!--      formControlName=\"book_date\"> -->\n                                <!--  </div>-->\n\n                                <!--</div>-->\n                                <!--<br>-->\n                                <!--<div class=\"row\" *ngIf=\"stepData.system_id === 23\">-->\n                                    <!-- \u0E27\u0E31\u0E19\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 -->\n                                    <!--<div class=\"col-sm-3\">-->\n                                        <!--<span>\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 :</span>-->\n                                    <!--</div>-->\n                                <!--     <div class=\"col-sm-6\">-->\n                                <!--        <label class=\"control-label\">\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A \u0E2A\u0E25\u0E04.</label>-->\n                                <!--        <input type=\"text\" class=\"form-control m-input\" id=\"soc_recv_no\" formControlName=\"soc_recv_no\" [(ngModel)]=\"stepData.soc_recv_no\">-->\n                                <!--    </div>-->\n                                <!--    <div class=\"col-sm-6\">-->\n                                <!--        <label class=\"control-label\">\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A \u0E2A\u0E25\u0E04.</label>-->\n                                <!--        <soc-date-box [id]=\"'soc_recv_date'\" [(value)]=\"stepData.soc_recv_date\" formControlName=\"soc_recv_date\"></soc-date-box>-->\n                                <!--    </div>-->\n                                <!--</div>-->\n                                <!--<br>-->\n                                <!--<div class=\"row\" *ngIf=\"stepData.system_id === 23\">-->\n                                    <!-- \u0E27\u0E31\u0E19\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 -->\n                                    <!--<div class=\"col-sm-3\">-->\n                                        <!--<span>\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 :</span>-->\n                                    <!--</div>-->\n                                <!--     <div class=\"col-sm-6\">-->\n                                <!--      <label class=\"control-label\">\u0E2B\u0E19\u0E48\u0E27\u0E22\u0E07\u0E32\u0E19\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A-\u0E2A\u0E48\u0E07</label>-->\n                                <!--      <input type=\"text\" class=\"form-control m-input\" id=\"dept_name\" [(ngModel)]=\"stepData.dept_name\" formControlName=\"dept_name\">-->\n                                <!--  </div>-->\n                                <!--</div>-->\n                                <!--<br>-->\n                                \n                                \n                                \n                                <div class=\"row\" *ngIf=\"stepData.system_id === 23\">\n                                    <div class=\"col-sm-6\">\n                                        <label class=\"control-label\">\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A \u0E2A\u0E25\u0E04.</label>\n                                        <input type=\"text\" class=\"form-control m-input\" id=\"soc_recv_no\" formControlName=\"soc_recv_no\" [(ngModel)]=\"stepData.soc_recv_no\">\n                                    </div>\n                                    <div class=\"col-sm-6\">\n                                        <label class=\"control-label\">\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A \u0E2A\u0E25\u0E04.</label>\n                                        <soc-date-box [id]=\"'soc_recv_date'\" [(value)]=\"stepData.soc_recv_date\" formControlName=\"soc_recv_date\"></soc-date-box>\n                                    </div>\n                                </div>\n                                <br>\n                                <div class=\"row\" *ngIf=\"stepData.system_id === 23\">\n                                    <div class=\"col-sm-6\">\n                                        <label class=\"control-label\">\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A \u0E01\u0E2D\u0E04.</label>\n                                        <input type=\"text\" class=\"form-control m-input\" id=\"gtc_recv_no\" [(ngModel)]=\"stepData.gtc_recv_no\" formControlName=\"gtc_recv_no\">\n                                    </div>\n                                    <div class=\"col-sm-6\">\n                                        <label class=\"control-label\">\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A \u0E01\u0E2D\u0E04.</label>\n                                        <soc-date-box [id]=\"'gtc_recv_date'\" [(value)]=\"stepData.gtc_recv_date\" formControlName=\"gtc_recv_date\"></soc-date-box>\n                                    </div>\n                                </div>\n                                <br>\n                                <div class=\"row\" *ngIf=\"stepData.system_id === 23\">\n                                  <div class=\"col-sm-6\">\n                                      <label class=\"control-label\">\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D</label>\n                                      <input type=\"text\" class=\"form-control m-input\" id=\"book_no\" [(ngModel)]=\"stepData.book_no\"\n                                      formControlName=\"book_no\">\n                                  </div>\n                                  <div class=\"col-sm-6\">\n                                      <label class=\"control-label\">\u0E25\u0E07\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48</label>\n                                      <soc-date-box [id]=\"'book_date'\" [(value)]=\"stepData.book_date\" formControlName=\"book_date\"></soc-date-box>\n                                      <!-- <input type=\"text\" class=\"form-control m-input\" id=\"book_date\" [(ngModel)]=\"stepData.book_date\"\n                                      formControlName=\"book_date\"> -->\n                                  </div>\n                                </div>\n                                <br>\n                                <div class=\"row\" *ngIf=\"stepData.system_id === 23\">\n                                    <div class=\"col-sm-6\">\n                                        <label class=\"control-label\">\u0E40\u0E23\u0E35\u0E22\u0E19</label>\n                                        <input type=\"text\" class=\"form-control m-input\" id=\"for\" [(ngModel)]=\"stepData.for\" formControlName=\"for\">\n                                    </div>\n\n                                </div>\n                                <br>\n                                <div class=\"row\" *ngIf=\"stepData.system_id === 23\">\n                                    <div class=\"col-sm-6\">\n                                        <label class=\"control-label\">\u0E01\u0E23\u0E30\u0E17\u0E23\u0E27\u0E07</label>\n                                        <soc-auto-complete-2 [id]=\"'ministry'\"  mode=\"local\"\n                                          [api]=\"'/db/ct_ext_department'\" [acceptCustomValue]=\"false\" field=\"name\" fieldApi=\"id,name,code,type\"\n                                          [filter]=\"'&_where=(type,in,1,9)'\" (valueSelete)=\"valueSeleteMinistry($event)\"\n                                          [(value)]=\"stepData.ministry\" [(ngModel)]=\"stepData.ministry\"\n                                          formControlName=\"ministry\">\n                                        </soc-auto-complete-2>\n                                    </div>\n                                    <div class=\"col-sm-6\">\n                                        <label class=\"control-label\">\u0E01\u0E23\u0E21</label>\n                                        <div *ngIf=\"filter_ref_ext_department_id_show\">\n                                        <soc-auto-complete-2 [acceptCustomValue]=\"false\" [id]=\"'dept_name'\"\n                                          mode=\"local\" [filter]=\"filter_ref_ext_department_id\"\n                                           [api]=\"'/db/ct_ext_department'\" field=\"name\"\n                                          fieldApi=\"id,name,code,type\" [(value)]=\"stepData.dept_name\" (valueSelete)=\"valueSeleteDeptName($event)\"\n                                          [(ngModel)]=\"stepData.dept_name\" [disabled]=\"!filter_ref_ext_department_id\"\n                                          formControlName=\"dept_name\">\n                                        </soc-auto-complete-2>\n                                        </div>\n                                    </div>\n\n                                </div>\n                                <br>\n                                \n                                <!-- \u0E2B\u0E21\u0E32\u0E22\u0E40\u0E2B\u0E15\u0E38 -->\n                                <div class=\"row\">\n                                    <!--<div class=\"col-sm-3\">-->\n                                        <!--<span>\u0E2B\u0E21\u0E32\u0E22\u0E40\u0E2B\u0E15\u0E38 :</span>-->\n                                    <!--</div>-->\n                                    <div class=\"col-sm-12\">\n                                        <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && f().remark.errors }\">\n                                            <label class=\"control-label\">\u0E2B\u0E21\u0E32\u0E22\u0E40\u0E2B\u0E15\u0E38</label>\n                                            <textarea class=\"form-control m-input\" id=\"txtRemark\" rows=\"5\" formControlName=\"remark\" [(ngModel)]=\"stepData.remark\"></textarea>\n                                        </div>\n                                    </div>\n                                </div>\n                                <br>\n                                <!-- \u0E40\u0E2D\u0E01\u0E2A\u0E32\u0E23\u0E41\u0E19\u0E1A -->\n                                <div class=\"row\">\n                                    <!--<div class=\"col-sm-3\">-->\n                                        <!--<span>\u0E40\u0E2D\u0E01\u0E2A\u0E32\u0E23\u0E41\u0E19\u0E1A :</span>-->\n                                    <!--</div>-->\n                                    <div class=\"col-sm-12\">\n                                        <label class=\"control-label\">\u0E40\u0E2D\u0E01\u0E2A\u0E32\u0E23\u0E41\u0E19\u0E1A</label>\n                                        <upload-attachment #uploadAttachment [systemId]=\"stepData.system_id\" (uploaded)=\"onUploaded($event)\"></upload-attachment>\n                                        <!--<dx-tab-panel-->\n                                                <!--#tabPanel-->\n                                                <!--[items]=\"upLoadType\"-->\n                                                <!--[selectedIndex]=\"0\"-->\n                                                <!--[loop]=\"false\"-->\n                                                <!--[animationEnabled]=\"false\"-->\n                                                <!--[swipeEnabled]=\"false\"-->\n                                                <!--itemTemplate=\"itemTemplate\"-->\n                                        <!--&gt;-->\n                                            <!--&lt;!&ndash;<div *dxTemplate=\"let type of upLoadType\">&ndash;&gt;-->\n                                                <!--&lt;!&ndash;<span>{{type.name.toUpperCase()}}</span>&ndash;&gt;-->\n                                            <!--&lt;!&ndash;</div>&ndash;&gt;-->\n                                            <!--<div *dxTemplate=\"let item of 'itemTemplate'\">-->\n                                                <!--<div class=\"tabpanel-item\">-->\n                                                    <!--<div *ngIf=\"item.type === 1\">-->\n                                                        <!--<div class=\"col-sm-10\" style=\"text-align: center\">-->\n                                                            <!--<dx-file-uploader selectButtonText=\"\u0E40\u0E25\u0E37\u0E2D\u0E01\u0E44\u0E1F\u0E25\u0E4C\" labelText=\"\" accept=\"*\" uploadMode=\"useForm\" uploadMethod=\"POST\"-->\n                                                                              <!--multiple=\"true\" uploadMode=\"instantly\" labelText=\"\u0E2B\u0E23\u0E37\u0E2D\u0E27\u0E32\u0E07\u0E44\u0E1F\u0E25\u0E4C\u0E17\u0E35\u0E48\u0E19\u0E35\u0E48\" uploadUrl=\"https://filemanager-dot-smartrms-api.appspot.com/api/http/upload\"-->\n                                                            <!--&gt;-->\n                                                            <!--</dx-file-uploader>-->\n                                                        <!--</div>-->\n                                                    <!--</div>-->\n                                                <!--</div>-->\n                                            <!--</div>-->\n                                        <!--</dx-tab-panel>-->\n                                    </div>\n                                </div>\n                                <br>\n                                <!-- field \u0E40\u0E1E\u0E34\u0E48\u0E21\u0E40\u0E15\u0E34\u0E21 -->\n                                <div *ngIf=\"isMore\">\n                                    <div formArrayName=\"moreField\">\n                                        <div *ngFor=\"let field of moreField; let i=index\">\n                                            <div [formGroupName]=\"i\">\n                                                <div class=\"row\">\n                                                    <!--<div class=\"col-sm-3\">-->\n                                                        <!--<span>field.display_name :</span>-->\n                                                    <!--</div>-->\n                                                    <!-- field \u0E40\u0E1E\u0E34\u0E48\u0E21\u0E40\u0E15\u0E34\u0E21 type text -->\n                                                    <div *ngIf=\"field.type === 'text'\">\n                                                        <div class=\"col-sm-12\">\n                                                            <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,field.field_name) }\">\n                                                                <label class=\"control-label\">{{field.display_name}}</label>\n                                                                <input type=\"text\" class=\"form-control m-input\" [id]=\"getFieldId(field)\" [formControlName]=\"field.field_name\" [(ngModel)]=\"stepData[field.field_name]\">\n                                                                <div *ngIf=\"submitted && getValidateMoreField(i,field.field_name)\" class=\"invalid-feedback\">\n                                                                    <div *ngIf=\"getValidateMoreField(i,field.field_name,'required')\"><font color=\"red\"> * \u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01</font></div>\n                                                                </div>\n                                                            </div>\n                                                        </div>\n                                                    </div>\n                                                    <!-- field \u0E40\u0E1E\u0E34\u0E48\u0E21\u0E40\u0E15\u0E34\u0E21 type datetime -->\n                                                    <div *ngIf=\"field.type === 'datetime'\">\n\n                                                        <div class=\"col-sm-6\">\n                                                            <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,field.field_name) }\">\n                                                                <label class=\"control-label\">{{field.display_name}}</label>\n                                                                <soc-date-box  [id]=\"getFieldId(field)\" [(value)]=\"stepData[field.field_name]\"></soc-date-box>\n                                                                <!--<div *ngIf=\"getValidateMoreField(i,field.field_name,'required')\" class=\"lable-error\">Date is required</div>-->\n                                                                <!--<div *ngIf=\"getValidateMoreField(i,field.field_name,'date')\" class=\"lable-error\">Date is invalid</div>-->\n                                                            </div>\n                                                        </div>\n                                                    </div>\n                                                    <div *ngIf=\"field.type === 'number'\">\n                                                        <div class=\"col-sm-4\">\n                                                            <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,field.field_name) }\">\n                                                                <label class=\"control-label\">{{field.display_name}}</label>\n                                                                <div class=\"input-group\">\n                                                                    <input type=\"number\" class=\"form-control m-input\" [id]=\"getFieldId(field)\" [formControlName]=\"field.field_name\" [(ngModel)]=\"stepData[field.field_name]\">\n                                                                    <div *ngIf=\"field.field_name === 'remind_date'\" class=\"input-group-addon\"><span>\u0E27\u0E31\u0E19</span></div>\n                                                                </div>\n                                                                <div *ngIf=\"submitted && getValidateMoreField(i,field.field_name)\" class=\"invalid-feedback\">\n                                                                    <div *ngIf=\"getValidateMoreField(i,field.field_name,'required')\"><font color=\"red\"> * \u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01</font></div>\n                                                                </div>\n                                                            </div>\n                                                        </div>\n                                                        <!--<div class=\"col-sm-2\" *ngIf=\"field.field_name === 'remind_date'\">-->\n                                                            <!--<span>\u0E27\u0E31\u0E19</span>-->\n                                                        <!--</div>-->\n                                                    </div>\n                                                    <div *ngIf=\"field.type === 'special'\">\n                                                        <div *ngIf=\"field.field_name === 'term'\">\n\n                                                        </div>\n                                                        <div *ngIf=\"field.field_name === 'amount'\">\n                                                            <div class=\"col-sm-6\">\n                                                                <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,field.field_name) }\">\n                                                                    <label class=\"control-label\">{{field.display_name}}</label>\n                                                                    <input type=\"number\" class=\"form-control m-input\" [id]=\"getFieldId(field)\" [formControlName]=\"field.field_name\" [(ngModel)]=\"stepData[field.field_name]\">\n                                                                    <div *ngIf=\"submitted && getValidateMoreField(i,field.field_name)\" class=\"invalid-feedback\">\n                                                                        <div *ngIf=\"getValidateMoreField(i,field.field_name,'required')\"><font color=\"red\"> * \u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01</font></div>\n                                                                    </div>\n                                                                </div>\n                                                            </div>\n                                                            <div class=\"col-sm-6\">\n                                                                <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,'amount_type') }\">\n                                                                    <div class=\"m-radio-inline\">\n                                                                        <label class=\"m-radio\">\n                                                                            <input type=\"radio\" id=\"rdlAmountType1\" name=\"amount_type\" value=\"0\" [formControlName]=\"'amount_type'\" [(ngModel)]=\"stepData['amount_type']\" checked>\n                                                                            \u0E19\u0E31\u0E1A\u0E41\u0E15\u0E48<span></span>\n                                                                        </label>\n                                                                        <label class=\"m-radio\">\n                                                                            <input type=\"radio\" id=\"rdlAmountType2\" name=\"amount_type\" value=\"1\" [formControlName]=\"'amount_type'\" [(ngModel)]=\"stepData['amount_type']\">\n                                                                            \u0E19\u0E31\u0E1A\u0E16\u0E31\u0E14<span></span>\n                                                                        </label>\n                                                                    </div>\n                                                                </div>\n                                                            </div>\n                                                        </div>\n                                                        <div *ngIf=\"field.field_name === 'follow'\">\n                                                            <div class=\"col-sm-6\">\n                                                                <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,'amount_type') }\">\n                                                                    <label class=\"control-label\">{{field.display_name}}</label>\n                                                                    <div class=\"m-radio-inline\">\n                                                                        <label class=\"m-radio\">\n                                                                            <input type=\"radio\" [id]=\"getFieldId(field) + '1'\" [name]=\"field.field_name\" value=\"\u0E17\u0E32\u0E07\u0E01\u0E32\u0E23\" [formControlName]=\"field.field_name\" [(ngModel)]=\"stepData[field.field_name]\" checked>\n                                                                            \u0E17\u0E32\u0E07\u0E01\u0E32\u0E23<span></span>\n                                                                        </label>\n                                                                        <label class=\"m-radio\">\n                                                                            <input type=\"radio\" [id]=\"getFieldId(field) + '2'\" [name]=\"field.field_name\" value=\"\u0E44\u0E21\u0E48\u0E17\u0E32\u0E07\u0E01\u0E32\u0E23\" [formControlName]=\"field.field_name\" [(ngModel)]=\"stepData[field.field_name]\">\n                                                                            \u0E44\u0E21\u0E48\u0E17\u0E32\u0E07\u0E01\u0E32\u0E23<span></span>\n                                                                        </label>\n                                                                    </div>\n                                                                </div>\n                                                            </div>\n                                                            <!--<div class=\"col-sm-3\">-->\n                                                                <!--<span>\u0E2B\u0E21\u0E32\u0E22\u0E40\u0E2B\u0E15\u0E38 :</span>-->\n                                                            <!--</div>-->\n                                                            <div class=\"col-sm-6\">\n                                                                <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,'follow_remark') }\">\n                                                                    <label class=\"control-label\">\u0E2B\u0E21\u0E32\u0E22\u0E40\u0E2B\u0E15\u0E38</label>\n                                                                    <input type=\"text\" class=\"form-control m-input\" id=\"txtFollowRemark\" [formControlName]=\"'follow_remark'\" [(ngModel)]=\"stepData['follow_remark']\" [disableControl]=\"checkDisable(field)\">\n                                                                    <!--<div *ngIf=\"submitted && getValidateMoreField(i,'follow_remark')\" class=\"invalid-feedback\">-->\n                                                                        <!--<div *ngIf=\"getValidateMoreField(i,'follow_remark','required')\">First Name is required</div>-->\n                                                                    <!--</div>-->\n                                                                </div>\n                                                            </div>\n                                                        </div>\n                                                        <div *ngIf=\"field.field_name === 'cause'\">\n                                                            <div class=\"col-sm-6\">\n                                                                <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,field.field_name) }\">\n                                                                    <label class=\"control-label\">{{field.display_name}}</label>\n                                                                    <soc-auto-complete id=\"'txtCause'\" mode=\"local\" [orderBy]=\"'name'\" [filter]=\"causeFilter\"\n                                                                                       [api]=\"causeUrl\" field=\"name\" [(value)]=\"stepData['cause']\"></soc-auto-complete>\n                                                                    <div *ngIf=\"submitted && getValidateMoreField(i,field.field_name)\" class=\"invalid-feedback\">\n                                                                        <div *ngIf=\"getValidateMoreField(i,field.field_name,'required')\"><font color=\"red\"> * \u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01</font></div>\n                                                                    </div>\n                                                                </div>\n                                                            </div>\n                                                        </div>\n                                                    </div>\n                                                </div>\n                                            </div>\n                                        </div>\n                                        <br>\n                                    </div>\n                                </div>\n                                <div *ngIf=\"isSend\">\n                                    <div class=\"row\">\n                                        <div class=\"col-sm-3\">\n                                            <span>\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E2A\u0E48\u0E07 :</span>\n                                        </div>\n                                        <div class=\"col-sm-9\">\n                                            <!--<a id=\"btnSendAdd\" (click)=\"sendModal.show()\" class=\"btn btn-default btn-sm icon\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Add\"><i class=\"fal fa-plus\"></i></a>-->\n                                            <a id=\"btnSendAdd\" class=\"btn btn-default btn-md btn-md-search\" (click)=\"addSend()\">\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E2A\u0E48\u0E07</a>\n                                        </div>\n                                    </div>\n                                    <br>\n                                    <dx-data-grid #dxDataGridStepSendList class=\"card-list-table\"\n                                                  id=\"gridStepSendList\" noDataText=\"\"\n                                                  (onCellPrepared)=\"onCellPrepared($event)\" [dataSource]=\"sendList\"\n                                                  [wordWrapEnabled]=\"true\"\n                                                  [showBorders]=\"true\">\n                                        <dxi-column caption=\"\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E17\u0E35\u0E48\" [allowSorting]=\"false\" cellTemplate=\"cellTemplate\" alignment=\"center\"></dxi-column>\n                                        <dxi-column caption=\"\u0E08\u0E31\u0E14\u0E01\u0E32\u0E23\" [allowSorting]=\"false\" cellTemplate=\"cellTemplateAction\" alignment=\"center\"></dxi-column>\n                                        <dxi-column dataField=\"send_to\" caption=\"\u0E2B\u0E19\u0E48\u0E27\u0E22\u0E07\u0E32\u0E19\"></dxi-column>\n                                        <dxi-column dataField=\"book_no\" caption=\"\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D\u0E2A\u0E48\u0E07\u0E2D\u0E2D\u0E01\"></dxi-column>\n                                        <dxi-column dataField=\"send_date\" caption=\"\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E2A\u0E48\u0E07\u0E2D\u0E2D\u0E01\" dataType=\"date\" alignment=\"center\"></dxi-column>\n                                        <dxi-column [calculateCellValue]=\"isImportant\" caption=\"\u0E04\u0E27\u0E32\u0E21\u0E2A\u0E33\u0E04\u0E31\u0E0D\"></dxi-column>\n                                        <div *dxTemplate=\"let data of 'cellTemplate'\">\n                                            {{getRowIndex(data)}}\n                                        </div>\n                                        <div *dxTemplate=\"let data of 'cellTemplateAction'\">\n                                            <a id=\"btnEditSend\" (click)=\"editSend(data.data)\" class=\"btn btn-default btn-sm icon\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\u0E41\u0E01\u0E49\u0E44\u0E02\"><i class=\"fal fa-pencil-alt\"></i></a>\n                                        </div>\n                                    </dx-data-grid>\n                                    <br>\n                                </div>\n                                <div *ngIf=\"isRecieve\">\n                                    <div class=\"row\">\n                                        <div class=\"col-sm-3\">\n                                            <span>\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E23\u0E31\u0E1A :</span>\n                                        </div>\n                                        <div class=\"col-sm-9\">\n                                            <!--<a id=\"btnSendAdd\" (click)=\"sendModal.show()\" class=\"btn btn-default btn-sm icon\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Add\"><i class=\"fal fa-plus\"></i></a>-->\n                                            <a id=\"btnRecieveAdd\" class=\"btn btn-default btn-md btn-md-search\" (click)=\"recieveModal.show()\">\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E23\u0E31\u0E1A</a>\n                                        </div>\n                                    </div>\n                                    <br>\n                                    <dx-data-grid #dxDataGridStepRecieveList class=\"card-list-table\"\n                                                  id=\"gridStepRecieveList\" noDataText=\"\"\n                                                  (onCellPrepared)=\"onCellPrepared($event)\" [dataSource]=\"recieveList\"\n                                                  [wordWrapEnabled]=\"true\"\n                                                  [showBorders]=\"true\">\n                                        <dxi-column caption=\"\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E17\u0E35\u0E48\" [allowSorting]=\"false\" cellTemplate=\"cellTemplate\"></dxi-column>\n                                        <dxi-column caption=\"\u0E08\u0E31\u0E14\u0E01\u0E32\u0E23\" [allowSorting]=\"false\" cellTemplate=\"cellTemplateAction\"></dxi-column>\n                                        <dxi-column dataField=\"recv_from\" caption=\"\u0E2B\u0E19\u0E48\u0E27\u0E22\u0E07\u0E32\u0E19\"></dxi-column>\n                                        <dxi-column dataField=\"send_book_no\" caption=\"\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D\u0E2A\u0E48\u0E07\u0E2D\u0E2D\u0E01\"></dxi-column>\n                                        <dxi-column dataField=\"send_date\" caption=\"\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E2A\u0E48\u0E07\u0E2D\u0E2D\u0E01\" dataType=\"date\"></dxi-column>\n                                        <dxi-column dataField=\"book_no\" caption=\"\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D\"></dxi-column>\n                                        <dxi-column dataField=\"recv_date\" caption=\"\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A\" dataType=\"date\"></dxi-column>\n                                        <div *dxTemplate=\"let data of 'cellTemplate'\">\n                                            {{getRowIndex(data)}}\n                                        </div>\n                                        <div *dxTemplate=\"let data of 'cellTemplateAction'\">\n                                            <a id=\"btnEditRecieve\" (click)=\"editRecieve(data.data)\" class=\"btn btn-default btn-sm icon\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\u0E41\u0E01\u0E49\u0E44\u0E02\"><i class=\"fal fa-pencil-alt\"></i></a>\n                                        </div>\n                                    </dx-data-grid>\n                                    <br>\n                                </div>\n                            </div>\n                            <div class=\"m-portlet__foot m-portlet__foot--fit text-right\">\n                                <div class=\"m-form__actions\">\n                                    <button type=\"submit\" class=\"btn btn-success btn-md btn-md-save\">\n                                        \u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\n                                    </button>\n                                    <button type=\"reset\" class=\"btn btn-default btn-md btn-md-search\" (click)=\"closeModal()\">\n                                        \u0E22\u0E01\u0E40\u0E25\u0E34\u0E01\n                                    </button>\n                                </div>\n                            </div>\n                        </form>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n<div class=\"modal fade\" bsModal #sendModal=\"bs-modal\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"dialog-static-name2\" [config]=\"{backdrop: 'static'}\">\n    <div class=\"modal-dialog modal-md\">\n        <div class=\"modal-content\">\n            <div class=\"modal-header\">\n                <h4 id=\"dialog-static-send\" class=\"modal-title pull-left\"><label>\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E2A\u0E48\u0E07</label></h4>\n                <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"closeSendModal()\">\n                    <span aria-hidden=\"true\">&times;</span>\n                </button>\n            </div>\n            <div class=\"modal-body\">\n                <form class=\"m-form m-form--state m-form--fit m-form--label-align-right\" [formGroup]=\"sendForm\" (ngSubmit)=\"onSubmitSend()\">\n                    <div class=\"ibox-body\">\n                        <div class=\"row\">\n                            <div class=\"form-group\">\n                                <label class=\"control-label\">\u0E2B\u0E19\u0E48\u0E27\u0E22\u0E07\u0E32\u0E19</label>\n                                <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submittedSend && fs().send_to.errors }\">\n                                    <soc-auto-complete [id]=\"'txtSendTo'\" mode=\"local\" [orderBy]=\"'name'\"\n                                                       [api]=\"departmentUrl\" field=\"name\" [(value)]=\"sendData.send_to\"></soc-auto-complete>\n                                    <!--<p-autoComplete type=\"text\" styleClass=\"form-control m-input\" id=\"txtSendTo\" formControlName=\"send_to\" [(ngModel)]=\"sendData.send_to\"-->\n                                                    <!--[suggestions]=\"filteredDepartments\" (completeMethod)=\"filterDepartments($event)\"></p-autoComplete>-->\n                                    <div *ngIf=\"submittedSend && fs().send_to.errors\" class=\"invalid-feedback\">\n                                        <div *ngIf=\"fs().send_to.errors.required\">First Name is required</div>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"form-group\">\n                                <label class=\"control-label\">\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D\u0E2A\u0E48\u0E07\u0E2D\u0E2D\u0E01</label>\n                                <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submittedSend && fs().book_no.errors }\">\n                                    <input type=\"text\" class=\"form-control m-input\" id=\"txtSendBookNo\" formControlName=\"book_no\" [(ngModel)]=\"sendData.book_no\">\n                                    <div *ngIf=\"submittedSend && fs().book_no.errors\" class=\"invalid-feedback\">\n                                        <div *ngIf=\"fs().book_no.errors.required\">First Name is required</div>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"form-group\">\n                                <label class=\"control-label\">\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E2A\u0E48\u0E07\u0E2D\u0E2D\u0E01</label>\n                                <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submittedSend && fs().send_date.errors }\">\n                                    <soc-date-box [id]=\"'txtSendDate'\" [(value)]=\"sendData.send_date\"></soc-date-box>\n                                    <div *ngIf=\"submittedSend && fs().send_date.errors\" >\n                                        <div *ngIf=\"fs().send_date.errors.required\" class=\"lable-error\">Date is required</div>\n                                        <div *ngIf=\"fs().send_date.errors.date\" class=\"lable-error\">Date is invalid</div>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"form-group\">\n                                <label class=\"control-label\"></label>\n                                <input type=\"checkbox\" id=\"chkIsImportant\"  name=\"is_important\" formControlName=\"is_important\" [(ngModel)]=\"sendData.is_important\" ng-checked> \u0E2A\u0E33\u0E04\u0E31\u0E0D\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"m-portlet__foot m-portlet__foot--fit text-right\">\n                        <div class=\"m-form__actions\">\n                            <button type=\"submit\" class=\"btn btn-success btn-md btn-md-save\">\n                                \u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\n                            </button>\n                            <button type=\"reset\" class=\"btn btn-default btn-md btn-md-search\" (click)=\"closeSendModal()\">\n                                \u0E22\u0E01\u0E40\u0E25\u0E34\u0E01\n                            </button>\n                        </div>\n                    </div>\n                </form>\n            </div>\n        </div>\n    </div>\n</div>\n<div class=\"modal fade\" bsModal #recieveModal=\"bs-modal\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"dialog-static-name2\" [config]=\"{backdrop: 'static'}\">\n    <div class=\"modal-dialog modal-md\">\n        <div class=\"modal-content\">\n            <div class=\"modal-header\">\n                <h4 id=\"dialog-static-recieve\" class=\"modal-title pull-left\"><label>\u0E23\u0E31\u0E1A\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D \u0E15\u0E2D\u0E1A\u0E04\u0E27\u0E32\u0E21\u0E40\u0E2B\u0E47\u0E19</label></h4>\n                <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"closeRecieveModal()\">\n                    <span aria-hidden=\"true\">&times;</span>\n                </button>\n            </div>\n            <div class=\"modal-body\">\n                <form class=\"m-form m-form--state m-form--fit m-form--label-align-right\" [formGroup]=\"recieveForm\" (ngSubmit)=\"onSubmitRecieve()\">\n                    <div class=\"ibox-body\">\n                        <div class=\"row\">\n                            <div class=\"form-group\">\n                                <label class=\"control-label\">\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D</label>\n                                <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submittedRecieve && fr().book_no.errors }\">\n                                    <input type=\"text\" class=\"form-control m-input\" id=\"txtRecieveBookNo\" formControlName=\"book_no\" [(ngModel)]=\"recieveData.book_no\">\n                                    <div *ngIf=\"submittedRecieve && fr().book_no.errors\" class=\"invalid-feedback\">\n                                        <div *ngIf=\"fr().book_no.errors.required\">First Name is required</div>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"form-group\">\n                                <label class=\"control-label\">\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A</label>\n                                <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submittedRecieve && fr().recv_date.errors }\">\n                                    <soc-date-box [id]=\"'txtRecieveDate'\" [(value)]=\"recieveData.recv_date\"></soc-date-box>\n                                    <div *ngIf=\"submittedRecieve && fr().recv_date.errors\" >\n                                        <div *ngIf=\"fr().recv_date.errors.required\" class=\"lable-error\">Date is required</div>\n                                        <div *ngIf=\"fr().recv_date.errors.date\" class=\"lable-error\">Date is invalid</div>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"m-portlet__foot m-portlet__foot--fit text-right\">\n                        <div class=\"m-form__actions\">\n                            <button type=\"submit\" class=\"btn btn-success btn-md btn-md-save\">\n                                \u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\n                            </button>\n                            <button type=\"reset\" class=\"btn btn-default btn-md btn-md-search\" (click)=\"closeRecieveModal()\">\n                                \u0E22\u0E01\u0E40\u0E25\u0E34\u0E01\n                            </button>\n                        </div>\n                    </div>\n                </form>\n            </div>\n        </div>\n    </div>\n</div>\n<app-alert #myModal (onClickBack)=\"onClickBack()\"></app-alert>\n"
            }] }
];
/** @nocollapse */
ModalStepComponent.ctorParameters = () => [
    { type: AppConfigService },
    { type: Request },
    { type: FormBuilder },
    { type: Common },
    { type: DateService },
    { type: B2bService }
];
ModalStepComponent.propDecorators = {
    onUpdateModal: [{ type: Output }],
    modal: [{ type: ViewChild, args: ['modal',] }],
    myModal: [{ type: ViewChild, args: ['myModal',] }],
    sendModal: [{ type: ViewChild, args: ['sendModal',] }],
    recieveModal: [{ type: ViewChild, args: ['recieveModal',] }],
    dxDataGridStepSendList: [{ type: ViewChild, args: ['dxDataGridStepSendList',] }],
    uploadAttachment: [{ type: ViewChild, args: ['uploadAttachment',] }]
};
if (false) {
    /** @type {?} */
    ModalStepComponent.prototype.onUpdateModal;
    /** @type {?} */
    ModalStepComponent.prototype.modal;
    /** @type {?} */
    ModalStepComponent.prototype.myModal;
    /** @type {?} */
    ModalStepComponent.prototype.sendModal;
    /** @type {?} */
    ModalStepComponent.prototype.recieveModal;
    /** @type {?} */
    ModalStepComponent.prototype.dxDataGridStepSendList;
    /** @type {?} */
    ModalStepComponent.prototype.uploadAttachment;
    /** @type {?} */
    ModalStepComponent.prototype.registerForm;
    /** @type {?} */
    ModalStepComponent.prototype.sendForm;
    /** @type {?} */
    ModalStepComponent.prototype.recieveForm;
    /** @type {?} */
    ModalStepComponent.prototype.submitted;
    /** @type {?} */
    ModalStepComponent.prototype.submittedSend;
    /** @type {?} */
    ModalStepComponent.prototype.submittedRecieve;
    /** @type {?} */
    ModalStepComponent.prototype.title;
    /** @type {?} */
    ModalStepComponent.prototype.selectList;
    /** @type {?} */
    ModalStepComponent.prototype.sendList;
    /** @type {?} */
    ModalStepComponent.prototype.recieveList;
    /** @type {?} */
    ModalStepComponent.prototype.modalConfig;
    /** @type {?} */
    ModalStepComponent.prototype.th;
    /** @type {?} */
    ModalStepComponent.prototype.selectedStep;
    /** @type {?} */
    ModalStepComponent.prototype.isMore;
    /** @type {?} */
    ModalStepComponent.prototype.moreField;
    /** @type {?} */
    ModalStepComponent.prototype.config;
    /** @type {?} */
    ModalStepComponent.prototype.stepData;
    /** @type {?} */
    ModalStepComponent.prototype.sendData;
    /** @type {?} */
    ModalStepComponent.prototype.recieveData;
    /** @type {?} */
    ModalStepComponent.prototype.lastStep;
    /** @type {?} */
    ModalStepComponent.prototype.isSend;
    /** @type {?} */
    ModalStepComponent.prototype.isRecieve;
    /** @type {?} */
    ModalStepComponent.prototype.isEditSend;
    /** @type {?} */
    ModalStepComponent.prototype.isEditRecieve;
    /** @type {?} */
    ModalStepComponent.prototype.tmpData;
    /** @type {?} */
    ModalStepComponent.prototype.filteredDepartments;
    /** @type {?} */
    ModalStepComponent.prototype.departmentList;
    /** @type {?} */
    ModalStepComponent.prototype.departmentUrl;
    /** @type {?} */
    ModalStepComponent.prototype.causeUrl;
    /** @type {?} */
    ModalStepComponent.prototype.causeFilter;
    /** @type {?} */
    ModalStepComponent.prototype.tempId;
    /** @type {?} */
    ModalStepComponent.prototype.attachmentUrl;
    /** @type {?} */
    ModalStepComponent.prototype.system_id;
    /** @type {?} */
    ModalStepComponent.prototype.filter_ref_ext_department_id;
    /** @type {?} */
    ModalStepComponent.prototype.filter_ref_ext_department_id_show;
    /** @type {?} */
    ModalStepComponent.prototype.appConfigService;
    /** @type {?} */
    ModalStepComponent.prototype.request;
    /** @type {?} */
    ModalStepComponent.prototype.formBuilder;
    /** @type {?} */
    ModalStepComponent.prototype.common;
    /** @type {?} */
    ModalStepComponent.prototype.date;
    /** @type {?} */
    ModalStepComponent.prototype.b2bService;
}

//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtc3RlcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9zb2MtYXBwLWxpYnJhcnkvIiwic291cmNlcyI6WyJsaWIvbW9kYWwtc3RlcC9tb2RhbC1zdGVwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUE0QixNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sRUFBZSxjQUFjLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDbEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsV0FBVyxFQUF3QixVQUFVLEVBQWtCLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUYsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFdkQsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3RELE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLGtEQUFrRCxDQUFDO0FBQzNGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUVwRDtDQUtDOzs7Ozs7Ozs7Ozs7O0FBTUQsTUFBTSx5QkFBMEIsU0FBUSxPQUFPOzs7Ozs7Ozs7SUFnRDNDLFlBQW9CLGdCQUFrQyxFQUFVLE9BQWdCLEVBQVUsV0FBd0IsRUFBUyxNQUFjLEVBQVMsSUFBaUIsRUFBUyxVQUFzQjtRQUM5TCxLQUFLLEVBQUUsQ0FBQztRQURRLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FB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WCxVQUFVOzs7NEJBY2IsTUFBTTtvQkFFTixTQUFTLFNBQUMsT0FBTztzQkFDakIsU0FBUyxTQUFDLFNBQVM7d0JBQ25CLFNBQVMsU0FBQyxXQUFXOzJCQUNyQixTQUFTLFNBQUMsY0FBYztxQ0FDeEIsU0FBUyxTQUFDLHdCQUF3QjsrQkFFbEMsU0FBUyxTQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtNb2RhbE9wdGlvbnMsIE1vZGFsRGlyZWN0aXZlfSBmcm9tICduZ3gtYm9vdHN0cmFwJztcbmltcG9ydCB7QXBwQ29uZmlnU2VydmljZX0gZnJvbSAnLi4vYXBwLWNvbmZpZy9hcHAtY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVxdWVzdCB9IGZyb20gJy4uL19zZXJ2aWNlcy9yZXF1ZXN0LnNlcnZpY2UnO1xuaW1wb3J0IHtDb21tb259IGZyb20gJy4uL19zZXJ2aWNlcy9jb21tb24uc2VydmljZSc7XG5pbXBvcnQge0Zvcm1CdWlsZGVyLCBGb3JtQXJyYXksIEZvcm1Hcm91cCwgVmFsaWRhdG9ycywgQWJzdHJhY3RDb250cm9sfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge0N1c3RvbVZhbGlkYXRvcnN9IGZyb20gJ25nMi12YWxpZGF0aW9uJztcbmltcG9ydCB7RHhEYXRhR3JpZENvbXBvbmVudH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyJztcbmltcG9ydCAqIGFzIHV1aWQgZnJvbSAndXVpZCc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge0RhdGVTZXJ2aWNlfSBmcm9tICcuLi9fc2VydmljZXMvZGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7VXBsb2FkQXR0YWNobWVudENvbXBvbmVudH0gZnJvbSAnLi4vdXBsb2FkLWF0dGFjaG1lbnQvdXBsb2FkLWF0dGFjaG1lbnQuY29tcG9uZW50JztcbmltcG9ydCB7QjJiU2VydmljZX0gZnJvbSAnLi4vX3NlcnZpY2VzL2IyYi5zZXJ2aWNlJztcblxuY2xhc3MgT3B0aW9ucyB7XG4gICAgLyoqIHRpdGxlIOC4l+C4teC5iOC4leC5ieC4reC4h+C4geC4suC4o+C5geC4quC4lOC4hyAqL1xuICAgIHRpdGxlPzogU3RyaW5nO1xuICAgIC8qKiBkYXRhICovXG4gICAgZGF0YTogYW55O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ21vZGFsLXN0ZXAnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9tb2RhbC1zdGVwLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgTW9kYWxTdGVwQ29tcG9uZW50IGV4dGVuZHMgT3B0aW9ucyBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgQE91dHB1dCgpIG9uVXBkYXRlTW9kYWwgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgLy8gQE91dHB1dCgpIG9uQ3JlYXRlTW9kYWwgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQFZpZXdDaGlsZCgnbW9kYWwnKSBtb2RhbDogTW9kYWxEaXJlY3RpdmU7XG4gICAgQFZpZXdDaGlsZCgnbXlNb2RhbCcpIG15TW9kYWw7XG4gICAgQFZpZXdDaGlsZCgnc2VuZE1vZGFsJykgc2VuZE1vZGFsOiBNb2RhbERpcmVjdGl2ZTtcbiAgICBAVmlld0NoaWxkKCdyZWNpZXZlTW9kYWwnKSByZWNpZXZlTW9kYWw6IE1vZGFsRGlyZWN0aXZlO1xuICAgIEBWaWV3Q2hpbGQoJ2R4RGF0YUdyaWRTdGVwU2VuZExpc3QnKVxuICAgIGR4RGF0YUdyaWRTdGVwU2VuZExpc3Q6IER4RGF0YUdyaWRDb21wb25lbnQ7XG4gICAgQFZpZXdDaGlsZCgndXBsb2FkQXR0YWNobWVudCcpIHVwbG9hZEF0dGFjaG1lbnQ6IFVwbG9hZEF0dGFjaG1lbnRDb21wb25lbnQ7XG5cbiAgICByZWdpc3RlckZvcm06IEZvcm1Hcm91cDtcbiAgICBzZW5kRm9ybTogRm9ybUdyb3VwO1xuICAgIHJlY2lldmVGb3JtOiBGb3JtR3JvdXA7XG4gICAgc3VibWl0dGVkID0gZmFsc2U7XG4gICAgc3VibWl0dGVkU2VuZCA9IGZhbHNlO1xuICAgIHN1Ym1pdHRlZFJlY2lldmUgPSBmYWxzZTtcbiAgICB0aXRsZTogYW55ID0gJyc7XG4gICAgc2VsZWN0TGlzdDogYW55ID0gW107XG4gICAgc2VuZExpc3Q6IGFueSA9IFtdO1xuICAgIHJlY2lldmVMaXN0OiBhbnkgPSBbXTtcbiAgICBtb2RhbENvbmZpZzogTW9kYWxPcHRpb25zID0ge1xuICAgICAgICBpZ25vcmVCYWNrZHJvcENsaWNrOiB0cnVlXG4gICAgfTtcbiAgICB0aDtcbiAgICBzZWxlY3RlZFN0ZXA6IGFueSA9IG51bGw7XG4gICAgaXNNb3JlID0gZmFsc2U7XG4gICAgbW9yZUZpZWxkOiBhbnk7XG4gICAgcHVibGljIGNvbmZpZzogYW55O1xuICAgIHN0ZXBEYXRhOiBhbnkgPSB7fTtcbiAgICBzZW5kRGF0YTogYW55ID0ge307XG4gICAgcmVjaWV2ZURhdGE6IGFueSA9IHt9O1xuICAgIGxhc3RTdGVwID0gJyc7XG4gICAgaXNTZW5kID0gZmFsc2U7XG4gICAgaXNSZWNpZXZlID0gZmFsc2U7XG4gICAgaXNFZGl0U2VuZCA9IGZhbHNlO1xuICAgIGlzRWRpdFJlY2lldmUgPSBmYWxzZTtcbiAgICB0bXBEYXRhOmFueSA9IHt9O1xuICAgIGZpbHRlcmVkRGVwYXJ0bWVudHM6YW55ID0gW107XG4gICAgZGVwYXJ0bWVudExpc3Q6YW55ID0gW107XG4gICAgZGVwYXJ0bWVudFVybCA9IFwiL2RiL2N0X2V4dF9kZXBhcnRtZW50XCI7XG4gICAgY2F1c2VVcmwgPSBcIi9kYi9jdF9kcm9wZG93blwiO1xuICAgIGNhdXNlRmlsdGVyID0gXCJzeXN0ZW1faWQsZXEsMjMpJGFuZChkcm9wZG93bl90eXBlLGxpa2Us4LmA4Lij4Li34LmI4Lit4LiH4Liq4LmI4LiH4LiE4Li34LiZXCI7XG4gICAgdGVtcElkID0gLTE7XG4gICAgYXR0YWNobWVudFVybDtcbiAgICBzeXN0ZW1faWQ7XG4gICAgZmlsdGVyX3JlZl9leHRfZGVwYXJ0bWVudF9pZDogYW55ID0gZmFsc2U7XG4gICAgZmlsdGVyX3JlZl9leHRfZGVwYXJ0bWVudF9pZF9zaG93ID0gdHJ1ZTtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFwcENvbmZpZ1NlcnZpY2U6IEFwcENvbmZpZ1NlcnZpY2UsIHByaXZhdGUgcmVxdWVzdDogUmVxdWVzdCwgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsIHB1YmxpYyBjb21tb246IENvbW1vbiwgcHVibGljIGRhdGU6IERhdGVTZXJ2aWNlLCBwdWJsaWMgYjJiU2VydmljZTogQjJiU2VydmljZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGFwcENvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnKCk7XG4gICAgICAgIHRoaXMuYXR0YWNobWVudFVybCA9IF8uZ2V0KHRoaXMuY29uZmlnLCAnYXBpU2VydmVycy5hbGZyZXNjby51cmwnKSB8fCBcImh0dHBzOi8vMjAzLjE1NC4zMi4xMjY6MjU4NS9hcGkvbWZlYy9BbGZyZXNjb1wiO1xuICAgICAgICB0aGlzLnN5c3RlbV9pZCA9IF8uZ2V0KHRoaXMuY29uZmlnLCAnc3lzdGVtX2lkJyk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMudGggPSB0aGlzLmNvbW1vbi5mbkxvY2FsUENhbGVuZGFyKCd0aCcpO1xuICAgICAgICB0aGlzLnJlY2lldmVGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgICAgICBib29rX25vOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICAgICAgICByZWN2X2RhdGU6IFsnJ10sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNlbmRGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgICAgICBzZW5kX3RvOiBbJyddLFxuICAgICAgICAgICAgYm9va19ubzogWycnXSxcbiAgICAgICAgICAgIHNlbmRfZGF0ZTogWycnXSxcbiAgICAgICAgICAgIGlzX2ltcG9ydGFudDogWycnXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgICAgICBuYW1lOiBbJyddLFxuICAgICAgICAgICAgc3RlcF9pZDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgIHN0ZXBfZGF0ZTogWycnXSxcbiAgICAgICAgICAgIHJlbWFyazogWycnXSxcbiAgICAgICAgICAgIGxhc3RTdGVwOiBbJyddLFxuICAgICAgICAgICAgbW9yZUZpZWxkOiB0aGlzLmZvcm1CdWlsZGVyLmFycmF5KFtdKSxcbiAgICAgICAgICAgIHNvY19yZWN2X25vOiBbJyddLFxuICAgICAgICAgICAgc29jX3JlY3ZfZGF0ZTogWycnXSxcbiAgICAgICAgICAgIGd0Y19yZWN2X25vOiBbJyddLFxuICAgICAgICAgICAgZ3RjX3JlY3ZfZGF0ZTogWycnXSxcbiAgICAgICAgICAgIGJvb2tfbm86IFsnJ10sXG4gICAgICAgICAgICBib29rX2RhdGU6IFsnJ10sXG4gICAgICAgICAgICAnZm9yJzogWycnXSxcbiAgICAgICAgICAgIGRlcHRfbmFtZTogWycnXSxcbiAgICAgICAgICAgIG1pbmlzdHJ5OiBbJyddXG5cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgb3BlbihvcHRpb25zPzogT3B0aW9ucykge1xuICAgICAgICBjb25zb2xlLmxvZyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5zdGVwRGF0YSA9IHt9O1xuICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgdGhpcy50aXRsZSA9IG9wdGlvbnMudGl0bGUgfHwgJyc7XG4gICAgICAgICAgICB0aGlzLmxhc3RTdGVwID0gb3B0aW9ucy5kYXRhLmxhc3RTdGVwO1xuICAgICAgICAgICAgdGhpcy5zdGVwRGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5kYXRhKSk7XG4gICAgICAgICAgICB0aGlzLnN0ZXBEYXRhLnN0ZXBfZGF0ZSA9IHRoaXMuZGF0ZS5nZXROb3coKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN0ZXBEYXRhWydsYXN0U3RlcCddO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RMaXN0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0LmdldCgnL2RiL2N0X3N0ZXA/X3doZXJlPShjYXRlZ29yeV9pZCxlcSwnICsgb3B0aW9ucy5kYXRhLmNhdGVnb3J5X2lkICsgJykmX3NvcnQ9c2VxX25vJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGxvYWRBdHRhY2htZW50LmNsZWFyVmFsdWUoKTtcbiAgICAgICAgdGhpcy5tb2RhbC5zaG93KCk7XG4gICAgfVxuXG4gICAgZigpIHsgcmV0dXJuIHRoaXMucmVnaXN0ZXJGb3JtLmNvbnRyb2xzOyB9XG4gICAgZnMoKSB7IHJldHVybiB0aGlzLnNlbmRGb3JtLmNvbnRyb2xzOyB9XG4gICAgZnIoKSB7IHJldHVybiB0aGlzLnJlY2lldmVGb3JtLmNvbnRyb2xzOyB9XG5cbiAgICBjbG9zZU1vZGFsKCkge1xuICAgICAgICB0aGlzLnN1Ym1pdHRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNlbGVjdExpc3QgPSBbXTtcbiAgICAgICAgdGhpcy5zZW5kTGlzdCA9IFtdO1xuICAgICAgICB0aGlzLnNlbGVjdGVkU3RlcCA9IG51bGw7XG4gICAgICAgIHRoaXMuaXNNb3JlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNTZW5kID0gZmFsc2U7XG4gICAgICAgIHRoaXMubW9yZUZpZWxkID0gW107XG4gICAgICAgIHRoaXMuc3RlcERhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5sYXN0U3RlcCA9ICcnO1xuICAgICAgICB0aGlzLm1vZGFsLmhpZGUoKTtcbiAgICB9XG5cbiAgICBjbG9zZVNlbmRNb2RhbCgpIHtcbiAgICAgICAgdGhpcy5zdWJtaXR0ZWRTZW5kID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VuZERhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5pc0VkaXRTZW5kID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG1wRGF0YSA9IHt9O1xuICAgICAgICB0aGlzLnNlbmRNb2RhbC5oaWRlKCk7XG4gICAgfVxuXG4gICAgY2xvc2VSZWNpZXZlTW9kYWwoKSB7XG4gICAgICAgIHRoaXMuc3VibWl0dGVkUmVjaWV2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlY2lldmVEYXRhID0ge307XG4gICAgICAgIHRoaXMuaXNFZGl0UmVjaWV2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRtcERhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5yZWNpZXZlTW9kYWwuaGlkZSgpO1xuICAgIH1cblxuICAgIG9uWWVzQ2xpY2sobW9kYWwpIHtcbiAgICAgICAgbW9kYWwuaGlkZSgpO1xuICAgIH1cblxuICAgIG9uTm9DbGljayhtb2RhbCkge1xuICAgICAgICBtb2RhbC5oaWRlKCk7XG4gICAgfVxuXG4gICAgb25IaWRkZW4oJGV2ZW50OiBNb2RhbERpcmVjdGl2ZSkge1xuICAgICAgICBjb25zb2xlLmxvZygnTE9HIE1FU1NBR0U6IE1vZGFsQ29uZmlybSAtPiBvbkhpZGRlbiAtPiAkZXZlbnQnLCAkZXZlbnQpO1xuXG4gICAgfVxuICAgIFxuICAgIHZhbHVlU2VsZXRlTWluaXN0cnkodmFsdWUpIHtcbiAgICAgIHRoaXMuZmlsdGVyX3JlZl9leHRfZGVwYXJ0bWVudF9pZF9zaG93ID0gZmFsc2U7XG4gICAgICBjb25zb2xlLmxvZygndmFsdWUnLCB2YWx1ZSlcbiAgICAgIC8vIHRoaXMuc3RlcERhdGEubWluaXN0cnlfaWQgPSB2YWx1ZSAmJiB2YWx1ZS5pZCA/IHZhbHVlLmlkIDogbnVsbFxuICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmlkKSB7XG4gICAgICAgIHRoaXMuc3RlcERhdGEuZGVwdF9uYW1lID0gbnVsbFxuICAgICAgICB0aGlzLmZpbHRlcl9yZWZfZXh0X2RlcGFydG1lbnRfaWQgPSBgJl93aGVyZT0ocmVmX2V4dF9kZXBhcnRtZW50X2lkLGVxLCR7dmFsdWUuaWR9KSRhbmQodHlwZSxpbiwyLDMsNCw1KWBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZmlsdGVyX3JlZl9leHRfZGVwYXJ0bWVudF9pZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZmlsdGVyX3JlZl9leHRfZGVwYXJ0bWVudF9pZF9zaG93ID0gdHJ1ZTtcbiAgICAgIH0sIDUwKVxuXG4gICAgfVxuXG4gICAgdmFsdWVTZWxldGVEZXB0TmFtZSh2YWx1ZSkge1xuICAgICAgY29uc29sZS5sb2coJ3ZhbHVlJywgdmFsdWUpXG4gICAgICB0aGlzLnN0ZXBEYXRhLmNvZGVfZGVwdCA9IHZhbHVlICYmIHZhbHVlLmlkID8gdmFsdWUuaWQgOiBudWxsXG4gICAgfVxuXG5cbiAgICBhc3luYyBjaGVja0V4dHJhRmllbGQoKSB7XG4gICAgICAgIHRoaXMuc3RlcERhdGEuc3RlcF9pZCA9IHRoaXMuc2VsZWN0ZWRTdGVwLmlkO1xuICAgICAgICB0aGlzLnN0ZXBEYXRhLnN0ZXBfbmFtZSA9IHRoaXMuc2VsZWN0ZWRTdGVwLm5hbWU7XG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMuaXNNb3JlKTtcbiAgICAgICAgdGhpcy5tb3JlRmllbGQgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRTdGVwLmZsYWcgJiYgdGhpcy5zZWxlY3RlZFN0ZXAuZmxhZyAhPT0gJycpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZFN0ZXAuZmxhZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZsYWcgPSB0aGlzLnNlbGVjdGVkU3RlcC5mbGFnLmNoYXJBdChpKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1aXJlRmxhZyA9IHRoaXMuc2VsZWN0ZWRTdGVwLnJlcXVpcmVfZmxhZyA/IHRoaXMuc2VsZWN0ZWRTdGVwLnJlcXVpcmVfZmxhZy5jaGFyQXQoaSkgOiAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN0X3N0ZXBfZmxhZyA9IGF3YWl0IHRoaXMucmVxdWVzdC5nZXQoJy9kYi9jdF9zdGVwX2ZsYWc/X3doZXJlPShmbGFnLGVxLCcgKyBmbGFnICsgJyknKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdGaWVsZCA9IGN0X3N0ZXBfZmxhZ1swXTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFkZEZpZWxkKG5ld0ZpZWxkLCArcmVxdWlyZUZsYWcpO1xuICAgICAgICAgICAgICAgIHRoaXMubW9yZUZpZWxkLnB1c2gobmV3RmllbGQpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmlzTW9yZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmlzU2VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pc1JlY2lldmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXNNb3JlID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFN0ZXAudHlwZV9pZCA9PT0gOCB8fCB0aGlzLnNlbGVjdGVkU3RlcC50eXBlX2lkID09PSAxMykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVwYXJ0bWVudExpc3QgPSBhd2FpdCB0aGlzLnJlcXVlc3QuZ2V0KCcvZGIvY3RfZXh0X2RlcGFydG1lbnQ/X3NvcnQ9bmFtZScpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVwYXJ0bWVudExpc3QgPSB0aGlzLmRlcGFydG1lbnRMaXN0Lm1hcChhID0+IGEubmFtZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1NlbmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNSZWNpZXZlID0gZmFsc2U7XG4gICAgICAgICAgICAvLyB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRTdGVwLnR5cGVfaWQgPT09IDkgfHwgdGhpcy5zZWxlY3RlZFN0ZXAudHlwZV9pZCA9PT0gMTQpIHtcbiAgICAgICAgICAgIC8vICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5yZXF1ZXN0LnBvc3QoJy9zcWwvZ2V0TGFzdFNlbmQnLCB0aGlzLnN0ZXBEYXRhKTtcbiAgICAgICAgICAgIC8vICAgICBpZiAoZGF0YS5yZXN1bHREYXRhICYmIGRhdGEucmVzdWx0RGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyAgICAgICAgIGNvbnN0IGN0X3N0ZXBfZGF0YV9pZCA9IGRhdGEucmVzdWx0RGF0YVswXS5pZDtcbiAgICAgICAgICAgIC8vICAgICAgICAgY29uc3QgY3Rfc2VuZExpc3QgPSBhd2FpdCB0aGlzLnJlcXVlc3QuZ2V0KCcvZGIvY3Rfc2VuZD9fd2hlcmU9KGN0X3N0ZXBfZGF0YV9pZCxlcSwnICsgY3Rfc3RlcF9kYXRhX2lkICsgJyknKTtcbiAgICAgICAgICAgIC8vICAgICAgICAgZm9yIChjb25zdCBjdF9zZW5kIG9mIGN0X3NlbmRMaXN0KSB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBjb25zdCByZWN2RGF0YTogYW55ID0ge1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIGN0X3NlbmRfaWQ6IGN0X3NlbmQuaWQsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgc2VuZF9ib29rX25vOiBjdF9zZW5kLmJvb2tfbm8sXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgc2VuZF9kYXRlOiBjdF9zZW5kLnNlbmRfZGF0ZSxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICByZWN2X2Zyb206IGN0X3NlbmQuc2VuZF90byxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBuYW1lOiBjdF9zZW5kLm5hbWVcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLnJlY2lldmVMaXN0LnB1c2gocmVjdkRhdGEpO1xuICAgICAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIHRoaXMuaXNSZWNpZXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmlzU2VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzU2VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNSZWNpZXZlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRGaWVsZElkKGRhdGEpIHtcbiAgICAgICAgbGV0IGlkID0gJyc7XG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgICAgaWQgKz0gJ3R4dCc7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnZGF0ZXRpbWUnKSB7XG4gICAgICAgICAgICBpZCArPSAndHh0JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlkICs9ICd0eHQnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZGF0YS5maWVsZF9uYW1lLmNoYXJBdCgwKS50b0xvY2FsZVVwcGVyQ2FzZSgpICsgZGF0YS5maWVsZF9uYW1lLnN1YnN0cmluZygxKTtcbiAgICAgICAgaWQgKz0gZmllbGQ7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICBhZGRGaWVsZChkYXRhLCByZXF1aXJlZCkge1xuICAgICAgICBsZXQgY29udHJvbDphbnkgPSA8Rm9ybUFycmF5PnRoaXMucmVnaXN0ZXJGb3JtLmNvbnRyb2xzWydtb3JlRmllbGQnXTtcbiAgICAgICAgbGV0IG5ld2dyb3VwO1xuICAgICAgICB0aGlzLnN0ZXBEYXRhW2RhdGEuZmllbGRfbmFtZV0gPSBudWxsO1xuICAgICAgICBpZiAoZGF0YS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgIGlmIChyZXF1aXJlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICBncm91cFtkYXRhLmZpZWxkX25hbWVdID0gWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXTtcbiAgICAgICAgICAgICAgICBuZXdncm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoZ3JvdXApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cDogYW55ID0ge307XG4gICAgICAgICAgICAgICAgZ3JvdXBbZGF0YS5maWVsZF9uYW1lXSA9IFsnJ107XG4gICAgICAgICAgICAgICAgbmV3Z3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKGdyb3VwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdkYXRldGltZScpIHtcbiAgICAgICAgICAgIGlmIChyZXF1aXJlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICBncm91cFtkYXRhLmZpZWxkX25hbWVdID0gWycnLFZhbGlkYXRvcnMucmVxdWlyZWQsIEN1c3RvbVZhbGlkYXRvcnMuZGF0ZV07XG4gICAgICAgICAgICAgICAgbmV3Z3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKGdyb3VwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgIGdyb3VwW2RhdGEuZmllbGRfbmFtZV0gPSBbJyddO1xuICAgICAgICAgICAgICAgIG5ld2dyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cChncm91cCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN0ZXBEYXRhW2RhdGEuZmllbGRfbmFtZV0gPSB0aGlzLmRhdGUuZ2V0Tm93KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgIGdyb3VwW2RhdGEuZmllbGRfbmFtZV0gPSBbVmFsaWRhdG9ycy5yZXF1aXJlZF07XG4gICAgICAgICAgICAgICAgbmV3Z3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKGdyb3VwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgIGdyb3VwW2RhdGEuZmllbGRfbmFtZV0gPSBbJyddO1xuICAgICAgICAgICAgICAgIG5ld2dyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cChncm91cCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnc3BlY2lhbCcpe1xuICAgICAgICAgICAgaWYoZGF0YS5maWVsZF9uYW1lID09PSAnYW1vdW50Jyl7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBbZGF0YS5maWVsZF9uYW1lXSA9IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF07XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwWydhbW91bnRfdHlwZSddID0gWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Z3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKGdyb3VwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cDogYW55ID0ge307XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwW2RhdGEuZmllbGRfbmFtZV0gPSBbJyddO1xuICAgICAgICAgICAgICAgICAgICBncm91cFsnYW1vdW50X3R5cGUnXSA9IFsnJ107XG4gICAgICAgICAgICAgICAgICAgIG5ld2dyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cChncm91cCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfWVsc2UgaWYoZGF0YS5maWVsZF9uYW1lID09PSAnZm9sbG93Jyl7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBbZGF0YS5maWVsZF9uYW1lXSA9IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF07XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwWydmb2xsb3dfcmVtYXJrJ10gPSBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdO1xuICAgICAgICAgICAgICAgICAgICBuZXdncm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoZ3JvdXApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBbZGF0YS5maWVsZF9uYW1lXSA9IFsnJ107XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwWydmb2xsb3dfcmVtYXJrJ10gPSBbJyddO1xuICAgICAgICAgICAgICAgICAgICBuZXdncm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoZ3JvdXApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cDogYW55ID0ge307XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwW2RhdGEuZmllbGRfbmFtZV0gPSBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdO1xuICAgICAgICAgICAgICAgICAgICBuZXdncm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoZ3JvdXApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBbZGF0YS5maWVsZF9uYW1lXSA9IFsnJ107XG4gICAgICAgICAgICAgICAgICAgIG5ld2dyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cChncm91cCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udHJvbC5wdXNoKG5ld2dyb3VwKTtcbiAgICB9XG5cbiAgICBnZXRWYWxpZGF0ZU1vcmVGaWVsZChpLCBmaWVsZCwgdmFsaWRhdGVUeXBlPykge1xuICAgICAgICBsZXQgZm9ybU1vcmVGaWVsZDogYW55ID0gdGhpcy5mKClbJ21vcmVGaWVsZCddO1xuICAgICAgICBpZiAodmFsaWRhdGVUeXBlKSB7XG4gICAgICAgICAgICBmb3JtTW9yZUZpZWxkID0gZm9ybU1vcmVGaWVsZC5jb250cm9sc1tpXTtcbiAgICAgICAgICAgIGZvcm1Nb3JlRmllbGQgPSBmb3JtTW9yZUZpZWxkLmNvbnRyb2xzW2ZpZWxkXTtcbiAgICAgICAgICAgIGlmIChmb3JtTW9yZUZpZWxkLmVycm9ycykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmb3JtTW9yZUZpZWxkLmVycm9yc1t2YWxpZGF0ZVR5cGVdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybU1vcmVGaWVsZC5lcnJvcnM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybU1vcmVGaWVsZC5lcnJvcnM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRSb3dJbmRleChkYXRhKSB7XG4gICAgICAgIGlmICghZGF0YS5kYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm8gPSBkYXRhLnJvdy5kYXRhSW5kZXggKyAxO1xuICAgICAgICByZXR1cm4gbm87XG4gICAgfVxuXG4gICAgb25DZWxsUHJlcGFyZWQoZSkge1xuICAgICAgICBpZiAoZS5yb3dUeXBlID09PSAnZGF0YScpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiBlLmNvbXBvbmVudC5jb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuY29sdW1uLmRhdGFGaWVsZCA9PT0gZS5jb21wb25lbnQuY29sdW1uc1tpXSkge1xuICAgICAgICAgICAgICAgICAgICBlLmNlbGxFbGVtZW50LmFjY2Vzc0tleSA9IGUuY29tcG9uZW50LmNvbHVtbnNbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkU2VuZCgpe1xuICAgICAgICB0aGlzLnNlbmREYXRhLnNlbmRfZGF0ZSA9IHRoaXMuZGF0ZS5nZXROb3coKTtcbiAgICAgICAgdGhpcy5zZW5kTW9kYWwuc2hvdygpO1xuICAgIH1cblxuICAgIGVkaXRTZW5kKGRhdGEpIHtcbiAgICAgICAgdGhpcy50bXBEYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5zZW5kRGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgICAgICAvLyB0aGlzLnNlbmREYXRhLnNlbmRfZGF0ZSA9IG5ldyBEYXRlKHRoaXMuc2VuZERhdGEuc2VuZF9kYXRlKTtcbiAgICAgICAgdGhpcy5pc0VkaXRTZW5kID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZW5kTW9kYWwuc2hvdygpO1xuICAgIH1cblxuICAgIGVkaXRSZWNpZXZlKGRhdGEpIHtcbiAgICAgICAgdGhpcy50bXBEYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5yZWNpZXZlRGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgICAgICB0aGlzLnJlY2lldmVEYXRhLnJlY3ZfZGF0ZSA9IHRoaXMucmVjaWV2ZURhdGEucmVjdl9kYXRlID8gbmV3IERhdGUodGhpcy5yZWNpZXZlRGF0YS5yZWN2X2RhdGUpIDogdGhpcy5yZWNpZXZlRGF0YS5yZWN2X2RhdGU7XG4gICAgICAgIHRoaXMuaXNFZGl0UmVjaWV2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVjaWV2ZU1vZGFsLnNob3coKTtcbiAgICB9XG5cbiAgICBmaWx0ZXJEZXBhcnRtZW50cyhldmVudCkge1xuICAgICAgICB0aGlzLmZpbHRlcmVkRGVwYXJ0bWVudHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRlcGFydG1lbnRMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBkZXBhcnRtZW50ID0gdGhpcy5kZXBhcnRtZW50TGlzdFtpXTtcbiAgICAgICAgICAgIGlmIChkZXBhcnRtZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihldmVudC5xdWVyeS50b0xvd2VyQ2FzZSgpKSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZERlcGFydG1lbnRzLnB1c2goZGVwYXJ0bWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBvblN1Ym1pdCgpIHtcbiAgICAgICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xuICAgICAgICAvLyDguJbguYnguLIgZm9ybSDguYTguKHguYjguITguKPguJrguKvguKPguLfguK3guJzguLTguJTguJXguLLguKHguYDguIfguLfguYjguK3guJnguYTguILguJfguLXguYjguJXguLHguYnguIfguYTguKfguYnguIjguLDguIjguJrguJfguLXguYjguJXguKPguIfguJnguLXguYlcbiAgICAgICAgY29uc29sZS5sb2coJ3RoaXMucmVnaXN0ZXJGb3JtLmludmFsaWQ6ICcsIHRoaXMucmVnaXN0ZXJGb3JtLmludmFsaWQpO1xuICAgICAgICBpZiAodGhpcy5yZWdpc3RlckZvcm0uaW52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwb3N0RGF0YSA9IFtdO1xuICAgICAgICBsZXQgZGF0YSA9IF8uY2xvbmVEZWVwKHRoaXMuc3RlcERhdGEpO1xuICAgICAgICBkYXRhLmFjdGlvbiA9IFwiYWRkXCI7XG4gICAgICAgIGxldCB1c2VyRGF0YTphbnkgPSB0aGlzLmIyYlNlcnZpY2UuZ2V0VmVyaWZ5VG9rZW4oKTtcbiAgICAgICAgZGF0YS51c2VybmFtZSA9IHVzZXJEYXRhLnVzZXJuYW1lO1xuICAgICAgICBpZihkYXRhLnJlbWluZF9kYXRlKSBkYXRhLnJlbWluZF9kYXRlID0gdGhpcy5kYXRlLmdldE5vdygpLmFkZChkYXRhLnJlbWluZF9kYXRlLCAnZCcpLnRvRGF0ZSgpO1xuICAgICAgICBkZWxldGUgZGF0YVtcImN0X21haW5faWRcIl07XG4gICAgICAgIGRlbGV0ZSBkYXRhW1widXBkYXRlX2RhdGVcIl07XG4gICAgICAgIGxldCBtYWluID0ge1xuICAgICAgICAgICAgXCJjdF9zdGVwX2RhdGFcIjpbZGF0YV1cbiAgICAgICAgfVxuICAgICAgICBwb3N0RGF0YS5wdXNoKG1haW4pO1xuICAgICAgICBpZih0aGlzLnNlbmRMaXN0ICYmIHRoaXMuc2VuZExpc3QubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICBsZXQgY3Rfc2VuZCA9IHtcbiAgICAgICAgICAgICAgICBcImN0X3NlbmRcIjpbXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBjdF9yZWNpZXZlID0ge1xuICAgICAgICAgICAgICAgIFwiY3RfcmVjaWV2ZVwiOltdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZm9yKGxldCBkYXRhIG9mIHRoaXMuc2VuZExpc3Qpe1xuICAgICAgICAgICAgICAgIGRhdGEubmFtZSA9IGRhdGEubmFtZTtcbiAgICAgICAgICAgICAgICBkYXRhLmFjdGlvbiA9IFwiYWRkXCI7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGRhdGEuaWQ7XG4gICAgICAgICAgICAgICAgY3Rfc2VuZC5jdF9zZW5kLnB1c2goZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3N0RGF0YS5wdXNoKGN0X3NlbmQpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMucmVjaWV2ZUxpc3QgJiYgdGhpcy5yZWNpZXZlTGlzdC5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgIGxldCBjdF9yZWNpZXZlID0ge1xuICAgICAgICAgICAgICAgIFwiY3RfcmVjaWV2ZVwiOltdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZm9yKGxldCBkYXRhIG9mIHRoaXMucmVjaWV2ZUxpc3Qpe1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhWydzZW5kX2Jvb2tfbm8nXTtcbiAgICAgICAgICAgICAgICBkZWxldGUgZGF0YVsnc2VuZF9kYXRlJ107XG4gICAgICAgICAgICAgICAgZGF0YS5uYW1lID0gZGF0YS5uYW1lO1xuICAgICAgICAgICAgICAgIGRhdGEuYWN0aW9uID0gXCJhZGRcIjtcbiAgICAgICAgICAgICAgICBjdF9yZWNpZXZlLmN0X3JlY2lldmUucHVzaChkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvc3REYXRhLnB1c2goY3RfcmVjaWV2ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coJ3Bvc3REYXRhJyxwb3N0RGF0YSk7XG4gICAgICAgIC8vIGlmKHRoaXMubW9kZSA9PT0gJ0VESVQnKXtcbiAgICAgICAgbGV0IHBvc3RSZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdC5wb3N0KFwiL2N0L21haW5cIixwb3N0RGF0YSk7XG4gICAgICAgIGlmKHRoaXMuc3RlcERhdGEudXBkYXRlX2RhdGUpe1xuICAgICAgICAgIGxldCBzdGVwTGlzdCA9IGF3YWl0IHRoaXMuZ2V0U3RlcExpc3QoKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInN0ZXBMaXN0XCIsc3RlcExpc3QpXG4gICAgICAgICAgaWYoc3RlcExpc3QubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3QucHV0KFwiL2RiL1wiK3RoaXMuc3RlcERhdGEucmVmX3RhYmxlK1wiL1wiK3RoaXMuc3RlcERhdGEucmVmX2lkLHtzdGF0dXM6c3RlcExpc3RbMF0uc3RlcF9uYW1lLHN0YXR1c19kYXRlOnN0ZXBMaXN0WzBdLnN0ZXBfZGF0ZX0pO1xuICAgICAgICAgICAgdGhpcy5jb21tb24uZm5DaGVja1Jlc3BvbnNlKHBvc3RSZXNwb25zZSwgdGhpcy5teU1vZGFsKVxuICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0LnB1dChcIi9kYi9cIit0aGlzLnN0ZXBEYXRhLnJlZl90YWJsZStcIi9cIit0aGlzLnN0ZXBEYXRhLnJlZl9pZCx7c3RhdHVzOnRoaXMuc3RlcERhdGEuc3RlcF9uYW1lfSk7XG4gICAgICAgICAgdGhpcy5jb21tb24uZm5DaGVja1Jlc3BvbnNlKHBvc3RSZXNwb25zZSwgdGhpcy5teU1vZGFsKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gfWVsc2V7XG4gICAgICAgIC8vICAgICB0aGlzLm9uQ3JlYXRlTW9kYWwuZW1pdChwb3N0RGF0YSk7XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICBhc3luYyBnZXRTdGVwTGlzdCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2dldFN0ZXBMaXN0Jyk7XG4gICAgICAgIGxldCBmaWx0ZXIgPSB7XG4gICAgICAgICAgICBmaWx0ZXI6e1xuICAgICAgICAgICAgICAgIHJlZl90YWJsZTpcIj1cIit0aGlzLnN0ZXBEYXRhLnJlZl90YWJsZSxcbiAgICAgICAgICAgICAgICByZWZfaWQ6dGhpcy5zdGVwRGF0YS5yZWZfaWQsXG4gICAgICAgICAgICAgICAgc3lzdGVtX2lkOnRoaXMuc3RlcERhdGEuc3lzdGVtX2lkXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3JkZXJfYnk6W1wic3RlcF9kYXRlIGRlc2NcIl1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5yZXF1ZXN0LnBvc3QoJy9zZWFyY2gvY3Rfc3RlcF9kYXRhJywgZmlsdGVyKTtcbiAgICAgICAgcmV0dXJuIGRhdGEucmVzdWx0RGF0YSB8fCBbXTtcbiAgICB9XG5cblxuICAgIG9uQ2xpY2tCYWNrKCl7XG4gICAgICAgIHRoaXMub25VcGRhdGVNb2RhbC5lbWl0KCk7XG4gICAgICAgIHRoaXMuY2xvc2VNb2RhbCgpO1xuICAgIH1cblxuICAgIGFzeW5jIG9uU3VibWl0U2VuZCgpIHtcbiAgICAgICAgdGhpcy5zdWJtaXR0ZWRTZW5kID0gdHJ1ZTtcbiAgICAgICAgLy8g4LiW4LmJ4LiyIGZvcm0g4LmE4Lih4LmI4LiE4Lij4Lia4Lir4Lij4Li34Lit4Lic4Li04LiU4LiV4Liy4Lih4LmA4LiH4Li34LmI4Lit4LiZ4LmE4LiC4LiX4Li14LmI4LiV4Lix4LmJ4LiH4LmE4Lin4LmJ4LiI4Liw4LiI4Lia4LiX4Li14LmI4LiV4Lij4LiH4LiZ4Li14LmJXG4gICAgICAgIGlmICh0aGlzLnNlbmRGb3JtLmludmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0VkaXRTZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0bXBMaXN0ID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRtcFNlbmQgb2YgdGhpcy5zZW5kTGlzdCkge1xuICAgICAgICAgICAgICAgIGlmICh0bXBTZW5kLmlkID09PSB0aGlzLnRtcERhdGEuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdG1wTGlzdC5wdXNoKHRoaXMuc2VuZERhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRtcExpc3QucHVzaCh0bXBTZW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNlbmRMaXN0ID0gdG1wTGlzdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZERhdGEuaWQgPSB0aGlzLnRlbXBJZDtcbiAgICAgICAgICAgIHRoaXMudGVtcElkLS07XG4gICAgICAgICAgICB0aGlzLnNlbmRMaXN0LnB1c2godGhpcy5zZW5kRGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbG9zZVNlbmRNb2RhbCgpO1xuICAgIH1cblxuICAgIGFzeW5jIG9uU3VibWl0UmVjaWV2ZSgpIHtcbiAgICAgICAgdGhpcy5zdWJtaXR0ZWRTZW5kID0gdHJ1ZTtcblxuICAgICAgICAvLyDguJbguYnguLIgZm9ybSDguYTguKHguYjguITguKPguJrguKvguKPguLfguK3guJzguLTguJTguJXguLLguKHguYDguIfguLfguYjguK3guJnguYTguILguJfguLXguYjguJXguLHguYnguIfguYTguKfguYnguIjguLDguIjguJrguJfguLXguYjguJXguKPguIfguJnguLXguYlcbiAgICAgICAgaWYgKHRoaXMucmVjaWV2ZUZvcm0uaW52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRWRpdFJlY2lldmUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRtcExpc3QgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdG1wU2VuZCBvZiB0aGlzLnJlY2lldmVMaXN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRtcFNlbmQucmVjdl9mcm9tID09PSB0aGlzLnRtcERhdGEucmVjdl9mcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgIHRtcExpc3QucHVzaCh0aGlzLnJlY2lldmVEYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0bXBMaXN0LnB1c2godG1wU2VuZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWNpZXZlTGlzdCA9IHRtcExpc3Q7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlY2lldmVMaXN0LnB1c2godGhpcy5yZWNpZXZlRGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbG9zZVJlY2lldmVNb2RhbCgpO1xuICAgIH1cbiAgICBpc0ltcG9ydGFudChkYXRhKXtcbiAgICAgICAgcmV0dXJuIGRhdGEuaXNfaW1wb3J0YW50P1wi4Liq4Liz4LiE4Lix4LiNXCI6XCJcIjtcbiAgICB9XG4gICAgb25VcGxvYWRlZChkYXRhKXtcbiAgICAgICAgdGhpcy5zdGVwRGF0YS51cmwgPSB0aGlzLmF0dGFjaG1lbnRVcmwrJy8nK2RhdGEudXVpZDtcbiAgICAgICAgdGhpcy5zdGVwRGF0YS51dWlkID0gZGF0YS51dWlkO1xuICAgIH1cbiAgICBjaGVja0Rpc2FibGUoZmllbGQpe1xuICAgICAgICBpZih0aGlzLnN0ZXBEYXRhW2ZpZWxkLmZpZWxkX25hbWVdICE9PSAn4LmE4Lih4LmI4LiX4Liy4LiH4LiB4Liy4LijJyl7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBnZXRJbWFnZUxpbmsoZGF0YSl7XG4gICAgICAgIGxldCB1cmwgPSBhd2FpdCB0aGlzLnJlcXVlc3QuZ2V0QXR0YWNobWVudExpbmtUb2tlbihkYXRhLnVybCk7XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxufVxuIl19