@fin.cx/einvoice 5.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/classes.decoder.d.ts +40 -0
- package/dist_ts/classes.decoder.js +320 -0
- package/dist_ts/classes.encoder.d.ts +51 -0
- package/dist_ts/classes.encoder.js +293 -0
- package/dist_ts/classes.xinvoice.d.ts +136 -0
- package/dist_ts/classes.xinvoice.js +352 -0
- package/dist_ts/einvoice.d.ts +217 -0
- package/dist_ts/einvoice.js +505 -0
- package/dist_ts/errors.d.ts +121 -0
- package/dist_ts/errors.js +241 -0
- package/dist_ts/formats/base/base.decoder.d.ts +32 -0
- package/dist_ts/formats/base/base.decoder.js +52 -0
- package/dist_ts/formats/base/base.encoder.d.ts +13 -0
- package/dist_ts/formats/base/base.encoder.js +7 -0
- package/dist_ts/formats/base/base.validator.d.ts +44 -0
- package/dist_ts/formats/base/base.validator.js +39 -0
- package/dist_ts/formats/base.decoder.d.ts +19 -0
- package/dist_ts/formats/base.decoder.js +130 -0
- package/dist_ts/formats/base.validator.d.ts +44 -0
- package/dist_ts/formats/base.validator.js +39 -0
- package/dist_ts/formats/cii/cii.decoder.d.ts +61 -0
- package/dist_ts/formats/cii/cii.decoder.js +111 -0
- package/dist_ts/formats/cii/cii.encoder.d.ts +43 -0
- package/dist_ts/formats/cii/cii.encoder.js +48 -0
- package/dist_ts/formats/cii/cii.types.d.ts +31 -0
- package/dist_ts/formats/cii/cii.types.js +40 -0
- package/dist_ts/formats/cii/cii.validator.d.ts +56 -0
- package/dist_ts/formats/cii/cii.validator.js +146 -0
- package/dist_ts/formats/cii/facturx/facturx.decoder.d.ts +43 -0
- package/dist_ts/formats/cii/facturx/facturx.decoder.js +207 -0
- package/dist_ts/formats/cii/facturx/facturx.encoder.d.ts +82 -0
- package/dist_ts/formats/cii/facturx/facturx.encoder.js +400 -0
- package/dist_ts/formats/cii/facturx/facturx.types.d.ts +10 -0
- package/dist_ts/formats/cii/facturx/facturx.types.js +15 -0
- package/dist_ts/formats/cii/facturx/facturx.validator.d.ts +32 -0
- package/dist_ts/formats/cii/facturx/facturx.validator.js +138 -0
- package/dist_ts/formats/cii/zugferd/zugferd.decoder.d.ts +43 -0
- package/dist_ts/formats/cii/zugferd/zugferd.decoder.js +218 -0
- package/dist_ts/formats/cii/zugferd/zugferd.encoder.d.ts +97 -0
- package/dist_ts/formats/cii/zugferd/zugferd.encoder.js +550 -0
- package/dist_ts/formats/cii/zugferd/zugferd.types.d.ts +10 -0
- package/dist_ts/formats/cii/zugferd/zugferd.types.js +15 -0
- package/dist_ts/formats/cii/zugferd/zugferd.v1.decoder.d.ts +49 -0
- package/dist_ts/formats/cii/zugferd/zugferd.v1.decoder.js +229 -0
- package/dist_ts/formats/cii/zugferd/zugferd.validator.d.ts +16 -0
- package/dist_ts/formats/cii/zugferd/zugferd.validator.js +29 -0
- package/dist_ts/formats/decoder.factory.d.ts +15 -0
- package/dist_ts/formats/decoder.factory.js +46 -0
- package/dist_ts/formats/factories/decoder.factory.d.ts +13 -0
- package/dist_ts/formats/factories/decoder.factory.js +56 -0
- package/dist_ts/formats/factories/encoder.factory.d.ts +14 -0
- package/dist_ts/formats/factories/encoder.factory.js +40 -0
- package/dist_ts/formats/factories/validator.factory.d.ts +12 -0
- package/dist_ts/formats/factories/validator.factory.js +110 -0
- package/dist_ts/formats/factorx.decoder.d.ts +18 -0
- package/dist_ts/formats/factorx.decoder.js +178 -0
- package/dist_ts/formats/factorx.encoder.d.ts +51 -0
- package/dist_ts/formats/factorx.encoder.js +293 -0
- package/dist_ts/formats/facturx.decoder.d.ts +18 -0
- package/dist_ts/formats/facturx.decoder.js +210 -0
- package/dist_ts/formats/facturx.encoder.d.ts +51 -0
- package/dist_ts/formats/facturx.encoder.js +293 -0
- package/dist_ts/formats/facturx.validator.d.ts +67 -0
- package/dist_ts/formats/facturx.validator.js +266 -0
- package/dist_ts/formats/pdf/extractors/associated.extractor.d.ts +14 -0
- package/dist_ts/formats/pdf/extractors/associated.extractor.js +68 -0
- package/dist_ts/formats/pdf/extractors/base.extractor.d.ts +92 -0
- package/dist_ts/formats/pdf/extractors/base.extractor.js +319 -0
- package/dist_ts/formats/pdf/extractors/index.d.ts +4 -0
- package/dist_ts/formats/pdf/extractors/index.js +5 -0
- package/dist_ts/formats/pdf/extractors/standard.extractor.d.ts +13 -0
- package/dist_ts/formats/pdf/extractors/standard.extractor.js +74 -0
- package/dist_ts/formats/pdf/extractors/text.extractor.d.ts +45 -0
- package/dist_ts/formats/pdf/extractors/text.extractor.js +151 -0
- package/dist_ts/formats/pdf/pdf.embedder.d.ts +69 -0
- package/dist_ts/formats/pdf/pdf.embedder.js +183 -0
- package/dist_ts/formats/pdf/pdf.extractor.d.ts +49 -0
- package/dist_ts/formats/pdf/pdf.extractor.js +98 -0
- package/dist_ts/formats/pdf/robust-pdf.extractor.d.ts +40 -0
- package/dist_ts/formats/pdf/robust-pdf.extractor.js +324 -0
- package/dist_ts/formats/ubl/en16931.ubl.validator.d.ts +18 -0
- package/dist_ts/formats/ubl/en16931.ubl.validator.js +169 -0
- package/dist_ts/formats/ubl/generic/ubl.encoder.d.ts +151 -0
- package/dist_ts/formats/ubl/generic/ubl.encoder.js +892 -0
- package/dist_ts/formats/ubl/ubl.decoder.d.ts +61 -0
- package/dist_ts/formats/ubl/ubl.decoder.js +95 -0
- package/dist_ts/formats/ubl/ubl.encoder.d.ts +38 -0
- package/dist_ts/formats/ubl/ubl.encoder.js +46 -0
- package/dist_ts/formats/ubl/ubl.types.d.ts +16 -0
- package/dist_ts/formats/ubl/ubl.types.js +21 -0
- package/dist_ts/formats/ubl/ubl.validator.d.ts +50 -0
- package/dist_ts/formats/ubl/ubl.validator.js +112 -0
- package/dist_ts/formats/ubl/xrechnung/xrechnung.decoder.d.ts +34 -0
- package/dist_ts/formats/ubl/xrechnung/xrechnung.decoder.js +424 -0
- package/dist_ts/formats/ubl/xrechnung/xrechnung.encoder.d.ts +75 -0
- package/dist_ts/formats/ubl/xrechnung/xrechnung.encoder.js +555 -0
- package/dist_ts/formats/ubl/xrechnung.validator.d.ts +15 -0
- package/dist_ts/formats/ubl/xrechnung.validator.js +107 -0
- package/dist_ts/formats/ubl.validator.d.ts +82 -0
- package/dist_ts/formats/ubl.validator.js +306 -0
- package/dist_ts/formats/utils/format.detector.d.ts +62 -0
- package/dist_ts/formats/utils/format.detector.js +249 -0
- package/dist_ts/formats/validation/en16931.validator.d.ts +23 -0
- package/dist_ts/formats/validation/en16931.validator.js +119 -0
- package/dist_ts/formats/validator.factory.d.ts +18 -0
- package/dist_ts/formats/validator.factory.js +78 -0
- package/dist_ts/formats/xinvoice.decoder.d.ts +28 -0
- package/dist_ts/formats/xinvoice.decoder.js +332 -0
- package/dist_ts/formats/xinvoice.encoder.d.ts +19 -0
- package/dist_ts/formats/xinvoice.encoder.js +282 -0
- package/dist_ts/index.d.ts +51 -0
- package/dist_ts/index.js +90 -0
- package/dist_ts/interfaces/common.d.ts +79 -0
- package/dist_ts/interfaces/common.js +24 -0
- package/dist_ts/interfaces.d.ts +87 -0
- package/dist_ts/interfaces.js +23 -0
- package/dist_ts/plugins.d.ts +14 -0
- package/dist_ts/plugins.js +31 -0
- package/npmextra.json +35 -0
- package/package.json +71 -0
- package/readme.hints.md +1107 -0
- package/readme.howtofixtests.md +38 -0
- package/readme.literature.md +1 -0
- package/readme.md +998 -0
- package/readme.plan.md +481 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/einvoice.ts +603 -0
- package/ts/errors.ts +341 -0
- package/ts/formats/base/base.decoder.ts +68 -0
- package/ts/formats/base/base.encoder.ts +14 -0
- package/ts/formats/base/base.validator.ts +64 -0
- package/ts/formats/cii/cii.decoder.ts +139 -0
- package/ts/formats/cii/cii.encoder.ts +64 -0
- package/ts/formats/cii/cii.types.ts +44 -0
- package/ts/formats/cii/cii.validator.ts +171 -0
- package/ts/formats/cii/facturx/facturx.decoder.ts +243 -0
- package/ts/formats/cii/facturx/facturx.encoder.ts +483 -0
- package/ts/formats/cii/facturx/facturx.types.ts +18 -0
- package/ts/formats/cii/facturx/facturx.validator.ts +180 -0
- package/ts/formats/cii/zugferd/zugferd.decoder.ts +256 -0
- package/ts/formats/cii/zugferd/zugferd.encoder.ts +661 -0
- package/ts/formats/cii/zugferd/zugferd.types.ts +18 -0
- package/ts/formats/cii/zugferd/zugferd.v1.decoder.ts +267 -0
- package/ts/formats/cii/zugferd/zugferd.validator.ts +31 -0
- package/ts/formats/factories/decoder.factory.ts +62 -0
- package/ts/formats/factories/encoder.factory.ts +47 -0
- package/ts/formats/factories/validator.factory.ts +134 -0
- package/ts/formats/pdf/extractors/associated.extractor.ts +78 -0
- package/ts/formats/pdf/extractors/base.extractor.ts +355 -0
- package/ts/formats/pdf/extractors/index.ts +4 -0
- package/ts/formats/pdf/extractors/standard.extractor.ts +86 -0
- package/ts/formats/pdf/extractors/text.extractor.ts +162 -0
- package/ts/formats/pdf/pdf.embedder.ts +242 -0
- package/ts/formats/pdf/pdf.extractor.ts +141 -0
- package/ts/formats/ubl/en16931.ubl.validator.ts +216 -0
- package/ts/formats/ubl/generic/ubl.encoder.ts +1041 -0
- package/ts/formats/ubl/ubl.decoder.ts +121 -0
- package/ts/formats/ubl/ubl.encoder.ts +63 -0
- package/ts/formats/ubl/ubl.types.ts +22 -0
- package/ts/formats/ubl/ubl.validator.ts +133 -0
- package/ts/formats/ubl/xrechnung/xrechnung.decoder.ts +471 -0
- package/ts/formats/ubl/xrechnung/xrechnung.encoder.ts +619 -0
- package/ts/formats/ubl/xrechnung.validator.ts +185 -0
- package/ts/formats/utils/format.detector.ts +306 -0
- package/ts/formats/validation/en16931.validator.ts +135 -0
- package/ts/index.ts +164 -0
- package/ts/interfaces/common.ts +90 -0
- package/ts/interfaces.ts +98 -0
- package/ts/plugins.ts +61 -0
|
@@ -0,0 +1,555 @@
|
|
|
1
|
+
import { UBLEncoder } from '../generic/ubl.encoder.js';
|
|
2
|
+
import { DOMParser, XMLSerializer } from '../../../plugins.js';
|
|
3
|
+
/**
|
|
4
|
+
* Encoder for XRechnung (UBL) format
|
|
5
|
+
* Extends the generic UBL encoder with XRechnung-specific customizations
|
|
6
|
+
*/
|
|
7
|
+
export class XRechnungEncoder extends UBLEncoder {
|
|
8
|
+
/**
|
|
9
|
+
* Encodes a credit note into XRechnung XML
|
|
10
|
+
* @param creditNote Credit note to encode
|
|
11
|
+
* @returns XRechnung XML string
|
|
12
|
+
*/
|
|
13
|
+
async encodeCreditNote(creditNote) {
|
|
14
|
+
// First get the base UBL XML
|
|
15
|
+
const baseXml = await super.encodeCreditNote(creditNote);
|
|
16
|
+
// Parse and modify for XRechnung
|
|
17
|
+
const doc = new DOMParser().parseFromString(baseXml, 'application/xml');
|
|
18
|
+
this.applyXRechnungCustomizations(doc, creditNote);
|
|
19
|
+
// Serialize back to string
|
|
20
|
+
return new XMLSerializer().serializeToString(doc);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Encodes a debit note (invoice) into XRechnung XML
|
|
24
|
+
* @param debitNote Debit note to encode
|
|
25
|
+
* @returns XRechnung XML string
|
|
26
|
+
*/
|
|
27
|
+
async encodeDebitNote(debitNote) {
|
|
28
|
+
// First get the base UBL XML
|
|
29
|
+
const baseXml = await super.encodeDebitNote(debitNote);
|
|
30
|
+
// Parse and modify for XRechnung
|
|
31
|
+
const doc = new DOMParser().parseFromString(baseXml, 'application/xml');
|
|
32
|
+
this.applyXRechnungCustomizations(doc, debitNote);
|
|
33
|
+
// Serialize back to string
|
|
34
|
+
return new XMLSerializer().serializeToString(doc);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Applies XRechnung-specific customizations to the document
|
|
38
|
+
* @param doc XML document
|
|
39
|
+
* @param invoice Invoice data
|
|
40
|
+
*/
|
|
41
|
+
applyXRechnungCustomizations(doc, invoice) {
|
|
42
|
+
const root = doc.documentElement;
|
|
43
|
+
// Extract metadata if available
|
|
44
|
+
const metadata = invoice.metadata?.extensions;
|
|
45
|
+
// Update Customization ID to XRechnung 2.0
|
|
46
|
+
const customizationId = root.getElementsByTagName('cbc:CustomizationID')[0];
|
|
47
|
+
if (customizationId) {
|
|
48
|
+
customizationId.textContent = 'urn:cen.eu:en16931:2017#compliant#urn:xoev-de:kosit:standard:xrechnung_2.0';
|
|
49
|
+
}
|
|
50
|
+
// Add or update Buyer Reference (required for XRechnung)
|
|
51
|
+
let buyerRef = root.getElementsByTagName('cbc:BuyerReference')[0];
|
|
52
|
+
const buyerReferenceValue = invoice.buyerReference || metadata?.businessReferences?.buyerReference || invoice.id;
|
|
53
|
+
if (!buyerRef) {
|
|
54
|
+
// Find where to insert it (after DocumentCurrencyCode)
|
|
55
|
+
const currencyCode = root.getElementsByTagName('cbc:DocumentCurrencyCode')[0];
|
|
56
|
+
if (currencyCode) {
|
|
57
|
+
buyerRef = doc.createElement('cbc:BuyerReference');
|
|
58
|
+
buyerRef.textContent = buyerReferenceValue;
|
|
59
|
+
currencyCode.parentNode.insertBefore(buyerRef, currencyCode.nextSibling);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else if (!buyerRef.textContent || buyerRef.textContent.trim() === '') {
|
|
63
|
+
buyerRef.textContent = buyerReferenceValue;
|
|
64
|
+
}
|
|
65
|
+
// Update payment terms to German
|
|
66
|
+
const paymentTermsNotes = root.getElementsByTagName('cac:PaymentTerms');
|
|
67
|
+
if (paymentTermsNotes.length > 0) {
|
|
68
|
+
const noteElement = paymentTermsNotes[0].getElementsByTagName('cbc:Note')[0];
|
|
69
|
+
if (noteElement && noteElement.textContent) {
|
|
70
|
+
noteElement.textContent = `Zahlung innerhalb von ${invoice.dueInDays || 30} Tagen`;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Add electronic address for parties if available
|
|
74
|
+
this.addElectronicAddressToParty(doc, 'cac:AccountingSupplierParty', invoice.from);
|
|
75
|
+
this.addElectronicAddressToParty(doc, 'cac:AccountingCustomerParty', invoice.to);
|
|
76
|
+
// Ensure payment reference is set
|
|
77
|
+
const paymentMeans = root.getElementsByTagName('cac:PaymentMeans')[0];
|
|
78
|
+
if (paymentMeans) {
|
|
79
|
+
let paymentId = paymentMeans.getElementsByTagName('cbc:PaymentID')[0];
|
|
80
|
+
if (!paymentId) {
|
|
81
|
+
paymentId = doc.createElement('cbc:PaymentID');
|
|
82
|
+
paymentId.textContent = invoice.id;
|
|
83
|
+
paymentMeans.appendChild(paymentId);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Add country code handling for German addresses
|
|
87
|
+
this.fixGermanCountryCodes(doc);
|
|
88
|
+
// Preserve business references from metadata
|
|
89
|
+
this.addBusinessReferences(doc, metadata?.businessReferences);
|
|
90
|
+
// Preserve payment information from metadata
|
|
91
|
+
this.enhancePaymentInformation(doc, metadata?.paymentInformation);
|
|
92
|
+
// Preserve date information from metadata
|
|
93
|
+
this.addDateInformation(doc, metadata?.dateInformation);
|
|
94
|
+
// Enhance party information with contact details
|
|
95
|
+
this.enhancePartyInformation(doc, invoice);
|
|
96
|
+
// Enhance line items with metadata
|
|
97
|
+
this.enhanceLineItems(doc, invoice);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Adds electronic address to party if not already present
|
|
101
|
+
* @param doc XML document
|
|
102
|
+
* @param partyType Party type selector
|
|
103
|
+
* @param party Party data
|
|
104
|
+
*/
|
|
105
|
+
addElectronicAddressToParty(doc, partyType, party) {
|
|
106
|
+
const partyContainer = doc.getElementsByTagName(partyType)[0];
|
|
107
|
+
if (!partyContainer)
|
|
108
|
+
return;
|
|
109
|
+
const partyElement = partyContainer.getElementsByTagName('cac:Party')[0];
|
|
110
|
+
if (!partyElement)
|
|
111
|
+
return;
|
|
112
|
+
// Check if electronic address already exists
|
|
113
|
+
const existingEndpoint = partyElement.getElementsByTagName('cbc:EndpointID')[0];
|
|
114
|
+
if (!existingEndpoint && party.electronicAddress) {
|
|
115
|
+
// Add electronic address at the beginning of party element
|
|
116
|
+
const endpointNode = doc.createElement('cbc:EndpointID');
|
|
117
|
+
endpointNode.setAttribute('schemeID', party.electronicAddress.scheme || '0204');
|
|
118
|
+
endpointNode.textContent = party.electronicAddress.value;
|
|
119
|
+
// Insert as first child of party element
|
|
120
|
+
if (partyElement.firstChild) {
|
|
121
|
+
partyElement.insertBefore(endpointNode, partyElement.firstChild);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
partyElement.appendChild(endpointNode);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Add GLN (Global Location Number) if available
|
|
128
|
+
if (party.gln && !existingEndpoint) {
|
|
129
|
+
const endpointNode = doc.createElement('cbc:EndpointID');
|
|
130
|
+
endpointNode.setAttribute('schemeID', '0088'); // GLN scheme ID
|
|
131
|
+
endpointNode.textContent = party.gln;
|
|
132
|
+
// Insert as first child of party element
|
|
133
|
+
if (partyElement.firstChild) {
|
|
134
|
+
partyElement.insertBefore(endpointNode, partyElement.firstChild);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
partyElement.appendChild(endpointNode);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Add PartyIdentification for additional identifiers
|
|
141
|
+
if (party.additionalIdentifiers) {
|
|
142
|
+
for (const identifier of party.additionalIdentifiers) {
|
|
143
|
+
const partyId = doc.createElement('cac:PartyIdentification');
|
|
144
|
+
const id = doc.createElement('cbc:ID');
|
|
145
|
+
if (identifier.scheme) {
|
|
146
|
+
id.setAttribute('schemeID', identifier.scheme);
|
|
147
|
+
}
|
|
148
|
+
id.textContent = identifier.value;
|
|
149
|
+
partyId.appendChild(id);
|
|
150
|
+
// Insert after EndpointID or at beginning
|
|
151
|
+
const endpoint = partyElement.getElementsByTagName('cbc:EndpointID')[0];
|
|
152
|
+
if (endpoint && endpoint.nextSibling) {
|
|
153
|
+
partyElement.insertBefore(partyId, endpoint.nextSibling);
|
|
154
|
+
}
|
|
155
|
+
else if (partyElement.firstChild) {
|
|
156
|
+
partyElement.insertBefore(partyId, partyElement.firstChild);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
partyElement.appendChild(partyId);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Add company registration number to PartyLegalEntity
|
|
164
|
+
if (party.registrationDetails?.registrationId) {
|
|
165
|
+
let legalEntity = partyElement.getElementsByTagName('cac:PartyLegalEntity')[0];
|
|
166
|
+
if (!legalEntity) {
|
|
167
|
+
legalEntity = doc.createElement('cac:PartyLegalEntity');
|
|
168
|
+
// Insert after PostalAddress
|
|
169
|
+
const postalAddress = partyElement.getElementsByTagName('cac:PostalAddress')[0];
|
|
170
|
+
if (postalAddress && postalAddress.nextSibling) {
|
|
171
|
+
partyElement.insertBefore(legalEntity, postalAddress.nextSibling);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
partyElement.appendChild(legalEntity);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Add registration name if not present
|
|
178
|
+
if (!legalEntity.getElementsByTagName('cbc:RegistrationName')[0]) {
|
|
179
|
+
const regName = doc.createElement('cbc:RegistrationName');
|
|
180
|
+
regName.textContent = party.registrationDetails.registrationName || party.name;
|
|
181
|
+
legalEntity.appendChild(regName);
|
|
182
|
+
}
|
|
183
|
+
// Add company ID if not present
|
|
184
|
+
if (!legalEntity.getElementsByTagName('cbc:CompanyID')[0]) {
|
|
185
|
+
const companyId = doc.createElement('cbc:CompanyID');
|
|
186
|
+
companyId.textContent = party.registrationDetails.registrationId;
|
|
187
|
+
legalEntity.appendChild(companyId);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Fixes German country codes in the document
|
|
193
|
+
* @param doc XML document
|
|
194
|
+
*/
|
|
195
|
+
fixGermanCountryCodes(doc) {
|
|
196
|
+
const countryNodes = doc.getElementsByTagName('cbc:IdentificationCode');
|
|
197
|
+
for (let i = 0; i < countryNodes.length; i++) {
|
|
198
|
+
const node = countryNodes[i];
|
|
199
|
+
if (node.textContent) {
|
|
200
|
+
const text = node.textContent.toLowerCase();
|
|
201
|
+
if (text === 'germany' || text === 'deutschland' || text === 'de') {
|
|
202
|
+
node.textContent = 'DE';
|
|
203
|
+
}
|
|
204
|
+
else if (text.length > 2) {
|
|
205
|
+
// Try to use first 2 characters as country code
|
|
206
|
+
node.textContent = text.substring(0, 2).toUpperCase();
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Adds business references from metadata to the document
|
|
213
|
+
* @param doc XML document
|
|
214
|
+
* @param businessReferences Business references from metadata
|
|
215
|
+
*/
|
|
216
|
+
addBusinessReferences(doc, businessReferences) {
|
|
217
|
+
if (!businessReferences)
|
|
218
|
+
return;
|
|
219
|
+
const root = doc.documentElement;
|
|
220
|
+
// Add OrderReference
|
|
221
|
+
if (businessReferences.orderReference && !root.getElementsByTagName('cac:OrderReference')[0]) {
|
|
222
|
+
const orderRef = doc.createElement('cac:OrderReference');
|
|
223
|
+
const orderId = doc.createElement('cbc:ID');
|
|
224
|
+
orderId.textContent = businessReferences.orderReference;
|
|
225
|
+
orderRef.appendChild(orderId);
|
|
226
|
+
// Insert after DocumentCurrencyCode
|
|
227
|
+
const currencyCode = root.getElementsByTagName('cbc:DocumentCurrencyCode')[0];
|
|
228
|
+
if (currencyCode && currencyCode.parentNode) {
|
|
229
|
+
currencyCode.parentNode.insertBefore(orderRef, currencyCode.nextSibling);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// Add ContractDocumentReference
|
|
233
|
+
if (businessReferences.contractReference && !root.getElementsByTagName('cac:ContractDocumentReference')[0]) {
|
|
234
|
+
const contractRef = doc.createElement('cac:ContractDocumentReference');
|
|
235
|
+
const contractId = doc.createElement('cbc:ID');
|
|
236
|
+
contractId.textContent = businessReferences.contractReference;
|
|
237
|
+
contractRef.appendChild(contractId);
|
|
238
|
+
// Insert after OrderReference or DocumentCurrencyCode
|
|
239
|
+
const orderRef = root.getElementsByTagName('cac:OrderReference')[0];
|
|
240
|
+
const insertAfter = orderRef || root.getElementsByTagName('cbc:DocumentCurrencyCode')[0];
|
|
241
|
+
if (insertAfter && insertAfter.parentNode) {
|
|
242
|
+
insertAfter.parentNode.insertBefore(contractRef, insertAfter.nextSibling);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// Add ProjectReference
|
|
246
|
+
if (businessReferences.projectReference && !root.getElementsByTagName('cac:ProjectReference')[0]) {
|
|
247
|
+
const projectRef = doc.createElement('cac:ProjectReference');
|
|
248
|
+
const projectId = doc.createElement('cbc:ID');
|
|
249
|
+
projectId.textContent = businessReferences.projectReference;
|
|
250
|
+
projectRef.appendChild(projectId);
|
|
251
|
+
// Insert after ContractDocumentReference or other refs
|
|
252
|
+
const contractRef = root.getElementsByTagName('cac:ContractDocumentReference')[0];
|
|
253
|
+
const orderRef = root.getElementsByTagName('cac:OrderReference')[0];
|
|
254
|
+
const insertAfter = contractRef || orderRef || root.getElementsByTagName('cbc:DocumentCurrencyCode')[0];
|
|
255
|
+
if (insertAfter && insertAfter.parentNode) {
|
|
256
|
+
insertAfter.parentNode.insertBefore(projectRef, insertAfter.nextSibling);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Enhances payment information from metadata
|
|
262
|
+
* @param doc XML document
|
|
263
|
+
* @param paymentInfo Payment information from metadata
|
|
264
|
+
*/
|
|
265
|
+
enhancePaymentInformation(doc, paymentInfo) {
|
|
266
|
+
if (!paymentInfo)
|
|
267
|
+
return;
|
|
268
|
+
const root = doc.documentElement;
|
|
269
|
+
let paymentMeans = root.getElementsByTagName('cac:PaymentMeans')[0];
|
|
270
|
+
// Create PaymentMeans if it doesn't exist
|
|
271
|
+
if (!paymentMeans) {
|
|
272
|
+
paymentMeans = doc.createElement('cac:PaymentMeans');
|
|
273
|
+
// Insert before TaxTotal
|
|
274
|
+
const taxTotal = root.getElementsByTagName('cac:TaxTotal')[0];
|
|
275
|
+
if (taxTotal && taxTotal.parentNode) {
|
|
276
|
+
taxTotal.parentNode.insertBefore(paymentMeans, taxTotal);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
// Add PaymentMeansCode
|
|
280
|
+
if (paymentInfo.paymentMeansCode && !paymentMeans.getElementsByTagName('cbc:PaymentMeansCode')[0]) {
|
|
281
|
+
const meansCode = doc.createElement('cbc:PaymentMeansCode');
|
|
282
|
+
meansCode.textContent = paymentInfo.paymentMeansCode;
|
|
283
|
+
paymentMeans.appendChild(meansCode);
|
|
284
|
+
}
|
|
285
|
+
// Add PaymentID
|
|
286
|
+
if (paymentInfo.paymentID && !paymentMeans.getElementsByTagName('cbc:PaymentID')[0]) {
|
|
287
|
+
const paymentId = doc.createElement('cbc:PaymentID');
|
|
288
|
+
paymentId.textContent = paymentInfo.paymentID;
|
|
289
|
+
paymentMeans.appendChild(paymentId);
|
|
290
|
+
}
|
|
291
|
+
// Add PaymentDueDate
|
|
292
|
+
if (paymentInfo.paymentDueDate && !paymentMeans.getElementsByTagName('cbc:PaymentDueDate')[0]) {
|
|
293
|
+
const dueDate = doc.createElement('cbc:PaymentDueDate');
|
|
294
|
+
dueDate.textContent = paymentInfo.paymentDueDate;
|
|
295
|
+
paymentMeans.appendChild(dueDate);
|
|
296
|
+
}
|
|
297
|
+
// Add IBAN and BIC
|
|
298
|
+
if (paymentInfo.iban || paymentInfo.bic) {
|
|
299
|
+
let payeeAccount = paymentMeans.getElementsByTagName('cac:PayeeFinancialAccount')[0];
|
|
300
|
+
if (!payeeAccount) {
|
|
301
|
+
payeeAccount = doc.createElement('cac:PayeeFinancialAccount');
|
|
302
|
+
paymentMeans.appendChild(payeeAccount);
|
|
303
|
+
}
|
|
304
|
+
// Add IBAN
|
|
305
|
+
if (paymentInfo.iban && !payeeAccount.getElementsByTagName('cbc:ID')[0]) {
|
|
306
|
+
const iban = doc.createElement('cbc:ID');
|
|
307
|
+
iban.textContent = paymentInfo.iban;
|
|
308
|
+
payeeAccount.appendChild(iban);
|
|
309
|
+
}
|
|
310
|
+
// Add account name (must come after ID but before FinancialInstitutionBranch)
|
|
311
|
+
if (paymentInfo.accountName && !payeeAccount.getElementsByTagName('cbc:Name')[0]) {
|
|
312
|
+
const accountName = doc.createElement('cbc:Name');
|
|
313
|
+
accountName.textContent = paymentInfo.accountName;
|
|
314
|
+
// Insert after ID but before FinancialInstitutionBranch
|
|
315
|
+
const id = payeeAccount.getElementsByTagName('cbc:ID')[0];
|
|
316
|
+
const finInstBranch = payeeAccount.getElementsByTagName('cac:FinancialInstitutionBranch')[0];
|
|
317
|
+
if (finInstBranch) {
|
|
318
|
+
payeeAccount.insertBefore(accountName, finInstBranch);
|
|
319
|
+
}
|
|
320
|
+
else if (id && id.nextSibling) {
|
|
321
|
+
payeeAccount.insertBefore(accountName, id.nextSibling);
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
payeeAccount.appendChild(accountName);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
// Add BIC and bank name
|
|
328
|
+
if (paymentInfo.bic || paymentInfo.bankName) {
|
|
329
|
+
let finInstBranch = payeeAccount.getElementsByTagName('cac:FinancialInstitutionBranch')[0];
|
|
330
|
+
if (!finInstBranch) {
|
|
331
|
+
finInstBranch = doc.createElement('cac:FinancialInstitutionBranch');
|
|
332
|
+
payeeAccount.appendChild(finInstBranch);
|
|
333
|
+
}
|
|
334
|
+
// Add BIC as branch ID
|
|
335
|
+
if (paymentInfo.bic && !finInstBranch.getElementsByTagName('cbc:ID')[0]) {
|
|
336
|
+
const bicElement = doc.createElement('cbc:ID');
|
|
337
|
+
bicElement.textContent = paymentInfo.bic;
|
|
338
|
+
finInstBranch.appendChild(bicElement);
|
|
339
|
+
}
|
|
340
|
+
// Add bank name
|
|
341
|
+
if (paymentInfo.bankName && !finInstBranch.getElementsByTagName('cbc:Name')[0]) {
|
|
342
|
+
const bankNameElement = doc.createElement('cbc:Name');
|
|
343
|
+
bankNameElement.textContent = paymentInfo.bankName;
|
|
344
|
+
finInstBranch.appendChild(bankNameElement);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
// Add payment terms with discount if available
|
|
349
|
+
if (paymentInfo.paymentTermsNote && paymentInfo.paymentTermsNote.includes('early payment')) {
|
|
350
|
+
let paymentTerms = root.getElementsByTagName('cac:PaymentTerms')[0];
|
|
351
|
+
if (!paymentTerms) {
|
|
352
|
+
paymentTerms = doc.createElement('cac:PaymentTerms');
|
|
353
|
+
// Insert before PaymentMeans
|
|
354
|
+
const paymentMeans = root.getElementsByTagName('cac:PaymentMeans')[0];
|
|
355
|
+
if (paymentMeans && paymentMeans.parentNode) {
|
|
356
|
+
paymentMeans.parentNode.insertBefore(paymentTerms, paymentMeans);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
// Update or add note
|
|
360
|
+
let note = paymentTerms.getElementsByTagName('cbc:Note')[0];
|
|
361
|
+
if (!note) {
|
|
362
|
+
note = doc.createElement('cbc:Note');
|
|
363
|
+
paymentTerms.appendChild(note);
|
|
364
|
+
}
|
|
365
|
+
note.textContent = paymentInfo.paymentTermsNote;
|
|
366
|
+
// Add discount percent if available
|
|
367
|
+
if (paymentInfo.discountPercent && !paymentTerms.getElementsByTagName('cbc:SettlementDiscountPercent')[0]) {
|
|
368
|
+
const discountElement = doc.createElement('cbc:SettlementDiscountPercent');
|
|
369
|
+
discountElement.textContent = paymentInfo.discountPercent;
|
|
370
|
+
paymentTerms.appendChild(discountElement);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Adds date information from metadata
|
|
376
|
+
* @param doc XML document
|
|
377
|
+
* @param dateInfo Date information from metadata
|
|
378
|
+
*/
|
|
379
|
+
addDateInformation(doc, dateInfo) {
|
|
380
|
+
if (!dateInfo)
|
|
381
|
+
return;
|
|
382
|
+
const root = doc.documentElement;
|
|
383
|
+
// Add InvoicePeriod
|
|
384
|
+
if ((dateInfo.periodStart || dateInfo.periodEnd) && !root.getElementsByTagName('cac:InvoicePeriod')[0]) {
|
|
385
|
+
const invoicePeriod = doc.createElement('cac:InvoicePeriod');
|
|
386
|
+
if (dateInfo.periodStart) {
|
|
387
|
+
const startDate = doc.createElement('cbc:StartDate');
|
|
388
|
+
startDate.textContent = dateInfo.periodStart;
|
|
389
|
+
invoicePeriod.appendChild(startDate);
|
|
390
|
+
}
|
|
391
|
+
if (dateInfo.periodEnd) {
|
|
392
|
+
const endDate = doc.createElement('cbc:EndDate');
|
|
393
|
+
endDate.textContent = dateInfo.periodEnd;
|
|
394
|
+
invoicePeriod.appendChild(endDate);
|
|
395
|
+
}
|
|
396
|
+
// Insert after business references or DocumentCurrencyCode
|
|
397
|
+
const projectRef = root.getElementsByTagName('cac:ProjectReference')[0];
|
|
398
|
+
const contractRef = root.getElementsByTagName('cac:ContractDocumentReference')[0];
|
|
399
|
+
const orderRef = root.getElementsByTagName('cac:OrderReference')[0];
|
|
400
|
+
const insertAfter = projectRef || contractRef || orderRef || root.getElementsByTagName('cbc:DocumentCurrencyCode')[0];
|
|
401
|
+
if (insertAfter && insertAfter.parentNode) {
|
|
402
|
+
insertAfter.parentNode.insertBefore(invoicePeriod, insertAfter.nextSibling);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
// Add Delivery with ActualDeliveryDate
|
|
406
|
+
if (dateInfo.deliveryDate && !root.getElementsByTagName('cac:Delivery')[0]) {
|
|
407
|
+
const delivery = doc.createElement('cac:Delivery');
|
|
408
|
+
const deliveryDate = doc.createElement('cbc:ActualDeliveryDate');
|
|
409
|
+
deliveryDate.textContent = dateInfo.deliveryDate;
|
|
410
|
+
delivery.appendChild(deliveryDate);
|
|
411
|
+
// Insert before PaymentMeans
|
|
412
|
+
const paymentMeans = root.getElementsByTagName('cac:PaymentMeans')[0];
|
|
413
|
+
if (paymentMeans && paymentMeans.parentNode) {
|
|
414
|
+
paymentMeans.parentNode.insertBefore(delivery, paymentMeans);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Enhances party information with contact details from metadata
|
|
420
|
+
* @param doc XML document
|
|
421
|
+
* @param invoice Invoice data
|
|
422
|
+
*/
|
|
423
|
+
enhancePartyInformation(doc, invoice) {
|
|
424
|
+
// Enhance supplier party
|
|
425
|
+
this.addContactToParty(doc, 'cac:AccountingSupplierParty', invoice.from?.metadata?.contactInformation);
|
|
426
|
+
// Enhance customer party
|
|
427
|
+
this.addContactToParty(doc, 'cac:AccountingCustomerParty', invoice.to?.metadata?.contactInformation);
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Adds contact information to a party
|
|
431
|
+
* @param doc XML document
|
|
432
|
+
* @param partySelector Party selector
|
|
433
|
+
* @param contactInfo Contact information from metadata
|
|
434
|
+
*/
|
|
435
|
+
addContactToParty(doc, partySelector, contactInfo) {
|
|
436
|
+
if (!contactInfo)
|
|
437
|
+
return;
|
|
438
|
+
const partyContainer = doc.getElementsByTagName(partySelector)[0];
|
|
439
|
+
if (!partyContainer)
|
|
440
|
+
return;
|
|
441
|
+
const party = partyContainer.getElementsByTagName('cac:Party')[0];
|
|
442
|
+
if (!party)
|
|
443
|
+
return;
|
|
444
|
+
// Check if Contact already exists
|
|
445
|
+
let contact = party.getElementsByTagName('cac:Contact')[0];
|
|
446
|
+
if (!contact && (contactInfo.name || contactInfo.phone || contactInfo.email)) {
|
|
447
|
+
contact = doc.createElement('cac:Contact');
|
|
448
|
+
// Insert after PartyName
|
|
449
|
+
const partyName = party.getElementsByTagName('cac:PartyName')[0];
|
|
450
|
+
if (partyName && partyName.parentNode) {
|
|
451
|
+
partyName.parentNode.insertBefore(contact, partyName.nextSibling);
|
|
452
|
+
}
|
|
453
|
+
else {
|
|
454
|
+
party.appendChild(contact);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
if (contact) {
|
|
458
|
+
// Add contact name
|
|
459
|
+
if (contactInfo.name && !contact.getElementsByTagName('cbc:Name')[0]) {
|
|
460
|
+
const name = doc.createElement('cbc:Name');
|
|
461
|
+
name.textContent = contactInfo.name;
|
|
462
|
+
contact.appendChild(name);
|
|
463
|
+
}
|
|
464
|
+
// Add telephone
|
|
465
|
+
if (contactInfo.phone && !contact.getElementsByTagName('cbc:Telephone')[0]) {
|
|
466
|
+
const phone = doc.createElement('cbc:Telephone');
|
|
467
|
+
phone.textContent = contactInfo.phone;
|
|
468
|
+
contact.appendChild(phone);
|
|
469
|
+
}
|
|
470
|
+
// Add email
|
|
471
|
+
if (contactInfo.email && !contact.getElementsByTagName('cbc:ElectronicMail')[0]) {
|
|
472
|
+
const email = doc.createElement('cbc:ElectronicMail');
|
|
473
|
+
email.textContent = contactInfo.email;
|
|
474
|
+
contact.appendChild(email);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Enhances line items with metadata
|
|
480
|
+
* @param doc XML document
|
|
481
|
+
* @param invoice Invoice data
|
|
482
|
+
*/
|
|
483
|
+
enhanceLineItems(doc, invoice) {
|
|
484
|
+
const invoiceLines = doc.getElementsByTagName('cac:InvoiceLine');
|
|
485
|
+
for (let i = 0; i < invoiceLines.length && i < invoice.items.length; i++) {
|
|
486
|
+
const line = invoiceLines[i];
|
|
487
|
+
const item = invoice.items[i];
|
|
488
|
+
const itemMetadata = item.metadata;
|
|
489
|
+
if (!itemMetadata)
|
|
490
|
+
continue;
|
|
491
|
+
const itemElement = line.getElementsByTagName('cac:Item')[0];
|
|
492
|
+
if (!itemElement)
|
|
493
|
+
continue;
|
|
494
|
+
// Add item description
|
|
495
|
+
if (itemMetadata.description && !itemElement.getElementsByTagName('cbc:Description')[0]) {
|
|
496
|
+
const desc = doc.createElement('cbc:Description');
|
|
497
|
+
desc.textContent = itemMetadata.description;
|
|
498
|
+
// Insert before Name
|
|
499
|
+
const name = itemElement.getElementsByTagName('cbc:Name')[0];
|
|
500
|
+
if (name && name.parentNode) {
|
|
501
|
+
name.parentNode.insertBefore(desc, name);
|
|
502
|
+
}
|
|
503
|
+
else {
|
|
504
|
+
itemElement.appendChild(desc);
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
// Add SellersItemIdentification
|
|
508
|
+
if (itemMetadata.buyerItemID && !itemElement.getElementsByTagName('cac:SellersItemIdentification')[0]) {
|
|
509
|
+
const sellerId = doc.createElement('cac:SellersItemIdentification');
|
|
510
|
+
const id = doc.createElement('cbc:ID');
|
|
511
|
+
id.textContent = item.articleNumber || itemMetadata.buyerItemID;
|
|
512
|
+
sellerId.appendChild(id);
|
|
513
|
+
itemElement.appendChild(sellerId);
|
|
514
|
+
}
|
|
515
|
+
// Add BuyersItemIdentification
|
|
516
|
+
if (itemMetadata.buyerItemID && !itemElement.getElementsByTagName('cac:BuyersItemIdentification')[0]) {
|
|
517
|
+
const buyerId = doc.createElement('cac:BuyersItemIdentification');
|
|
518
|
+
const id = doc.createElement('cbc:ID');
|
|
519
|
+
id.textContent = itemMetadata.buyerItemID;
|
|
520
|
+
buyerId.appendChild(id);
|
|
521
|
+
itemElement.appendChild(buyerId);
|
|
522
|
+
}
|
|
523
|
+
// Add StandardItemIdentification
|
|
524
|
+
if (itemMetadata.standardItemID && !itemElement.getElementsByTagName('cac:StandardItemIdentification')[0]) {
|
|
525
|
+
const standardId = doc.createElement('cac:StandardItemIdentification');
|
|
526
|
+
const id = doc.createElement('cbc:ID');
|
|
527
|
+
id.textContent = itemMetadata.standardItemID;
|
|
528
|
+
standardId.appendChild(id);
|
|
529
|
+
itemElement.appendChild(standardId);
|
|
530
|
+
}
|
|
531
|
+
// Add CommodityClassification
|
|
532
|
+
if (itemMetadata.commodityClassification && !itemElement.getElementsByTagName('cac:CommodityClassification')[0]) {
|
|
533
|
+
const classification = doc.createElement('cac:CommodityClassification');
|
|
534
|
+
const code = doc.createElement('cbc:ItemClassificationCode');
|
|
535
|
+
code.textContent = itemMetadata.commodityClassification;
|
|
536
|
+
classification.appendChild(code);
|
|
537
|
+
itemElement.appendChild(classification);
|
|
538
|
+
}
|
|
539
|
+
// Add additional item properties
|
|
540
|
+
if (itemMetadata.additionalProperties) {
|
|
541
|
+
for (const [propName, propValue] of Object.entries(itemMetadata.additionalProperties)) {
|
|
542
|
+
const additionalProp = doc.createElement('cac:AdditionalItemProperty');
|
|
543
|
+
const nameElement = doc.createElement('cbc:Name');
|
|
544
|
+
nameElement.textContent = propName;
|
|
545
|
+
additionalProp.appendChild(nameElement);
|
|
546
|
+
const valueElement = doc.createElement('cbc:Value');
|
|
547
|
+
valueElement.textContent = propValue;
|
|
548
|
+
additionalProp.appendChild(valueElement);
|
|
549
|
+
itemElement.appendChild(additionalProp);
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHJlY2hudW5nLmVuY29kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9mb3JtYXRzL3VibC94cmVjaG51bmcveHJlY2hudW5nLmVuY29kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXZELE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFL0Q7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGdCQUFpQixTQUFRLFVBQVU7SUFDOUM7Ozs7T0FJRztJQUNPLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxVQUF1QjtRQUN0RCw2QkFBNkI7UUFDN0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFekQsaUNBQWlDO1FBQ2pDLE1BQU0sR0FBRyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLEVBQUUsVUFBaUMsQ0FBQyxDQUFDO1FBRTFFLDJCQUEyQjtRQUMzQixPQUFPLElBQUksYUFBYSxFQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDTyxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQXFCO1FBQ25ELDZCQUE2QjtRQUM3QixNQUFNLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFdkQsaUNBQWlDO1FBQ2pDLE1BQU0sR0FBRyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLEVBQUUsU0FBZ0MsQ0FBQyxDQUFDO1FBRXpFLDJCQUEyQjtRQUMzQixPQUFPLElBQUksYUFBYSxFQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyw0QkFBNEIsQ0FBQyxHQUFhLEVBQUUsT0FBaUI7UUFDbkUsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQztRQUVqQyxnQ0FBZ0M7UUFDaEMsTUFBTSxRQUFRLEdBQUksT0FBZSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7UUFFdkQsMkNBQTJDO1FBQzNDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVFLElBQUksZUFBZSxFQUFFLENBQUM7WUFDcEIsZUFBZSxDQUFDLFdBQVcsR0FBRyw0RUFBNEUsQ0FBQztRQUM3RyxDQUFDO1FBRUQseURBQXlEO1FBQ3pELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sbUJBQW1CLEdBQUksT0FBZSxDQUFDLGNBQWMsSUFBSSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxJQUFJLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDMUgsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsdURBQXVEO1lBQ3ZELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlFLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ2pCLFFBQVEsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0JBQ25ELFFBQVEsQ0FBQyxXQUFXLEdBQUcsbUJBQW1CLENBQUM7Z0JBQzNDLFlBQVksQ0FBQyxVQUFXLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDNUUsQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsSUFBSSxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3ZFLFFBQVEsQ0FBQyxXQUFXLEdBQUcsbUJBQW1CLENBQUM7UUFDN0MsQ0FBQztRQUVELGlDQUFpQztRQUNqQyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3hFLElBQUksaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sV0FBVyxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdFLElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDM0MsV0FBVyxDQUFDLFdBQVcsR0FBRyx5QkFBeUIsT0FBTyxDQUFDLFNBQVMsSUFBSSxFQUFFLFFBQVEsQ0FBQztZQUNyRixDQUFDO1FBQ0gsQ0FBQztRQUVELGtEQUFrRDtRQUNsRCxJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxFQUFFLDZCQUE2QixFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRixJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxFQUFFLDZCQUE2QixFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVqRixrQ0FBa0M7UUFDbEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEUsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixJQUFJLFNBQVMsR0FBRyxZQUFZLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNmLFNBQVMsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUMvQyxTQUFTLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ25DLFlBQVksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdEMsQ0FBQztRQUNILENBQUM7UUFFRCxpREFBaUQ7UUFDakQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWhDLDZDQUE2QztRQUM3QyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBRTlELDZDQUE2QztRQUM3QyxJQUFJLENBQUMseUJBQXlCLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBRWxFLDBDQUEwQztRQUMxQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUV4RCxpREFBaUQ7UUFDakQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUUzQyxtQ0FBbUM7UUFDbkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSywyQkFBMkIsQ0FBQyxHQUFhLEVBQUUsU0FBaUIsRUFBRSxLQUFVO1FBQzlFLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsY0FBYztZQUFFLE9BQU87UUFFNUIsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTztRQUUxQiw2Q0FBNkM7UUFDN0MsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsZ0JBQWdCLElBQUksS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDakQsMkRBQTJEO1lBQzNELE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUN6RCxZQUFZLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDO1lBQ2hGLFlBQVksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQztZQUV6RCx5Q0FBeUM7WUFDekMsSUFBSSxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzVCLFlBQVksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNuRSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sWUFBWSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN6QyxDQUFDO1FBQ0gsQ0FBQztRQUVELGdEQUFnRDtRQUNoRCxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ25DLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUN6RCxZQUFZLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLGdCQUFnQjtZQUMvRCxZQUFZLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFFckMseUNBQXlDO1lBQ3pDLElBQUksWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUM1QixZQUFZLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbkUsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFlBQVksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDekMsQ0FBQztRQUNILENBQUM7UUFFRCxxREFBcUQ7UUFDckQsSUFBSSxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNoQyxLQUFLLE1BQU0sVUFBVSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUNyRCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLHlCQUF5QixDQUFDLENBQUM7Z0JBQzdELE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUN0QixFQUFFLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2pELENBQUM7Z0JBQ0QsRUFBRSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO2dCQUNsQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUV4QiwwQ0FBMEM7Z0JBQzFDLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4RSxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ3JDLFlBQVksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDM0QsQ0FBQztxQkFBTSxJQUFJLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDbkMsWUFBWSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM5RCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDcEMsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsc0RBQXNEO1FBQ3RELElBQUksS0FBSyxDQUFDLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxDQUFDO1lBQzlDLElBQUksV0FBVyxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9FLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDakIsV0FBVyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsQ0FBQztnQkFDeEQsNkJBQTZCO2dCQUM3QixNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsb0JBQW9CLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEYsSUFBSSxhQUFhLElBQUksYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUMvQyxZQUFZLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3BFLENBQUM7cUJBQU0sQ0FBQztvQkFDTixZQUFZLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN4QyxDQUFDO1lBQ0gsQ0FBQztZQUVELHVDQUF1QztZQUN2QyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDakUsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2dCQUMxRCxPQUFPLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDO2dCQUMvRSxXQUFXLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25DLENBQUM7WUFFRCxnQ0FBZ0M7WUFDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMxRCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUNyRCxTQUFTLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLENBQUM7Z0JBQ2pFLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0sscUJBQXFCLENBQUMsR0FBYTtRQUN6QyxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsb0JBQW9CLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUN4RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzdDLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxhQUFhLElBQUksSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO29CQUNsRSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztnQkFDMUIsQ0FBQztxQkFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzNCLGdEQUFnRDtvQkFDaEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDeEQsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxxQkFBcUIsQ0FBQyxHQUFhLEVBQUUsa0JBQXdCO1FBQ25FLElBQUksQ0FBQyxrQkFBa0I7WUFBRSxPQUFPO1FBRWhDLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUM7UUFFakMscUJBQXFCO1FBQ3JCLElBQUksa0JBQWtCLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM3RixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDekQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM1QyxPQUFPLENBQUMsV0FBVyxHQUFHLGtCQUFrQixDQUFDLGNBQWMsQ0FBQztZQUN4RCxRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRTlCLG9DQUFvQztZQUNwQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5RSxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzVDLFlBQVksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDM0UsQ0FBQztRQUNILENBQUM7UUFFRCxnQ0FBZ0M7UUFDaEMsSUFBSSxrQkFBa0IsQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0csTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0MsVUFBVSxDQUFDLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQztZQUM5RCxXQUFXLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRXBDLHNEQUFzRDtZQUN0RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRSxNQUFNLFdBQVcsR0FBRyxRQUFRLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekYsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUMxQyxXQUFXLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzVFLENBQUM7UUFDSCxDQUFDO1FBRUQsdUJBQXVCO1FBQ3ZCLElBQUksa0JBQWtCLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pHLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUM3RCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUM7WUFDNUQsVUFBVSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUVsQyx1REFBdUQ7WUFDdkQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLCtCQUErQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEUsTUFBTSxXQUFXLEdBQUcsV0FBVyxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4RyxJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDM0UsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLHlCQUF5QixDQUFDLEdBQWEsRUFBRSxXQUFpQjtRQUNoRSxJQUFJLENBQUMsV0FBVztZQUFFLE9BQU87UUFFekIsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQztRQUNqQyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVwRSwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2xCLFlBQVksR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDckQseUJBQXlCO1lBQ3pCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5RCxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3BDLFFBQVEsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMzRCxDQUFDO1FBQ0gsQ0FBQztRQUVELHVCQUF1QjtRQUN2QixJQUFJLFdBQVcsQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbEcsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQzVELFNBQVMsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDO1lBQ3JELFlBQVksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELGdCQUFnQjtRQUNoQixJQUFJLFdBQVcsQ0FBQyxTQUFTLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNwRixNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3JELFNBQVMsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQztZQUM5QyxZQUFZLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFFRCxxQkFBcUI7UUFDckIsSUFBSSxXQUFXLENBQUMsY0FBYyxJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM5RixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDeEQsT0FBTyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsY0FBYyxDQUFDO1lBQ2pELFlBQVksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUVELG1CQUFtQjtRQUNuQixJQUFJLFdBQVcsQ0FBQyxJQUFJLElBQUksV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3hDLElBQUksWUFBWSxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JGLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDbEIsWUFBWSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsMkJBQTJCLENBQUMsQ0FBQztnQkFDOUQsWUFBWSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN6QyxDQUFDO1lBRUQsV0FBVztZQUNYLElBQUksV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN4RSxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7Z0JBQ3BDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsQ0FBQztZQUVELDhFQUE4RTtZQUM5RSxJQUFJLFdBQVcsQ0FBQyxXQUFXLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDakYsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDbEQsV0FBVyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDO2dCQUNsRCx3REFBd0Q7Z0JBQ3hELE1BQU0sRUFBRSxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUQsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLG9CQUFvQixDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdGLElBQUksYUFBYSxFQUFFLENBQUM7b0JBQ2xCLFlBQVksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO2dCQUN4RCxDQUFDO3FCQUFNLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDaEMsWUFBWSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN6RCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sWUFBWSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDeEMsQ0FBQztZQUNILENBQUM7WUFFRCx3QkFBd0I7WUFDeEIsSUFBSSxXQUFXLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSxhQUFhLEdBQUcsWUFBWSxDQUFDLG9CQUFvQixDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNGLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDbkIsYUFBYSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztvQkFDcEUsWUFBWSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDMUMsQ0FBQztnQkFFRCx1QkFBdUI7Z0JBQ3ZCLElBQUksV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN4RSxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUMvQyxVQUFVLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUM7b0JBQ3pDLGFBQWEsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3hDLENBQUM7Z0JBRUQsZ0JBQWdCO2dCQUNoQixJQUFJLFdBQVcsQ0FBQyxRQUFRLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDL0UsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDdEQsZUFBZSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDO29CQUNuRCxhQUFhLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUM3QyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCwrQ0FBK0M7UUFDL0MsSUFBSSxXQUFXLENBQUMsZ0JBQWdCLElBQUksV0FBVyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1lBQzNGLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDbEIsWUFBWSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFDckQsNkJBQTZCO2dCQUM3QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEUsSUFBSSxZQUFZLElBQUksWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUM1QyxZQUFZLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBQ25FLENBQUM7WUFDSCxDQUFDO1lBRUQscUJBQXFCO1lBQ3JCLElBQUksSUFBSSxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1RCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ1YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3JDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsQ0FBQztZQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDO1lBRWhELG9DQUFvQztZQUNwQyxJQUFJLFdBQVcsQ0FBQyxlQUFlLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsK0JBQStCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMxRyxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLCtCQUErQixDQUFDLENBQUM7Z0JBQzNFLGVBQWUsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLGVBQWUsQ0FBQztnQkFDMUQsWUFBWSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM1QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssa0JBQWtCLENBQUMsR0FBYSxFQUFFLFFBQWM7UUFDdEQsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBRXRCLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUM7UUFFakMsb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdkcsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBRTdELElBQUksUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN6QixNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUNyRCxTQUFTLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7Z0JBQzdDLGFBQWEsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkMsQ0FBQztZQUVELElBQUksUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUN2QixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNqRCxPQUFPLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pDLGFBQWEsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckMsQ0FBQztZQUVELDJEQUEyRDtZQUMzRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4RSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsK0JBQStCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRSxNQUFNLFdBQVcsR0FBRyxVQUFVLElBQUksV0FBVyxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0SCxJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDOUUsQ0FBQztRQUNILENBQUM7UUFFRCx1Q0FBdUM7UUFDdkMsSUFBSSxRQUFRLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0UsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNuRCxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLENBQUM7WUFDakUsWUFBWSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDO1lBQ2pELFFBQVEsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFbkMsNkJBQTZCO1lBQzdCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLElBQUksWUFBWSxJQUFJLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDNUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQy9ELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyx1QkFBdUIsQ0FBQyxHQUFhLEVBQUUsT0FBaUI7UUFDOUQseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsNkJBQTZCLEVBQUcsT0FBTyxDQUFDLElBQVksRUFBRSxRQUFRLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUVoSCx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSw2QkFBNkIsRUFBRyxPQUFPLENBQUMsRUFBVSxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQ2hILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLGlCQUFpQixDQUFDLEdBQWEsRUFBRSxhQUFxQixFQUFFLFdBQWlCO1FBQy9FLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTztRQUV6QixNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLGNBQWM7WUFBRSxPQUFPO1FBRTVCLE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87UUFFbkIsa0NBQWtDO1FBQ2xDLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsS0FBSyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzdFLE9BQU8sR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRTNDLHlCQUF5QjtZQUN6QixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakUsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN0QyxTQUFTLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdCLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLG1CQUFtQjtZQUNuQixJQUFJLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDckUsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUNwQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVCLENBQUM7WUFFRCxnQkFBZ0I7WUFDaEIsSUFBSSxXQUFXLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzNFLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ2pELEtBQUssQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztnQkFDdEMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixDQUFDO1lBRUQsWUFBWTtZQUNaLElBQUksV0FBVyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hGLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFDdEQsS0FBSyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDO2dCQUN0QyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxnQkFBZ0IsQ0FBQyxHQUFhLEVBQUUsT0FBaUI7UUFDdkQsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFakUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDekUsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsTUFBTSxZQUFZLEdBQUksSUFBWSxDQUFDLFFBQVEsQ0FBQztZQUU1QyxJQUFJLENBQUMsWUFBWTtnQkFBRSxTQUFTO1lBRTVCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsV0FBVztnQkFBRSxTQUFTO1lBRTNCLHVCQUF1QjtZQUN2QixJQUFJLFlBQVksQ0FBQyxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN4RixNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQztnQkFDNUMscUJBQXFCO2dCQUNyQixNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDNUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMzQyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDaEMsQ0FBQztZQUNILENBQUM7WUFFRCxnQ0FBZ0M7WUFDaEMsSUFBSSxZQUFZLENBQUMsV0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLCtCQUErQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDdEcsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO2dCQUNwRSxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN2QyxFQUFFLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLElBQUksWUFBWSxDQUFDLFdBQVcsQ0FBQztnQkFDaEUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDekIsV0FBVyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNwQyxDQUFDO1lBRUQsK0JBQStCO1lBQy9CLElBQUksWUFBWSxDQUFDLFdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JHLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsOEJBQThCLENBQUMsQ0FBQztnQkFDbEUsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdkMsRUFBRSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDO2dCQUMxQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN4QixXQUFXLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25DLENBQUM7WUFFRCxpQ0FBaUM7WUFDakMsSUFBSSxZQUFZLENBQUMsY0FBYyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDMUcsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO2dCQUN2RSxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN2QyxFQUFFLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUM7Z0JBQzdDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzNCLFdBQVcsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEMsQ0FBQztZQUVELDhCQUE4QjtZQUM5QixJQUFJLFlBQVksQ0FBQyx1QkFBdUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hILE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsNkJBQTZCLENBQUMsQ0FBQztnQkFDeEUsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQztnQkFDeEQsY0FBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDakMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMxQyxDQUFDO1lBRUQsaUNBQWlDO1lBQ2pDLElBQUksWUFBWSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQ3RDLEtBQUssTUFBTSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7b0JBQ3RGLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsNEJBQTRCLENBQUMsQ0FBQztvQkFFdkUsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDbEQsV0FBVyxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUM7b0JBQ25DLGNBQWMsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBRXhDLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ3BELFlBQVksQ0FBQyxXQUFXLEdBQUcsU0FBbUIsQ0FBQztvQkFDL0MsY0FBYyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFFekMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDMUMsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { EN16931UBLValidator } from './en16931.ubl.validator.js';
|
|
2
|
+
/**
|
|
3
|
+
* XRechnung-specific validator that extends EN16931 validation
|
|
4
|
+
* Implements additional German CIUS (Core Invoice Usage Specification) rules
|
|
5
|
+
*/
|
|
6
|
+
export declare class XRechnungValidator extends EN16931UBLValidator {
|
|
7
|
+
/**
|
|
8
|
+
* Validates XRechnung-specific structure requirements
|
|
9
|
+
*/
|
|
10
|
+
protected validateStructure(): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Validates XRechnung-specific business rules
|
|
13
|
+
*/
|
|
14
|
+
protected validateBusinessRules(): boolean;
|
|
15
|
+
}
|