taxtank-core 0.29.35 → 0.29.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/taxtank-core.umd.js +154 -76
- package/bundles/taxtank-core.umd.js.map +1 -1
- package/esm2015/lib/collections/collection.js +18 -5
- package/esm2015/lib/collections/property/property.collection.js +2 -2
- package/esm2015/lib/collections/subscription/service-product.collection.js +4 -1
- package/esm2015/lib/collections/subscription/service-subscription.collection.js +4 -1
- package/esm2015/lib/db/Enums/chart-accounts/chart-accounts-list.enum.js +2 -1
- package/esm2015/lib/forms/transaction/index.js +3 -2
- package/esm2015/lib/forms/transaction/transaction.form.js +5 -2
- package/esm2015/lib/forms/transaction/work/work-expense.form.js +21 -0
- package/esm2015/lib/forms/transaction/work/work-income.form.js +87 -0
- package/esm2015/lib/forms/transaction/work/work-transaction.form.js +40 -0
- package/esm2015/lib/models/chart-accounts/chart-accounts.js +2 -2
- package/esm2015/lib/services/http/user/user.service.js +2 -2
- package/fesm2015/taxtank-core.js +133 -76
- package/fesm2015/taxtank-core.js.map +1 -1
- package/lib/collections/collection.d.ts +6 -2
- package/lib/collections/subscription/service-product.collection.d.ts +1 -0
- package/lib/collections/subscription/service-subscription.collection.d.ts +1 -0
- package/lib/db/Enums/chart-accounts/chart-accounts-list.enum.d.ts +1 -0
- package/lib/forms/transaction/index.d.ts +2 -1
- package/lib/forms/transaction/work/work-expense.form.d.ts +6 -0
- package/lib/forms/transaction/{work-income.form.d.ts → work/work-income.form.d.ts} +4 -8
- package/lib/forms/transaction/work/work-transaction.form.d.ts +15 -0
- package/package.json +1 -1
- package/esm2015/lib/forms/transaction/work-income.form.js +0 -109
|
@@ -39,9 +39,13 @@ export declare class Collection<Model extends AbstractModel> implements Iterable
|
|
|
39
39
|
findBy(path: string, value: any): Model | null;
|
|
40
40
|
findIndexBy(path: string, value: any): number;
|
|
41
41
|
push(...items: Model[]): this;
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
remove(...items: Model[]): this;
|
|
43
|
+
/**
|
|
44
|
+
* @TODO it's filter, not remove
|
|
45
|
+
*/
|
|
44
46
|
removeBy(path: string, values: any): this;
|
|
47
|
+
replaceBy(path: string, value: any, item: Model): this;
|
|
48
|
+
diff(items: Model[]): this;
|
|
45
49
|
minBy(path: string): Model;
|
|
46
50
|
maxBy(path: string): Model;
|
|
47
51
|
reduce(callback: (sum: number, item: Model) => number, init?: number): number;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { IEventListener } from '../../../interfaces';
|
|
2
|
+
import { WorkTransactionForm } from './work-transaction.form';
|
|
3
|
+
export declare class WorkExpenseForm extends WorkTransactionForm implements IEventListener {
|
|
4
|
+
listenEvents(): void;
|
|
5
|
+
watchChartAccountsMetadata(): void;
|
|
6
|
+
}
|
|
@@ -1,16 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
export declare class WorkIncomeForm extends
|
|
1
|
+
import { Transaction, TransactionAllocation } from '../../../models';
|
|
2
|
+
import { IEventListener } from '../../../interfaces';
|
|
3
|
+
import { WorkTransactionForm } from './work-transaction.form';
|
|
4
|
+
export declare class WorkIncomeForm extends WorkTransactionForm implements IEventListener {
|
|
5
5
|
constructor(transaction: Transaction, registeredForGst: boolean, allocations: TransactionAllocation[]);
|
|
6
6
|
listenEvents(): void;
|
|
7
7
|
private watchIncomeSource;
|
|
8
8
|
private updateTaxValue;
|
|
9
9
|
watchChartAccounts(): void;
|
|
10
|
-
/**
|
|
11
|
-
* depends on chartAccounts the form could include different extra fields
|
|
12
|
-
*/
|
|
13
|
-
private buildMetadataForm;
|
|
14
10
|
/**
|
|
15
11
|
* salary comes to bankAccount together with related transactions like tips (kind of salary, but reported in different tax summary section),
|
|
16
12
|
* adjustments used to clarify received payment by separating it into multiple transactions,
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { TransactionForm } from '../transaction.form';
|
|
2
|
+
import { IEventListener } from '../../../interfaces';
|
|
3
|
+
import { Transaction, TransactionAllocation } from '../../../models';
|
|
4
|
+
import { AbstractControl } from '@angular/forms';
|
|
5
|
+
export declare abstract class WorkTransactionForm extends TransactionForm implements IEventListener {
|
|
6
|
+
constructor(transaction: Transaction, registeredForGst: boolean, allocations: TransactionAllocation[], controls?: {
|
|
7
|
+
[key: string]: AbstractControl;
|
|
8
|
+
});
|
|
9
|
+
listenEvents(): void;
|
|
10
|
+
watchChartAccounts(): void;
|
|
11
|
+
/**
|
|
12
|
+
* depends on chartAccounts the form could include different extra fields
|
|
13
|
+
*/
|
|
14
|
+
private buildMetadataForm;
|
|
15
|
+
}
|
package/package.json
CHANGED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import { TransactionForm } from './transaction.form';
|
|
2
|
-
import { FormArray, FormControl, FormGroup, Validators } from '@angular/forms';
|
|
3
|
-
import { IncomeSource } from '../../models/income-source/income-source';
|
|
4
|
-
import { autocompleteValidator } from '../../validators';
|
|
5
|
-
import { Collection } from '../../collections';
|
|
6
|
-
import { TransactionOperationEnum } from '../../db/Enums/transaction-operation.enum';
|
|
7
|
-
export class WorkIncomeForm extends TransactionForm {
|
|
8
|
-
constructor(transaction, registeredForGst, allocations) {
|
|
9
|
-
var _a;
|
|
10
|
-
// for work income we need to show netAmount instead of amount (because some adjustments are included in amount)
|
|
11
|
-
transaction.amount = transaction.netAmount;
|
|
12
|
-
super(transaction, registeredForGst, allocations, {
|
|
13
|
-
// additional data related to work income (like tax instalments)
|
|
14
|
-
metadata: new FormArray((transaction.metadata || []).map((transactionMetadata) => {
|
|
15
|
-
return new FormGroup({
|
|
16
|
-
value: new FormControl(transactionMetadata.value),
|
|
17
|
-
chartAccountsMetadata: new FormControl(transactionMetadata.chartAccountsMetadata)
|
|
18
|
-
});
|
|
19
|
-
})),
|
|
20
|
-
tax: new FormControl({
|
|
21
|
-
value: transaction.tax,
|
|
22
|
-
disabled: !transaction.chartAccounts || transaction.chartAccounts.isNRAS(),
|
|
23
|
-
}, Validators.required),
|
|
24
|
-
incomeSource: new FormControl(transaction.incomeSource, [Validators.required, autocompleteValidator()]),
|
|
25
|
-
});
|
|
26
|
-
// forbid to edit some fields for allocated transaction
|
|
27
|
-
if (allocations.length) {
|
|
28
|
-
this.get('chartAccounts').disable();
|
|
29
|
-
}
|
|
30
|
-
// adjustments allowed only for salary
|
|
31
|
-
if (!((_a = transaction.chartAccounts) === null || _a === void 0 ? void 0 : _a.isSalary())) {
|
|
32
|
-
this.get('transactions').disable();
|
|
33
|
-
}
|
|
34
|
-
// amount changes are not available for transactions with allocations or during allocate process
|
|
35
|
-
if (allocations.length || transaction.operation === TransactionOperationEnum.ALLOCATE) {
|
|
36
|
-
this.get('amount').disable();
|
|
37
|
-
}
|
|
38
|
-
// prefill tax value for preselected salary income source
|
|
39
|
-
if (!this.get('tax').value && transaction.incomeSource && transaction.incomeSource.isSalaryIncome()) {
|
|
40
|
-
this.updateTaxValue(transaction.incomeSource);
|
|
41
|
-
}
|
|
42
|
-
this.listenEvents();
|
|
43
|
-
}
|
|
44
|
-
listenEvents() {
|
|
45
|
-
this.watchIncomeSource();
|
|
46
|
-
this.watchChartAccounts();
|
|
47
|
-
}
|
|
48
|
-
watchIncomeSource() {
|
|
49
|
-
this.get('incomeSource').valueChanges.subscribe((incomeSource) => {
|
|
50
|
-
// prefill salary tax with its income source forecast
|
|
51
|
-
if (incomeSource instanceof IncomeSource && incomeSource.isSalaryIncome() && !this.get('tax').value) {
|
|
52
|
-
this.updateTaxValue(incomeSource);
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
updateTaxValue(incomeSource) {
|
|
57
|
-
this.get('tax').setValue(incomeSource.salaryForecasts[0].taxWithheld);
|
|
58
|
-
}
|
|
59
|
-
watchChartAccounts() {
|
|
60
|
-
super.watchChartAccounts();
|
|
61
|
-
this.get('chartAccounts').valueChanges.subscribe((chartAccounts) => {
|
|
62
|
-
this.buildMetadataForm();
|
|
63
|
-
// tax make no sense for pre-paying tax category
|
|
64
|
-
if (chartAccounts.isNRAS()) {
|
|
65
|
-
this.get('tax').disable();
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
this.get('tax').enable();
|
|
69
|
-
}
|
|
70
|
-
// adjustments possible only for salary chartAccounts
|
|
71
|
-
if (chartAccounts.isSalary()) {
|
|
72
|
-
this.get('transactions').enable();
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
this.get('transactions').disable();
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* depends on chartAccounts the form could include different extra fields
|
|
81
|
-
*/
|
|
82
|
-
buildMetadataForm() {
|
|
83
|
-
// Remove all controls in the FormArray before pushing
|
|
84
|
-
this.get('metadata').clear();
|
|
85
|
-
// create form controls for each metadata object from selected chart accounts
|
|
86
|
-
(this.get('chartAccounts').value.metadata).forEach((chartAccountsMetadata) => {
|
|
87
|
-
this.get('metadata').push(new FormGroup({
|
|
88
|
-
value: new FormControl(chartAccountsMetadata.isSharePercentage() ? 100 : 0),
|
|
89
|
-
chartAccountsMetadata: new FormControl(chartAccountsMetadata),
|
|
90
|
-
}));
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* salary comes to bankAccount together with related transactions like tips (kind of salary, but reported in different tax summary section),
|
|
95
|
-
* adjustments used to clarify received payment by separating it into multiple transactions,
|
|
96
|
-
* netAmount always match received payment and includes related adjustments
|
|
97
|
-
* amount calculated as netAmount - salary included adjustments
|
|
98
|
-
* ie bankTransaction=1000$ with 900$ salary and 100$ tips will create 2 transactions with 900$ and 100$
|
|
99
|
-
*/
|
|
100
|
-
getAmount() {
|
|
101
|
-
return this.get('amount').value - new Collection(this.currentValue.transactions)
|
|
102
|
-
.filter((t) => { var _a; return (_a = t.chartAccounts) === null || _a === void 0 ? void 0 : _a.isSalaryIncluded(); })
|
|
103
|
-
.sumBy('amount');
|
|
104
|
-
}
|
|
105
|
-
submit(data = {}) {
|
|
106
|
-
return super.submit(Object.assign(data, { amount: this.getAmount() }));
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yay1pbmNvbWUuZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R0LWNvcmUvc3JjL2xpYi9mb3Jtcy90cmFuc2FjdGlvbi93b3JrLWluY29tZS5mb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQVFuRCxPQUFPLEVBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0UsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUVyRixNQUFNLE9BQU8sY0FBZSxTQUFRLGVBQWU7SUFDakQsWUFBWSxXQUF3QixFQUFFLGdCQUF5QixFQUFFLFdBQW9DOztRQUNuRyxnSEFBZ0g7UUFDaEgsV0FBVyxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDO1FBRTNDLEtBQUssQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFO1lBQ2hELGdFQUFnRTtZQUNoRSxRQUFRLEVBQUUsSUFBSSxTQUFTLENBQ3JCLENBQUMsV0FBVyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxtQkFBd0MsRUFBYSxFQUFFO2dCQUN2RixPQUFPLElBQUksU0FBUyxDQUFDO29CQUNuQixLQUFLLEVBQUUsSUFBSSxXQUFXLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDO29CQUNqRCxxQkFBcUIsRUFBRSxJQUFJLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FB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QUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsTUFBTSxDQUFDLE9BQWUsRUFBRTtRQUN0QixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7VHJhbnNhY3Rpb25Gb3JtfSBmcm9tICcuL3RyYW5zYWN0aW9uLmZvcm0nO1xuaW1wb3J0IHtcbiAgQ2hhcnRBY2NvdW50cyxcbiAgQ2hhcnRBY2NvdW50c01ldGFkYXRhLFxuICBUcmFuc2FjdGlvbixcbiAgVHJhbnNhY3Rpb25BbGxvY2F0aW9uLFxuICBUcmFuc2FjdGlvbk1ldGFkYXRhXG59IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQge0Zvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtJRXZlbnRMaXN0ZW5lcn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9ldmVudC1saXN0ZW5lci5pbnRlcmZhY2UnO1xuaW1wb3J0IHtJbmNvbWVTb3VyY2V9IGZyb20gJy4uLy4uL21vZGVscy9pbmNvbWUtc291cmNlL2luY29tZS1zb3VyY2UnO1xuaW1wb3J0IHthdXRvY29tcGxldGVWYWxpZGF0b3J9IGZyb20gJy4uLy4uL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHtDb2xsZWN0aW9ufSBmcm9tICcuLi8uLi9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbk9wZXJhdGlvbkVudW0gfSBmcm9tICcuLi8uLi9kYi9FbnVtcy90cmFuc2FjdGlvbi1vcGVyYXRpb24uZW51bSc7XG5cbmV4cG9ydCBjbGFzcyBXb3JrSW5jb21lRm9ybSBleHRlbmRzIFRyYW5zYWN0aW9uRm9ybSBpbXBsZW1lbnRzIElFdmVudExpc3RlbmVyIHtcbiAgY29uc3RydWN0b3IodHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uLCByZWdpc3RlcmVkRm9yR3N0OiBib29sZWFuLCBhbGxvY2F0aW9uczogVHJhbnNhY3Rpb25BbGxvY2F0aW9uW10pIHtcbiAgICAvLyBmb3Igd29yayBpbmNvbWUgd2UgbmVlZCB0byBzaG93IG5ldEFtb3VudCBpbnN0ZWFkIG9mIGFtb3VudCAoYmVjYXVzZSBzb21lIGFkanVzdG1lbnRzIGFyZSBpbmNsdWRlZCBpbiBhbW91bnQpXG4gICAgdHJhbnNhY3Rpb24uYW1vdW50ID0gdHJhbnNhY3Rpb24ubmV0QW1vdW50O1xuXG4gICAgc3VwZXIodHJhbnNhY3Rpb24sIHJlZ2lzdGVyZWRGb3JHc3QsIGFsbG9jYXRpb25zLCB7XG4gICAgICAvLyBhZGRpdGlvbmFsIGRhdGEgcmVsYXRlZCB0byB3b3JrIGluY29tZSAobGlrZSB0YXggaW5zdGFsbWVudHMpXG4gICAgICBtZXRhZGF0YTogbmV3IEZvcm1BcnJheShcbiAgICAgICAgKHRyYW5zYWN0aW9uLm1ldGFkYXRhIHx8IFtdKS5tYXAoKHRyYW5zYWN0aW9uTWV0YWRhdGE6IFRyYW5zYWN0aW9uTWV0YWRhdGEpOiBGb3JtR3JvdXAgPT4ge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ybUdyb3VwKHtcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgRm9ybUNvbnRyb2wodHJhbnNhY3Rpb25NZXRhZGF0YS52YWx1ZSksXG4gICAgICAgICAgICBjaGFydEFjY291bnRzTWV0YWRhdGE6IG5ldyBGb3JtQ29udHJvbCh0cmFuc2FjdGlvbk1ldGFkYXRhLmNoYXJ0QWNjb3VudHNNZXRhZGF0YSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICksXG4gICAgICB0YXg6IG5ldyBGb3JtQ29udHJvbCh7XG4gICAgICAgIHZhbHVlOiB0cmFuc2FjdGlvbi50YXgsXG4gICAgICAgIGRpc2FibGVkOiAhdHJhbnNhY3Rpb24uY2hhcnRBY2NvdW50cyB8fCB0cmFuc2FjdGlvbi5jaGFydEFjY291bnRzLmlzTlJBUygpLFxuICAgICAgfSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBpbmNvbWVTb3VyY2U6IG5ldyBGb3JtQ29udHJvbCh0cmFuc2FjdGlvbi5pbmNvbWVTb3VyY2UsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBhdXRvY29tcGxldGVWYWxpZGF0b3IoKV0pLFxuICAgIH0pO1xuXG4gICAgLy8gZm9yYmlkIHRvIGVkaXQgc29tZSBmaWVsZHMgZm9yIGFsbG9jYXRlZCB0cmFuc2FjdGlvblxuICAgIGlmIChhbGxvY2F0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZ2V0KCdjaGFydEFjY291bnRzJykuZGlzYWJsZSgpO1xuICAgIH1cbiAgICAvLyBhZGp1c3RtZW50cyBhbGxvd2VkIG9ubHkgZm9yIHNhbGFyeVxuICAgIGlmICghdHJhbnNhY3Rpb24uY2hhcnRBY2NvdW50cz8uaXNTYWxhcnkoKSkge1xuICAgICAgdGhpcy5nZXQoJ3RyYW5zYWN0aW9ucycpLmRpc2FibGUoKTtcbiAgICB9XG4gICAgLy8gYW1vdW50IGNoYW5nZXMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIHRyYW5zYWN0aW9ucyB3aXRoIGFsbG9jYXRpb25zIG9yIGR1cmluZyBhbGxvY2F0ZSBwcm9jZXNzXG4gICAgaWYgKGFsbG9jYXRpb25zLmxlbmd0aCB8fCB0cmFuc2FjdGlvbi5vcGVyYXRpb24gPT09IFRyYW5zYWN0aW9uT3BlcmF0aW9uRW51bS5BTExPQ0FURSkge1xuICAgICAgdGhpcy5nZXQoJ2Ftb3VudCcpLmRpc2FibGUoKTtcbiAgICB9XG5cbiAgICAvLyBwcmVmaWxsIHRheCB2YWx1ZSBmb3IgcHJlc2VsZWN0ZWQgc2FsYXJ5IGluY29tZSBzb3VyY2VcbiAgICBpZiAoIXRoaXMuZ2V0KCd0YXgnKS52YWx1ZSAmJiB0cmFuc2FjdGlvbi5pbmNvbWVTb3VyY2UgJiYgdHJhbnNhY3Rpb24uaW5jb21lU291cmNlLmlzU2FsYXJ5SW5jb21lKCkpIHtcbiAgICAgIHRoaXMudXBkYXRlVGF4VmFsdWUodHJhbnNhY3Rpb24uaW5jb21lU291cmNlKTtcbiAgICB9XG5cbiAgICB0aGlzLmxpc3RlbkV2ZW50cygpO1xuICB9XG5cbiAgbGlzdGVuRXZlbnRzKCkge1xuICAgIHRoaXMud2F0Y2hJbmNvbWVTb3VyY2UoKTtcbiAgICB0aGlzLndhdGNoQ2hhcnRBY2NvdW50cygpO1xuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaEluY29tZVNvdXJjZSgpOiB2b2lkIHtcbiAgICB0aGlzLmdldCgnaW5jb21lU291cmNlJykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoaW5jb21lU291cmNlOiBzdHJpbmcgfCBJbmNvbWVTb3VyY2UpOiB2b2lkID0+IHtcbiAgICAgIC8vIHByZWZpbGwgc2FsYXJ5IHRheCB3aXRoIGl0cyBpbmNvbWUgc291cmNlIGZvcmVjYXN0XG4gICAgICBpZiAoaW5jb21lU291cmNlIGluc3RhbmNlb2YgSW5jb21lU291cmNlICYmIGluY29tZVNvdXJjZS5pc1NhbGFyeUluY29tZSgpICYmICF0aGlzLmdldCgndGF4JykudmFsdWUpIHtcbiAgICAgICAgdGhpcy51cGRhdGVUYXhWYWx1ZShpbmNvbWVTb3VyY2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVUYXhWYWx1ZShpbmNvbWVTb3VyY2U6IEluY29tZVNvdXJjZSk6IHZvaWQge1xuICAgIHRoaXMuZ2V0KCd0YXgnKS5zZXRWYWx1ZShpbmNvbWVTb3VyY2Uuc2FsYXJ5Rm9yZWNhc3RzWzBdLnRheFdpdGhoZWxkKTtcbiAgfVxuXG4gIHdhdGNoQ2hhcnRBY2NvdW50cygpOiB2b2lkIHtcbiAgICBzdXBlci53YXRjaENoYXJ0QWNjb3VudHMoKTtcbiAgICB0aGlzLmdldCgnY2hhcnRBY2NvdW50cycpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKGNoYXJ0QWNjb3VudHM6IENoYXJ0QWNjb3VudHMpID0+IHtcbiAgICAgIHRoaXMuYnVpbGRNZXRhZGF0YUZvcm0oKTtcblxuICAgICAgLy8gdGF4IG1ha2Ugbm8gc2Vuc2UgZm9yIHByZS1wYXlpbmcgdGF4IGNhdGVnb3J5XG4gICAgICBpZiAoY2hhcnRBY2NvdW50cy5pc05SQVMoKSkge1xuICAgICAgICB0aGlzLmdldCgndGF4JykuZGlzYWJsZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5nZXQoJ3RheCcpLmVuYWJsZSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBhZGp1c3RtZW50cyBwb3NzaWJsZSBvbmx5IGZvciBzYWxhcnkgY2hhcnRBY2NvdW50c1xuICAgICAgaWYgKGNoYXJ0QWNjb3VudHMuaXNTYWxhcnkoKSkge1xuICAgICAgICB0aGlzLmdldCgndHJhbnNhY3Rpb25zJykuZW5hYmxlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmdldCgndHJhbnNhY3Rpb25zJykuZGlzYWJsZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGRlcGVuZHMgb24gY2hhcnRBY2NvdW50cyB0aGUgZm9ybSBjb3VsZCBpbmNsdWRlIGRpZmZlcmVudCBleHRyYSBmaWVsZHNcbiAgICovXG4gIHByaXZhdGUgYnVpbGRNZXRhZGF0YUZvcm0oKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIGFsbCBjb250cm9scyBpbiB0aGUgRm9ybUFycmF5IGJlZm9yZSBwdXNoaW5nXG4gICAgKHRoaXMuZ2V0KCdtZXRhZGF0YScpIGFzIEZvcm1BcnJheSkuY2xlYXIoKTtcblxuICAgIC8vIGNyZWF0ZSBmb3JtIGNvbnRyb2xzIGZvciBlYWNoIG1ldGFkYXRhIG9iamVjdCBmcm9tIHNlbGVjdGVkIGNoYXJ0IGFjY291bnRzXG4gICAgKHRoaXMuZ2V0KCdjaGFydEFjY291bnRzJykudmFsdWUubWV0YWRhdGEpLmZvckVhY2goKGNoYXJ0QWNjb3VudHNNZXRhZGF0YTogQ2hhcnRBY2NvdW50c01ldGFkYXRhKTogdm9pZCA9PiB7XG4gICAgICAodGhpcy5nZXQoJ21ldGFkYXRhJykgYXMgRm9ybUFycmF5KS5wdXNoKFxuICAgICAgICBuZXcgRm9ybUdyb3VwKHtcbiAgICAgICAgICB2YWx1ZTogbmV3IEZvcm1Db250cm9sKGNoYXJ0QWNjb3VudHNNZXRhZGF0YS5pc1NoYXJlUGVyY2VudGFnZSgpID8gMTAwIDogMCksXG4gICAgICAgICAgY2hhcnRBY2NvdW50c01ldGFkYXRhOiBuZXcgRm9ybUNvbnRyb2woY2hhcnRBY2NvdW50c01ldGFkYXRhKSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogc2FsYXJ5IGNvbWVzIHRvIGJhbmtBY2NvdW50IHRvZ2V0aGVyIHdpdGggcmVsYXRlZCB0cmFuc2FjdGlvbnMgbGlrZSB0aXBzIChraW5kIG9mIHNhbGFyeSwgYnV0IHJlcG9ydGVkIGluIGRpZmZlcmVudCB0YXggc3VtbWFyeSBzZWN0aW9uKSxcbiAgICogYWRqdXN0bWVudHMgdXNlZCB0byBjbGFyaWZ5IHJlY2VpdmVkIHBheW1lbnQgYnkgc2VwYXJhdGluZyBpdCBpbnRvIG11bHRpcGxlIHRyYW5zYWN0aW9ucyxcbiAgICogbmV0QW1vdW50IGFsd2F5cyBtYXRjaCByZWNlaXZlZCBwYXltZW50IGFuZCBpbmNsdWRlcyByZWxhdGVkIGFkanVzdG1lbnRzXG4gICAqIGFtb3VudCBjYWxjdWxhdGVkIGFzIG5ldEFtb3VudCAtIHNhbGFyeSBpbmNsdWRlZCBhZGp1c3RtZW50c1xuICAgKiBpZSBiYW5rVHJhbnNhY3Rpb249MTAwMCQgd2l0aCA5MDAkIHNhbGFyeSBhbmQgMTAwJCB0aXBzIHdpbGwgY3JlYXRlIDIgdHJhbnNhY3Rpb25zIHdpdGggOTAwJCBhbmQgMTAwJFxuICAgKi9cbiAgZ2V0QW1vdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdhbW91bnQnKS52YWx1ZSAtIG5ldyBDb2xsZWN0aW9uKHRoaXMuY3VycmVudFZhbHVlLnRyYW5zYWN0aW9ucylcbiAgICAgIC5maWx0ZXIoKHQpID0+IHQuY2hhcnRBY2NvdW50cz8uaXNTYWxhcnlJbmNsdWRlZCgpKVxuICAgICAgLnN1bUJ5KCdhbW91bnQnKTtcbiAgfVxuXG4gIHN1Ym1pdChkYXRhOiBvYmplY3QgPSB7fSk6IFRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gc3VwZXIuc3VibWl0KE9iamVjdC5hc3NpZ24oZGF0YSwge2Ftb3VudDogdGhpcy5nZXRBbW91bnQoKX0pKTtcbiAgfVxufVxuIl19
|