cdk-assets 3.3.0 → 4.0.0

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.
Files changed (48) hide show
  1. package/README.md +4 -4
  2. package/THIRD_PARTY_LICENSES +18764 -0
  3. package/bin/cdk-assets.js +109830 -62
  4. package/bin/docker-credential-cdk-assets.js +4 -4
  5. package/bin/list.js +3 -3
  6. package/bin/logging.js +3 -1
  7. package/bin/publish.js +6 -6
  8. package/package.json +11 -30
  9. package/lib/asset-manifest.d.ts +0 -186
  10. package/lib/asset-manifest.js +0 -270
  11. package/lib/aws-types.d.ts +0 -1666
  12. package/lib/aws-types.js +0 -144
  13. package/lib/aws.d.ts +0 -71
  14. package/lib/aws.js +0 -131
  15. package/lib/index.d.ts +0 -4
  16. package/lib/index.js +0 -21
  17. package/lib/private/archive.d.ts +0 -3
  18. package/lib/private/archive.js +0 -87
  19. package/lib/private/asset-handler.d.ts +0 -60
  20. package/lib/private/asset-handler.js +0 -3
  21. package/lib/private/docker-credentials.d.ts +0 -35
  22. package/lib/private/docker-credentials.js +0 -90
  23. package/lib/private/docker.d.ts +0 -98
  24. package/lib/private/docker.js +0 -235
  25. package/lib/private/fs-extra.d.ts +0 -3
  26. package/lib/private/fs-extra.js +0 -37
  27. package/lib/private/handlers/client-options.d.ts +0 -3
  28. package/lib/private/handlers/client-options.js +0 -12
  29. package/lib/private/handlers/container-images.d.ts +0 -22
  30. package/lib/private/handlers/container-images.js +0 -224
  31. package/lib/private/handlers/files.d.ts +0 -14
  32. package/lib/private/handlers/files.js +0 -289
  33. package/lib/private/handlers/index.d.ts +0 -3
  34. package/lib/private/handlers/index.js +0 -16
  35. package/lib/private/p-limit.d.ts +0 -10
  36. package/lib/private/p-limit.js +0 -51
  37. package/lib/private/placeholders.d.ts +0 -10
  38. package/lib/private/placeholders.js +0 -34
  39. package/lib/private/shell.d.ts +0 -24
  40. package/lib/private/shell.js +0 -131
  41. package/lib/private/util.d.ts +0 -5
  42. package/lib/private/util.js +0 -16
  43. package/lib/progress.d.ts +0 -114
  44. package/lib/progress.js +0 -104
  45. package/lib/publishing.d.ts +0 -118
  46. package/lib/publishing.js +0 -193
  47. package/scripts/manual-test-manifest.json +0 -12
  48. package/scripts/manual-test.sh +0 -22
package/lib/aws-types.js DELETED
@@ -1,144 +0,0 @@
1
- "use strict";
2
- /**
3
- * This file contains a copy of the input and output types from the SDK v3
4
- * clients. Instead of exposing the SDK types in the public interface, we
5
- * expose these, shielding consumers from breaking changes in a possible
6
- * migration to an SDK v4.
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.EncryptionType = exports.ImageTagMutability = exports.FindingSeverity = exports.ScanStatus = exports.TagStatus = exports.StorageClass = exports.ObjectLockLegalHoldStatus = exports.ObjectLockMode = exports.ObjectCannedACL = exports.ObjectStorageClass = exports.ChecksumAlgorithmIn = exports.RequestCharged = exports.OptionalObjectAttributes = exports.RequestPayer = exports.EncodingType = exports.BucketLocationConstraint = exports.ServerSideEncryption = void 0;
10
- exports.ServerSideEncryption = {
11
- AES256: 'AES256',
12
- aws_kms: 'aws:kms',
13
- aws_kms_dsse: 'aws:kms:dsse',
14
- };
15
- exports.BucketLocationConstraint = {
16
- EU: 'EU',
17
- af_south_1: 'af-south-1',
18
- ap_east_1: 'ap-east-1',
19
- ap_northeast_1: 'ap-northeast-1',
20
- ap_northeast_2: 'ap-northeast-2',
21
- ap_northeast_3: 'ap-northeast-3',
22
- ap_south_1: 'ap-south-1',
23
- ap_south_2: 'ap-south-2',
24
- ap_southeast_1: 'ap-southeast-1',
25
- ap_southeast_2: 'ap-southeast-2',
26
- ap_southeast_3: 'ap-southeast-3',
27
- ap_southeast_4: 'ap-southeast-4',
28
- ap_southeast_5: 'ap-southeast-5',
29
- ca_central_1: 'ca-central-1',
30
- cn_north_1: 'cn-north-1',
31
- cn_northwest_1: 'cn-northwest-1',
32
- eu_central_1: 'eu-central-1',
33
- eu_central_2: 'eu-central-2',
34
- eu_north_1: 'eu-north-1',
35
- eu_south_1: 'eu-south-1',
36
- eu_south_2: 'eu-south-2',
37
- eu_west_1: 'eu-west-1',
38
- eu_west_2: 'eu-west-2',
39
- eu_west_3: 'eu-west-3',
40
- il_central_1: 'il-central-1',
41
- me_south_1: 'me-south-1',
42
- me_central_1: 'me-central-1',
43
- sa_east_1: 'sa-east-1',
44
- us_east_2: 'us-east-2',
45
- us_gov_east_1: 'us-gov-east-1',
46
- us_gov_west_1: 'us-gov-west-1',
47
- us_west_1: 'us-west-1',
48
- us_west_2: 'us-west-2',
49
- };
50
- exports.EncodingType = {
51
- url: 'url',
52
- };
53
- exports.RequestPayer = {
54
- requester: 'requester',
55
- };
56
- exports.OptionalObjectAttributes = {
57
- RESTORE_STATUS: 'RestoreStatus',
58
- };
59
- exports.RequestCharged = {
60
- requester: 'requester',
61
- };
62
- exports.ChecksumAlgorithmIn = {
63
- CRC32: 'CRC32',
64
- CRC32C: 'CRC32C',
65
- SHA1: 'SHA1',
66
- SHA256: 'SHA256',
67
- };
68
- exports.ObjectStorageClass = {
69
- DEEP_ARCHIVE: 'DEEP_ARCHIVE',
70
- EXPRESS_ONEZONE: 'EXPRESS_ONEZONE',
71
- GLACIER: 'GLACIER',
72
- GLACIER_IR: 'GLACIER_IR',
73
- INTELLIGENT_TIERING: 'INTELLIGENT_TIERING',
74
- ONEZONE_IA: 'ONEZONE_IA',
75
- OUTPOSTS: 'OUTPOSTS',
76
- REDUCED_REDUNDANCY: 'REDUCED_REDUNDANCY',
77
- SNOW: 'SNOW',
78
- STANDARD: 'STANDARD',
79
- STANDARD_IA: 'STANDARD_IA',
80
- };
81
- exports.ObjectCannedACL = {
82
- authenticated_read: 'authenticated-read',
83
- aws_exec_read: 'aws-exec-read',
84
- bucket_owner_full_control: 'bucket-owner-full-control',
85
- bucket_owner_read: 'bucket-owner-read',
86
- private: 'private',
87
- public_read: 'public-read',
88
- public_read_write: 'public-read-write',
89
- };
90
- exports.ObjectLockMode = {
91
- COMPLIANCE: 'COMPLIANCE',
92
- GOVERNANCE: 'GOVERNANCE',
93
- };
94
- exports.ObjectLockLegalHoldStatus = {
95
- OFF: 'OFF',
96
- ON: 'ON',
97
- };
98
- exports.StorageClass = {
99
- DEEP_ARCHIVE: 'DEEP_ARCHIVE',
100
- EXPRESS_ONEZONE: 'EXPRESS_ONEZONE',
101
- GLACIER: 'GLACIER',
102
- GLACIER_IR: 'GLACIER_IR',
103
- INTELLIGENT_TIERING: 'INTELLIGENT_TIERING',
104
- ONEZONE_IA: 'ONEZONE_IA',
105
- OUTPOSTS: 'OUTPOSTS',
106
- REDUCED_REDUNDANCY: 'REDUCED_REDUNDANCY',
107
- SNOW: 'SNOW',
108
- STANDARD: 'STANDARD',
109
- STANDARD_IA: 'STANDARD_IA',
110
- };
111
- exports.TagStatus = {
112
- ANY: 'ANY',
113
- TAGGED: 'TAGGED',
114
- UNTAGGED: 'UNTAGGED',
115
- };
116
- exports.ScanStatus = {
117
- ACTIVE: 'ACTIVE',
118
- COMPLETE: 'COMPLETE',
119
- FAILED: 'FAILED',
120
- FINDINGS_UNAVAILABLE: 'FINDINGS_UNAVAILABLE',
121
- IN_PROGRESS: 'IN_PROGRESS',
122
- PENDING: 'PENDING',
123
- SCAN_ELIGIBILITY_EXPIRED: 'SCAN_ELIGIBILITY_EXPIRED',
124
- UNSUPPORTED_IMAGE: 'UNSUPPORTED_IMAGE',
125
- LIMIT_EXCEEDED: 'LIMIT_EXCEEDED',
126
- };
127
- exports.FindingSeverity = {
128
- CRITICAL: 'CRITICAL',
129
- HIGH: 'HIGH',
130
- INFORMATIONAL: 'INFORMATIONAL',
131
- LOW: 'LOW',
132
- MEDIUM: 'MEDIUM',
133
- UNDEFINED: 'UNDEFINED',
134
- };
135
- exports.ImageTagMutability = {
136
- IMMUTABLE: 'IMMUTABLE',
137
- MUTABLE: 'MUTABLE',
138
- };
139
- exports.EncryptionType = {
140
- AES256: 'AES256',
141
- KMS: 'KMS',
142
- KMS_DSSE: 'KMS_DSSE',
143
- };
144
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXdzLXR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7R0FLRzs7O0FBc0RVLFFBQUEsb0JBQW9CLEdBQUc7SUFDbEMsTUFBTSxFQUFFLFFBQVE7SUFDaEIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsWUFBWSxFQUFFLGNBQWM7Q0FDcEIsQ0FBQztBQWlHRSxRQUFBLHdCQUF3QixHQUFHO0lBQ3RDLEVBQUUsRUFBRSxJQUFJO0lBQ1IsVUFBVSxFQUFFLFlBQVk7SUFDeEIsU0FBUyxFQUFFLFdBQVc7SUFDdEIsY0FBYyxFQUFFLGdCQUFnQjtJQUNoQyxjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsVUFBVSxFQUFFLFlBQVk7SUFDeEIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsY0FBYyxFQUFFLGdCQUFnQjtJQUNoQyxjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsY0FBYyxFQUFFLGdCQUFnQjtJQUNoQyxjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLFlBQVksRUFBRSxjQUFjO0lBQzVCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsWUFBWSxFQUFFLGNBQWM7SUFDNUIsWUFBWSxFQUFFLGNBQWM7SUFDNUIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsU0FBUyxFQUFFLFdBQVc7SUFDdEIsU0FBUyxFQUFFLFdBQVc7SUFDdEIsU0FBUyxFQUFFLFdBQVc7SUFDdEIsWUFBWSxFQUFFLGNBQWM7SUFDNUIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsWUFBWSxFQUFFLGNBQWM7SUFDNUIsU0FBUyxFQUFFLFdBQVc7SUFDdEIsU0FBUyxFQUFFLFdBQVc7SUFDdEIsYUFBYSxFQUFFLGVBQWU7SUFDOUIsYUFBYSxFQUFFLGVBQWU7SUFDOUIsU0FBUyxFQUFFLFdBQVc7SUFDdEIsU0FBUyxFQUFFLFdBQVc7Q0FDZCxDQUFDO0FBaUJFLFFBQUEsWUFBWSxHQUFHO0lBQzFCLEdBQUcsRUFBRSxLQUFLO0NBQ0YsQ0FBQztBQUlFLFFBQUEsWUFBWSxHQUFHO0lBQzFCLFNBQVMsRUFBRSxXQUFXO0NBQ2QsQ0FBQztBQUlFLFFBQUEsd0JBQXdCLEdBQUc7SUFDdEMsY0FBYyxFQUFFLGVBQWU7Q0FDdkIsQ0FBQztBQTBIRSxRQUFBLGNBQWMsR0FBRztJQUM1QixTQUFTLEVBQUUsV0FBVztDQUNkLENBQUM7QUFJRSxRQUFBLG1CQUFtQixHQUFHO0lBQ2pDLEtBQUssRUFBRSxPQUFPO0lBQ2QsTUFBTSxFQUFFLFFBQVE7SUFDaEIsSUFBSSxFQUFFLE1BQU07SUFDWixNQUFNLEVBQUUsUUFBUTtDQUNSLENBQUM7QUFNRSxRQUFBLGtCQUFrQixHQUFHO0lBQ2hDLFlBQVksRUFBRSxjQUFjO0lBQzVCLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEMsT0FBTyxFQUFFLFNBQVM7SUFDbEIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsbUJBQW1CLEVBQUUscUJBQXFCO0lBQzFDLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLGtCQUFrQixFQUFFLG9CQUFvQjtJQUN4QyxJQUFJLEVBQUUsTUFBTTtJQUNaLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLFdBQVcsRUFBRSxhQUFhO0NBQ2xCLENBQUM7QUEyU0UsUUFBQSxlQUFlLEdBQUc7SUFDN0Isa0JBQWtCLEVBQUUsb0JBQW9CO0lBQ3hDLGFBQWEsRUFBRSxlQUFlO0lBQzlCLHlCQUF5QixFQUFFLDJCQUEyQjtJQUN0RCxpQkFBaUIsRUFBRSxtQkFBbUI7SUFDdEMsT0FBTyxFQUFFLFNBQVM7SUFDbEIsV0FBVyxFQUFFLGFBQWE7SUFDMUIsaUJBQWlCLEVBQUUsbUJBQW1CO0NBQzlCLENBQUM7QUFJRSxRQUFBLGNBQWMsR0FBRztJQUM1QixVQUFVLEVBQUUsWUFBWTtJQUN4QixVQUFVLEVBQUUsWUFBWTtDQUNoQixDQUFDO0FBSUUsUUFBQSx5QkFBeUIsR0FBRztJQUN2QyxHQUFHLEVBQUUsS0FBSztJQUNWLEVBQUUsRUFBRSxJQUFJO0NBQ0EsQ0FBQztBQUtFLFFBQUEsWUFBWSxHQUFHO0lBQzFCLFlBQVksRUFBRSxjQUFjO0lBQzVCLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEMsT0FBTyxFQUFFLFNBQVM7SUFDbEIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsbUJBQW1CLEVBQUUscUJBQXFCO0lBQzFDLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLGtCQUFrQixFQUFFLG9CQUFvQjtJQUN4QyxJQUFJLEVBQUUsTUFBTTtJQUNaLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLFdBQVcsRUFBRSxhQUFhO0NBQ2xCLENBQUM7QUE4a0JFLFFBQUEsU0FBUyxHQUFHO0lBQ3ZCLEdBQUcsRUFBRSxLQUFLO0lBQ1YsTUFBTSxFQUFFLFFBQVE7SUFDaEIsUUFBUSxFQUFFLFVBQVU7Q0FDWixDQUFDO0FBb0RFLFFBQUEsVUFBVSxHQUFHO0lBQ3hCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLG9CQUFvQixFQUFFLHNCQUFzQjtJQUM1QyxXQUFXLEVBQUUsYUFBYTtJQUMxQixPQUFPLEVBQUUsU0FBUztJQUNsQix3QkFBd0IsRUFBRSwwQkFBMEI7SUFDcEQsaUJBQWlCLEVBQUUsbUJBQW1CO0lBQ3RDLGNBQWMsRUFBRSxnQkFBZ0I7Q0FDeEIsQ0FBQztBQUlFLFFBQUEsZUFBZSxHQUFHO0lBQzdCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLElBQUksRUFBRSxNQUFNO0lBQ1osYUFBYSxFQUFFLGVBQWU7SUFDOUIsR0FBRyxFQUFFLEtBQUs7SUFDVixNQUFNLEVBQUUsUUFBUTtJQUNoQixTQUFTLEVBQUUsV0FBVztDQUNkLENBQUM7QUEySkUsUUFBQSxrQkFBa0IsR0FBRztJQUNoQyxTQUFTLEVBQUUsV0FBVztJQUN0QixPQUFPLEVBQUUsU0FBUztDQUNWLENBQUM7QUFnQkUsUUFBQSxjQUFjLEdBQUc7SUFDNUIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsR0FBRyxFQUFFLEtBQUs7SUFDVixRQUFRLEVBQUUsVUFBVTtDQUNaLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoaXMgZmlsZSBjb250YWlucyBhIGNvcHkgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgdHlwZXMgZnJvbSB0aGUgU0RLIHYzXG4gKiBjbGllbnRzLiBJbnN0ZWFkIG9mIGV4cG9zaW5nIHRoZSBTREsgdHlwZXMgaW4gdGhlIHB1YmxpYyBpbnRlcmZhY2UsIHdlXG4gKiBleHBvc2UgdGhlc2UsIHNoaWVsZGluZyBjb25zdW1lcnMgZnJvbSBicmVha2luZyBjaGFuZ2VzIGluIGEgcG9zc2libGVcbiAqIG1pZ3JhdGlvbiB0byBhbiBTREsgdjQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2VNZXRhZGF0YSB7XG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIGNvZGUgb2YgdGhlIGxhc3QgSFRUUCByZXNwb25zZSByZWNlaXZlZCBmb3IgdGhpcyBvcGVyYXRpb24uXG4gICAqL1xuICBodHRwU3RhdHVzQ29kZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBsYXN0IHJlcXVlc3Qgc2VudCBmb3IgdGhpcyBvcGVyYXRpb24uIE9mdGVuXG4gICAqIHJlcXVlc3RlZCBieSBBV1Mgc2VydmljZSB0ZWFtcyB0byBhaWQgaW4gZGVidWdnaW5nLlxuICAgKi9cbiAgcmVxdWVzdElkPzogc3RyaW5nO1xuICAvKipcbiAgICogQSBzZWNvbmRhcnkgaWRlbnRpZmllciBmb3IgdGhlIGxhc3QgcmVxdWVzdCBzZW50LiBVc2VkIGZvciBkZWJ1Z2dpbmcuXG4gICAqL1xuICBleHRlbmRlZFJlcXVlc3RJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIEEgdGVydGlhcnkgaWRlbnRpZmllciBmb3IgdGhlIGxhc3QgcmVxdWVzdCBzZW50LiBVc2VkIGZvciBkZWJ1Z2dpbmcuXG4gICAqL1xuICBjZklkPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkLlxuICAgKi9cbiAgYXR0ZW1wdHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdGhhdCB3YXMgc3BlbnQgd2FpdGluZyBiZXR3ZWVuXG4gICAqIHJldHJ5IGF0dGVtcHRzLlxuICAgKi9cbiAgdG90YWxSZXRyeURlbGF5PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1ldGFkYXRhQmVhcmVyIHtcbiAgLyoqXG4gICAqIE1ldGFkYXRhIHBlcnRhaW5pbmcgdG8gdGhpcyByZXF1ZXN0LlxuICAgKi9cbiAgJG1ldGFkYXRhOiBSZXNwb25zZU1ldGFkYXRhO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldEJ1Y2tldEVuY3J5cHRpb25Db21tYW5kSW5wdXQge1xuICAvKipcbiAgICogPHA+VGhlIG5hbWUgb2YgdGhlIGJ1Y2tldCBmcm9tIHdoaWNoIHRoZSBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gaXNcbiAgICogICAgICAgICAgcmV0cmlldmVkLjwvcD5cbiAgICogPHA+Tm90ZTogVG8gc3VwcGx5IHRoZSBNdWx0aS1yZWdpb24gQWNjZXNzIFBvaW50IChNUkFQKSB0byBCdWNrZXQsIHlvdSBuZWVkIHRvIGluc3RhbGwgdGhlIFwiQGF3cy1zZGsvc2lnbmF0dXJlLXY0LWNydFwiIHBhY2thZ2UgdG8geW91ciBwcm9qZWN0IGRlcGVuZGVuY2llcy5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBnbyB0byBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1zZGstanMtdjMja25vd24taXNzdWVzPC9wPlxuICAgKi9cbiAgQnVja2V0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiA8cD5UaGUgYWNjb3VudCBJRCBvZiB0aGUgZXhwZWN0ZWQgYnVja2V0IG93bmVyLiBJZiB0aGUgYWNjb3VudCBJRCB0aGF0IHlvdSBwcm92aWRlIGRvZXMgbm90IG1hdGNoIHRoZSBhY3R1YWwgb3duZXIgb2YgdGhlIGJ1Y2tldCwgdGhlIHJlcXVlc3QgZmFpbHMgd2l0aCB0aGUgSFRUUCBzdGF0dXMgY29kZSA8Y29kZT40MDMgRm9yYmlkZGVuPC9jb2RlPiAoYWNjZXNzIGRlbmllZCkuPC9wPlxuICAgKi9cbiAgRXhwZWN0ZWRCdWNrZXRPd25lcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IFNlcnZlclNpZGVFbmNyeXB0aW9uID0ge1xuICBBRVMyNTY6ICdBRVMyNTYnLFxuICBhd3Nfa21zOiAnYXdzOmttcycsXG4gIGF3c19rbXNfZHNzZTogJ2F3czprbXM6ZHNzZScsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBTZXJ2ZXJTaWRlRW5jcnlwdGlvbiA9ICh0eXBlb2YgU2VydmVyU2lkZUVuY3J5cHRpb24pW2tleW9mIHR5cGVvZiBTZXJ2ZXJTaWRlRW5jcnlwdGlvbl07XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmVyU2lkZUVuY3J5cHRpb25CeURlZmF1bHQge1xuICAvKipcbiAgICogPHA+U2VydmVyLXNpZGUgZW5jcnlwdGlvbiBhbGdvcml0aG0gdG8gdXNlIGZvciB0aGUgZGVmYXVsdCBlbmNyeXB0aW9uLjwvcD5cbiAgICovXG4gIFNTRUFsZ29yaXRobTogU2VydmVyU2lkZUVuY3J5cHRpb24gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiA8cD5BbWF6b24gV2ViIFNlcnZpY2VzIEtleSBNYW5hZ2VtZW50IFNlcnZpY2UgKEtNUykgY3VzdG9tZXIgQW1hem9uIFdlYiBTZXJ2aWNlcyBLTVMga2V5IElEIHRvIHVzZSBmb3IgdGhlIGRlZmF1bHRcbiAgICogICAgICAgICAgZW5jcnlwdGlvbi4gVGhpcyBwYXJhbWV0ZXIgaXMgYWxsb3dlZCBpZiBhbmQgb25seSBpZiA8Y29kZT5TU0VBbGdvcml0aG08L2NvZGU+IGlzIHNldCB0b1xuICAgKiAgICAgICAgICA8Y29kZT5hd3M6a21zPC9jb2RlPiBvciA8Y29kZT5hd3M6a21zOmRzc2U8L2NvZGU+LjwvcD5cbiAgICogICAgICAgICAgPHA+WW91IGNhbiBzcGVjaWZ5IHRoZSBrZXkgSUQsIGtleSBhbGlhcywgb3IgdGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBLTVNcbiAgICogICAgICAgICAga2V5LjwvcD5cbiAgICogICAgICAgICAgPHVsPlxuICAgKiAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgIDxwPktleSBJRDogPGNvZGU+MTIzNGFiY2QtMTJhYi0zNGNkLTU2ZWYtMTIzNDU2Nzg5MGFiPC9jb2RlPlxuICAgKiAgICAgICAgICAgICAgICA8L3A+XG4gICAqICAgICAgICAgICAgIDwvbGk+XG4gICAqICAgICAgICAgICAgIDxsaT5cbiAgICogICAgICAgICAgICAgICAgPHA+S2V5IEFSTjogPGNvZGU+YXJuOmF3czprbXM6dXMtZWFzdC0yOjExMTEyMjIyMzMzMzprZXkvMTIzNGFiY2QtMTJhYi0zNGNkLTU2ZWYtMTIzNDU2Nzg5MGFiPC9jb2RlPlxuICAgKiAgICAgICAgICAgICAgICA8L3A+XG4gICAqICAgICAgICAgICAgIDwvbGk+XG4gICAqICAgICAgICAgICAgIDxsaT5cbiAgICogICAgICAgICAgICAgICAgPHA+S2V5IEFsaWFzOiA8Y29kZT5hbGlhcy9hbGlhcy1uYW1lPC9jb2RlPlxuICAgKiAgICAgICAgICAgICAgICA8L3A+XG4gICAqICAgICAgICAgICAgIDwvbGk+XG4gICAqICAgICAgICAgIDwvdWw+XG4gICAqICAgICAgICAgIDxwPklmIHlvdSB1c2UgYSBrZXkgSUQsIHlvdSBjYW4gcnVuIGludG8gYSBMb2dEZXN0aW5hdGlvbiB1bmRlbGl2ZXJhYmxlIGVycm9yIHdoZW4gY3JlYXRpbmdcbiAgICogICAgICAgICAgYSBWUEMgZmxvdyBsb2cuIDwvcD5cbiAgICogICAgICAgICAgPHA+SWYgeW91IGFyZSB1c2luZyBlbmNyeXB0aW9uIHdpdGggY3Jvc3MtYWNjb3VudCBvciBBbWF6b24gV2ViIFNlcnZpY2VzIHNlcnZpY2Ugb3BlcmF0aW9ucyB5b3UgbXVzdCB1c2VcbiAgICogICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgS01TIGtleSBBUk4uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L2J1Y2tldC1lbmNyeXB0aW9uLmh0bWwjYnVja2V0LWVuY3J5cHRpb24tdXBkYXRlLWJ1Y2tldC1wb2xpY3lcIj5Vc2luZyBlbmNyeXB0aW9uIGZvciBjcm9zcy1hY2NvdW50IG9wZXJhdGlvbnM8L2E+LjwvcD5cbiAgICogICAgICAgICAgPGltcG9ydGFudD5cbiAgICogICAgICAgICAgICAgPHA+QW1hem9uIFMzIG9ubHkgc3VwcG9ydHMgc3ltbWV0cmljIGVuY3J5cHRpb24gS01TIGtleXMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rbXMvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3N5bW1ldHJpYy1hc3ltbWV0cmljLmh0bWxcIj5Bc3ltbWV0cmljIGtleXMgaW4gQW1hem9uIFdlYiBTZXJ2aWNlcyBLTVM8L2E+IGluIHRoZSA8aT5BbWF6b24gV2ViIFNlcnZpY2VzIEtleSBNYW5hZ2VtZW50IFNlcnZpY2VcbiAgICogICAgICAgICAgICAgICAgRGV2ZWxvcGVyIEd1aWRlPC9pPi48L3A+XG4gICAqICAgICAgICAgIDwvaW1wb3J0YW50PlxuICAgKi9cbiAgS01TTWFzdGVyS2V5SUQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmVyU2lkZUVuY3J5cHRpb25SdWxlIHtcbiAgLyoqXG4gICAqIDxwPlNwZWNpZmllcyB0aGUgZGVmYXVsdCBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIHRvIGFwcGx5IHRvIG5ldyBvYmplY3RzIGluIHRoZSBidWNrZXQuIElmIGFcbiAgICogICAgICAgICAgUFVUIE9iamVjdCByZXF1ZXN0IGRvZXNuJ3Qgc3BlY2lmeSBhbnkgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiwgdGhpcyBkZWZhdWx0IGVuY3J5cHRpb24gd2lsbFxuICAgKiAgICAgICAgICBiZSBhcHBsaWVkLjwvcD5cbiAgICovXG4gIEFwcGx5U2VydmVyU2lkZUVuY3J5cHRpb25CeURlZmF1bHQ/OiBTZXJ2ZXJTaWRlRW5jcnlwdGlvbkJ5RGVmYXVsdDtcbiAgLyoqXG4gICAqIDxwPlNwZWNpZmllcyB3aGV0aGVyIEFtYXpvbiBTMyBzaG91bGQgdXNlIGFuIFMzIEJ1Y2tldCBLZXkgd2l0aCBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIHVzaW5nIEtNU1xuICAgKiAgICAgICAgICAoU1NFLUtNUykgZm9yIG5ldyBvYmplY3RzIGluIHRoZSBidWNrZXQuIEV4aXN0aW5nIG9iamVjdHMgYXJlIG5vdCBhZmZlY3RlZC4gU2V0dGluZyB0aGVcbiAgICogICAgICAgICAgICAgPGNvZGU+QnVja2V0S2V5RW5hYmxlZDwvY29kZT4gZWxlbWVudCB0byA8Y29kZT50cnVlPC9jb2RlPiBjYXVzZXMgQW1hem9uIFMzIHRvIHVzZSBhbiBTM1xuICAgKiAgICAgICAgICBCdWNrZXQgS2V5LiBCeSBkZWZhdWx0LCBTMyBCdWNrZXQgS2V5IGlzIG5vdCBlbmFibGVkLjwvcD5cbiAgICogICAgICAgICAgPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvYnVja2V0LWtleS5odG1sXCI+QW1hem9uIFMzIEJ1Y2tldCBLZXlzPC9hPiBpbiB0aGVcbiAgICogICAgICAgICAgICAgPGk+QW1hem9uIFMzIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICovXG4gIEJ1Y2tldEtleUVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiA8cD5Db250YWluZXIgZm9yIGluZm9ybWF0aW9uIGFib3V0IGEgcGFydGljdWxhciBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb25cbiAgICogICAgICAgICAgcnVsZS48L3A+XG4gICAqL1xuICBSdWxlczogU2VydmVyU2lkZUVuY3J5cHRpb25SdWxlW10gfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QnVja2V0RW5jcnlwdGlvbk91dHB1dCB7XG4gIC8qKlxuICAgKiA8cD5TcGVjaWZpZXMgdGhlIGRlZmF1bHQgc2VydmVyLXNpZGUtZW5jcnlwdGlvbiBjb25maWd1cmF0aW9uLjwvcD5cbiAgICovXG4gIFNlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbj86IFNlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRCdWNrZXRFbmNyeXB0aW9uQ29tbWFuZE91dHB1dFxuICBleHRlbmRzIEdldEJ1Y2tldEVuY3J5cHRpb25PdXRwdXQsXG4gIE1ldGFkYXRhQmVhcmVyIHtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRCdWNrZXRMb2NhdGlvbkNvbW1hbmRJbnB1dCB7XG4gIC8qKlxuICAgKiA8cD5UaGUgbmFtZSBvZiB0aGUgYnVja2V0IGZvciB3aGljaCB0byBnZXQgdGhlIGxvY2F0aW9uLjwvcD5cbiAgICogICAgICAgICAgPHA+V2hlbiB5b3UgdXNlIHRoaXMgQVBJIG9wZXJhdGlvbiB3aXRoIGFuIGFjY2VzcyBwb2ludCwgcHJvdmlkZSB0aGUgYWxpYXMgb2YgdGhlIGFjY2VzcyBwb2ludCBpbiBwbGFjZSBvZiB0aGUgYnVja2V0IG5hbWUuPC9wPlxuICAgKiAgICAgICAgICA8cD5XaGVuIHlvdSB1c2UgdGhpcyBBUEkgb3BlcmF0aW9uIHdpdGggYW4gT2JqZWN0IExhbWJkYSBhY2Nlc3MgcG9pbnQsIHByb3ZpZGUgdGhlIGFsaWFzIG9mIHRoZSBPYmplY3QgTGFtYmRhIGFjY2VzcyBwb2ludCBpbiBwbGFjZSBvZiB0aGUgYnVja2V0IG5hbWUuXG4gICAqIElmIHRoZSBPYmplY3QgTGFtYmRhIGFjY2VzcyBwb2ludCBhbGlhcyBpbiBhIHJlcXVlc3QgaXMgbm90IHZhbGlkLCB0aGUgZXJyb3IgY29kZSA8Y29kZT5JbnZhbGlkQWNjZXNzUG9pbnRBbGlhc0Vycm9yPC9jb2RlPiBpcyByZXR1cm5lZC5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgPGNvZGU+SW52YWxpZEFjY2Vzc1BvaW50QWxpYXNFcnJvcjwvY29kZT4sIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvRXJyb3JSZXNwb25zZXMuaHRtbCNFcnJvckNvZGVMaXN0XCI+TGlzdCBvZlxuICAgKiAgICAgICAgICAgICBFcnJvciBDb2RlczwvYT4uPC9wPlxuICAgKiA8cD5Ob3RlOiBUbyBzdXBwbHkgdGhlIE11bHRpLXJlZ2lvbiBBY2Nlc3MgUG9pbnQgKE1SQVApIHRvIEJ1Y2tldCwgeW91IG5lZWQgdG8gaW5zdGFsbCB0aGUgXCJAYXdzLXNkay9zaWduYXR1cmUtdjQtY3J0XCIgcGFja2FnZSB0byB5b3VyIHByb2plY3QgZGVwZW5kZW5jaWVzLlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGdvIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1qcy12MyNrbm93bi1pc3N1ZXM8L3A+XG4gICAqL1xuICBCdWNrZXQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIDxwPlRoZSBhY2NvdW50IElEIG9mIHRoZSBleHBlY3RlZCBidWNrZXQgb3duZXIuIElmIHRoZSBhY2NvdW50IElEIHRoYXQgeW91IHByb3ZpZGUgZG9lcyBub3QgbWF0Y2ggdGhlIGFjdHVhbCBvd25lciBvZiB0aGUgYnVja2V0LCB0aGUgcmVxdWVzdCBmYWlscyB3aXRoIHRoZSBIVFRQIHN0YXR1cyBjb2RlIDxjb2RlPjQwMyBGb3JiaWRkZW48L2NvZGU+IChhY2Nlc3MgZGVuaWVkKS48L3A+XG4gICAqL1xuICBFeHBlY3RlZEJ1Y2tldE93bmVyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgQnVja2V0TG9jYXRpb25Db25zdHJhaW50ID0ge1xuICBFVTogJ0VVJyxcbiAgYWZfc291dGhfMTogJ2FmLXNvdXRoLTEnLFxuICBhcF9lYXN0XzE6ICdhcC1lYXN0LTEnLFxuICBhcF9ub3J0aGVhc3RfMTogJ2FwLW5vcnRoZWFzdC0xJyxcbiAgYXBfbm9ydGhlYXN0XzI6ICdhcC1ub3J0aGVhc3QtMicsXG4gIGFwX25vcnRoZWFzdF8zOiAnYXAtbm9ydGhlYXN0LTMnLFxuICBhcF9zb3V0aF8xOiAnYXAtc291dGgtMScsXG4gIGFwX3NvdXRoXzI6ICdhcC1zb3V0aC0yJyxcbiAgYXBfc291dGhlYXN0XzE6ICdhcC1zb3V0aGVhc3QtMScsXG4gIGFwX3NvdXRoZWFzdF8yOiAnYXAtc291dGhlYXN0LTInLFxuICBhcF9zb3V0aGVhc3RfMzogJ2FwLXNvdXRoZWFzdC0zJyxcbiAgYXBfc291dGhlYXN0XzQ6ICdhcC1zb3V0aGVhc3QtNCcsXG4gIGFwX3NvdXRoZWFzdF81OiAnYXAtc291dGhlYXN0LTUnLFxuICBjYV9jZW50cmFsXzE6ICdjYS1jZW50cmFsLTEnLFxuICBjbl9ub3J0aF8xOiAnY24tbm9ydGgtMScsXG4gIGNuX25vcnRod2VzdF8xOiAnY24tbm9ydGh3ZXN0LTEnLFxuICBldV9jZW50cmFsXzE6ICdldS1jZW50cmFsLTEnLFxuICBldV9jZW50cmFsXzI6ICdldS1jZW50cmFsLTInLFxuICBldV9ub3J0aF8xOiAnZXUtbm9ydGgtMScsXG4gIGV1X3NvdXRoXzE6ICdldS1zb3V0aC0xJyxcbiAgZXVfc291dGhfMjogJ2V1LXNvdXRoLTInLFxuICBldV93ZXN0XzE6ICdldS13ZXN0LTEnLFxuICBldV93ZXN0XzI6ICdldS13ZXN0LTInLFxuICBldV93ZXN0XzM6ICdldS13ZXN0LTMnLFxuICBpbF9jZW50cmFsXzE6ICdpbC1jZW50cmFsLTEnLFxuICBtZV9zb3V0aF8xOiAnbWUtc291dGgtMScsXG4gIG1lX2NlbnRyYWxfMTogJ21lLWNlbnRyYWwtMScsXG4gIHNhX2Vhc3RfMTogJ3NhLWVhc3QtMScsXG4gIHVzX2Vhc3RfMjogJ3VzLWVhc3QtMicsXG4gIHVzX2dvdl9lYXN0XzE6ICd1cy1nb3YtZWFzdC0xJyxcbiAgdXNfZ292X3dlc3RfMTogJ3VzLWdvdi13ZXN0LTEnLFxuICB1c193ZXN0XzE6ICd1cy13ZXN0LTEnLFxuICB1c193ZXN0XzI6ICd1cy13ZXN0LTInLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgQnVja2V0TG9jYXRpb25Db25zdHJhaW50ID1cbiAgKHR5cGVvZiBCdWNrZXRMb2NhdGlvbkNvbnN0cmFpbnQpW2tleW9mIHR5cGVvZiBCdWNrZXRMb2NhdGlvbkNvbnN0cmFpbnRdO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdldEJ1Y2tldExvY2F0aW9uT3V0cHV0IHtcbiAgLyoqXG4gICAqIDxwPlNwZWNpZmllcyB0aGUgUmVnaW9uIHdoZXJlIHRoZSBidWNrZXQgcmVzaWRlcy4gRm9yIGEgbGlzdCBvZiBhbGwgdGhlIEFtYXpvbiBTMyBzdXBwb3J0ZWRcbiAgICogICAgICAgICAgbG9jYXRpb24gY29uc3RyYWludHMgYnkgUmVnaW9uLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nZW5lcmFsL2xhdGVzdC9nci9yYW5kZS5odG1sI3MzX3JlZ2lvblwiPlJlZ2lvbnMgYW5kIEVuZHBvaW50czwvYT4uIEJ1Y2tldHMgaW5cbiAgICogICAgICAgICAgUmVnaW9uIDxjb2RlPnVzLWVhc3QtMTwvY29kZT4gaGF2ZSBhIExvY2F0aW9uQ29uc3RyYWludCBvZiA8Y29kZT5udWxsPC9jb2RlPi48L3A+XG4gICAqL1xuICBMb2NhdGlvbkNvbnN0cmFpbnQ/OiBCdWNrZXRMb2NhdGlvbkNvbnN0cmFpbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QnVja2V0TG9jYXRpb25Db21tYW5kT3V0cHV0IGV4dGVuZHMgR2V0QnVja2V0TG9jYXRpb25PdXRwdXQsIE1ldGFkYXRhQmVhcmVyIHtcbn1cblxuZXhwb3J0IGNvbnN0IEVuY29kaW5nVHlwZSA9IHtcbiAgdXJsOiAndXJsJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEVuY29kaW5nVHlwZSA9ICh0eXBlb2YgRW5jb2RpbmdUeXBlKVtrZXlvZiB0eXBlb2YgRW5jb2RpbmdUeXBlXTtcblxuZXhwb3J0IGNvbnN0IFJlcXVlc3RQYXllciA9IHtcbiAgcmVxdWVzdGVyOiAncmVxdWVzdGVyJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RQYXllciA9ICh0eXBlb2YgUmVxdWVzdFBheWVyKVtrZXlvZiB0eXBlb2YgUmVxdWVzdFBheWVyXTtcblxuZXhwb3J0IGNvbnN0IE9wdGlvbmFsT2JqZWN0QXR0cmlidXRlcyA9IHtcbiAgUkVTVE9SRV9TVEFUVVM6ICdSZXN0b3JlU3RhdHVzJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIE9wdGlvbmFsT2JqZWN0QXR0cmlidXRlcyA9XG4gICh0eXBlb2YgT3B0aW9uYWxPYmplY3RBdHRyaWJ1dGVzKVtrZXlvZiB0eXBlb2YgT3B0aW9uYWxPYmplY3RBdHRyaWJ1dGVzXTtcblxuZXhwb3J0IGludGVyZmFjZSBMaXN0T2JqZWN0c1YyQ29tbWFuZElucHV0IHtcbiAgLyoqXG4gICAqIDxwPlxuICAgKiAgICAgICAgICAgICA8Yj5EaXJlY3RvcnkgYnVja2V0czwvYj4gLSBXaGVuIHlvdSB1c2UgdGhpcyBvcGVyYXRpb24gd2l0aCBhIGRpcmVjdG9yeSBidWNrZXQsIHlvdSBtdXN0IHVzZSB2aXJ0dWFsLWhvc3RlZC1zdHlsZSByZXF1ZXN0cyBpbiB0aGUgZm9ybWF0IDxjb2RlPlxuICAgKiAgICAgICAgICAgICAgICA8aT5CdWNrZXRfbmFtZTwvaT4uczNleHByZXNzLTxpPmF6X2lkPC9pPi48aT5yZWdpb248L2k+LmFtYXpvbmF3cy5jb208L2NvZGU+LiBQYXRoLXN0eWxlIHJlcXVlc3RzIGFyZSBub3Qgc3VwcG9ydGVkLiAgRGlyZWN0b3J5IGJ1Y2tldCBuYW1lcyBtdXN0IGJlIHVuaXF1ZSBpbiB0aGUgY2hvc2VuIEF2YWlsYWJpbGl0eSBab25lLiBCdWNrZXQgbmFtZXMgbXVzdCBmb2xsb3cgdGhlIGZvcm1hdCA8Y29kZT5cbiAgICogICAgICAgICAgICAgICAgPGk+YnVja2V0X2Jhc2VfbmFtZTwvaT4tLTxpPmF6LWlkPC9pPi0teC1zMzwvY29kZT4gKGZvciBleGFtcGxlLCA8Y29kZT5cbiAgICogICAgICAgICAgICAgICAgPGk+RE9DLUVYQU1QTEUtQlVDS0VUPC9pPi0tPGk+dXN3Mi1hejE8L2k+LS14LXMzPC9jb2RlPikuIEZvciBpbmZvcm1hdGlvbiBhYm91dCBidWNrZXQgbmFtaW5nXG4gICAqICAgICAgICAgIHJlc3RyaWN0aW9ucywgc2VlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9kaXJlY3RvcnktYnVja2V0LW5hbWluZy1ydWxlcy5odG1sXCI+RGlyZWN0b3J5IGJ1Y2tldCBuYW1pbmdcbiAgICogICAgICAgICAgICAgcnVsZXM8L2E+IGluIHRoZSA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKiAgICAgICAgICA8cD5cbiAgICogICAgICAgICAgICAgPGI+QWNjZXNzIHBvaW50czwvYj4gLSBXaGVuIHlvdSB1c2UgdGhpcyBhY3Rpb24gd2l0aCBhbiBhY2Nlc3MgcG9pbnQsIHlvdSBtdXN0IHByb3ZpZGUgdGhlIGFsaWFzIG9mIHRoZSBhY2Nlc3MgcG9pbnQgaW4gcGxhY2Ugb2YgdGhlIGJ1Y2tldCBuYW1lIG9yIHNwZWNpZnkgdGhlIGFjY2VzcyBwb2ludCBBUk4uIFdoZW4gdXNpbmcgdGhlIGFjY2VzcyBwb2ludCBBUk4sIHlvdSBtdXN0IGRpcmVjdCByZXF1ZXN0cyB0byB0aGUgYWNjZXNzIHBvaW50IGhvc3RuYW1lLiBUaGUgYWNjZXNzIHBvaW50IGhvc3RuYW1lIHRha2VzIHRoZSBmb3JtIDxpPkFjY2Vzc1BvaW50TmFtZTwvaT4tPGk+QWNjb3VudElkPC9pPi5zMy1hY2Nlc3Nwb2ludC48aT5SZWdpb248L2k+LmFtYXpvbmF3cy5jb20uIFdoZW4gdXNpbmcgdGhpcyBhY3Rpb24gd2l0aCBhbiBhY2Nlc3MgcG9pbnQgdGhyb3VnaCB0aGUgQW1hem9uIFdlYiBTZXJ2aWNlcyBTREtzLCB5b3UgcHJvdmlkZSB0aGUgYWNjZXNzIHBvaW50IEFSTiBpbiBwbGFjZSBvZiB0aGUgYnVja2V0IG5hbWUuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGFjY2VzcyBwb2ludCBBUk5zLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL3VzaW5nLWFjY2Vzcy1wb2ludHMuaHRtbFwiPlVzaW5nIGFjY2VzcyBwb2ludHM8L2E+IGluIHRoZSA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+QWNjZXNzIHBvaW50cyBhbmQgT2JqZWN0IExhbWJkYSBhY2Nlc3MgcG9pbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IGRpcmVjdG9yeSBidWNrZXRzLjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKiAgICAgICAgICA8cD5cbiAgICogICAgICAgICAgICAgPGI+UzMgb24gT3V0cG9zdHM8L2I+IC0gV2hlbiB5b3UgdXNlIHRoaXMgYWN0aW9uIHdpdGggQW1hem9uIFMzIG9uIE91dHBvc3RzLCB5b3UgbXVzdCBkaXJlY3QgcmVxdWVzdHMgdG8gdGhlIFMzIG9uIE91dHBvc3RzIGhvc3RuYW1lLiBUaGUgUzMgb24gT3V0cG9zdHMgaG9zdG5hbWUgdGFrZXMgdGhlIGZvcm0gPGNvZGU+XG4gICAqICAgICAgICAgICAgICAgIDxpPkFjY2Vzc1BvaW50TmFtZTwvaT4tPGk+QWNjb3VudElkPC9pPi48aT5vdXRwb3N0SUQ8L2k+LnMzLW91dHBvc3RzLjxpPlJlZ2lvbjwvaT4uYW1hem9uYXdzLmNvbTwvY29kZT4uIFdoZW4geW91IHVzZSB0aGlzIGFjdGlvbiB3aXRoIFMzIG9uIE91dHBvc3RzIHRocm91Z2ggdGhlIEFtYXpvbiBXZWIgU2VydmljZXMgU0RLcywgeW91IHByb3ZpZGUgdGhlIE91dHBvc3RzIGFjY2VzcyBwb2ludCBBUk4gaW4gcGxhY2Ugb2YgdGhlIGJ1Y2tldCBuYW1lLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBTMyBvbiBPdXRwb3N0cyBBUk5zLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL1Mzb25PdXRwb3N0cy5odG1sXCI+V2hhdCBpcyBTMyBvbiBPdXRwb3N0cz88L2E+IGluIHRoZSA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKiA8cD5Ob3RlOiBUbyBzdXBwbHkgdGhlIE11bHRpLXJlZ2lvbiBBY2Nlc3MgUG9pbnQgKE1SQVApIHRvIEJ1Y2tldCwgeW91IG5lZWQgdG8gaW5zdGFsbCB0aGUgXCJAYXdzLXNkay9zaWduYXR1cmUtdjQtY3J0XCIgcGFja2FnZSB0byB5b3VyIHByb2plY3QgZGVwZW5kZW5jaWVzLlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGdvIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1qcy12MyNrbm93bi1pc3N1ZXM8L3A+XG4gICAqL1xuICBCdWNrZXQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIDxwPkEgZGVsaW1pdGVyIGlzIGEgY2hhcmFjdGVyIHRoYXQgeW91IHVzZSB0byBncm91cCBrZXlzLjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDx1bD5cbiAgICogICAgICAgICAgICAgICAgPGxpPlxuICAgKiAgICAgICAgICAgICAgICAgICA8cD5cbiAgICogICAgICAgICAgICAgICAgICAgICAgPGI+RGlyZWN0b3J5IGJ1Y2tldHM8L2I+IC0gRm9yIGRpcmVjdG9yeSBidWNrZXRzLCA8Y29kZT4vPC9jb2RlPiBpcyB0aGUgb25seSBzdXBwb3J0ZWQgZGVsaW1pdGVyLjwvcD5cbiAgICogICAgICAgICAgICAgICAgPC9saT5cbiAgICogICAgICAgICAgICAgICAgPGxpPlxuICAgKiAgICAgICAgICAgICAgICAgICA8cD5cbiAgICogICAgICAgICAgICAgICAgICAgICAgPGI+RGlyZWN0b3J5IGJ1Y2tldHMgPC9iPiAtIFdoZW4geW91IHF1ZXJ5IDxjb2RlPkxpc3RPYmplY3RzVjI8L2NvZGU+IHdpdGggYSBkZWxpbWl0ZXIgZHVyaW5nIGluLXByb2dyZXNzIG11bHRpcGFydCB1cGxvYWRzLCB0aGVcbiAgICogICAgICAgICAgICAgPGNvZGU+Q29tbW9uUHJlZml4ZXM8L2NvZGU+IHJlc3BvbnNlIHBhcmFtZXRlciBjb250YWlucyB0aGUgcHJlZml4ZXMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbi1wcm9ncmVzcyBtdWx0aXBhcnQgdXBsb2Fkcy5cbiAgICogICAgICAgICAgICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgbXVsdGlwYXJ0IHVwbG9hZHMsIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvbXB1b3ZlcnZpZXcuaHRtbFwiPk11bHRpcGFydCBVcGxvYWQgT3ZlcnZpZXc8L2E+IGluIHRoZSA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKiAgICAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICA8L3VsPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBEZWxpbWl0ZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5FbmNvZGluZyB0eXBlIHVzZWQgYnkgQW1hem9uIFMzIHRvIGVuY29kZSB0aGUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL29iamVjdC1rZXlzLmh0bWxcIj5vYmplY3Qga2V5czwvYT4gaW4gdGhlIHJlc3BvbnNlLlxuICAgKiAgICAgICAgICBSZXNwb25zZXMgYXJlIGVuY29kZWQgb25seSBpbiBVVEYtOC4gQW4gb2JqZWN0IGtleSBjYW4gY29udGFpbiBhbnkgVW5pY29kZSBjaGFyYWN0ZXIuXG4gICAqICAgICAgICAgIEhvd2V2ZXIsIHRoZSBYTUwgMS4wIHBhcnNlciBjYW4ndCBwYXJzZSBjZXJ0YWluIGNoYXJhY3RlcnMsIHN1Y2ggYXMgY2hhcmFjdGVycyB3aXRoIGFuXG4gICAqICAgICAgICAgIEFTQ0lJIHZhbHVlIGZyb20gMCB0byAxMC4gRm9yIGNoYXJhY3RlcnMgdGhhdCBhcmVuJ3Qgc3VwcG9ydGVkIGluIFhNTCAxLjAsIHlvdSBjYW4gYWRkIHRoaXNcbiAgICogICAgICAgICAgcGFyYW1ldGVyIHRvIHJlcXVlc3QgdGhhdCBBbWF6b24gUzMgZW5jb2RlIHRoZSBrZXlzIGluIHRoZSByZXNwb25zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXRcbiAgICogICAgICAgICAgY2hhcmFjdGVycyB0byBhdm9pZCBpbiBvYmplY3Qga2V5IG5hbWVzLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL29iamVjdC1rZXlzLmh0bWwjb2JqZWN0LWtleS1ndWlkZWxpbmVzXCI+T2JqZWN0IGtleSBuYW1pbmdcbiAgICogICAgICAgICAgICAgZ3VpZGVsaW5lczwvYT4uPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+V2hlbiB1c2luZyB0aGUgVVJMIGVuY29kaW5nIHR5cGUsIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIHRoYXQgYXJlIHVzZWQgaW4gYW4gb2JqZWN0J3NcbiAgICogICAgICAgICAgICAga2V5IG5hbWUgd2lsbCBiZSBwZXJjZW50LWVuY29kZWQgYWNjb3JkaW5nIHRvIFVURi04IGNvZGUgdmFsdWVzLiBGb3IgZXhhbXBsZSwgdGhlIG9iamVjdFxuICAgKiAgICAgICAgICAgICA8Y29kZT50ZXN0X2ZpbGUoMykucG5nPC9jb2RlPiB3aWxsIGFwcGVhciBhc1xuICAgKiAgICAgICAgICAgICA8Y29kZT50ZXN0X2ZpbGUlMjgzJTI5LnBuZzwvY29kZT4uPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBFbmNvZGluZ1R5cGU/OiBFbmNvZGluZ1R5cGU7XG4gIC8qKlxuICAgKiA8cD5TZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBrZXlzIHJldHVybmVkIGluIHRoZSByZXNwb25zZS4gQnkgZGVmYXVsdCwgdGhlIGFjdGlvbiByZXR1cm5zXG4gICAqICAgICAgICAgIHVwIHRvIDEsMDAwIGtleSBuYW1lcy4gVGhlIHJlc3BvbnNlIG1pZ2h0IGNvbnRhaW4gZmV3ZXIga2V5cyBidXQgd2lsbCBuZXZlciBjb250YWluXG4gICAqICAgICAgICAgIG1vcmUuPC9wPlxuICAgKi9cbiAgTWF4S2V5cz86IG51bWJlcjtcbiAgLyoqXG4gICAqIDxwPkxpbWl0cyB0aGUgcmVzcG9uc2UgdG8ga2V5cyB0aGF0IGJlZ2luIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXguPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+XG4gICAqICAgICAgICAgICAgICAgIDxiPkRpcmVjdG9yeSBidWNrZXRzPC9iPiAtIEZvciBkaXJlY3RvcnkgYnVja2V0cywgb25seSBwcmVmaXhlcyB0aGF0IGVuZCBpbiBhIGRlbGltaXRlciAoPGNvZGU+LzwvY29kZT4pIGFyZSBzdXBwb3J0ZWQuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBQcmVmaXg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5cbiAgICogICAgICAgICAgICAgPGNvZGU+Q29udGludWF0aW9uVG9rZW48L2NvZGU+IGluZGljYXRlcyB0byBBbWF6b24gUzMgdGhhdCB0aGUgbGlzdCBpcyBiZWluZyBjb250aW51ZWQgb25cbiAgICogICAgICAgICAgdGhpcyBidWNrZXQgd2l0aCBhIHRva2VuLiA8Y29kZT5Db250aW51YXRpb25Ub2tlbjwvY29kZT4gaXMgb2JmdXNjYXRlZCBhbmQgaXMgbm90IGEgcmVhbFxuICAgKiAgICAgICAgICBrZXkuIFlvdSBjYW4gdXNlIHRoaXMgPGNvZGU+Q29udGludWF0aW9uVG9rZW48L2NvZGU+IGZvciBwYWdpbmF0aW9uIG9mIHRoZSBsaXN0IHJlc3VsdHMuICA8L3A+XG4gICAqL1xuICBDb250aW51YXRpb25Ub2tlbj86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlRoZSBvd25lciBmaWVsZCBpcyBub3QgcHJlc2VudCBpbiA8Y29kZT5MaXN0T2JqZWN0c1YyPC9jb2RlPiBieSBkZWZhdWx0LiBJZiB5b3Ugd2FudCB0b1xuICAgKiAgICAgICAgICByZXR1cm4gdGhlIG93bmVyIGZpZWxkIHdpdGggZWFjaCBrZXkgaW4gdGhlIHJlc3VsdCwgdGhlbiBzZXQgdGhlIDxjb2RlPkZldGNoT3duZXI8L2NvZGU+XG4gICAqICAgICAgICAgIGZpZWxkIHRvIDxjb2RlPnRydWU8L2NvZGU+LjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlxuICAgKiAgICAgICAgICAgICAgICA8Yj5EaXJlY3RvcnkgYnVja2V0czwvYj4gLSBGb3IgZGlyZWN0b3J5IGJ1Y2tldHMsIHRoZSBidWNrZXQgb3duZXIgaXMgcmV0dXJuZWQgYXMgdGhlIG9iamVjdCBvd25lciBmb3IgYWxsIG9iamVjdHMuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBGZXRjaE93bmVyPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIDxwPlN0YXJ0QWZ0ZXIgaXMgd2hlcmUgeW91IHdhbnQgQW1hem9uIFMzIHRvIHN0YXJ0IGxpc3RpbmcgZnJvbS4gQW1hem9uIFMzIHN0YXJ0cyBsaXN0aW5nIGFmdGVyIHRoaXNcbiAgICogICAgICAgICAgc3BlY2lmaWVkIGtleS4gU3RhcnRBZnRlciBjYW4gYmUgYW55IGtleSBpbiB0aGUgYnVja2V0LjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIFN0YXJ0QWZ0ZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5Db25maXJtcyB0aGF0IHRoZSByZXF1ZXN0ZXIga25vd3MgdGhhdCBzaGUgb3IgaGUgd2lsbCBiZSBjaGFyZ2VkIGZvciB0aGUgbGlzdCBvYmplY3RzXG4gICAqICAgICAgICAgIHJlcXVlc3QgaW4gVjIgc3R5bGUuIEJ1Y2tldCBvd25lcnMgbmVlZCBub3Qgc3BlY2lmeSB0aGlzIHBhcmFtZXRlciBpbiB0aGVpclxuICAgKiAgICAgICAgICByZXF1ZXN0cy48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBSZXF1ZXN0UGF5ZXI/OiBSZXF1ZXN0UGF5ZXI7XG4gIC8qKlxuICAgKiA8cD5UaGUgYWNjb3VudCBJRCBvZiB0aGUgZXhwZWN0ZWQgYnVja2V0IG93bmVyLiBJZiB0aGUgYWNjb3VudCBJRCB0aGF0IHlvdSBwcm92aWRlIGRvZXMgbm90IG1hdGNoIHRoZSBhY3R1YWwgb3duZXIgb2YgdGhlIGJ1Y2tldCwgdGhlIHJlcXVlc3QgZmFpbHMgd2l0aCB0aGUgSFRUUCBzdGF0dXMgY29kZSA8Y29kZT40MDMgRm9yYmlkZGVuPC9jb2RlPiAoYWNjZXNzIGRlbmllZCkuPC9wPlxuICAgKi9cbiAgRXhwZWN0ZWRCdWNrZXRPd25lcj86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlNwZWNpZmllcyB0aGUgb3B0aW9uYWwgZmllbGRzIHRoYXQgeW91IHdhbnQgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlLiBGaWVsZHMgdGhhdCB5b3UgZG9cbiAgICogICAgICAgICAgbm90IHNwZWNpZnkgYXJlIG5vdCByZXR1cm5lZC48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBPcHRpb25hbE9iamVjdEF0dHJpYnV0ZXM/OiBPcHRpb25hbE9iamVjdEF0dHJpYnV0ZXNbXTtcbn1cblxuZXhwb3J0IGNvbnN0IFJlcXVlc3RDaGFyZ2VkID0ge1xuICByZXF1ZXN0ZXI6ICdyZXF1ZXN0ZXInLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgUmVxdWVzdENoYXJnZWQgPSAodHlwZW9mIFJlcXVlc3RDaGFyZ2VkKVtrZXlvZiB0eXBlb2YgUmVxdWVzdENoYXJnZWRdO1xuXG5leHBvcnQgY29uc3QgQ2hlY2tzdW1BbGdvcml0aG1JbiA9IHtcbiAgQ1JDMzI6ICdDUkMzMicsXG4gIENSQzMyQzogJ0NSQzMyQycsXG4gIFNIQTE6ICdTSEExJyxcbiAgU0hBMjU2OiAnU0hBMjU2Jyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIENoZWNrc3VtQWxnb3JpdGhtSW4gPSAodHlwZW9mIENoZWNrc3VtQWxnb3JpdGhtSW4pW2tleW9mIHR5cGVvZiBDaGVja3N1bUFsZ29yaXRobUluXTtcblxuZXhwb3J0IHR5cGUgQ2hlY2tzdW1BbGdvcml0aG1PdXQgPSBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBPYmplY3RTdG9yYWdlQ2xhc3MgPSB7XG4gIERFRVBfQVJDSElWRTogJ0RFRVBfQVJDSElWRScsXG4gIEVYUFJFU1NfT05FWk9ORTogJ0VYUFJFU1NfT05FWk9ORScsXG4gIEdMQUNJRVI6ICdHTEFDSUVSJyxcbiAgR0xBQ0lFUl9JUjogJ0dMQUNJRVJfSVInLFxuICBJTlRFTExJR0VOVF9USUVSSU5HOiAnSU5URUxMSUdFTlRfVElFUklORycsXG4gIE9ORVpPTkVfSUE6ICdPTkVaT05FX0lBJyxcbiAgT1VUUE9TVFM6ICdPVVRQT1NUUycsXG4gIFJFRFVDRURfUkVEVU5EQU5DWTogJ1JFRFVDRURfUkVEVU5EQU5DWScsXG4gIFNOT1c6ICdTTk9XJyxcbiAgU1RBTkRBUkQ6ICdTVEFOREFSRCcsXG4gIFNUQU5EQVJEX0lBOiAnU1RBTkRBUkRfSUEnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgT2JqZWN0U3RvcmFnZUNsYXNzID0gKHR5cGVvZiBPYmplY3RTdG9yYWdlQ2xhc3MpW2tleW9mIHR5cGVvZiBPYmplY3RTdG9yYWdlQ2xhc3NdO1xuXG5leHBvcnQgaW50ZXJmYWNlIE93bmVyIHtcbiAgLyoqXG4gICAqIDxwPkNvbnRhaW5lciBmb3IgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgb3duZXIuIFRoaXMgdmFsdWUgaXMgb25seSBzdXBwb3J0ZWQgaW4gdGhlXG4gICAqICAgICAgICAgIGZvbGxvd2luZyBBbWF6b24gV2ViIFNlcnZpY2VzIFJlZ2lvbnM6PC9wPlxuICAgKiAgICAgICAgICA8dWw+XG4gICAqICAgICAgICAgICAgIDxsaT5cbiAgICogICAgICAgICAgICAgICAgPHA+VVMgRWFzdCAoTi4gVmlyZ2luaWEpPC9wPlxuICAgKiAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgIDxwPlVTIFdlc3QgKE4uIENhbGlmb3JuaWEpPC9wPlxuICAgKiAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgIDxwPlVTIFdlc3QgKE9yZWdvbik8L3A+XG4gICAqICAgICAgICAgICAgIDwvbGk+XG4gICAqICAgICAgICAgICAgIDxsaT5cbiAgICogICAgICAgICAgICAgICAgPHA+QXNpYSBQYWNpZmljIChTaW5nYXBvcmUpPC9wPlxuICAgKiAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgIDxwPkFzaWEgUGFjaWZpYyAoU3lkbmV5KTwvcD5cbiAgICogICAgICAgICAgICAgPC9saT5cbiAgICogICAgICAgICAgICAgPGxpPlxuICAgKiAgICAgICAgICAgICAgICA8cD5Bc2lhIFBhY2lmaWMgKFRva3lvKTwvcD5cbiAgICogICAgICAgICAgICAgPC9saT5cbiAgICogICAgICAgICAgICAgPGxpPlxuICAgKiAgICAgICAgICAgICAgICA8cD5FdXJvcGUgKElyZWxhbmQpPC9wPlxuICAgKiAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgIDxwPlNvdXRoIEFtZXJpY2EgKFPDo28gUGF1bG8pPC9wPlxuICAgKiAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICA8L3VsPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+VGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yeSBidWNrZXRzLjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgRGlzcGxheU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIDxwPkNvbnRhaW5lciBmb3IgdGhlIElEIG9mIHRoZSBvd25lci48L3A+XG4gICAqL1xuICBJRD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXN0b3JlU3RhdHVzIHtcbiAgLyoqXG4gICAqIDxwPlNwZWNpZmllcyB3aGV0aGVyIHRoZSBvYmplY3QgaXMgY3VycmVudGx5IGJlaW5nIHJlc3RvcmVkLiBJZiB0aGUgb2JqZWN0IHJlc3RvcmF0aW9uIGlzXG4gICAqICAgICAgICAgIGluIHByb2dyZXNzLCB0aGUgaGVhZGVyIHJldHVybnMgdGhlIHZhbHVlIDxjb2RlPlRSVUU8L2NvZGU+LiBGb3IgZXhhbXBsZTo8L3A+XG4gICAqICAgICAgICAgIDxwPlxuICAgKiAgICAgICAgICAgICA8Y29kZT54LWFtei1vcHRpb25hbC1vYmplY3QtYXR0cmlidXRlczogSXNSZXN0b3JlSW5Qcm9ncmVzcz1cInRydWVcIjwvY29kZT5cbiAgICogICAgICAgICAgPC9wPlxuICAgKiAgICAgICAgICA8cD5JZiB0aGUgb2JqZWN0IHJlc3RvcmF0aW9uIGhhcyBjb21wbGV0ZWQsIHRoZSBoZWFkZXIgcmV0dXJucyB0aGUgdmFsdWVcbiAgICogICAgICAgICAgPGNvZGU+RkFMU0U8L2NvZGU+LiBGb3IgZXhhbXBsZTo8L3A+XG4gICAqICAgICAgICAgIDxwPlxuICAgKiAgICAgICAgICAgICA8Y29kZT54LWFtei1vcHRpb25hbC1vYmplY3QtYXR0cmlidXRlczogSXNSZXN0b3JlSW5Qcm9ncmVzcz1cImZhbHNlXCIsXG4gICAqICAgICAgICAgICAgIFJlc3RvcmVFeHBpcnlEYXRlPVwiMjAxMi0xMi0yMVQwMDowMDowMC4wMDBaXCI8L2NvZGU+XG4gICAqICAgICAgICAgIDwvcD5cbiAgICogICAgICAgICAgPHA+SWYgdGhlIG9iamVjdCBoYXNuJ3QgYmVlbiByZXN0b3JlZCwgdGhlcmUgaXMgbm8gaGVhZGVyIHJlc3BvbnNlLjwvcD5cbiAgICovXG4gIElzUmVzdG9yZUluUHJvZ3Jlc3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiA8cD5JbmRpY2F0ZXMgd2hlbiB0aGUgcmVzdG9yZWQgY29weSB3aWxsIGV4cGlyZS4gVGhpcyB2YWx1ZSBpcyBwb3B1bGF0ZWQgb25seSBpZiB0aGUgb2JqZWN0XG4gICAqICAgICAgICAgIGhhcyBhbHJlYWR5IGJlZW4gcmVzdG9yZWQuIEZvciBleGFtcGxlOjwvcD5cbiAgICogICAgICAgICAgPHA+XG4gICAqICAgICAgICAgICAgIDxjb2RlPngtYW16LW9wdGlvbmFsLW9iamVjdC1hdHRyaWJ1dGVzOiBJc1Jlc3RvcmVJblByb2dyZXNzPVwiZmFsc2VcIixcbiAgICogICAgICAgICAgICAgUmVzdG9yZUV4cGlyeURhdGU9XCIyMDEyLTEyLTIxVDAwOjAwOjAwLjAwMFpcIjwvY29kZT5cbiAgICogICAgICAgICAgPC9wPlxuICAgKi9cbiAgUmVzdG9yZUV4cGlyeURhdGU/OiBEYXRlO1xufVxuXG4vKipcbiAqIFJldHVybiBvbmUgb2YgMiB0eXBlcywgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UgYXJlIHBhc3NpbmcgdmFsdWVzIGluIG9yIG91dFxuICpcbiAqIFVzZSBhcyBmb2xsb3dzOlxuICpcbiAqIGBgYHRzXG4gKiBpbnRlcmZhY2UgQ29udGFpbmluZ1R5cGU8RGlyPiB7XG4gKiAgICBmaWVsZDogSW5PdXQ8RGlyLCBGaWVsZFR5cGVJbiwgRmllbGRUeXBlT3V0PjtcbiAqIH1cbiAqIGBgYFxuICovXG50eXBlIEluT3V0PERpciwgSSwgTz4gPSBEaXIgZXh0ZW5kcyAnaW4nID8gSSA6IERpciBleHRlbmRzICdvdXQnID8gTyA6IG5ldmVyO1xuXG5leHBvcnQgaW50ZXJmYWNlIF9PYmplY3Q8RGlyPiB7XG4gIC8qKlxuICAgKiA8cD5UaGUgbmFtZSB0aGF0IHlvdSBhc3NpZ24gdG8gYW4gb2JqZWN0LiBZb3UgdXNlIHRoZSBvYmplY3Qga2V5IHRvIHJldHJpZXZlIHRoZVxuICAgKiAgICAgICAgICBvYmplY3QuPC9wPlxuICAgKi9cbiAgS2V5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiA8cD5DcmVhdGlvbiBkYXRlIG9mIHRoZSBvYmplY3QuPC9wPlxuICAgKi9cbiAgTGFzdE1vZGlmaWVkPzogRGF0ZTtcblxuICAvKipcbiAgICogPHA+VGhlIGVudGl0eSB0YWcgaXMgYSBoYXNoIG9mIHRoZSBvYmplY3QuIFRoZSBFVGFnIHJlZmxlY3RzIGNoYW5nZXMgb25seSB0byB0aGUgY29udGVudHNcbiAgICogICAgICAgICAgb2YgYW4gb2JqZWN0LCBub3QgaXRzIG1ldGFkYXRhLiBUaGUgRVRhZyBtYXkgb3IgbWF5IG5vdCBiZSBhbiBNRDUgZGlnZXN0IG9mIHRoZSBvYmplY3RcbiAgICogICAgICAgICAgZGF0YS4gV2hldGhlciBvciBub3QgaXQgaXMgZGVwZW5kcyBvbiBob3cgdGhlIG9iamVjdCB3YXMgY3JlYXRlZCBhbmQgaG93IGl0IGlzIGVuY3J5cHRlZCBhc1xuICAgKiAgICAgICAgICBkZXNjcmliZWQgYmVsb3c6PC9wPlxuICAgKiAgICAgICAgICA8dWw+XG4gICAqICAgICAgICAgICAgIDxsaT5cbiAgICogICAgICAgICAgICAgICAgPHA+T2JqZWN0cyBjcmVhdGVkIGJ5IHRoZSBQVVQgT2JqZWN0LCBQT1NUIE9iamVjdCwgb3IgQ29weSBvcGVyYXRpb24sIG9yIHRocm91Z2ggdGhlXG4gICAqICAgICAgICAgICAgICAgIEFtYXpvbiBXZWIgU2VydmljZXMgTWFuYWdlbWVudCBDb25zb2xlLCBhbmQgYXJlIGVuY3J5cHRlZCBieSBTU0UtUzMgb3IgcGxhaW50ZXh0LCBoYXZlIEVUYWdzIHRoYXRcbiAgICogICAgICAgICAgICAgICAgYXJlIGFuIE1ENSBkaWdlc3Qgb2YgdGhlaXIgb2JqZWN0IGRhdGEuPC9wPlxuICAgKiAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgIDxwPk9iamVjdHMgY3JlYXRlZCBieSB0aGUgUFVUIE9iamVjdCwgUE9TVCBPYmplY3QsIG9yIENvcHkgb3BlcmF0aW9uLCBvciB0aHJvdWdoIHRoZVxuICAgKiAgICAgICAgICAgICAgICBBbWF6b24gV2ViIFNlcnZpY2VzIE1hbmFnZW1lbnQgQ29uc29sZSwgYW5kIGFyZSBlbmNyeXB0ZWQgYnkgU1NFLUMgb3IgU1NFLUtNUywgaGF2ZSBFVGFncyB0aGF0IGFyZVxuICAgKiAgICAgICAgICAgICAgICBub3QgYW4gTUQ1IGRpZ2VzdCBvZiB0aGVpciBvYmplY3QgZGF0YS48L3A+XG4gICAqICAgICAgICAgICAgIDwvbGk+XG4gICAqICAgICAgICAgICAgIDxsaT5cbiAgICogICAgICAgICAgICAgICAgPHA+SWYgYW4gb2JqZWN0IGlzIGNyZWF0ZWQgYnkgZWl0aGVyIHRoZSBNdWx0aXBhcnQgVXBsb2FkIG9yIFBhcnQgQ29weSBvcGVyYXRpb24sIHRoZVxuICAgKiAgICAgICAgICAgICAgICBFVGFnIGlzIG5vdCBhbiBNRDUgZGlnZXN0LCByZWdhcmRsZXNzIG9mIHRoZSBtZXRob2Qgb2YgZW5jcnlwdGlvbi4gSWYgYW4gb2JqZWN0IGlzXG4gICAqICAgICAgICAgICAgICAgIGxhcmdlciB0aGFuIDE2IE1CLCB0aGUgQW1hem9uIFdlYiBTZXJ2aWNlcyBNYW5hZ2VtZW50IENvbnNvbGUgd2lsbCB1cGxvYWQgb3IgY29weSB0aGF0IG9iamVjdCBhcyBhXG4gICAqICAgICAgICAgICAgICAgIE11bHRpcGFydCBVcGxvYWQsIGFuZCB0aGVyZWZvcmUgdGhlIEVUYWcgd2lsbCBub3QgYmUgYW4gTUQ1IGRpZ2VzdC48L3A+XG4gICAqICAgICAgICAgICAgIDwvbGk+XG4gICAqICAgICAgICAgIDwvdWw+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5cbiAgICogICAgICAgICAgICAgICAgPGI+RGlyZWN0b3J5IGJ1Y2tldHM8L2I+IC0gTUQ1IGlzIG5vdCBzdXBwb3J0ZWQgYnkgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBFVGFnPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiA8cD5UaGUgYWxnb3JpdGhtIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIGEgY2hlY2tzdW0gb2YgdGhlIG9iamVjdC48L3A+XG4gICAqL1xuICBDaGVja3N1bUFsZ29yaXRobT86IEluT3V0PERpciwgQ2hlY2tzdW1BbGdvcml0aG1JbiwgQ2hlY2tzdW1BbGdvcml0aG1PdXQ+W107XG5cbiAgLyoqXG4gICAqIDxwPlNpemUgaW4gYnl0ZXMgb2YgdGhlIG9iamVjdDwvcD5cbiAgICovXG4gIFNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIDxwPlRoZSBjbGFzcyBvZiBzdG9yYWdlIHVzZWQgdG8gc3RvcmUgdGhlIG9iamVjdC48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5cbiAgICogICAgICAgICAgICAgICAgPGI+RGlyZWN0b3J5IGJ1Y2tldHM8L2I+IC0gT25seSB0aGUgUzMgRXhwcmVzcyBPbmUgWm9uZSBzdG9yYWdlIGNsYXNzIGlzIHN1cHBvcnRlZCBieSBkaXJlY3RvcnkgYnVja2V0cyB0byBzdG9yZSBvYmplY3RzLjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgU3RvcmFnZUNsYXNzPzogT2JqZWN0U3RvcmFnZUNsYXNzO1xuXG4gIC8qKlxuICAgKiA8cD5UaGUgb3duZXIgb2YgdGhlIG9iamVjdDwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlxuICAgKiAgICAgICAgICAgICAgICA8Yj5EaXJlY3RvcnkgYnVja2V0czwvYj4gLSBUaGUgYnVja2V0IG93bmVyIGlzIHJldHVybmVkIGFzIHRoZSBvYmplY3Qgb3duZXIuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBPd25lcj86IE93bmVyO1xuXG4gIC8qKlxuICAgKiA8cD5TcGVjaWZpZXMgdGhlIHJlc3RvcmF0aW9uIHN0YXR1cyBvZiBhbiBvYmplY3QuIE9iamVjdHMgaW4gY2VydGFpbiBzdG9yYWdlIGNsYXNzZXMgbXVzdFxuICAgKiAgICAgICAgICBiZSByZXN0b3JlZCBiZWZvcmUgdGhleSBjYW4gYmUgcmV0cmlldmVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBzdG9yYWdlIGNsYXNzZXNcbiAgICogICAgICAgICAgYW5kIGhvdyB0byB3b3JrIHdpdGggYXJjaGl2ZWQgb2JqZWN0cywgc2VlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9hcmNoaXZlZC1vYmplY3RzLmh0bWxcIj4gV29ya2luZyB3aXRoIGFyY2hpdmVkXG4gICAqICAgICAgICAgICAgIG9iamVjdHM8L2E+IGluIHRoZSA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+VGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yeSBidWNrZXRzLiBPbmx5IHRoZSBTMyBFeHByZXNzIE9uZSBab25lIHN0b3JhZ2UgY2xhc3MgaXMgc3VwcG9ydGVkIGJ5IGRpcmVjdG9yeSBidWNrZXRzIHRvIHN0b3JlIG9iamVjdHMuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBSZXN0b3JlU3RhdHVzPzogUmVzdG9yZVN0YXR1cztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21tb25QcmVmaXgge1xuICAvKipcbiAgICogPHA+Q29udGFpbmVyIGZvciB0aGUgc3BlY2lmaWVkIGNvbW1vbiBwcmVmaXguPC9wPlxuICAgKi9cbiAgUHJlZml4Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RPYmplY3RzVjJPdXRwdXQge1xuICAvKipcbiAgICogPHA+U2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhbGwgb2YgdGhlIHJlc3VsdHMgd2VyZSByZXR1cm5lZC4gU2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+XG4gICAqICAgICAgICAgIGlmIG1vcmUga2V5cyBhcmUgYXZhaWxhYmxlIHRvIHJldHVybi4gSWYgdGhlIG51bWJlciBvZiByZXN1bHRzIGV4Y2VlZHMgdGhhdCBzcGVjaWZpZWQgYnlcbiAgICogICAgICAgICAgICAgPGNvZGU+TWF4S2V5czwvY29kZT4sIGFsbCBvZiB0aGUgcmVzdWx0cyBtaWdodCBub3QgYmUgcmV0dXJuZWQuPC9wPlxuICAgKi9cbiAgSXNUcnVuY2F0ZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogPHA+TWV0YWRhdGEgYWJvdXQgZWFjaCBvYmplY3QgcmV0dXJuZWQuPC9wPlxuICAgKi9cbiAgQ29udGVudHM/OiBfT2JqZWN0PCdvdXQnPltdO1xuICAvKipcbiAgICogPHA+VGhlIGJ1Y2tldCBuYW1lLjwvcD5cbiAgICovXG4gIE5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5LZXlzIHRoYXQgYmVnaW4gd2l0aCB0aGUgaW5kaWNhdGVkIHByZWZpeC48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5cbiAgICogICAgICAgICAgICAgICAgPGI+RGlyZWN0b3J5IGJ1Y2tldHM8L2I+IC0gRm9yIGRpcmVjdG9yeSBidWNrZXRzLCBvbmx5IHByZWZpeGVzIHRoYXQgZW5kIGluIGEgZGVsaW1pdGVyICg8Y29kZT4vPC9jb2RlPikgYXJlIHN1cHBvcnRlZC48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIFByZWZpeD86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPkNhdXNlcyBrZXlzIHRoYXQgY29udGFpbiB0aGUgc2FtZSBzdHJpbmcgYmV0d2VlbiB0aGUgPGNvZGU+cHJlZml4PC9jb2RlPiBhbmQgdGhlIGZpcnN0XG4gICAqICAgICAgICAgIG9jY3VycmVuY2Ugb2YgdGhlIGRlbGltaXRlciB0byBiZSByb2xsZWQgdXAgaW50byBhIHNpbmdsZSByZXN1bHQgZWxlbWVudCBpbiB0aGVcbiAgICogICAgICAgICAgICAgPGNvZGU+Q29tbW9uUHJlZml4ZXM8L2NvZGU+IGNvbGxlY3Rpb24uIFRoZXNlIHJvbGxlZC11cCBrZXlzIGFyZSBub3QgcmV0dXJuZWQgZWxzZXdoZXJlXG4gICAqICAgICAgICAgIGluIHRoZSByZXNwb25zZS4gRWFjaCByb2xsZWQtdXAgcmVzdWx0IGNvdW50cyBhcyBvbmx5IG9uZSByZXR1cm4gYWdhaW5zdCB0aGVcbiAgICogICAgICAgICAgICAgPGNvZGU+TWF4S2V5czwvY29kZT4gdmFsdWUuPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+XG4gICAqICAgICAgICAgICAgICAgIDxiPkRpcmVjdG9yeSBidWNrZXRzPC9iPiAtIEZvciBkaXJlY3RvcnkgYnVja2V0cywgPGNvZGU+LzwvY29kZT4gaXMgdGhlIG9ubHkgc3VwcG9ydGVkIGRlbGltaXRlci48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIERlbGltaXRlcj86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGtleXMgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlLiBCeSBkZWZhdWx0LCB0aGUgYWN0aW9uIHJldHVybnNcbiAgICogICAgICAgICAgdXAgdG8gMSwwMDAga2V5IG5hbWVzLiBUaGUgcmVzcG9uc2UgbWlnaHQgY29udGFpbiBmZXdlciBrZXlzIGJ1dCB3aWxsIG5ldmVyIGNvbnRhaW5cbiAgICogICAgICAgICAgbW9yZS48L3A+XG4gICAqL1xuICBNYXhLZXlzPzogbnVtYmVyO1xuICAvKipcbiAgICogPHA+QWxsIG9mIHRoZSBrZXlzICh1cCB0byAxLDAwMCkgdGhhdCBzaGFyZSB0aGUgc2FtZSBwcmVmaXggYXJlIGdyb3VwZWQgdG9nZXRoZXIuIFdoZW4gY291bnRpbmcgdGhlIHRvdGFsIG51bWJlcnMgb2YgcmV0dXJucyBieSB0aGlzIEFQSSBvcGVyYXRpb24sXG4gICAqICAgICAgICAgIHRoaXMgZ3JvdXAgb2Yga2V5cyBpcyBjb25zaWRlcmVkIGFzIG9uZSBpdGVtLjwvcD5cbiAgICogICAgICAgICAgPHA+QSByZXNwb25zZSBjYW4gY29udGFpbiA8Y29kZT5Db21tb25QcmVmaXhlczwvY29kZT4gb25seSBpZiB5b3Ugc3BlY2lmeSBhXG4gICAqICAgICAgICAgIGRlbGltaXRlci48L3A+XG4gICAqICAgICAgICAgIDxwPlxuICAgKiAgICAgICAgICAgICA8Y29kZT5Db21tb25QcmVmaXhlczwvY29kZT4gY29udGFpbnMgYWxsIChpZiB0aGVyZSBhcmUgYW55KSBrZXlzIGJldHdlZW5cbiAgICogICAgICAgICAgICAgPGNvZGU+UHJlZml4PC9jb2RlPiBhbmQgdGhlIG5leHQgb2NjdXJyZW5jZSBvZiB0aGUgc3RyaW5nIHNwZWNpZmllZCBieSBhXG4gICAqICAgICAgICAgIGRlbGltaXRlci48L3A+XG4gICAqICAgICAgICAgIDxwPlxuICAgKiAgICAgICAgICAgICA8Y29kZT5Db21tb25QcmVmaXhlczwvY29kZT4gbGlzdHMga2V5cyB0aGF0IGFjdCBsaWtlIHN1YmRpcmVjdG9yaWVzIGluIHRoZSBkaXJlY3RvcnlcbiAgICogICAgICAgICAgc3BlY2lmaWVkIGJ5IDxjb2RlPlByZWZpeDwvY29kZT4uPC9wPlxuICAgKiAgICAgICAgICA8cD5Gb3IgZXhhbXBsZSwgaWYgdGhlIHByZWZpeCBpcyA8Y29kZT5ub3Rlcy88L2NvZGU+IGFuZCB0aGUgZGVsaW1pdGVyIGlzIGEgc2xhc2hcbiAgICogICAgICAgICAgICAgKDxjb2RlPi88L2NvZGU+KSBhcyBpbiA8Y29kZT5ub3Rlcy9zdW1tZXIvanVseTwvY29kZT4sIHRoZSBjb21tb24gcHJlZml4IGlzXG4gICAqICAgICAgICAgICAgIDxjb2RlPm5vdGVzL3N1bW1lci88L2NvZGU+LiBBbGwgb2YgdGhlIGtleXMgdGhhdCByb2xsIHVwIGludG8gYSBjb21tb24gcHJlZml4IGNvdW50IGFzIGFcbiAgICogICAgICAgICAgc2luZ2xlIHJldHVybiB3aGVuIGNhbGN1bGF0aW5nIHRoZSBudW1iZXIgb2YgcmV0dXJucy4gPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHVsPlxuICAgKiAgICAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgICAgIDxwPlxuICAgKiAgICAgICAgICAgICAgICAgICAgICA8Yj5EaXJlY3RvcnkgYnVja2V0czwvYj4gLSBGb3IgZGlyZWN0b3J5IGJ1Y2tldHMsIG9ubHkgcHJlZml4ZXMgdGhhdCBlbmQgaW4gYSBkZWxpbWl0ZXIgKDxjb2RlPi88L2NvZGU+KSBhcmUgc3VwcG9ydGVkLjwvcD5cbiAgICogICAgICAgICAgICAgICAgPC9saT5cbiAgICogICAgICAgICAgICAgICAgPGxpPlxuICAgKiAgICAgICAgICAgICAgICAgICA8cD5cbiAgICogICAgICAgICAgICAgICAgICAgICAgPGI+RGlyZWN0b3J5IGJ1Y2tldHMgPC9iPiAtIFdoZW4geW91IHF1ZXJ5IDxjb2RlPkxpc3RPYmplY3RzVjI8L2NvZGU+IHdpdGggYSBkZWxpbWl0ZXIgZHVyaW5nIGluLXByb2dyZXNzIG11bHRpcGFydCB1cGxvYWRzLCB0aGVcbiAgICogICAgICAgICAgICAgICAgPGNvZGU+Q29tbW9uUHJlZml4ZXM8L2NvZGU+IHJlc3BvbnNlIHBhcmFtZXRlciBjb250YWlucyB0aGUgcHJlZml4ZXMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbi1wcm9ncmVzcyBtdWx0aXBhcnQgdXBsb2Fkcy5cbiAgICogICAgICAgICAgICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgbXVsdGlwYXJ0IHVwbG9hZHMsIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvbXB1b3ZlcnZpZXcuaHRtbFwiPk11bHRpcGFydCBVcGxvYWQgT3ZlcnZpZXc8L2E+IGluIHRoZSA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKiAgICAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICA8L3VsPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBDb21tb25QcmVmaXhlcz86IENvbW1vblByZWZpeFtdO1xuICAvKipcbiAgICogPHA+RW5jb2RpbmcgdHlwZSB1c2VkIGJ5IEFtYXpvbiBTMyB0byBlbmNvZGUgb2JqZWN0IGtleSBuYW1lcyBpbiB0aGUgWE1MIHJlc3BvbnNlLjwvcD5cbiAgICogICAgICAgICAgPHA+SWYgeW91IHNwZWNpZnkgdGhlIDxjb2RlPmVuY29kaW5nLXR5cGU8L2NvZGU+IHJlcXVlc3QgcGFyYW1ldGVyLCBBbWF6b24gUzMgaW5jbHVkZXMgdGhpc1xuICAgKiAgICAgICAgICBlbGVtZW50IGluIHRoZSByZXNwb25zZSwgYW5kIHJldHVybnMgZW5jb2RlZCBrZXkgbmFtZSB2YWx1ZXMgaW4gdGhlIGZvbGxvd2luZyByZXNwb25zZVxuICAgKiAgICAgICAgICBlbGVtZW50czo8L3A+XG4gICAqICAgICAgICAgIDxwPlxuICAgKiAgICAgICAgICAgICA8Y29kZT5EZWxpbWl0ZXIsIFByZWZpeCwgS2V5LDwvY29kZT4gYW5kIDxjb2RlPlN0YXJ0QWZ0ZXI8L2NvZGU+LjwvcD5cbiAgICovXG4gIEVuY29kaW5nVHlwZT86IEVuY29kaW5nVHlwZTtcbiAgLyoqXG4gICAqIDxwPlxuICAgKiAgICAgICAgICAgICA8Y29kZT5LZXlDb3VudDwvY29kZT4gaXMgdGhlIG51bWJlciBvZiBrZXlzIHJldHVybmVkIHdpdGggdGhpcyByZXF1ZXN0LlxuICAgKiAgICAgICAgICAgICA8Y29kZT5LZXlDb3VudDwvY29kZT4gd2lsbCBhbHdheXMgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSA8Y29kZT5NYXhLZXlzPC9jb2RlPlxuICAgKiAgICAgICAgICBmaWVsZC4gRm9yIGV4YW1wbGUsIGlmIHlvdSBhc2sgZm9yIDUwIGtleXMsIHlvdXIgcmVzdWx0IHdpbGwgaW5jbHVkZSA1MCBrZXlzIG9yXG4gICAqICAgICAgICAgIGZld2VyLjwvcD5cbiAgICovXG4gIEtleUNvdW50PzogbnVtYmVyO1xuICAvKipcbiAgICogPHA+IElmIDxjb2RlPkNvbnRpbnVhdGlvblRva2VuPC9jb2RlPiB3YXMgc2VudCB3aXRoIHRoZSByZXF1ZXN0LCBpdCBpcyBpbmNsdWRlZCBpbiB0aGVcbiAgICogICAgICAgICAgcmVzcG9uc2UuIFlvdSBjYW4gdXNlIHRoZSByZXR1cm5lZCA8Y29kZT5Db250aW51YXRpb25Ub2tlbjwvY29kZT4gZm9yIHBhZ2luYXRpb24gb2YgdGhlIGxpc3QgcmVzcG9uc2UuIFlvdSBjYW4gdXNlIHRoaXMgPGNvZGU+Q29udGludWF0aW9uVG9rZW48L2NvZGU+IGZvciBwYWdpbmF0aW9uIG9mIHRoZSBsaXN0IHJlc3VsdHMuIDwvcD5cbiAgICovXG4gIENvbnRpbnVhdGlvblRva2VuPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+XG4gICAqICAgICAgICAgICAgIDxjb2RlPk5leHRDb250aW51YXRpb25Ub2tlbjwvY29kZT4gaXMgc2VudCB3aGVuIDxjb2RlPmlzVHJ1bmNhdGVkPC9jb2RlPiBpcyB0cnVlLCB3aGljaFxuICAgKiAgICAgICAgICBtZWFucyB0aGVyZSBhcmUgbW9yZSBrZXlzIGluIHRoZSBidWNrZXQgdGhhdCBjYW4gYmUgbGlzdGVkLiBUaGUgbmV4dCBsaXN0IHJlcXVlc3RzIHRvIEFtYXpvbiBTM1xuICAgKiAgICAgICAgICBjYW4gYmUgY29udGludWVkIHdpdGggdGhpcyA8Y29kZT5OZXh0Q29udGludWF0aW9uVG9rZW48L2NvZGU+LlxuICAgKiAgICAgICAgICAgICA8Y29kZT5OZXh0Q29udGludWF0aW9uVG9rZW48L2NvZGU+IGlzIG9iZnVzY2F0ZWQgYW5kIGlzIG5vdCBhIHJlYWwga2V5PC9wPlxuICAgKi9cbiAgTmV4dENvbnRpbnVhdGlvblRva2VuPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+SWYgU3RhcnRBZnRlciB3YXMgc2VudCB3aXRoIHRoZSByZXF1ZXN0LCBpdCBpcyBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UuPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+VGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yeSBidWNrZXRzLjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgU3RhcnRBZnRlcj86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPklmIHByZXNlbnQsIGluZGljYXRlcyB0aGF0IHRoZSByZXF1ZXN0ZXIgd2FzIHN1Y2Nlc3NmdWxseSBjaGFyZ2VkIGZvciB0aGVcbiAgICogICAgICAgICAgcmVxdWVzdC48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBSZXF1ZXN0Q2hhcmdlZD86IFJlcXVlc3RDaGFyZ2VkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RPYmplY3RzVjJDb21tYW5kT3V0cHV0IGV4dGVuZHMgTGlzdE9iamVjdHNWMk91dHB1dCwgTWV0YWRhdGFCZWFyZXIge1xufVxuXG5leHBvcnQgY29uc3QgT2JqZWN0Q2FubmVkQUNMID0ge1xuICBhdXRoZW50aWNhdGVkX3JlYWQ6ICdhdXRoZW50aWNhdGVkLXJlYWQnLFxuICBhd3NfZXhlY19yZWFkOiAnYXdzLWV4ZWMtcmVhZCcsXG4gIGJ1Y2tldF9vd25lcl9mdWxsX2NvbnRyb2w6ICdidWNrZXQtb3duZXItZnVsbC1jb250cm9sJyxcbiAgYnVja2V0X293bmVyX3JlYWQ6ICdidWNrZXQtb3duZXItcmVhZCcsXG4gIHByaXZhdGU6ICdwcml2YXRlJyxcbiAgcHVibGljX3JlYWQ6ICdwdWJsaWMtcmVhZCcsXG4gIHB1YmxpY19yZWFkX3dyaXRlOiAncHVibGljLXJlYWQtd3JpdGUnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgT2JqZWN0Q2FubmVkQUNMID0gKHR5cGVvZiBPYmplY3RDYW5uZWRBQ0wpW2tleW9mIHR5cGVvZiBPYmplY3RDYW5uZWRBQ0xdO1xuXG5leHBvcnQgY29uc3QgT2JqZWN0TG9ja01vZGUgPSB7XG4gIENPTVBMSUFOQ0U6ICdDT01QTElBTkNFJyxcbiAgR09WRVJOQU5DRTogJ0dPVkVSTkFOQ0UnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgT2JqZWN0TG9ja01vZGUgPSAodHlwZW9mIE9iamVjdExvY2tNb2RlKVtrZXlvZiB0eXBlb2YgT2JqZWN0TG9ja01vZGVdO1xuXG5leHBvcnQgY29uc3QgT2JqZWN0TG9ja0xlZ2FsSG9sZFN0YXR1cyA9IHtcbiAgT0ZGOiAnT0ZGJyxcbiAgT046ICdPTicsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBPYmplY3RMb2NrTGVnYWxIb2xkU3RhdHVzID1cbiAgKHR5cGVvZiBPYmplY3RMb2NrTGVnYWxIb2xkU3RhdHVzKVtrZXlvZiB0eXBlb2YgT2JqZWN0TG9ja0xlZ2FsSG9sZFN0YXR1c107XG5cbmV4cG9ydCBjb25zdCBTdG9yYWdlQ2xhc3MgPSB7XG4gIERFRVBfQVJDSElWRTogJ0RFRVBfQVJDSElWRScsXG4gIEVYUFJFU1NfT05FWk9ORTogJ0VYUFJFU1NfT05FWk9ORScsXG4gIEdMQUNJRVI6ICdHTEFDSUVSJyxcbiAgR0xBQ0lFUl9JUjogJ0dMQUNJRVJfSVInLFxuICBJTlRFTExJR0VOVF9USUVSSU5HOiAnSU5URUxMSUdFTlRfVElFUklORycsXG4gIE9ORVpPTkVfSUE6ICdPTkVaT05FX0lBJyxcbiAgT1VUUE9TVFM6ICdPVVRQT1NUUycsXG4gIFJFRFVDRURfUkVEVU5EQU5DWTogJ1JFRFVDRURfUkVEVU5EQU5DWScsXG4gIFNOT1c6ICdTTk9XJyxcbiAgU1RBTkRBUkQ6ICdTVEFOREFSRCcsXG4gIFNUQU5EQVJEX0lBOiAnU1RBTkRBUkRfSUEnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU3RvcmFnZUNsYXNzID0gKHR5cGVvZiBTdG9yYWdlQ2xhc3MpW2tleW9mIHR5cGVvZiBTdG9yYWdlQ2xhc3NdO1xuXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5IHtcbiAgLyoqXG4gICAqIEEgYERhdGVgIHdoZW4gdGhlIGlkZW50aXR5IG9yIGNyZWRlbnRpYWwgd2lsbCBubyBsb25nZXIgYmUgYWNjZXB0ZWQuXG4gICAqL1xuICByZWFkb25seSBleHBpcmF0aW9uPzogRGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVByb3ZpZGVyPElkZW50aXR5VCBleHRlbmRzIElkZW50aXR5PiB7XG4gIChpZGVudGl0eVByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUHJvbWlzZTxJZGVudGl0eVQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF3c0NyZWRlbnRpYWxJZGVudGl0eSBleHRlbmRzIElkZW50aXR5IHtcbiAgLyoqXG4gICAqIEFXUyBhY2Nlc3Mga2V5IElEXG4gICAqL1xuICByZWFkb25seSBhY2Nlc3NLZXlJZDogc3RyaW5nO1xuICAvKipcbiAgICogQVdTIHNlY3JldCBhY2Nlc3Mga2V5XG4gICAqL1xuICByZWFkb25seSBzZWNyZXRBY2Nlc3NLZXk6IHN0cmluZztcbiAgLyoqXG4gICAqIEEgc2VjdXJpdHkgb3Igc2Vzc2lvbiB0b2tlbiB0byB1c2Ugd2l0aCB0aGVzZSBjcmVkZW50aWFscy4gVXN1YWxseVxuICAgKiBwcmVzZW50IGZvciB0ZW1wb3JhcnkgY3JlZGVudGlhbHMuXG4gICAqL1xuICByZWFkb25seSBzZXNzaW9uVG9rZW4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBV1MgY3JlZGVudGlhbCBzY29wZSBmb3IgdGhpcyBzZXQgb2YgY3JlZGVudGlhbHMuXG4gICAqL1xuICByZWFkb25seSBjcmVkZW50aWFsU2NvcGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBV1MgYWNjb3VudElkLlxuICAgKi9cbiAgcmVhZG9ubHkgYWNjb3VudElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBBd3NDcmVkZW50aWFsSWRlbnRpdHlQcm92aWRlciA9IElkZW50aXR5UHJvdmlkZXI8QXdzQ3JlZGVudGlhbElkZW50aXR5PjtcblxuZXhwb3J0IGludGVyZmFjZSBQdXRPYmplY3RSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIDxwPlRoZSBjYW5uZWQgQUNMIHRvIGFwcGx5IHRvIHRoZSBvYmplY3QuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L2FjbC1vdmVydmlldy5odG1sI0Nhbm5lZEFDTFwiPkNhbm5lZFxuICAgKiAgICAgICAgICBBQ0w8L2E+IGluIHRoZSA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKiAgICAgICAgICA8cD5XaGVuIGFkZGluZyBhIG5ldyBvYmplY3QsIHlvdSBjYW4gdXNlIGhlYWRlcnMgdG8gZ3JhbnQgQUNMLWJhc2VkIHBlcm1pc3Npb25zIHRvXG4gICAqICAgICAgICAgIGluZGl2aWR1YWwgQW1hem9uIFdlYiBTZXJ2aWNlcyBhY2NvdW50cyBvciB0byBwcmVkZWZpbmVkIGdyb3VwcyBkZWZpbmVkIGJ5IEFtYXpvbiBTMy4gVGhlc2UgcGVybWlzc2lvbnMgYXJlXG4gICAqICAgICAgICAgIHRoZW4gYWRkZWQgdG8gdGhlIEFDTCBvbiB0aGUgb2JqZWN0LiBCeSBkZWZhdWx0LCBhbGwgb2JqZWN0cyBhcmUgcHJpdmF0ZS4gT25seSB0aGUgb3duZXJcbiAgICogICAgICAgICAgaGFzIGZ1bGwgYWNjZXNzIGNvbnRyb2wuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L2FjbC1vdmVydmlldy5odG1sXCI+QWNjZXNzIENvbnRyb2wgTGlzdCAoQUNMKSBPdmVydmlldzwvYT5cbiAgICogICAgICAgICAgYW5kIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9hY2wtdXNpbmctcmVzdC1hcGkuaHRtbFwiPk1hbmFnaW5nXG4gICAqICAgICAgICAgICAgIEFDTHMgVXNpbmcgdGhlIFJFU1QgQVBJPC9hPiBpbiB0aGUgPGk+QW1hem9uIFMzIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICogICAgICAgICAgPHA+SWYgdGhlIGJ1Y2tldCB0aGF0IHlvdSdyZSB1cGxvYWRpbmcgb2JqZWN0cyB0byB1c2VzIHRoZSBidWNrZXQgb3duZXIgZW5mb3JjZWQgc2V0dGluZ1xuICAgKiAgICAgICAgICBmb3IgUzMgT2JqZWN0IE93bmVyc2hpcCwgQUNMcyBhcmUgZGlzYWJsZWQgYW5kIG5vIGxvbmdlciBhZmZlY3QgcGVybWlzc2lvbnMuIEJ1Y2tldHMgdGhhdFxuICAgKiAgICAgICAgICB1c2UgdGhpcyBzZXR0aW5nIG9ubHkgYWNjZXB0IFBVVCByZXF1ZXN0cyB0aGF0IGRvbid0IHNwZWNpZnkgYW4gQUNMIG9yIFBVVCByZXF1ZXN0cyB0aGF0XG4gICAqICAgICAgICAgIHNwZWNpZnkgYnVja2V0IG93bmVyIGZ1bGwgY29udHJvbCBBQ0xzLCBzdWNoIGFzIHRoZSA8Y29kZT5idWNrZXQtb3duZXItZnVsbC1jb250cm9sPC9jb2RlPlxuICAgKiAgICAgICAgICBjYW5uZWQgQUNMIG9yIGFuIGVxdWl2YWxlbnQgZm9ybSBvZiB0aGlzIEFDTCBleHByZXNzZWQgaW4gdGhlIFhNTCBmb3JtYXQuIFBVVCByZXF1ZXN0cyB0aGF0XG4gICAqICAgICAgICAgIGNvbnRhaW4gb3RoZXIgQUNMcyAoZm9yIGV4YW1wbGUsIGN1c3RvbSBncmFudHMgdG8gY2VydGFpbiBBbWF6b24gV2ViIFNlcnZpY2VzIGFjY291bnRzKSBmYWlsIGFuZCByZXR1cm4gYVxuICAgKiAgICAgICAgICA8Y29kZT40MDA8L2NvZGU+IGVycm9yIHdpdGggdGhlIGVycm9yIGNvZGUgPGNvZGU+QWNjZXNzQ29udHJvbExpc3ROb3RTdXBwb3J0ZWQ8L2NvZGU+LlxuICAgKiAgICAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9hYm91dC1vYmplY3Qtb3duZXJzaGlwLmh0bWxcIj4gQ29udHJvbGxpbmcgb3duZXJzaGlwIG9mXG4gICAqICAgICAgICAgICAgIG9iamVjdHMgYW5kIGRpc2FibGluZyBBQ0xzPC9hPiBpbiB0aGUgPGk+QW1hem9uIFMzIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDx1bD5cbiAgICogICAgICAgICAgICAgICAgPGxpPlxuICAgKiAgICAgICAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBBbWF6b24gUzMgb24gT3V0cG9zdHMuPC9wPlxuICAgKiAgICAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICA8L3VsPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBBQ0w/OiBPYmplY3RDYW5uZWRBQ0w7XG4gIC8qKlxuICAgKiA8cD5PYmplY3QgZGF0YS48L3A+XG4gICAqL1xuICBCb2R5PzogUmVhZGFibGU7XG4gIC8qKlxuICAgKiA8cD5UaGUgYnVja2V0IG5hbWUgdG8gd2hpY2ggdGhlIFBVVCBhY3Rpb24gd2FzIGluaXRpYXRlZC4gPC9wPlxuICAgKiAgICAgICAgICA8cD5cbiAgICogICAgICAgICAgICAgPGI+RGlyZWN0b3J5IGJ1Y2tldHM8L2I+IC0gV2hlbiB5b3UgdXNlIHRoaXMgb3BlcmF0aW9uIHdpdGggYSBkaXJlY3RvcnkgYnVja2V0LCB5b3UgbXVzdCB1c2UgdmlydHVhbC1ob3N0ZWQtc3R5bGUgcmVxdWVzdHMgaW4gdGhlIGZvcm1hdCA8Y29kZT5cbiAgICogICAgICAgICAgICAgICAgPGk+QnVja2V0X25hbWU8L2k+LnMzZXhwcmVzcy08aT5hel9pZDwvaT4uPGk+cmVnaW9uPC9pPi5hbWF6b25hd3MuY29tPC9jb2RlPi4gUGF0aC1zdHlsZSByZXF1ZXN0cyBhcmUgbm90IHN1cHBvcnRlZC4gIERpcmVjdG9yeSBidWNrZXQgbmFtZXMgbXVzdCBiZSB1bmlxdWUgaW4gdGhlIGNob3NlbiBBdmFpbGFiaWxpdHkgWm9uZS4gQnVja2V0IG5hbWVzIG11c3QgZm9sbG93IHRoZSBmb3JtYXQgPGNvZGU+XG4gICAqICAgICAgICAgICAgICAgIDxpPmJ1Y2tldF9iYXNlX25hbWU8L2k+LS08aT5hei1pZDwvaT4tLXgtczM8L2NvZGU+IChmb3IgZXhhbXBsZSwgPGNvZGU+XG4gICAqICAgICAgICAgICAgICAgIDxpPkRPQy1FWEFNUExFLUJVQ0tFVDwvaT4tLTxpPnVzdzItYXoxPC9pPi0teC1zMzwvY29kZT4pLiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgYnVja2V0IG5hbWluZ1xuICAgKiAgICAgICAgICByZXN0cmljdGlvbnMsIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvZGlyZWN0b3J5LWJ1Y2tldC1uYW1pbmctcnVsZXMuaHRtbFwiPkRpcmVjdG9yeSBidWNrZXQgbmFtaW5nXG4gICAqICAgICAgICAgICAgIHJ1bGVzPC9hPiBpbiB0aGUgPGk+QW1hem9uIFMzIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICogICAgICAgICAgPHA+XG4gICAqICAgICAgICAgICAgIDxiPkFjY2VzcyBwb2ludHM8L2I+IC0gV2hlbiB5b3UgdXNlIHRoaXMgYWN0aW9uIHdpdGggYW4gYWNjZXNzIHBvaW50LCB5b3UgbXVzdCBwcm92aWRlIHRoZSBhbGlhcyBvZiB0aGUgYWNjZXNzIHBvaW50IGluIHBsYWNlIG9mIHRoZSBidWNrZXQgbmFtZSBvciBzcGVjaWZ5IHRoZSBhY2Nlc3MgcG9pbnQgQVJOLiBXaGVuIHVzaW5nIHRoZSBhY2Nlc3MgcG9pbnQgQVJOLCB5b3UgbXVzdCBkaXJlY3QgcmVxdWVzdHMgdG8gdGhlIGFjY2VzcyBwb2ludCBob3N0bmFtZS4gVGhlIGFjY2VzcyBwb2ludCBob3N0bmFtZSB0YWtlcyB0aGUgZm9ybSA8aT5BY2Nlc3NQb2ludE5hbWU8L2k+LTxpPkFjY291bnRJZDwvaT4uczMtYWNjZXNzcG9pbnQuPGk+UmVnaW9uPC9pPi5hbWF6b25hd3MuY29tLiBXaGVuIHVzaW5nIHRoaXMgYWN0aW9uIHdpdGggYW4gYWNjZXNzIHBvaW50IHRocm91Z2ggdGhlIEFtYXpvbiBXZWIgU2VydmljZXMgU0RLcywgeW91IHByb3ZpZGUgdGhlIGFjY2VzcyBwb2ludCBBUk4gaW4gcGxhY2Ugb2YgdGhlIGJ1Y2tldCBuYW1lLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhY2Nlc3MgcG9pbnQgQVJOcywgc2VlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS91c2luZy1hY2Nlc3MtcG9pbnRzLmh0bWxcIj5Vc2luZyBhY2Nlc3MgcG9pbnRzPC9hPiBpbiB0aGUgPGk+QW1hem9uIFMzIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPkFjY2VzcyBwb2ludHMgYW5kIE9iamVjdCBMYW1iZGEgYWNjZXNzIHBvaW50cyBhcmUgbm90IHN1cHBvcnRlZCBieSBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICogICAgICAgICAgPHA+XG4gICAqICAgICAgICAgICAgIDxiPlMzIG9uIE91dHBvc3RzPC9iPiAtIFdoZW4geW91IHVzZSB0aGlzIGFjdGlvbiB3aXRoIEFtYXpvbiBTMyBvbiBPdXRwb3N0cywgeW91IG11c3QgZGlyZWN0IHJlcXVlc3RzIHRvIHRoZSBTMyBvbiBPdXRwb3N0cyBob3N0bmFtZS4gVGhlIFMzIG9uIE91dHBvc3RzIGhvc3RuYW1lIHRha2VzIHRoZSBmb3JtIDxjb2RlPlxuICAgKiAgICAgICAgICAgICAgICA8aT5BY2Nlc3NQb2ludE5hbWU8L2k+LTxpPkFjY291bnRJZDwvaT4uPGk+b3V0cG9zdElEPC9pPi5zMy1vdXRwb3N0cy48aT5SZWdpb248L2k+LmFtYXpvbmF3cy5jb208L2NvZGU+LiBXaGVuIHlvdSB1c2UgdGhpcyBhY3Rpb24gd2l0aCBTMyBvbiBPdXRwb3N0cyB0aHJvdWdoIHRoZSBBbWF6b24gV2ViIFNlcnZpY2VzIFNES3MsIHlvdSBwcm92aWRlIHRoZSBPdXRwb3N0cyBhY2Nlc3MgcG9pbnQgQVJOIGluIHBsYWNlIG9mIHRoZSBidWNrZXQgbmFtZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgUzMgb24gT3V0cG9zdHMgQVJOcywgc2VlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9TM29uT3V0cG9zdHMuaHRtbFwiPldoYXQgaXMgUzMgb24gT3V0cG9zdHM/PC9hPiBpbiB0aGUgPGk+QW1hem9uIFMzIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICogPHA+Tm90ZTogVG8gc3VwcGx5IHRoZSBNdWx0aS1yZWdpb24gQWNjZXNzIFBvaW50IChNUkFQKSB0byBCdWNrZXQsIHlvdSBuZWVkIHRvIGluc3RhbGwgdGhlIFwiQGF3cy1zZGsvc2lnbmF0dXJlLXY0LWNydFwiIHBhY2thZ2UgdG8geW91ciBwcm9qZWN0IGRlcGVuZGVuY2llcy5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBnbyB0byBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1zZGstanMtdjMja25vd24taXNzdWVzPC9wPlxuICAgKi9cbiAgQnVja2V0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiA8cD5DYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGNhY2hpbmcgYmVoYXZpb3IgYWxvbmcgdGhlIHJlcXVlc3QvcmVwbHkgY2hhaW4uIEZvciBtb3JlXG4gICAqICAgICAgICAgIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj1cImh0dHA6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMTQuaHRtbCNzZWMxNC45XCI+aHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxNC5odG1sI3NlYzE0Ljk8L2E+LjwvcD5cbiAgICovXG4gIENhY2hlQ29udHJvbD86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlNwZWNpZmllcyBwcmVzZW50YXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIG9iamVjdC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzYyNjYjc2VjdGlvbi00XCI+aHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzYyNjYjc2VjdGlvbi00PC9hPi48L3A+XG4gICAqL1xuICBDb250ZW50RGlzcG9zaXRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5TcGVjaWZpZXMgd2hhdCBjb250ZW50IGVuY29kaW5ncyBoYXZlIGJlZW4gYXBwbGllZCB0byB0aGUgb2JqZWN0IGFuZCB0aHVzIHdoYXQgZGVjb2RpbmdcbiAgICogICAgICAgICAgbWVjaGFuaXNtcyBtdXN0IGJlIGFwcGxpZWQgdG8gb2J0YWluIHRoZSBtZWRpYS10eXBlIHJlZmVyZW5jZWQgYnkgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICogICAgICAgICAgZmllbGQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM5MTEwLmh0bWwjZmllbGQuY29udGVudC1lbmNvZGluZ1wiPmh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM5MTEwLmh0bWwjZmllbGQuY29udGVudC1lbmNvZGluZzwvYT4uPC9wPlxuICAgKi9cbiAgQ29udGVudEVuY29kaW5nPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+VGhlIGxhbmd1YWdlIHRoZSBjb250ZW50IGlzIGluLjwvcD5cbiAgICovXG4gIENvbnRlbnRMYW5ndWFnZT86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlNpemUgb2YgdGhlIGJvZHkgaW4gYnl0ZXMuIFRoaXMgcGFyYW1ldGVyIGlzIHVzZWZ1bCB3aGVuIHRoZSBzaXplIG9mIHRoZSBib2R5IGNhbm5vdCBiZVxuICAgKiAgICAgICAgICBkZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHkuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM5MTEwLmh0bWwjbmFtZS1jb250ZW50LWxlbmd0aFwiPmh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM5MTEwLmh0bWwjbmFtZS1jb250ZW50LWxlbmd0aDwvYT4uPC9wPlxuICAgKi9cbiAgQ29udGVudExlbmd0aD86IG51bWJlcjtcbiAgLyoqXG4gICAqIDxwPlRoZSBiYXNlNjQtZW5jb2RlZCAxMjgtYml0IE1ENSBkaWdlc3Qgb2YgdGhlIG1lc3NhZ2UgKHdpdGhvdXQgdGhlIGhlYWRlcnMpIGFjY29yZGluZyB0b1xuICAgKiAgICAgICAgICBSRkMgMTg2NC4gVGhpcyBoZWFkZXIgY2FuIGJlIHVzZWQgYXMgYSBtZXNzYWdlIGludGVncml0eSBjaGVjayB0byB2ZXJpZnkgdGhhdCB0aGUgZGF0YSBpc1xuICAgKiAgICAgICAgICB0aGUgc2FtZSBkYXRhIHRoYXQgd2FzIG9yaWdpbmFsbHkgc2VudC4gQWx0aG91Z2ggaXQgaXMgb3B0aW9uYWwsIHdlIHJlY29tbWVuZCB1c2luZyB0aGVcbiAgICogICAgICAgICAgQ29udGVudC1NRDUgbWVjaGFuaXNtIGFzIGFuIGVuZC10by1lbmQgaW50ZWdyaXR5IGNoZWNrLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBSRVNUXG4gICAqICAgICAgICAgIHJlcXVlc3QgYXV0aGVudGljYXRpb24sIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvUkVTVEF1dGhlbnRpY2F0aW9uLmh0bWxcIj5SRVNUIEF1dGhlbnRpY2F0aW9uPC9hPi48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5UaGUgPGNvZGU+Q29udGVudC1NRDU8L2NvZGU+IGhlYWRlciBpcyByZXF1aXJlZCBmb3IgYW55IHJlcXVlc3QgdG8gdXBsb2FkIGFuXG4gICAqICAgICAgICAgIG9iamVjdCB3aXRoIGEgcmV0ZW50aW9uIHBlcmlvZCBjb25maWd1cmVkIHVzaW5nIEFtYXpvbiBTMyBPYmplY3QgTG9jay4gRm9yIG1vcmVcbiAgICogICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgQW1hem9uIFMzIE9iamVjdCBMb2NrLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L29iamVjdC1sb2NrLW92ZXJ2aWV3Lmh0bWxcIj5BbWF6b24gUzMgT2JqZWN0IExvY2tcbiAgICogICAgICAgICAgICAgT3ZlcnZpZXc8L2E+IGluIHRoZSA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uIDwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+VGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yeSBidWNrZXRzLjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgQ29udGVudE1ENT86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPkEgc3RhbmRhcmQgTUlNRSB0eXBlIGRlc2NyaWJpbmcgdGhlIGZvcm1hdCBvZiB0aGUgY29udGVudHMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbiAgICogICAgICAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM5MTEwLmh0bWwjbmFtZS1jb250ZW50LXR5cGVcIj5odHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjOTExMC5odG1sI25hbWUtY29udGVudC10eXBlPC9hPi48L3A+XG4gICAqL1xuICBDb250ZW50VHlwZT86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPkluZGljYXRlcyB0aGUgYWxnb3JpdGhtIHVzZWQgdG8gY3JlYXRlIHRoZSBjaGVja3N1bSBmb3IgdGhlIG9iamVjdCB3aGVuIHlvdSB1c2UgdGhlIFNESy4gVGhpcyBoZWFkZXIgd2lsbCBub3QgcHJvdmlkZSBhbnlcbiAgICogICAgIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSBpZiB5b3UgZG9uJ3QgdXNlIHRoZSBTREsuIFdoZW4geW91IHNlbmQgdGhpcyBoZWFkZXIsIHRoZXJlIG11c3QgYmUgYSBjb3JyZXNwb25kaW5nIDxjb2RlPngtYW16LWNoZWNrc3VtLTxpPmFsZ29yaXRobTwvaT5cbiAgICogICAgICAgICAgICAgPC9jb2RlPiBvclxuICAgKiAgICAgPGNvZGU+eC1hbXotdHJhaWxlcjwvY29kZT4gaGVhZGVyIHNlbnQuIE90aGVyd2lzZSwgQW1hem9uIFMzIGZhaWxzIHRoZSByZXF1ZXN0IHdpdGggdGhlIEhUVFAgc3RhdHVzIGNvZGUgPGNvZGU+NDAwIEJhZCBSZXF1ZXN0PC9jb2RlPi48L3A+XG4gICAqICAgICAgICAgIDxwPkZvciB0aGUgPGNvZGU+eC1hbXotY2hlY2tzdW0tPGk+YWxnb3JpdGhtPC9pPlxuICAgKiAgICAgICAgICAgICA8L2NvZGU+IGhlYWRlciwgcmVwbGFjZSA8Y29kZT5cbiAgICogICAgICAgICAgICAgICAgPGk+YWxnb3JpdGhtPC9pPlxuICAgKiAgICAgICAgICAgICA8L2NvZGU+IHdpdGggdGhlIHN1cHBvcnRlZCBhbGdvcml0aG0gZnJvbSB0aGUgZm9sbG93aW5nIGxpc3Q6IDwvcD5cbiAgICogICAgICAgICAgPHVsPlxuICAgKiAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgIDxwPkNSQzMyPC9wPlxuICAgKiAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgIDxwPkNSQzMyQzwvcD5cbiAgICogICAgICAgICAgICAgPC9saT5cbiAgICogICAgICAgICAgICAgPGxpPlxuICAgKiAgICAgICAgICAgICAgICA8cD5TSEExPC9wPlxuICAgKiAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgIDxwPlNIQTI1NjwvcD5cbiAgICogICAgICAgICAgICAgPC9saT5cbiAgICogICAgICAgICAgPC91bD5cbiAgICogICAgICAgICAgPHA+Rm9yIG1vcmVcbiAgICogICAgIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL2NoZWNraW5nLW9iamVjdC1pbnRlZ3JpdHkuaHRtbFwiPkNoZWNraW5nIG9iamVjdCBpbnRlZ3JpdHk8L2E+IGluXG4gICAqICAgICB0aGUgPGk+QW1hem9uIFMzIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICogICAgICAgICAgPHA+SWYgdGhlIGluZGl2aWR1YWwgY2hlY2tzdW0gdmFsdWUgeW91IHByb3ZpZGUgdGhyb3VnaCA8Y29kZT54LWFtei1jaGVja3N1bS08aT5hbGdvcml0aG08L2k+XG4gICAqICAgICAgICAgICAgIDwvY29kZT4gZG9lc24ndCBtYXRjaCB0aGUgY2hlY2tzdW0gYWxnb3JpdGhtIHlvdSBzZXQgdGhyb3VnaCA8Y29kZT54LWFtei1zZGstY2hlY2tzdW0tYWxnb3JpdGhtPC9jb2RlPiwgIEFtYXpvbiBTMyBpZ25vcmVzIGFueSBwcm92aWRlZFxuICAgKiAgICAgICAgICAgICA8Y29kZT5DaGVja3N1bUFsZ29yaXRobTwvY29kZT4gcGFyYW1ldGVyIGFuZCB1c2VzIHRoZSBjaGVja3N1bSBhbGdvcml0aG0gdGhhdCBtYXRjaGVzIHRoZSBwcm92aWRlZCB2YWx1ZSBpbiA8Y29kZT54LWFtei1jaGVja3N1bS08aT5hbGdvcml0aG08L2k+XG4gICAqICAgICAgICAgICAgIDwvY29kZT4uPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+Rm9yIGRpcmVjdG9yeSBidWNrZXRzLCB3aGVuIHlvdSB1c2UgQW1hem9uIFdlYiBTZXJ2aWNlcyBTREtzLCA8Y29kZT5DUkMzMjwvY29kZT4gaXMgdGhlIGRlZmF1bHQgY2hlY2tzdW0gYWxnb3JpdGhtIHRoYXQncyB1c2VkIGZvciBwZXJmb3JtYW5jZS48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIENoZWNrc3VtQWxnb3JpdGhtPzogQ2hlY2tzdW1BbGdvcml0aG1JbjtcbiAgLyoqXG4gICAqIDxwPlRoaXMgaGVhZGVyIGNhbiBiZSB1c2VkIGFzIGEgZGF0YSBpbnRlZ3JpdHkgY2hlY2sgdG8gdmVyaWZ5IHRoYXQgdGhlIGRhdGEgcmVjZWl2ZWQgaXMgdGhlIHNhbWUgZGF0YSB0aGF0IHdhcyBvcmlnaW5hbGx5IHNlbnQuXG4gICAqICAgICBUaGlzIGhlYWRlciBzcGVjaWZpZXMgdGhlIGJhc2U2NC1lbmNvZGVkLCAzMi1iaXQgQ1JDMzIgY2hlY2tzdW0gb2YgdGhlIG9iamVjdC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZVxuICAgKiAgICAgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL2NoZWNraW5nLW9iamVjdC1pbnRlZ3JpdHkuaHRtbFwiPkNoZWNraW5nIG9iamVjdCBpbnRlZ3JpdHk8L2E+IGluIHRoZVxuICAgKiAgICAgPGk+QW1hem9uIFMzIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICovXG4gIENoZWNrc3VtQ1JDMzI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5UaGlzIGhlYWRlciBjYW4gYmUgdXNlZCBhcyBhIGRhdGEgaW50ZWdyaXR5IGNoZWNrIHRvIHZlcmlmeSB0aGF0IHRoZSBkYXRhIHJlY2VpdmVkIGlzIHRoZSBzYW1lIGRhdGEgdGhhdCB3YXMgb3JpZ2luYWxseSBzZW50LlxuICAgKiAgICAgVGhpcyBoZWFkZXIgc3BlY2lmaWVzIHRoZSBiYXNlNjQtZW5jb2RlZCwgMzItYml0IENSQzMyQyBjaGVja3N1bSBvZiB0aGUgb2JqZWN0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlXG4gICAqICAgICA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvY2hlY2tpbmctb2JqZWN0LWludGVncml0eS5odG1sXCI+Q2hlY2tpbmcgb2JqZWN0IGludGVncml0eTwvYT4gaW4gdGhlXG4gICAqICAgICA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKi9cbiAgQ2hlY2tzdW1DUkMzMkM/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5UaGlzIGhlYWRlciBjYW4gYmUgdXNlZCBhcyBhIGRhdGEgaW50ZWdyaXR5IGNoZWNrIHRvIHZlcmlmeSB0aGF0IHRoZSBkYXRhIHJlY2VpdmVkIGlzIHRoZSBzYW1lIGRhdGEgdGhhdCB3YXMgb3JpZ2luYWxseSBzZW50LlxuICAgKiAgICAgVGhpcyBoZWFkZXIgc3BlY2lmaWVzIHRoZSBiYXNlNjQtZW5jb2RlZCwgMTYwLWJpdCBTSEEtMSBkaWdlc3Qgb2YgdGhlIG9iamVjdC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZVxuICAgKiAgICAgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL2NoZWNraW5nLW9iamVjdC1pbnRlZ3JpdHkuaHRtbFwiPkNoZWNraW5nIG9iamVjdCBpbnRlZ3JpdHk8L2E+IGluIHRoZVxuICAgKiAgICAgPGk+QW1hem9uIFMzIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICovXG4gIENoZWNrc3VtU0hBMT86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlRoaXMgaGVhZGVyIGNhbiBiZSB1c2VkIGFzIGEgZGF0YSBpbnRlZ3JpdHkgY2hlY2sgdG8gdmVyaWZ5IHRoYXQgdGhlIGRhdGEgcmVjZWl2ZWQgaXMgdGhlIHNhbWUgZGF0YSB0aGF0IHdhcyBvcmlnaW5hbGx5IHNlbnQuXG4gICAqICAgICBUaGlzIGhlYWRlciBzcGVjaWZpZXMgdGhlIGJhc2U2NC1lbmNvZGVkLCAyNTYtYml0IFNIQS0yNTYgZGlnZXN0IG9mIHRoZSBvYmplY3QuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbiAgICogICAgIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9jaGVja2luZy1vYmplY3QtaW50ZWdyaXR5Lmh0bWxcIj5DaGVja2luZyBvYmplY3QgaW50ZWdyaXR5PC9hPiBpbiB0aGVcbiAgICogICAgIDxpPkFtYXpvbiBTMyBVc2VyIEd1aWRlPC9pPi48L3A+XG4gICAqL1xuICBDaGVja3N1bVNIQTI1Nj86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlRoZSBkYXRlIGFuZCB0aW1lIGF0IHdoaWNoIHRoZSBvYmplY3QgaXMgbm8gbG9uZ2VyIGNhY2hlYWJsZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZVxuICAgKiAgICAgICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzcyMzQjc2VjdGlvbi01LjNcIj5odHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNzIzNCNzZWN0aW9uLTUuMzwvYT4uPC9wPlxuICAgKi9cbiAgRXhwaXJlcz86IERhdGU7XG4gIC8qKlxuICAgKiA8cD5VcGxvYWRzIHRoZSBvYmplY3Qgb25seSBpZiB0aGUgb2JqZWN0IGtleSBuYW1lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIGJ1Y2tldCBzcGVjaWZpZWQuIE90aGVyd2lzZSwgQW1hem9uIFMzIHJldHVybnMgYSA8Y29kZT40MTIgUHJlY29uZGl0aW9uIEZhaWxlZDwvY29kZT4gZXJyb3IuPC9wPlxuICAgKiAgICAgICAgICA8cD5JZiBhIGNvbmZsaWN0aW5nIG9wZXJhdGlvbiBvY2N1cnMgZHVyaW5nIHRoZSB1cGxvYWQgUzMgcmV0dXJucyBhIDxjb2RlPjQwOSBDb25kaXRpb25hbFJlcXVlc3RDb25mbGljdDwvY29kZT4gcmVzcG9uc2UuIE9uIGEgNDA5IGZhaWx1cmUgeW91IHNob3VsZCByZXRyeSB0aGUgdXBsb2FkLjwvcD5cbiAgICogICAgICAgICAgPHA+RXhwZWN0cyB0aGUgJyonIChhc3RlcmlzaykgY2hhcmFjdGVyLjwvcD5cbiAgICogICAgICAgICAgPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29uZGl0aW9uYWwgcmVxdWVzdHMsIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzJcIj5SRkMgNzIzMjwvYT4sIG9yIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9jb25kaXRpb25hbC1yZXF1ZXN0cy5odG1sXCI+Q29uZGl0aW9uYWwgcmVxdWVzdHM8L2E+IGluIHRoZSA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKi9cbiAgSWZOb25lTWF0Y2g/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5HaXZlcyB0aGUgZ3JhbnRlZSBSRUFELCBSRUFEX0FDUCwgYW5kIFdSSVRFX0FDUCBwZXJtaXNzaW9ucyBvbiB0aGUgb2JqZWN0LjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDx1bD5cbiAgICogICAgICAgICAgICAgICAgPGxpPlxuICAgKiAgICAgICAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBBbWF6b24gUzMgb24gT3V0cG9zdHMuPC9wPlxuICAgKiAgICAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICA8L3VsPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBHcmFudEZ1bGxDb250cm9sPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+QWxsb3dzIGdyYW50ZWUgdG8gcmVhZCB0aGUgb2JqZWN0IGRhdGEgYW5kIGl0cyBtZXRhZGF0YS48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8dWw+XG4gICAqICAgICAgICAgICAgICAgIDxsaT5cbiAgICogICAgICAgICAgICAgICAgICAgPHA+VGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yeSBidWNrZXRzLjwvcD5cbiAgICogICAgICAgICAgICAgICAgPC9saT5cbiAgICogICAgICAgICAgICAgICAgPGxpPlxuICAgKiAgICAgICAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgQW1hem9uIFMzIG9uIE91dHBvc3RzLjwvcD5cbiAgICogICAgICAgICAgICAgICAgPC9saT5cbiAgICogICAgICAgICAgICAgPC91bD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgR3JhbnRSZWFkPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+QWxsb3dzIGdyYW50ZWUgdG8gcmVhZCB0aGUgb2JqZWN0IEFDTC48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8dWw+XG4gICAqICAgICAgICAgICAgICAgIDxsaT5cbiAgICogICAgICAgICAgICAgICAgICAgPHA+VGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yeSBidWNrZXRzLjwvcD5cbiAgICogICAgICAgICAgICAgICAgPC9saT5cbiAgICogICAgICAgICAgICAgICAgPGxpPlxuICAgKiAgICAgICAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgQW1hem9uIFMzIG9uIE91dHBvc3RzLjwvcD5cbiAgICogICAgICAgICAgICAgICAgPC9saT5cbiAgICogICAgICAgICAgICAgPC91bD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgR3JhbnRSZWFkQUNQPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+QWxsb3dzIGdyYW50ZWUgdG8gd3JpdGUgdGhlIEFDTCBmb3IgdGhlIGFwcGxpY2FibGUgb2JqZWN0LjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDx1bD5cbiAgICogICAgICAgICAgICAgICAgPGxpPlxuICAgKiAgICAgICAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICAgICA8bGk+XG4gICAqICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBBbWF6b24gUzMgb24gT3V0cG9zdHMuPC9wPlxuICAgKiAgICAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICA8L3VsPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBHcmFudFdyaXRlQUNQPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+T2JqZWN0IGtleSBmb3Igd2hpY2ggdGhlIFBVVCBhY3Rpb24gd2FzIGluaXRpYXRlZC48L3A+XG4gICAqL1xuICBLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIDxwPkEgbWFwIG9mIG1ldGFkYXRhIHRvIHN0b3JlIHdpdGggdGhlIG9iamVjdCBpbiBTMy48L3A+XG4gICAqL1xuICBNZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKlxuICAgKiA8cD5UaGUgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiBhbGdvcml0aG0gdGhhdCB3YXMgdXNlZCB3aGVuIHlvdSBzdG9yZSB0aGlzIG9iamVjdCBpbiBBbWF6b24gUzMgKGZvciBleGFtcGxlLFxuICAgKiAgICAgICAgICAgICA8Y29kZT5BRVMyNTY8L2NvZGU+LCA8Y29kZT5hd3M6a21zPC9jb2RlPiwgPGNvZGU+YXdzOmttczpkc3NlPC9jb2RlPikuPC9wPlxuICAgKiAgICAgICAgICA8cD5cbiAgICogICAgICAgICAgICAgPGI+R2VuZXJhbCBwdXJwb3NlIGJ1Y2tldHMgPC9iPiAtIFlvdSBoYXZlIGZvdXIgbXV0dWFsbHkgZXhjbHVzaXZlIG9wdGlvbnMgdG8gcHJvdGVjdCBkYXRhIHVzaW5nIHNlcnZlci1zaWRlIGVuY3J5cHRpb24gaW5cbiAgICogICAgICAgICAgICAgICAgQW1hem9uIFMzLCBkZXBlbmRpbmcgb24gaG93IHlvdSBjaG9vc2UgdG8gbWFuYWdlIHRoZSBlbmNyeXB0aW9uIGtleXMuIFNwZWNpZmljYWxseSwgdGhlXG4gICAqICAgICAgICAgICAgICAgIGVuY3J5cHRpb24ga2V5IG9wdGlvbnMgYXJlIEFtYXpvbiBTMyBtYW5hZ2VkIGtleXMgKFNTRS1TMyksIEFtYXpvbiBXZWIgU2VydmljZXMgS01TIGtleXMgKFNTRS1LTVMgb3JcbiAgICogICAgICAgICAgICAgICAgRFNTRS1LTVMpLCBhbmQgY3VzdG9tZXItcHJvdmlkZWQga2V5cyAoU1NFLUMpLiBBbWF6b24gUzMgZW5jcnlwdHMgZGF0YSB3aXRoIHNlcnZlci1zaWRlXG4gICAqICAgICAgICAgICAgICAgIGVuY3J5cHRpb24gYnkgdXNpbmcgQW1hem9uIFMzIG1hbmFnZWQga2V5cyAoU1NFLVMzKSBieSBkZWZhdWx0LiBZb3UgY2FuIG9wdGlvbmFsbHkgdGVsbCBBbWF6b24gUzMgdG9cbiAgICogICAgICAgICAgICAgICAgZW5jcnlwdCBkYXRhIGF0IHJlc3QgYnkgdXNpbmcgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiB3aXRoIG90aGVyIGtleSBvcHRpb25zLiBGb3IgbW9yZVxuICAgKiAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9Vc2luZ1NlcnZlclNpZGVFbmNyeXB0aW9uLmh0bWxcIj5Vc2luZyBTZXJ2ZXItU2lkZVxuICAgKiAgICAgICAgICAgICAgICAgICBFbmNyeXB0aW9uPC9hPiBpbiB0aGUgPGk+QW1hem9uIFMzIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICogICAgICAgICAgPHA+XG4gICAqICAgICAgICAgICAgIDxiPkRpcmVjdG9yeSBidWNrZXRzIDwvYj4gLSBGb3IgZGlyZWN0b3J5IGJ1Y2tldHMsIG9ubHkgdGhlIHNlcnZlci1zaWRlIGVuY3J5cHRpb24gd2l0aCBBbWF6b24gUzMgbWFuYWdlZCBrZXlzIChTU0UtUzMpICg8Y29kZT5BRVMyNTY8L2NvZGU+KSB2YWx1ZSBpcyBzdXBwb3J0ZWQuPC9wPlxuICAgKi9cbiAgU2VydmVyU2lkZUVuY3J5cHRpb24/OiBTZXJ2ZXJTaWRlRW5jcnlwdGlvbjtcbiAgLyoqXG4gICAqIDxwPkJ5IGRlZmF1bHQsIEFtYXpvbiBTMyB1c2VzIHRoZSBTVEFOREFSRCBTdG9yYWdlIENsYXNzIHRvIHN0b3JlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0cy4gVGhlXG4gICAqICAgICAgICAgIFNUQU5EQVJEIHN0b3JhZ2UgY2xhc3MgcHJvdmlkZXMgaGlnaCBkdXJhYmlsaXR5IGFuZCBoaWdoIGF2YWlsYWJpbGl0eS4gRGVwZW5kaW5nIG9uXG4gICAqICAgICAgICAgIHBlcmZvcm1hbmNlIG5lZWRzLCB5b3UgY2FuIHNwZWNpZnkgYSBkaWZmZXJlbnQgU3RvcmFnZSBDbGFzcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvc3RvcmFnZS1jbGFzcy1pbnRyby5odG1sXCI+U3RvcmFnZSBDbGFzc2VzPC9hPiBpbiB0aGVcbiAgICogICAgICAgICAgICAgPGk+QW1hem9uIFMzIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDx1bD5cbiAgICogICAgICAgICAgICAgICAgPGxpPlxuICAgKiAgICAgICAgICAgICAgICAgICA8cD5Gb3IgZGlyZWN0b3J5IGJ1Y2tldHMsIG9ubHkgdGhlIFMzIEV4cHJlc3MgT25lIFpvbmUgc3RvcmFnZSBjbGFzcyBpcyBzdXBwb3J0ZWQgdG8gc3RvcmUgbmV3bHkgY3JlYXRlZCBvYmplY3RzLjwvcD5cbiAgICogICAgICAgICAgICAgICAgPC9saT5cbiAgICogICAgICAgICAgICAgICAgPGxpPlxuICAgKiAgICAgICAgICAgICAgICAgICA8cD5BbWF6b24gUzMgb24gT3V0cG9zdHMgb25seSB1c2VzXG4gICAqICAgICAgICAgICAgICAgIHRoZSBPVVRQT1NUUyBTdG9yYWdlIENsYXNzLjwvcD5cbiAgICogICAgICAgICAgICAgICAgPC9saT5cbiAgICogICAgICAgICAgICAgPC91bD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgU3RvcmFnZUNsYXNzPzogU3RvcmFnZUNsYXNzO1xuICAvKipcbiAgICogPHA+SWYgdGhlIGJ1Y2tldCBpcyBjb25maWd1cmVkIGFzIGEgd2Vic2l0ZSwgcmVkaXJlY3RzIHJlcXVlc3RzIGZvciB0aGlzIG9iamVjdCB0byBhbm90aGVyXG4gICAqICAgICAgICAgIG9iamVjdCBpbiB0aGUgc2FtZSBidWNrZXQgb3IgdG8gYW4gZXh0ZXJuYWwgVVJMLiBBbWF6b24gUzMgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGlzIGhlYWRlciBpblxuICAgKiAgICAgICAgICB0aGUgb2JqZWN0IG1ldGFkYXRhLiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgb2JqZWN0IG1ldGFkYXRhLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L1VzaW5nTWV0YWRhdGEuaHRtbFwiPk9iamVjdCBLZXkgYW5kIE1ldGFkYXRhPC9hPiBpbiB0aGUgPGk+QW1hem9uIFMzXG4gICAqICAgICAgICAgICAgICAgIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICogICAgICAgICAgPHA+SW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCB0aGUgcmVxdWVzdCBoZWFkZXIgc2V0cyB0aGUgcmVkaXJlY3QgdG8gYW4gb2JqZWN0XG4gICAqICAgICAgICAgIChhbm90aGVyUGFnZS5odG1sKSBpbiB0aGUgc2FtZSBidWNrZXQ6PC9wPlxuICAgKiAgICAgICAgICA8cD5cbiAgICogICAgICAgICAgICAgPGNvZGU+eC1hbXotd2Vic2l0ZS1yZWRpcmVjdC1sb2NhdGlvbjogL2Fub3RoZXJQYWdlLmh0bWw8L2NvZGU+XG4gICAqICAgICAgICAgIDwvcD5cbiAgICogICAgICAgICAgPHA+SW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCB0aGUgcmVxdWVzdCBoZWFkZXIgc2V0cyB0aGUgb2JqZWN0IHJlZGlyZWN0IHRvIGFub3RoZXJcbiAgICogICAgICAgICAgd2Vic2l0ZTo8L3A+XG4gICAqICAgICAgICAgIDxwPlxuICAgKiAgICAgICAgICAgICA8Y29kZT54LWFtei13ZWJzaXRlLXJlZGlyZWN0LWxvY2F0aW9uOiBodHRwOi8vd3d3LmV4YW1wbGUuY29tLzwvY29kZT5cbiAgICogICAgICAgICAgPC9wPlxuICAgKiAgICAgICAgICA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3ZWJzaXRlIGhvc3RpbmcgaW4gQW1hem9uIFMzLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L1dlYnNpdGVIb3N0aW5nLmh0bWxcIj5Ib3N0aW5nIFdlYnNpdGVzIG9uIEFtYXpvbiBTMzwvYT4gYW5kXG4gICAqICAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9ob3ctdG8tcGFnZS1yZWRpcmVjdC5odG1sXCI+SG93IHRvXG4gICAqICAgICAgICAgICAgICAgIENvbmZpZ3VyZSBXZWJzaXRlIFBhZ2UgUmVkaXJlY3RzPC9hPiBpbiB0aGUgPGk+QW1hem9uIFMzXG4gICAqICAgICAgICAgICAgICAgICAgIFVzZXIgR3VpZGU8L2k+LiA8L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBXZWJzaXRlUmVkaXJlY3RMb2NhdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlNwZWNpZmllcyB0aGUgYWxnb3JpdGhtIHRvIHVzZSB3aGVuIGVuY3J5cHRpbmcgdGhlIG9iamVjdCAoZm9yIGV4YW1wbGUsXG4gICAqICAgICAgICAgIDxjb2RlPkFFUzI1NjwvY29kZT4pLjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIFNTRUN1c3RvbWVyQWxnb3JpdGhtPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+U3BlY2lmaWVzIHRoZSBjdXN0b21lci1wcm92aWRlZCBlbmNyeXB0aW9uIGtleSBmb3IgQW1hem9uIFMzIHRvIHVzZSBpbiBlbmNyeXB0aW5nIGRhdGEuIFRoaXNcbiAgICogICAgICAgICAgdmFsdWUgaXMgdXNlZCB0byBzdG9yZSB0aGUgb2JqZWN0IGFuZCB0aGVuIGl0IGlzIGRpc2NhcmRlZDsgQW1hem9uIFMzIGRvZXMgbm90IHN0b3JlIHRoZVxuICAgKiAgICAgICAgICBlbmNyeXB0aW9uIGtleS4gVGhlIGtleSBtdXN0IGJlIGFwcHJvcHJpYXRlIGZvciB1c2Ugd2l0aCB0aGUgYWxnb3JpdGhtIHNwZWNpZmllZCBpbiB0aGVcbiAgICogICAgICAgICAgICAgPGNvZGU+eC1hbXotc2VydmVyLXNpZGUtZW5jcnlwdGlvbi1jdXN0b21lci1hbGdvcml0aG08L2NvZGU+IGhlYWRlci48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBTU0VDdXN0b21lcktleT86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlNwZWNpZmllcyB0aGUgMTI4LWJpdCBNRDUgZGlnZXN0IG9mIHRoZSBlbmNyeXB0aW9uIGtleSBhY2NvcmRpbmcgdG8gUkZDIDEzMjEuIEFtYXpvbiBTMyB1c2VzXG4gICAqICAgICAgICAgIHRoaXMgaGVhZGVyIGZvciBhIG1lc3NhZ2UgaW50ZWdyaXR5IGNoZWNrIHRvIGVuc3VyZSB0aGF0IHRoZSBlbmNyeXB0aW9uIGtleSB3YXMgdHJhbnNtaXR0ZWRcbiAgICogICAgICAgICAgd2l0aG91dCBlcnJvci48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBTU0VDdXN0b21lcktleU1ENT86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPklmIDxjb2RlPngtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb248L2NvZGU+IGhhcyBhIHZhbGlkIHZhbHVlIG9mIDxjb2RlPmF3czprbXM8L2NvZGU+XG4gICAqICAgICAgICAgIG9yIDxjb2RlPmF3czprbXM6ZHNzZTwvY29kZT4sIHRoaXMgaGVhZGVyIHNwZWNpZmllcyB0aGUgSUQgKEtleSBJRCwgS2V5IEFSTiwgb3IgS2V5IEFsaWFzKSBvZiB0aGUgS2V5IE1hbmFnZW1lbnQgU2VydmljZSAoS01TKVxuICAgKiAgICAgICAgICBzeW1tZXRyaWMgZW5jcnlwdGlvbiBjdXN0b21lciBtYW5hZ2VkIGtleSB0aGF0IHdhcyB1c2VkIGZvciB0aGUgb2JqZWN0LiBJZiB5b3Ugc3BlY2lmeVxuICAgKiAgICAgICAgICAgICA8Y29kZT54LWFtei1zZXJ2ZXItc2lkZS1lbmNyeXB0aW9uOmF3czprbXM8L2NvZGU+IG9yXG4gICAqICAgICAgICAgICAgIDxjb2RlPngtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb246YXdzOmttczpkc3NlPC9jb2RlPiwgYnV0IGRvIG5vdCBwcm92aWRlPGNvZGU+XG4gICAqICAgICAgICAgICAgIHgtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb24tYXdzLWttcy1rZXktaWQ8L2NvZGU+LCBBbWF6b24gUzMgdXNlcyB0aGUgQW1hem9uIFdlYiBTZXJ2aWNlcyBtYW5hZ2VkIGtleVxuICAgKiAgICAgICAgICAgICAoPGNvZGU+YXdzL3MzPC9jb2RlPikgdG8gcHJvdGVjdCB0aGUgZGF0YS4gSWYgdGhlIEtNUyBrZXkgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHNhbWVcbiAgICogICAgICAgICAgYWNjb3VudCB0aGF0J3MgaXNzdWluZyB0aGUgY29tbWFuZCwgeW91IG11c3QgdXNlIHRoZSBmdWxsIEFSTiBhbmQgbm90IGp1c3QgdGhlIElELiA8L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBTU0VLTVNLZXlJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlNwZWNpZmllcyB0aGUgQW1hem9uIFdlYiBTZXJ2aWNlcyBLTVMgRW5jcnlwdGlvbiBDb250ZXh0IHRvIHVzZSBmb3Igb2JqZWN0IGVuY3J5cHRpb24uIFRoZSB2YWx1ZSBvZlxuICAgKiAgICAgICAgICB0aGlzIGhlYWRlciBpcyBhIGJhc2U2NC1lbmNvZGVkIFVURi04IHN0cmluZyBob2xkaW5nIEpTT04gd2l0aCB0aGUgZW5jcnlwdGlvbiBjb250ZXh0XG4gICAqICAgICAgICAgIGtleS12YWx1ZSBwYWlycy4gVGhpcyB2YWx1ZSBpcyBzdG9yZWQgYXMgb2JqZWN0IG1ldGFkYXRhIGFuZCBhdXRvbWF0aWNhbGx5IGdldHMgcGFzc2VkIG9uXG4gICAqICAgICAgICAgIHRvIEFtYXpvbiBXZWIgU2VydmljZXMgS01TIGZvciBmdXR1cmUgPGNvZGU+R2V0T2JqZWN0PC9jb2RlPiBvciA8Y29kZT5Db3B5T2JqZWN0PC9jb2RlPiBvcGVyYXRpb25zIG9uXG4gICAqICAgICAgICAgIHRoaXMgb2JqZWN0LiBUaGlzIHZhbHVlIG11c3QgYmUgZXhwbGljaXRseSBhZGRlZCBkdXJpbmcgPGNvZGU+Q29weU9iamVjdDwvY29kZT4gb3BlcmF0aW9ucy48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBTU0VLTVNFbmNyeXB0aW9uQ29udGV4dD86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlNwZWNpZmllcyB3aGV0aGVyIEFtYXpvbiBTMyBzaG91bGQgdXNlIGFuIFMzIEJ1Y2tldCBLZXkgZm9yIG9iamVjdCBlbmNyeXB0aW9uIHdpdGhcbiAgICogICAgICAgICAgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiB1c2luZyBLZXkgTWFuYWdlbWVudCBTZXJ2aWNlIChLTVMpIGtleXMgKFNTRS1LTVMpLiBTZXR0aW5nIHRoaXMgaGVhZGVyIHRvXG4gICAqICAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGNhdXNlcyBBbWF6b24gUzMgdG8gdXNlIGFuIFMzIEJ1Y2tldCBLZXkgZm9yIG9iamVjdCBlbmNyeXB0aW9uIHdpdGhcbiAgICogICAgICAgICAgU1NFLUtNUy48L3A+XG4gICAqICAgICAgICAgIDxwPlNwZWNpZnlpbmcgdGhpcyBoZWFkZXIgd2l0aCBhIFBVVCBhY3Rpb24gZG9lc27igJl0IGFmZmVjdCBidWNrZXQtbGV2ZWwgc2V0dGluZ3MgZm9yIFMzXG4gICAqICAgICAgICAgIEJ1Y2tldCBLZXkuPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+VGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yeSBidWNrZXRzLjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgQnVja2V0S2V5RW5hYmxlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiA8cD5Db25maXJtcyB0aGF0IHRoZSByZXF1ZXN0ZXIga25vd3MgdGhhdCB0aGV5IHdpbGwgYmUgY2hhcmdlZCBmb3IgdGhlIHJlcXVlc3QuIEJ1Y2tldFxuICAgKiAgICAgICAgICBvd25lcnMgbmVlZCBub3Qgc3BlY2lmeSB0aGlzIHBhcmFtZXRlciBpbiB0aGVpciByZXF1ZXN0cy4gSWYgZWl0aGVyIHRoZSBzb3VyY2Ugb3JcbiAgICogICAgICAgICAgZGVzdGluYXRpb24gUzMgYnVja2V0IGhhcyBSZXF1ZXN0ZXIgUGF5cyBlbmFibGVkLCB0aGUgcmVxdWVzdGVyIHdpbGwgcGF5IGZvclxuICAgKiAgICAgICAgICBjb3JyZXNwb25kaW5nIGNoYXJnZXMgdG8gY29weSB0aGUgb2JqZWN0LiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgZG93bmxvYWRpbmcgb2JqZWN0cyBmcm9tXG4gICAqICAgICAgICAgIFJlcXVlc3RlciBQYXlzIGJ1Y2tldHMsIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvT2JqZWN0c2luUmVxdWVzdGVyUGF5c0J1Y2tldHMuaHRtbFwiPkRvd25sb2FkaW5nIE9iamVjdHMgaW5cbiAgICogICAgICAgICAgICAgUmVxdWVzdGVyIFBheXMgQnVja2V0czwvYT4gaW4gdGhlIDxpPkFtYXpvbiBTMyBVc2VyIEd1aWRlPC9pPi48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBSZXF1ZXN0UGF5ZXI/OiBSZXF1ZXN0UGF5ZXI7XG4gIC8qKlxuICAgKiA8cD5UaGUgdGFnLXNldCBmb3IgdGhlIG9iamVjdC4gVGhlIHRhZy1zZXQgbXVzdCBiZSBlbmNvZGVkIGFzIFVSTCBRdWVyeSBwYXJhbWV0ZXJzLiAoRm9yXG4gICAqICAgICAgICAgIGV4YW1wbGUsIFwiS2V5MT1WYWx1ZTFcIik8L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBUYWdnaW5nPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+VGhlIE9iamVjdCBMb2NrIG1vZGUgdGhhdCB5b3Ugd2FudCB0byBhcHBseSB0byB0aGlzIG9iamVjdC48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBPYmplY3RMb2NrTW9kZT86IE9iamVjdExvY2tNb2RlO1xuICAvKipcbiAgICogPHA+VGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB5b3Ugd2FudCB0aGlzIG9iamVjdCdzIE9iamVjdCBMb2NrIHRvIGV4cGlyZS4gTXVzdCBiZSBmb3JtYXR0ZWRcbiAgICogICAgICAgICAgYXMgYSB0aW1lc3RhbXAgcGFyYW1ldGVyLjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIE9iamVjdExvY2tSZXRhaW5VbnRpbERhdGU/OiBEYXRlO1xuICAvKipcbiAgICogPHA+U3BlY2lmaWVzIHdoZXRoZXIgYSBsZWdhbCBob2xkIHdpbGwgYmUgYXBwbGllZCB0byB0aGlzIG9iamVjdC4gRm9yIG1vcmUgaW5mb3JtYXRpb25cbiAgICogICAgICAgICAgYWJvdXQgUzMgT2JqZWN0IExvY2ssIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvb2JqZWN0LWxvY2suaHRtbFwiPk9iamVjdCBMb2NrPC9hPiBpbiB0aGUgPGk+QW1hem9uIFMzIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIE9iamVjdExvY2tMZWdhbEhvbGRTdGF0dXM/OiBPYmplY3RMb2NrTGVnYWxIb2xkU3RhdHVzO1xuICAvKipcbiAgICogPHA+VGhlIGFjY291bnQgSUQgb2YgdGhlIGV4cGVjdGVkIGJ1Y2tldCBvd25lci4gSWYgdGhlIGFjY291bnQgSUQgdGhhdCB5b3UgcHJvdmlkZSBkb2VzIG5vdCBtYXRjaCB0aGUgYWN0dWFsIG93bmVyIG9mIHRoZSBidWNrZXQsIHRoZSByZXF1ZXN0IGZhaWxzIHdpdGggdGhlIEhUVFAgc3RhdHVzIGNvZGUgPGNvZGU+NDAzIEZvcmJpZGRlbjwvY29kZT4gKGFjY2VzcyBkZW5pZWQpLjwvcD5cbiAgICovXG4gIEV4cGVjdGVkQnVja2V0T3duZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIE5vZGVKc1J1bnRpbWVTdHJlYW1pbmdCbG9iUGF5bG9hZElucHV0VHlwZXMgPSBzdHJpbmcgfCBVaW50OEFycmF5IHwgQnVmZmVyIHwgUmVhZGFibGU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHV0T2JqZWN0Q29tbWFuZElucHV0IGV4dGVuZHMgT21pdDxQdXRPYmplY3RSZXF1ZXN0LCAnQm9keSc+IHtcbiAgQm9keT86IE5vZGVKc1J1bnRpbWVTdHJlYW1pbmdCbG9iUGF5bG9hZElucHV0VHlwZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxldGVNdWx0aXBhcnRVcGxvYWRPdXRwdXQge1xuICAvKipcbiAgICogPHA+VGhlIFVSSSB0aGF0IGlkZW50aWZpZXMgdGhlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LjwvcD5cbiAgICovXG4gIExvY2F0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+VGhlIG5hbWUgb2YgdGhlIGJ1Y2tldCB0aGF0IGNvbnRhaW5zIHRoZSBuZXdseSBjcmVhdGVkIG9iamVjdC4gRG9lcyBub3QgcmV0dXJuIHRoZSBhY2Nlc3MgcG9pbnRcbiAgICogICAgICAgICAgQVJOIG9yIGFjY2VzcyBwb2ludCBhbGlhcyBpZiB1c2VkLjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPkFjY2VzcyBwb2ludHMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBCdWNrZXQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5UaGUgb2JqZWN0IGtleSBvZiB0aGUgbmV3bHkgY3JlYXRlZCBvYmplY3QuPC9wPlxuICAgKi9cbiAgS2V5Pzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+SWYgdGhlIG9iamVjdCBleHBpcmF0aW9uIGlzIGNvbmZpZ3VyZWQsIHRoaXMgd2lsbCBjb250YWluIHRoZSBleHBpcmF0aW9uIGRhdGVcbiAgICogICAgICAgICAgICAgKDxjb2RlPmV4cGlyeS1kYXRlPC9jb2RlPikgYW5kIHJ1bGUgSUQgKDxjb2RlPnJ1bGUtaWQ8L2NvZGU+KS4gVGhlIHZhbHVlIG9mXG4gICAqICAgICAgICAgICAgIDxjb2RlPnJ1bGUtaWQ8L2NvZGU+IGlzIFVSTC1lbmNvZGVkLjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIEV4cGlyYXRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5FbnRpdHkgdGFnIHRoYXQgaWRlbnRpZmllcyB0aGUgbmV3bHkgY3JlYXRlZCBvYmplY3QncyBkYXRhLiBPYmplY3RzIHdpdGggZGlmZmVyZW50XG4gICAqICAgICAgICAgIG9iamVjdCBkYXRhIHdpbGwgaGF2ZSBkaWZmZXJlbnQgZW50aXR5IHRhZ3MuIFRoZSBlbnRpdHkgdGFnIGlzIGFuIG9wYXF1ZSBzdHJpbmcuIFRoZSBlbnRpdHlcbiAgICogICAgICAgICAgdGFnIG1heSBvciBtYXkgbm90IGJlIGFuIE1ENSBkaWdlc3Qgb2YgdGhlIG9iamVjdCBkYXRhLiBJZiB0aGUgZW50aXR5IHRhZyBpcyBub3QgYW4gTUQ1XG4gICAqICAgICAgICAgIGRpZ2VzdCBvZiB0aGUgb2JqZWN0IGRhdGEsIGl0IHdpbGwgY29udGFpbiBvbmUgb3IgbW9yZSBub25oZXhhZGVjaW1hbCBjaGFyYWN0ZXJzIGFuZC9vclxuICAgKiAgICAgICAgICB3aWxsIGNvbnNpc3Qgb2YgbGVzcyB0aGFuIDMyIG9yIG1vcmUgdGhhbiAzMiBoZXhhZGVjaW1hbCBkaWdpdHMuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0XG4gICAqICAgICAgICAgIGhvdyB0aGUgZW50aXR5IHRhZyBpcyBjYWxjdWxhdGVkLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL2NoZWNraW5nLW9iamVjdC1pbnRlZ3JpdHkuaHRtbFwiPkNoZWNraW5nIG9iamVjdFxuICAgKiAgICAgICAgICAgICBpbnRlZ3JpdHk8L2E+IGluIHRoZSA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKi9cbiAgRVRhZz86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlRoZSBiYXNlNjQtZW5jb2RlZCwgMzItYml0IENSQzMyIGNoZWNrc3VtIG9mIHRoZSBvYmplY3QuIFRoaXMgd2lsbCBvbmx5IGJlIHByZXNlbnQgaWYgaXQgd2FzIHVwbG9hZGVkXG4gICAqICAgICB3aXRoIHRoZSBvYmplY3QuIFdoZW4geW91IHVzZSBhbiBBUEkgb3BlcmF0aW9uIG9uIGFuIG9iamVjdCB0aGF0IHdhcyB1cGxvYWRlZCB1c2luZyBtdWx0aXBhcnQgdXBsb2FkcywgdGhpcyB2YWx1ZSBtYXkgbm90IGJlIGEgZGlyZWN0IGNoZWNrc3VtIHZhbHVlIG9mIHRoZSBmdWxsIG9iamVjdC4gSW5zdGVhZCwgaXQncyBhIGNhbGN1bGF0aW9uIGJhc2VkIG9uIHRoZSBjaGVja3N1bSB2YWx1ZXMgb2YgZWFjaCBpbmRpdmlkdWFsIHBhcnQuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGhvdyBjaGVja3N1bXMgYXJlIGNhbGN1bGF0ZWRcbiAgICogICAgIHdpdGggbXVsdGlwYXJ0IHVwbG9hZHMsIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvY2hlY2tpbmctb2JqZWN0LWludGVncml0eS5odG1sI2xhcmdlLW9iamVjdC1jaGVja3N1bXNcIj5cbiAgICogICAgIENoZWNraW5nIG9iamVjdCBpbnRlZ3JpdHk8L2E+IGluIHRoZSA8aT5BbWF6b24gUzMgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKi9cbiAgQ2hlY2tzdW1DUkMzMj86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlRoZSBiYXNlNjQtZW5jb2RlZCwgMzItYml0IENSQzMyQyBjaGVja3N1bSBvZiB0aGUgb2JqZWN0LiBUaGlzIHdpbGwgb25seSBiZSBwcmVzZW50IGlmIGl0IHdhcyB1cGxvYWRlZFxuICAgKiAgICAgd2l0aCB0aGUgb2JqZWN0LiBXaGVuIHlvdSB1c2UgYW4gQVBJIG9wZXJhdGlvbiBvbiBhbiBvYmplY3QgdGhhdCB3YXMgdXBsb2FkZWQgdXNpbmcgbXVsdGlwYXJ0IHVwbG9hZHMsIHRoaXMgdmFsdWUgbWF5IG5vdCBiZSBhIGRpcmVjdCBjaGVja3N1bSB2YWx1ZSBvZiB0aGUgZnVsbCBvYmplY3QuIEluc3RlYWQsIGl0J3MgYSBjYWxjdWxhdGlvbiBiYXNlZCBvbiB0aGUgY2hlY2tzdW0gdmFsdWVzIG9mIGVhY2ggaW5kaXZpZHVhbCBwYXJ0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgY2hlY2tzdW1zIGFyZSBjYWxjdWxhdGVkXG4gICAqICAgICB3aXRoIG11bHRpcGFydCB1cGxvYWRzLCBzZWUgPGEgaHJlZj1cImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL2NoZWNraW5nLW9iamVjdC1pbnRlZ3JpdHkuaHRtbCNsYXJnZS1vYmplY3QtY2hlY2tzdW1zXCI+XG4gICAqICAgICBDaGVja2luZyBvYmplY3QgaW50ZWdyaXR5PC9hPiBpbiB0aGUgPGk+QW1hem9uIFMzIFVzZXIgR3VpZGU8L2k+LjwvcD5cbiAgICovXG4gIENoZWNrc3VtQ1JDMzJDPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+VGhlIGJhc2U2NC1lbmNvZGVkLCAxNjAtYml0IFNIQS0xIGRpZ2VzdCBvZiB0aGUgb2JqZWN0LiBUaGlzIHdpbGwgb25seSBiZSBwcmVzZW50IGlmIGl0IHdhcyB1cGxvYWRlZFxuICAgKiAgICAgd2l0aCB0aGUgb2JqZWN0LiBXaGVuIHlvdSB1c2UgdGhlIEFQSSBvcGVyYXRpb24gb24gYW4gb2JqZWN0IHRoYXQgd2FzIHVwbG9hZGVkIHVzaW5nIG11bHRpcGFydCB1cGxvYWRzLCB0aGlzIHZhbHVlIG1heSBub3QgYmUgYSBkaXJlY3QgY2hlY2tzdW0gdmFsdWUgb2YgdGhlIGZ1bGwgb2JqZWN0LiBJbnN0ZWFkLCBpdCdzIGEgY2FsY3VsYXRpb24gYmFzZWQgb24gdGhlIGNoZWNrc3VtIHZhbHVlcyBvZiBlYWNoIGluZGl2aWR1YWwgcGFydC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IGNoZWNrc3VtcyBhcmUgY2FsY3VsYXRlZFxuICAgKiAgICAgd2l0aCBtdWx0aXBhcnQgdXBsb2Fkcywgc2VlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9jaGVja2luZy1vYmplY3QtaW50ZWdyaXR5Lmh0bWwjbGFyZ2Utb2JqZWN0LWNoZWNrc3Vtc1wiPlxuICAgKiAgICAgQ2hlY2tpbmcgb2JqZWN0IGludGVncml0eTwvYT4gaW4gdGhlIDxpPkFtYXpvbiBTMyBVc2VyIEd1aWRlPC9pPi48L3A+XG4gICAqL1xuICBDaGVja3N1bVNIQTE/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5UaGUgYmFzZTY0LWVuY29kZWQsIDI1Ni1iaXQgU0hBLTI1NiBkaWdlc3Qgb2YgdGhlIG9iamVjdC4gVGhpcyB3aWxsIG9ubHkgYmUgcHJlc2VudCBpZiBpdCB3YXMgdXBsb2FkZWRcbiAgICogICAgIHdpdGggdGhlIG9iamVjdC4gV2hlbiB5b3UgdXNlIGFuIEFQSSBvcGVyYXRpb24gb24gYW4gb2JqZWN0IHRoYXQgd2FzIHVwbG9hZGVkIHVzaW5nIG11bHRpcGFydCB1cGxvYWRzLCB0aGlzIHZhbHVlIG1heSBub3QgYmUgYSBkaXJlY3QgY2hlY2tzdW0gdmFsdWUgb2YgdGhlIGZ1bGwgb2JqZWN0LiBJbnN0ZWFkLCBpdCdzIGEgY2FsY3VsYXRpb24gYmFzZWQgb24gdGhlIGNoZWNrc3VtIHZhbHVlcyBvZiBlYWNoIGluZGl2aWR1YWwgcGFydC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IGNoZWNrc3VtcyBhcmUgY2FsY3VsYXRlZFxuICAgKiAgICAgd2l0aCBtdWx0aXBhcnQgdXBsb2Fkcywgc2VlIDxhIGhyZWY9XCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9jaGVja2luZy1vYmplY3QtaW50ZWdyaXR5Lmh0bWwjbGFyZ2Utb2JqZWN0LWNoZWNrc3Vtc1wiPlxuICAgKiAgICAgQ2hlY2tpbmcgb2JqZWN0IGludGVncml0eTwvYT4gaW4gdGhlIDxpPkFtYXpvbiBTMyBVc2VyIEd1aWRlPC9pPi48L3A+XG4gICAqL1xuICBDaGVja3N1bVNIQTI1Nj86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlRoZSBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIGFsZ29yaXRobSB1c2VkIHdoZW4gc3RvcmluZyB0aGlzIG9iamVjdCBpbiBBbWF6b24gUzMgKGZvciBleGFtcGxlLFxuICAgKiAgICAgICAgICAgICA8Y29kZT5BRVMyNTY8L2NvZGU+LCA8Y29kZT5hd3M6a21zPC9jb2RlPikuPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+Rm9yIGRpcmVjdG9yeSBidWNrZXRzLCBvbmx5IHNlcnZlci1zaWRlIGVuY3J5cHRpb24gd2l0aCBBbWF6b24gUzMgbWFuYWdlZCBrZXlzIChTU0UtUzMpICg8Y29kZT5BRVMyNTY8L2NvZGU+KSBpcyBzdXBwb3J0ZWQuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBTZXJ2ZXJTaWRlRW5jcnlwdGlvbj86IFNlcnZlclNpZGVFbmNyeXB0aW9uO1xuICAvKipcbiAgICogPHA+VmVyc2lvbiBJRCBvZiB0aGUgbmV3bHkgY3JlYXRlZCBvYmplY3QsIGluIGNhc2UgdGhlIGJ1Y2tldCBoYXMgdmVyc2lvbmluZyB0dXJuZWRcbiAgICogICAgICAgICAgb24uPC9wPlxuICAgKiAgICAgICAgICA8bm90ZT5cbiAgICogICAgICAgICAgICAgPHA+VGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yeSBidWNrZXRzLjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgVmVyc2lvbklkPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+SWYgcHJlc2VudCwgaW5kaWNhdGVzIHRoZSBJRCBvZiB0aGUgS2V5IE1hbmFnZW1lbnQgU2VydmljZSAoS01TKSBzeW1tZXRyaWMgZW5jcnlwdGlvbiBjdXN0b21lciBtYW5hZ2VkIGtleVxuICAgKiAgICAgICAgICB0aGF0IHdhcyB1c2VkIGZvciB0aGUgb2JqZWN0LjwvcD5cbiAgICogICAgICAgICAgPG5vdGU+XG4gICAqICAgICAgICAgICAgIDxwPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3RvcnkgYnVja2V0cy48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIFNTRUtNU0tleUlkPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIG11bHRpcGFydCB1cGxvYWQgdXNlcyBhbiBTMyBCdWNrZXQgS2V5IGZvciBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uXG4gICAqICAgICAgICAgIHdpdGggS2V5IE1hbmFnZW1lbnQgU2VydmljZSAoS01TKSBrZXlzIChTU0UtS01TKS48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBCdWNrZXRLZXlFbmFibGVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIDxwPklmIHByZXNlbnQsIGluZGljYXRlcyB0aGF0IHRoZSByZXF1ZXN0ZXIgd2FzIHN1Y2Nlc3NmdWxseSBjaGFyZ2VkIGZvciB0aGVcbiAgICogICAgICAgICAgcmVxdWVzdC48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5UaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3J5IGJ1Y2tldHMuPC9wPlxuICAgKiAgICAgICAgICA8L25vdGU+XG4gICAqL1xuICBSZXF1ZXN0Q2hhcmdlZD86IFJlcXVlc3RDaGFyZ2VkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkQ29tbWFuZE91dHB1dFxuICBleHRlbmRzIENvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkT3V0cHV0LFxuICBNZXRhZGF0YUJlYXJlciB7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VJZGVudGlmaWVyIHtcbiAgLyoqXG4gICAqIDxwPlRoZSA8Y29kZT5zaGEyNTY8L2NvZGU+IGRpZ2VzdCBvZiB0aGUgaW1hZ2UgbWFuaWZlc3QuPC9wPlxuICAgKi9cbiAgaW1hZ2VEaWdlc3Q/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5UaGUgdGFnIHVzZWQgZm9yIHRoZSBpbWFnZS48L3A+XG4gICAqL1xuICBpbWFnZVRhZz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXNjcmliZUltYWdlc0ZpbHRlciB7XG4gIC8qKlxuICAgKiA8cD5UaGUgdGFnIHN0YXR1cyB3aXRoIHdoaWNoIHRvIGZpbHRlciB5b3VyIDxhPkRlc2NyaWJlSW1hZ2VzPC9hPiByZXN1bHRzLiBZb3VcbiAgICogICAgICAgICAgICAgY2FuIGZpbHRlciByZXN1bHRzIGJhc2VkIG9uIHdoZXRoZXIgdGhleSBhcmUgPGNvZGU+VEFHR0VEPC9jb2RlPiBvclxuICAgKiAgICAgICAgICAgICAgICAgPGNvZGU+VU5UQUdHRUQ8L2NvZGU+LjwvcD5cbiAgICovXG4gIHRhZ1N0YXR1cz86IFRhZ1N0YXR1cztcbn1cblxuZXhwb3J0IGNvbnN0IFRhZ1N0YXR1cyA9IHtcbiAgQU5ZOiAnQU5ZJyxcbiAgVEFHR0VEOiAnVEFHR0VEJyxcbiAgVU5UQUdHRUQ6ICdVTlRBR0dFRCcsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBUYWdTdGF0dXMgPSAodHlwZW9mIFRhZ1N0YXR1cylba2V5b2YgdHlwZW9mIFRhZ1N0YXR1c107XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVzY3JpYmVJbWFnZXNSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIDxwPlRoZSBBbWF6b24gV2ViIFNlcnZpY2VzIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWdpc3RyeSB0aGF0IGNvbnRhaW5zIHRoZSByZXBvc2l0b3J5IGluXG4gICAqICAgICAgICAgICAgIHdoaWNoIHRvIGRlc2NyaWJlIGltYWdlcy4gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgcmVnaXN0cnksIHRoZSBkZWZhdWx0IHJlZ2lzdHJ5IGlzIGFzc3VtZWQuPC9wPlxuICAgKi9cbiAgcmVnaXN0cnlJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlRoZSByZXBvc2l0b3J5IHRoYXQgY29udGFpbnMgdGhlIGltYWdlcyB0byBkZXNjcmliZS48L3A+XG4gICAqL1xuICByZXBvc2l0b3J5TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogPHA+VGhlIGxpc3Qgb2YgaW1hZ2UgSURzIGZvciB0aGUgcmVxdWVzdGVkIHJlcG9zaXRvcnkuPC9wPlxuICAgKi9cbiAgaW1hZ2VJZHM/OiBJbWFnZUlkZW50aWZpZXJbXTtcbiAgLyoqXG4gICAqIDxwPlRoZSA8Y29kZT5uZXh0VG9rZW48L2NvZGU+IHZhbHVlIHJldHVybmVkIGZyb20gYSBwcmV2aW91cyBwYWdpbmF0ZWRcbiAgICogICAgICAgICAgICAgICAgIDxjb2RlPkRlc2NyaWJlSW1hZ2VzPC9jb2RlPiByZXF1ZXN0IHdoZXJlIDxjb2RlPm1heFJlc3VsdHM8L2NvZGU+IHdhcyB1c2VkIGFuZCB0aGVcbiAgICogICAgICAgICAgICAgcmVzdWx0cyBleGNlZWRlZCB0aGUgdmFsdWUgb2YgdGhhdCBwYXJhbWV0ZXIuIFBhZ2luYXRpb24gY29udGludWVzIGZyb20gdGhlIGVuZCBvZiB0aGVcbiAgICogICAgICAgICAgICAgcHJldmlvdXMgcmVzdWx0cyB0aGF0IHJldHVybmVkIHRoZSA8Y29kZT5uZXh0VG9rZW48L2NvZGU+IHZhbHVlLiBUaGlzIHZhbHVlIGlzXG4gICAqICAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIHJlc3VsdHMgdG8gcmV0dXJuLiBUaGlzIG9wdGlvbiBjYW5ub3QgYmVcbiAgICogICAgICAgICAgICAgdXNlZCB3aGVuIHlvdSBzcGVjaWZ5IGltYWdlcyB3aXRoIDxjb2RlPmltYWdlSWRzPC9jb2RlPi48L3A+XG4gICAqL1xuICBuZXh0VG9rZW4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5UaGUgbWF4aW11bSBudW1iZXIgb2YgcmVwb3NpdG9yeSByZXN1bHRzIHJldHVybmVkIGJ5IDxjb2RlPkRlc2NyaWJlSW1hZ2VzPC9jb2RlPiBpblxuICAgKiAgICAgICAgICAgICBwYWdpbmF0ZWQgb3V0cHV0LiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHVzZWQsIDxjb2RlPkRlc2NyaWJlSW1hZ2VzPC9jb2RlPiBvbmx5IHJldHVybnNcbiAgICogICAgICAgICAgICAgICAgIDxjb2RlPm1heFJlc3VsdHM8L2NvZGU+IHJlc3VsdHMgaW4gYSBzaW5nbGUgcGFnZSBhbG9uZyB3aXRoIGEgPGNvZGU+bmV4dFRva2VuPC9jb2RlPlxuICAgKiAgICAgICAgICAgICByZXNwb25zZSBlbGVtZW50LiBUaGUgcmVtYWluaW5nIHJlc3VsdHMgb2YgdGhlIGluaXRpYWwgcmVxdWVzdCBjYW4gYmUgc2VlbiBieSBzZW5kaW5nXG4gICAqICAgICAgICAgICAgIGFub3RoZXIgPGNvZGU+RGVzY3JpYmVJbWFnZXM8L2NvZGU+IHJlcXVlc3Qgd2l0aCB0aGUgcmV0dXJuZWQgPGNvZGU+bmV4dFRva2VuPC9jb2RlPlxuICAgKiAgICAgICAgICAgICB2YWx1ZS4gVGhpcyB2YWx1ZSBjYW4gYmUgYmV0d2VlbiAxIGFuZCAxMDAwLiBJZiB0aGlzXG4gICAqICAgICAgICAgICAgIHBhcmFtZXRlciBpcyBub3QgdXNlZCwgdGhlbiA8Y29kZT5EZXNjcmliZUltYWdlczwvY29kZT4gcmV0dXJucyB1cCB0b1xuICAgKiAgICAgICAgICAgICAxMDAgcmVzdWx0cyBhbmQgYSA8Y29kZT5uZXh0VG9rZW48L2NvZGU+IHZhbHVlLCBpZiBhcHBsaWNhYmxlLiBUaGlzXG4gICAqICAgICAgICAgICAgIG9wdGlvbiBjYW5ub3QgYmUgdXNlZCB3aGVuIHlvdSBzcGVjaWZ5IGltYWdlcyB3aXRoIDxjb2RlPmltYWdlSWRzPC9jb2RlPi48L3A+XG4gICAqL1xuICBtYXhSZXN1bHRzPzogbnVtYmVyO1xuICAvKipcbiAgICogPHA+VGhlIGZpbHRlciBrZXkgYW5kIHZhbHVlIHdpdGggd2hpY2ggdG8gZmlsdGVyIHlvdXIgPGNvZGU+RGVzY3JpYmVJbWFnZXM8L2NvZGU+XG4gICAqICAgICAgICAgICAgIHJlc3VsdHMuPC9wPlxuICAgKi9cbiAgZmlsdGVyPzogRGVzY3JpYmVJbWFnZXNGaWx0ZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVzY3JpYmVJbWFnZXNDb21tYW5kSW5wdXQgZXh0ZW5kcyBEZXNjcmliZUltYWdlc1JlcXVlc3Qge1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlc2NyaWJlSW1hZ2VzQ29tbWFuZE91dHB1dCBleHRlbmRzIERlc2NyaWJlSW1hZ2VzUmVzcG9uc2UsIE1ldGFkYXRhQmVhcmVyIHtcbn1cblxuZXhwb3J0IGNvbnN0IFNjYW5TdGF0dXMgPSB7XG4gIEFDVElWRTogJ0FDVElWRScsXG4gIENPTVBMRVRFOiAnQ09NUExFVEUnLFxuICBGQUlMRUQ6ICdGQUlMRUQnLFxuICBGSU5ESU5HU19VTkFWQUlMQUJMRTogJ0ZJTkRJTkdTX1VOQVZBSUxBQkxFJyxcbiAgSU5fUFJPR1JFU1M6ICdJTl9QUk9HUkVTUycsXG4gIFBFTkRJTkc6ICdQRU5ESU5HJyxcbiAgU0NBTl9FTElHSUJJTElUWV9FWFBJUkVEOiAnU0NBTl9FTElHSUJJTElUWV9FWFBJUkVEJyxcbiAgVU5TVVBQT1JURURfSU1BR0U6ICdVTlNVUFBPUlRFRF9JTUFHRScsXG4gIExJTUlUX0VYQ0VFREVEOiAnTElNSVRfRVhDRUVERUQnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2NhblN0YXR1cyA9ICh0eXBlb2YgU2NhblN0YXR1cylba2V5b2YgdHlwZW9mIFNjYW5TdGF0dXNdO1xuXG5leHBvcnQgY29uc3QgRmluZGluZ1NldmVyaXR5ID0ge1xuICBDUklUSUNBTDogJ0NSSVRJQ0FMJyxcbiAgSElHSDogJ0hJR0gnLFxuICBJTkZPUk1BVElPTkFMOiAnSU5GT1JNQVRJT05BTCcsXG4gIExPVzogJ0xPVycsXG4gIE1FRElVTTogJ01FRElVTScsXG4gIFVOREVGSU5FRDogJ1VOREVGSU5FRCcsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqL1xuZXhwb3J0IHR5cGUgRmluZGluZ1NldmVyaXR5ID0gKHR5cGVvZiBGaW5kaW5nU2V2ZXJpdHkpW2tleW9mIHR5cGVvZiBGaW5kaW5nU2V2ZXJpdHldO1xuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlU2NhblN0YXR1cyB7XG4gIC8qKlxuICAgKiA8cD5UaGUgY3VycmVudCBzdGF0ZSBvZiBhbiBpbWFnZSBzY2FuLjwvcD5cbiAgICovXG4gIHN0YXR1cz86IFNjYW5TdGF0dXM7XG4gIC8qKlxuICAgKiA8cD5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIGltYWdlIHNjYW4gc3RhdHVzLjwvcD5cbiAgICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlU2NhbkZpbmRpbmdzU3VtbWFyeSB7XG4gIC8qKlxuICAgKiA8cD5UaGUgdGltZSBvZiB0aGUgbGFzdCBjb21wbGV0ZWQgaW1hZ2Ugc2Nhbi48L3A+XG4gICAqL1xuICBpbWFnZVNjYW5Db21wbGV0ZWRBdD86IERhdGU7XG4gIC8qKlxuICAgKiA8cD5UaGUgdGltZSB3aGVuIHRoZSB2dWxuZXJhYmlsaXR5IGRhdGEgd2FzIGxhc3Qgc2Nhbm5lZC48L3A+XG4gICAqL1xuICB2dWxuZXJhYmlsaXR5U291cmNlVXBkYXRlZEF0PzogRGF0ZTtcbiAgLyoqXG4gICAqIDxwPlRoZSBpbWFnZSB2dWxuZXJhYmlsaXR5IGNvdW50cywgc29ydGVkIGJ5IHNldmVyaXR5LjwvcD5cbiAgICovXG4gIGZpbmRpbmdTZXZlcml0eUNvdW50cz86IFBhcnRpYWw8UmVjb3JkPEZpbmRpbmdTZXZlcml0eSwgbnVtYmVyPj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VEZXRhaWwge1xuICAvKipcbiAgICogPHA+VGhlIEFtYXpvbiBXZWIgU2VydmljZXMgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlZ2lzdHJ5IHRvIHdoaWNoIHRoaXMgaW1hZ2UgYmVsb25ncy48L3A+XG4gICAqL1xuICByZWdpc3RyeUlkPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+VGhlIG5hbWUgb2YgdGhlIHJlcG9zaXRvcnkgdG8gd2hpY2ggdGhpcyBpbWFnZSBiZWxvbmdzLjwvcD5cbiAgICovXG4gIHJlcG9zaXRvcnlOYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+VGhlIDxjb2RlPnNoYTI1NjwvY29kZT4gZGlnZXN0IG9mIHRoZSBpbWFnZSBtYW5pZmVzdC48L3A+XG4gICAqL1xuICBpbWFnZURpZ2VzdD86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlRoZSBsaXN0IG9mIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW1hZ2UuPC9wPlxuICAgKi9cbiAgaW1hZ2VUYWdzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiA8cD5UaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBpbWFnZSBpbiB0aGUgcmVwb3NpdG9yeS48L3A+XG4gICAqICAgICAgICAgIDxwPklmIHRoZSBpbWFnZSBpcyBhIG1hbmlmZXN0IGxpc3QsIHRoaXMgd2lsbCBiZSB0aGUgbWF4IHNpemUgb2YgYWxsIG1hbmlmZXN0cyBpbiB0aGVcbiAgICogICAgICAgICAgICAgbGlzdC48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5CZWdpbm5pbmcgd2l0aCBEb2NrZXIgdmVyc2lvbiAxLjksIHRoZSBEb2NrZXIgY2xpZW50IGNvbXByZXNzZXMgaW1hZ2UgbGF5ZXJzXG4gICAqICAgICAgICAgICAgICAgICBiZWZvcmUgcHVzaGluZyB0aGVtIHRvIGEgVjIgRG9ja2VyIHJlZ2lzdHJ5LiBUaGUgb3V0cHV0IG9mIHRoZSA8Y29kZT5kb2NrZXJcbiAgICogICAgICAgICAgICAgICAgICAgICBpbWFnZXM8L2NvZGU+IGNvbW1hbmQgc2hvd3MgdGhlIHVuY29tcHJlc3NlZCBpbWFnZSBzaXplLCBzbyBpdCBtYXkgcmV0dXJuIGFcbiAgICogICAgICAgICAgICAgICAgIGxhcmdlciBpbWFnZSBzaXplIHRoYW4gdGhlIGltYWdlIHNpemVzIHJldHVybmVkIGJ5IDxhPkRlc2NyaWJlSW1hZ2VzPC9hPi48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIGltYWdlU2l6ZUluQnl0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiA8cD5UaGUgZGF0ZSBhbmQgdGltZSwgZXhwcmVzc2VkIGluIHN0YW5kYXJkIEphdmFTY3JpcHQgZGF0ZSBmb3JtYXQsIGF0IHdoaWNoIHRoZSBjdXJyZW50XG4gICAqICAgICAgICAgICAgIGltYWdlIHdhcyBwdXNoZWQgdG8gdGhlIHJlcG9zaXRvcnkuIDwvcD5cbiAgICovXG4gIGltYWdlUHVzaGVkQXQ/OiBEYXRlO1xuICAvKipcbiAgICogPHA+VGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHNjYW4uPC9wPlxuICAgKi9cbiAgaW1hZ2VTY2FuU3RhdHVzPzogSW1hZ2VTY2FuU3RhdHVzO1xuICAvKipcbiAgICogPHA+QSBzdW1tYXJ5IG9mIHRoZSBsYXN0IGNvbXBsZXRlZCBpbWFnZSBzY2FuLjwvcD5cbiAgICovXG4gIGltYWdlU2NhbkZpbmRpbmdzU3VtbWFyeT86IEltYWdlU2NhbkZpbmRpbmdzU3VtbWFyeTtcbiAgLyoqXG4gICAqIDxwPlRoZSBtZWRpYSB0eXBlIG9mIHRoZSBpbWFnZSBtYW5pZmVzdC48L3A+XG4gICAqL1xuICBpbWFnZU1hbmlmZXN0TWVkaWFUeXBlPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+VGhlIGFydGlmYWN0IG1lZGlhIHR5cGUgb2YgdGhlIGltYWdlLjwvcD5cbiAgICovXG4gIGFydGlmYWN0TWVkaWFUeXBlPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+VGhlIGRhdGUgYW5kIHRpbWUsIGV4cHJlc3NlZCBpbiBzdGFuZGFyZCBKYXZhU2NyaXB0IGRhdGUgZm9ybWF0LCB3aGVuIEFtYXpvbiBFQ1IgcmVjb3JkZWRcbiAgICogICAgICAgICAgICAgdGhlIGxhc3QgaW1hZ2UgcHVsbC48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5BbWF6b24gRUNSIHJlZnJlc2hlcyB0aGUgbGFzdCBpbWFnZSBwdWxsIHRpbWVzdGFtcCBhdCBsZWFzdCBvbmNlIGV2ZXJ5IDI0IGhvdXJzLiBGb3JcbiAgICogICAgICAgICAgICAgICAgIGV4YW1wbGUsIGlmIHlvdSBwdWxsIGFuIGltYWdlIG9uY2UgYSBkYXkgdGhlbiB0aGUgPGNvZGU+bGFzdFJlY29yZGVkUHVsbFRpbWU8L2NvZGU+XG4gICAqICAgICAgICAgICAgICAgICB0aW1lc3RhbXAgd2lsbCBpbmRpY2F0ZSB0aGUgZXhhY3QgdGltZSB0aGF0IHRoZSBpbWFnZSB3YXMgbGFzdCBwdWxsZWQuIEhvd2V2ZXIsIGlmXG4gICAqICAgICAgICAgICAgICAgICB5b3UgcHVsbCBhbiBpbWFnZSBvbmNlIGFuIGhvdXIsIGJlY2F1c2UgQW1hem9uIEVDUiByZWZyZXNoZXMgdGhlXG4gICAqICAgICAgICAgICAgICAgICAgICAgPGNvZGU+bGFzdFJlY29yZGVkUHVsbFRpbWU8L2NvZGU+IHRpbWVzdGFtcCBhdCBsZWFzdCBvbmNlIGV2ZXJ5IDI0IGhvdXJzLCB0aGVcbiAgICogICAgICAgICAgICAgICAgIHJlc3VsdCBtYXkgbm90IGJlIHRoZSBleGFjdCB0aW1lIHRoYXQgdGhlIGltYWdlIHdhcyBsYXN0IHB1bGxlZC48L3A+XG4gICAqICAgICAgICAgIDwvbm90ZT5cbiAgICovXG4gIGxhc3RSZWNvcmRlZFB1bGxUaW1lPzogRGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXNjcmliZUltYWdlc1Jlc3BvbnNlIHtcbiAgLyoqXG4gICAqIDxwPkEgbGlzdCBvZiA8YT5JbWFnZURldGFpbDwvYT4gb2JqZWN0cyB0aGF0IGNvbnRhaW4gZGF0YSBhYm91dCB0aGVcbiAgICogICAgICAgICAgICAgaW1hZ2UuPC9wPlxuICAgKi9cbiAgaW1hZ2VEZXRhaWxzPzogSW1hZ2VEZXRhaWxbXTtcbiAgLyoqXG4gICAqIDxwPlRoZSA8Y29kZT5uZXh0VG9rZW48L2NvZGU+IHZhbHVlIHRvIGluY2x1ZGUgaW4gYSBmdXR1cmUgPGNvZGU+RGVzY3JpYmVJbWFnZXM8L2NvZGU+XG4gICAqICAgICAgICAgICAgIHJlcXVlc3QuIFdoZW4gdGhlIHJlc3VsdHMgb2YgYSA8Y29kZT5EZXNjcmliZUltYWdlczwvY29kZT4gcmVxdWVzdCBleGNlZWRcbiAgICogICAgICAgICAgICAgICAgIDxjb2RlPm1heFJlc3VsdHM8L2NvZGU+LCB0aGlzIHZhbHVlIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZSBuZXh0IHBhZ2Ugb2ZcbiAgICogICAgICAgICAgICAgcmVzdWx0cy4gVGhpcyB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIHJlc3VsdHMgdG9cbiAgICogICAgICAgICAgICAgcmV0dXJuLjwvcD5cbiAgICovXG4gIG5leHRUb2tlbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXNjcmliZVJlcG9zaXRvcmllc1JlcXVlc3Qge1xuICAvKipcbiAgICogPHA+VGhlIEFtYXpvbiBXZWIgU2VydmljZXMgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlZ2lzdHJ5IHRoYXQgY29udGFpbnMgdGhlIHJlcG9zaXRvcmllcyB0byBiZVxuICAgKiAgICAgICAgICAgICBkZXNjcmliZWQuIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIHJlZ2lzdHJ5LCB0aGUgZGVmYXVsdCByZWdpc3RyeSBpcyBhc3N1bWVkLjwvcD5cbiAgICovXG4gIHJlZ2lzdHJ5SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiA8cD5BIGxpc3Qgb2YgcmVwb3NpdG9yaWVzIHRvIGRlc2NyaWJlLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLCB0aGVuIGFsbFxuICAgKiAgICAgICAgICAgICByZXBvc2l0b3JpZXMgaW4gYSByZWdpc3RyeSBhcmUgZGVzY3JpYmVkLjwvcD5cbiAgICovXG4gIHJlcG9zaXRvcnlOYW1lcz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogPHA+VGhlIDxjb2RlPm5leHRUb2tlbjwvY29kZT4gdmFsdWUgcmV0dXJuZWQgZnJvbSBhIHByZXZpb3VzIHBhZ2luYXRlZFxuICAgKiAgICAgICAgICAgICAgICAgPGNvZGU+RGVzY3JpYmVSZXBvc2l0b3JpZXM8L2NvZGU+IHJlcXVlc3Qgd2hlcmUgPGNvZGU+bWF4UmVzdWx0czwvY29kZT4gd2FzIHVzZWQgYW5kXG4gICAqICAgICAgICAgICAgIHRoZSByZXN1bHRzIGV4Y2VlZGVkIHRoZSB2YWx1ZSBvZiB0aGF0IHBhcmFtZXRlci4gUGFnaW5hdGlvbiBjb250aW51ZXMgZnJvbSB0aGUgZW5kIG9mXG4gICAqICAgICAgICAgICAgIHRoZSBwcmV2aW91cyByZXN1bHRzIHRoYXQgcmV0dXJuZWQgdGhlIDxjb2RlPm5leHRUb2tlbjwvY29kZT4gdmFsdWUuIFRoaXMgdmFsdWUgaXNcbiAgICogICAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgcmVzdWx0cyB0byByZXR1cm4uIFRoaXMgb3B0aW9uIGNhbm5vdCBiZVxuICAgKiAgICAgICAgICAgICB1c2VkIHdoZW4geW91IHNwZWNpZnkgcmVwb3NpdG9yaWVzIHdpdGggPGNvZGU+cmVwb3NpdG9yeU5hbWVzPC9jb2RlPi48L3A+XG4gICAqICAgICAgICAgIDxub3RlPlxuICAgKiAgICAgICAgICAgICA8cD5UaGlzIHRva2VuIHNob3VsZCBiZSB0cmVhdGVkIGFzIGFuIG9wYXF1ZSBpZGVudGlmaWVyIHRoYXQgaXMgb25seSB1c2VkIHRvXG4gICAqICAgICAgICAgICAgICAgICByZXRyaWV2ZSB0aGUgbmV4dCBpdGVtcyBpbiBhIGxpc3QgYW5kIG5vdCBmb3Igb3RoZXIgcHJvZ3JhbW1hdGljIHB1cnBvc2VzLjwvcD5cbiAgICogICAgICAgICAgPC9ub3RlPlxuICAgKi9cbiAgbmV4dFRva2VuPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+VGhlIG1heGltdW0gbnVtYmVyIG9mIHJlcG9zaXRvcnkgcmVzdWx0cyByZXR1cm5lZCBieSA8Y29kZT5EZXNjcmliZVJlcG9zaXRvcmllczwvY29kZT5cbiAgICogICAgICAgICAgICAgaW4gcGFnaW5hdGVkIG91dHB1dC4gV2hlbiB0aGlzIHBhcmFtZXRlciBpcyB1c2VkLCA8Y29kZT5EZXNjcmliZVJlcG9zaXRvcmllczwvY29kZT4gb25seVxuICAgKiAgICAgICAgICAgICByZXR1cm5zIDxjb2RlPm1heFJlc3VsdHM8L2NvZGU+IHJlc3VsdHMgaW4gYSBzaW5nbGUgcGFnZSBhbG9uZyB3aXRoIGFcbiAgICogICAgICAgICAgICAgICAgIDxjb2RlPm5leHRUb2tlbjwvY29kZT4gcmVzcG9uc2UgZWxlbWVudC4gVGhlIHJlbWFpbmluZyByZXN1bHRzIG9mIHRoZSBpbml0aWFsXG4gICAqICAgICAgICAgICAgIHJlcXVlc3QgY2FuIGJlIHNlZW4gYnkgc2VuZGluZyBhbm90aGVyIDxjb2RlPkRlc2NyaWJlUmVwb3NpdG9yaWVzPC9jb2RlPiByZXF1ZXN0IHdpdGhcbiAgICogICAgICAgICAgICAgdGhlIHJldHVybmVkIDxjb2RlPm5leHRUb2tlbjwvY29kZT4gdmFsdWUuIFRoaXMgdmFsdWUgY2FuIGJlIGJldHdlZW4gMVxuICAgKiAgICAgICAgICAgICBhbmQgMTAwMC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHVzZWQsIHRoZW5cbiAgICogICAgICAgICAgICAgICAgIDxjb2RlPkRlc2NyaWJlUmVwb3NpdG9yaWVzPC9jb2RlPiByZXR1cm5zIHVwIHRvIDEwMCByZXN1bHRzIGFuZCBhXG4gICAqICAgICAgICAgICAgICAgICA8Y29kZT5uZXh0VG9rZW48L2NvZGU+IHZhbHVlLCBpZiBhcHBsaWNhYmxlLiBUaGlzIG9wdGlvbiBjYW5ub3QgYmUgdXNlZCB3aGVuIHlvdVxuICAgKiAgICAgICAgICAgICBzcGVjaWZ5IHJlcG9zaXRvcmllcyB3aXRoIDxjb2RlPnJlcG9zaXRvcnlOYW1lczwvY29kZT4uPC9wPlxuICAgKi9cbiAgbWF4UmVzdWx0cz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXNjcmliZVJlcG9zaXRvcmllc0NvbW1hbmRJbnB1dCBleHRlbmRzIERlc2NyaWJlUmVwb3NpdG9yaWVzUmVxdWVzdCB7XG59XG5cbmV4cG9ydCBjb25zdCBJbWFnZVRhZ011dGFiaWxpdHkgPSB7XG4gIElNTVVUQUJMRTogJ0lNTVVUQUJMRScsXG4gIE1VVEFCTEU6ICdNVVRBQkxFJyxcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICovXG5leHBvcnQgdHlwZSBJbWFnZVRhZ011dGFiaWxpdHkgPSAodHlwZW9mIEltYWdlVGFnTXV0YWJpbGl0eSlba2V5b2YgdHlwZW9mIEltYWdlVGFnTXV0YWJpbGl0eV07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VTY2FubmluZ0NvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogPHA+VGhlIHNldHRpbmcgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgaW1hZ2VzIGFyZSBzY2FubmVkIGFmdGVyIGJlaW5nIHB1c2hlZCB0byBhXG4gICAqICAgICAgICAgICAgIHJlcG9zaXRvcnkuIElmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwgaW1hZ2VzIHdpbGwgYmUgc2Nhbm5lZCBhZnRlciBiZWluZyBwdXNoZWQuIElmXG4gICAqICAgICAgICAgICAgIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIGl0IHdpbGwgZGVmYXVsdCB0byA8Y29kZT5mYWxzZTwvY29kZT4gYW5kIGltYWdlcyB3aWxsXG4gICAqICAgICAgICAgICAgIG5vdCBiZSBzY2FubmVkIHVubGVzcyBhIHNjYW4gaXMgbWFudWFsbHkgc3RhcnRlZCB3aXRoIHRoZSA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TdGFydEltYWdlU2Nhbi5odG1sXCI+QVBJX1N0YXJ0SW1hZ2VTY2FuPC9hPiBBUEkuPC9wPlxuICAgKi9cbiAgc2Nhbk9uUHVzaD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBFbmNyeXB0aW9uVHlwZSA9IHtcbiAgQUVTMjU2OiAnQUVTMjU2JyxcbiAgS01TOiAnS01TJyxcbiAgS01TX0RTU0U6ICdLTVNfRFNTRScsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqL1xuZXhwb3J0IHR5cGUgRW5jcnlwdGlvblR5cGUgPSAodHlwZW9mIEVuY3J5cHRpb25UeXBlKVtrZXlvZiB0eXBlb2YgRW5jcnlwdGlvblR5cGVdO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVuY3J5cHRpb25Db25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIDxwPlRoZSBlbmNyeXB0aW9uIHR5cGUgdG8gdXNlLjwvcD5cbiAgICogICAgICAgICAgPHA+SWYgeW91IHVzZSB0aGUgPGNvZGU+S01TPC9jb2RlPiBlbmNyeXB0aW9uIHR5cGUsIHRoZSBjb250ZW50cyBvZiB0aGUgcmVwb3NpdG9yeSB3aWxsXG4gICAqICAgICAgICAgICAgIGJlIGVuY3J5cHRlZCB1c2luZyBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIHdpdGggS2V5IE1hbmFnZW1lbnQgU2VydmljZSBrZXkgc3RvcmVkIGluIEtNUy4gV2hlbiB5b3VcbiAgICogICAgICAgICAgICAgdXNlIEtNUyB0byBlbmNyeXB0IHlvdXIgZGF0YSwgeW91IGNhbiBlaXRoZXIgdXNlIHRoZSBkZWZhdWx0IEFtYXpvbiBXZWIgU2VydmljZXMgbWFuYWdlZCBLTVMga2V5XG4gICAqICAgICAgICAgICAgIGZvciBBbWF6b24gRUNSLCBvciBzcGVjaWZ5IHlvdXIgb3duIEtNUyBrZXksIHdoaWNoIHlvdSBhbHJlYWR5IGNyZWF0ZWQuPC9wPlxuICAgKiAgICAgICAgICA8cD5JZiB5b3UgdXNlIHRoZSA8Y29kZT5LTVNfRFNTRTwvY29kZT4gZW5jcnlwdGlvbiB0eXBlLCB0aGUgY29udGVudHMgb2YgdGhlIHJlcG9zaXRvcnlcbiAgICogICAgICAgICAgICAgd2lsbCBiZSBlbmNyeXB0ZWQgd2l0aCB0d28gbGF5ZXJzIG9mIGVuY3J5cHRpb24gdXNpbmcgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiB3aXRoIHRoZVxuICAgKiAgICAgICAgICAgICBLTVMgTWFuYWdlbWVudCBTZXJ2aWNlIGtleSBzdG9yZWQgaW4gS01TLiBTaW1pbGFyIHRvIHRoZSA8Y29kZT5LTVM8L2NvZGU+IGVuY3J5cHRpb24gdHlwZSwgeW91XG4gICAqICAgICAgICAgICAgIGNhbiBlaXRoZXIgdXNlIHRoZSBkZWZhdWx0IEFtYXpvbiBXZWIgU2VydmljZXMgbWFuYWdlZCBLTVMga2V5IGZvciBBbWF6b24gRUNSLCBvciBzcGVjaWZ5IHlvdXIgb3duIEtNU1xuICAgKiAgICAgICAgICAgICBrZXksIHdoaWNoIHlvdSd2ZSBhbHJlYWR5IGNyZWF0ZWQuIDwvcD5cbiAgICogICAgICAgICAgPHA+SWYgeW91IHVzZSB0aGUgPGNvZGU+QUVTMjU2PC9jb2RlPiBlbmNyeXB0aW9uIHR5cGUsIEFtYXpvbiBFQ1IgdXNlcyBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uXG4gICAqICAgICAgICAgICAgIHdpdGggQW1hem9uIFMzLW1hbmFnZWQgZW5jcnlwdGlvbiBrZXlzIHdoaWNoIGVuY3J5cHRzIHRoZSBpbWFnZXMgaW4gdGhlIHJlcG9zaXRvcnkgdXNpbmcgYW5cbiAgICogICAgICAgICAgICAgQUVTMjU2IGVuY3J5cHRpb24gYWxnb3JpdGhtLjwvcD5cbiAgICogICAgICAgICAgPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUi9sYXRlc3QvdXNlcmd1aWRlL2VuY3J5cHRpb24tYXQtcmVzdC5odG1sXCI+QW1hem9uIEVDUiBlbmNyeXB0aW9uIGF0XG4gICAqICAgICAgICAgICAgIHJlc3Q8L2E+IGluIHRoZSA8aT5BbWF6b24gRWxhc3RpYyBDb250YWluZXIgUmVnaXN0cnkgVXNlciBHdWlkZTwvaT4uPC9wPlxuICAgKi9cbiAgZW5jcnlwdGlvblR5cGU6IEVuY3J5cHRpb25UeXBlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiA8cD5JZiB5b3UgdXNlIHRoZSA8Y29kZT5LTVM8L2NvZGU+IGVuY3J5cHRpb24gdHlwZSwgc3BlY2lmeSB0aGUgS01TIGtleSB0byB1c2UgZm9yXG4gICAqICAgICAgICAgICAgIGVuY3J5cHRpb24uIFRoZSBhbGlhcywga2V5IElELCBvciBmdWxsIEFSTiBvZiB0aGUgS01TIGtleSBjYW4gYmUgc3BlY2lmaWVkLiBUaGUga2V5XG4gICAqICAgICAgICAgICAgIG11c3QgZXhpc3QgaW4gdGhlIHNhbWUgUmVnaW9uIGFzIHRoZSByZXBvc2l0b3J5LiBJZiBubyBrZXkgaXMgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdFxuICAgKiAgICAgICAgICAgICBBbWF6b24gV2ViIFNlcnZpY2VzIG1hbmFnZWQgS01TIGtleSBmb3IgQW1hem9uIEVDUiB3aWxsIGJlIHVzZWQuPC9wPlxuICAgKi9cbiAga21zS2V5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9zaXRvcnkge1xuICAvKipcbiAgICogPHA+VGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVwb3NpdG9yeS4gVGhlIEFSTiBjb250YWlucyB0aGUgPGNvZGU+YXJuOmF3czplY3I8L2NvZGU+IG5hbWVzcGFjZSwgZm9sbG93ZWQgYnkgdGhlIHJlZ2lvbiBvZiB0aGVcbiAgICogICAgIHJlcG9zaXRvcnksIEFtYXpvbiBXZWIgU2VydmljZXMgYWNjb3VudCBJRCBvZiB0aGUgcmVwb3NpdG9yeSBvd25lciwgcmVwb3NpdG9yeSBuYW1lc3BhY2UsIGFuZCByZXBvc2l0b3J5IG5hbWUuXG4gICAqICAgICBGb3IgZXhhbXBsZSwgPGNvZGU+YXJuOmF3czplY3I6cmVnaW9uOjAxMjM0NTY3ODkxMDpyZXBvc2l0b3J5LW5hbWVzcGFjZS9yZXBvc2l0b3J5LW5hbWU8L2NvZGU+LjwvcD5cbiAgICovXG4gIHJlcG9zaXRvcnlBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIDxwPlRoZSBBbWF6b24gV2ViIFNlcnZpY2VzIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWdpc3RyeSB0aGF0IGNvbnRhaW5zIHRoZSByZXBvc2l0b3J5LjwvcD5cbiAgICovXG4gIHJlZ2lzdHJ5SWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIDxwPlRoZSBuYW1lIG9mIHRoZSByZXBvc2l0b3J5LjwvcD5cbiAgICovXG4gIHJlcG9zaXRvcnlOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiA8cD5UaGUgVVJJIGZvciB0aGUgcmVwb3NpdG9yeS4gWW91IGNhbiB1c2UgdGhpcyBVUkkgZm9yIGNvbnRhaW5lciBpbWFnZSA8Y29kZT5wdXNoPC9jb2RlPlxuICAgKiAgICAgICAgICAgICBhbmQgPGNvZGU+cHVsbDwvY29kZT4gb3BlcmF0aW9ucy48L3A+XG4gICAqL1xuICByZXBvc2l0b3J5VXJpPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiA8cD5UaGUgZGF0ZSBhbmQgdGltZSwgaW4gSmF2YVNjcmlwdCBkYXRlIGZvcm1hdCwgd2hlbiB0aGUgcmVwb3NpdG9yeSB3YXMgY3JlYXRlZC48L3A+XG4gICAqL1xuICBjcmVhdGVkQXQ/OiBEYXRlO1xuXG4gIC8qKlxuICAgKiA8cD5UaGUgdGFnIG11dGFiaWxpdHkgc2V0dGluZyBmb3IgdGhlIHJlcG9zaXRvcnkuPC9wPlxuICAgKi9cbiAgaW1hZ2VUYWdNdXRhYmlsaXR5PzogSW1hZ2VUYWdNdXRhYmlsaXR5O1xuXG4gIC8qKlxuICAgKiA8cD5UaGUgaW1hZ2Ugc2Nhbm5pbmcgY29uZmlndXJhdGlvbiBmb3IgYSByZXBvc2l0b3J5LjwvcD5cbiAgICovXG4gIGltYWdlU2Nhbm5pbmdDb25maWd1cmF0aW9uPzogSW1hZ2VTY2FubmluZ0NvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIDxwPlRoZSBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSByZXBvc2l0b3J5LiBUaGlzIGRldGVybWluZXMgaG93IHRoZSBjb250ZW50cyBvZlxuICAgKiAgICAgICAgICAgICB5b3VyIHJlcG9zaXRvcnkgYXJlIGVuY3J5cHRlZCBhdCByZXN0LjwvcD5cbiAgICovXG4gIGVuY3J5cHRpb25Db25maWd1cmF0aW9uPzogRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVzY3JpYmVSZXBvc2l0b3JpZXNSZXNwb25zZSB7XG4gIC8qKlxuICAgKiA8cD5BIGxpc3Qgb2YgcmVwb3NpdG9yeSBvYmplY3RzIGNvcnJlc3BvbmRpbmcgdG8gdmFsaWQgcmVwb3NpdG9yaWVzLjwvcD5cbiAgICovXG4gIHJlcG9zaXRvcmllcz86IFJlcG9zaXRvcnlbXTtcbiAgLyoqXG4gICAqIDxwPlRoZSA8Y29kZT5uZXh0VG9rZW48L2NvZGU+IHZhbHVlIHRvIGluY2x1ZGUgaW4gYSBmdXR1cmVcbiAgICogICAgICAgICAgICAgICAgIDxjb2RlPkRlc2NyaWJlUmVwb3NpdG9yaWVzPC9jb2RlPiByZXF1ZXN0LiBXaGVuIHRoZSByZXN1bHRzIG9mIGFcbiAgICogICAgICAgICAgICAgICAgIDxjb2RlPkRlc2NyaWJlUmVwb3NpdG9yaWVzPC9jb2RlPiByZXF1ZXN0IGV4Y2VlZCA8Y29kZT5tYXhSZXN1bHRzPC9jb2RlPiwgdGhpcyB2YWx1ZVxuICAgKiAgICAgICAgICAgICBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgbmV4dCBwYWdlIG9mIHJlc3VsdHMuIFRoaXMgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4gd2hlblxuICAgKiAgICAgICAgICAgICB0aGVyZSBhcmUgbm8gbW9yZSByZXN1bHRzIHRvIHJldHVybi48L3A+XG4gICAqL1xuICBuZXh0VG9rZW4/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVzY3JpYmVSZXBvc2l0b3JpZXNDb21tYW5kT3V0cHV0XG4gIGV4dGVuZHMgRGVzY3JpYmVSZXBvc2l0b3JpZXNSZXNwb25zZSxcbiAgTWV0YWRhdGFCZWFyZXIge1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldEF1dGhvcml6YXRpb25Ub2tlblJlcXVlc3Qge1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICpcbiAgICogPHA+QSBsaXN0IG9mIEFtYXpvbiBXZWIgU2VydmljZXMgYWNjb3VudCBJRHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWdpc3RyaWVzIGZvciB3aGljaCB0byBnZXRcbiAgICogICAgICAgICAgICAgQXV0aG9yaXphdGlvbkRhdGEgb2JqZWN0cy4gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgcmVnaXN0cnksIHRoZSBkZWZhdWx0IHJlZ2lzdHJ5IGlzIGFzc3VtZWQuPC9wPlxuICAgKi9cbiAgcmVnaXN0cnlJZHM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRBdXRob3JpemF0aW9uVG9rZW5Db21tYW5kSW5wdXQgZXh0ZW5kcyBHZXRBdXRob3JpemF0aW9uVG9rZW5SZXF1ZXN0IHtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdXRob3JpemF0aW9uRGF0YSB7XG4gIC8qKlxuICAgKiA8cD5BIGJhc2U2NC1lbmNvZGVkIHN0cmluZyB0aGF0IGNvbnRhaW5zIGF1dGhvcml6YXRpb24gZGF0YSBmb3IgdGhlIHNwZWNpZmllZCBBbWF6b24gRUNSXG4gICAqICAgICAgICAgICAgIHJlZ2lzdHJ5LiBXaGVuIHRoZSBzdHJpbmcgaXMgZGVjb2RlZCwgaXQgaXMgcHJlc2VudGVkIGluIHRoZSBmb3JtYXRcbiAgICogICAgICAgICAgICAgICAgIDxjb2RlPnVzZXI6cGFzc3dvcmQ8L2NvZGU+IGZvciBwcml2YXRlIHJlZ2lzdHJ5IGF1dGhlbnRpY2F0aW9uIHVzaW5nIDxjb2RlPmRvY2tlclxuICAgKiAgICAgICAgICAgICAgICAgbG9naW48L2NvZGU+LjwvcD5cbiAgICovXG4gIGF1dGhvcml6YXRpb25Ub2tlbj86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlRoZSBVbml4IHRpbWUgaW4gc2Vjb25kcyBhbmQgbWlsbGlzZWNvbmRzIHdoZW4gdGhlIGF1dGhvcml6YXRpb24gdG9rZW4gZXhwaXJlcy5cbiAgICogICAgICAgICAgICAgQXV0aG9yaXphdGlvbiB0b2tlbnMgYXJlIHZhbGlkIGZvciAxMiBob3Vycy48L3A+XG4gICAqL1xuICBleHBpcmVzQXQ/OiBEYXRlO1xuICAvKipcbiAgICogPHA+VGhlIHJlZ2lzdHJ5IFVSTCB0byB1c2UgZm9yIHRoaXMgYXV0aG9yaXphdGlvbiB0b2tlbiBpbiBhIDxjb2RlPmRvY2tlciBsb2dpbjwvY29kZT5cbiAgICogICAgICAgICAgICAgY29tbWFuZC4gVGhlIEFtYXpvbiBFQ1IgcmVnaXN0cnkgVVJMIGZvcm1hdCBpc1xuICAgKiAgICAgICAgIDxjb2RlPmh0dHBzOi8vYXdzX2FjY291bnRfaWQuZGtyLmVjci5yZWdpb24uYW1hem9uYXdzLmNvbTwvY29kZT4uIEZvciBleGFtcGxlLFxuICAgKiAgICAgICAgIDxjb2RlPmh0dHBzOi8vMDEyMzQ1Njc4OTEwLmRrci5lY3IudXMtZWFzdC0xLmFtYXpvbmF3cy5jb208L2NvZGU+Li4gPC9wPlxuICAgKi9cbiAgcHJveHlFbmRwb2ludD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRBdXRob3JpemF0aW9uVG9rZW5SZXNwb25zZSB7XG4gIC8qKlxuICAgKiA8cD5BIGxpc3Qgb2YgYXV0aG9yaXphdGlvbiB0b2tlbiBkYXRhIG9iamVjdHMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZVxuICAgKiAgICAgICAgICAgICAgICAgPGNvZGU+cmVnaXN0cnlJZHM8L2NvZGU+IHZhbHVlcyBpbiB0aGUgcmVxdWVzdC48L3A+XG4gICAqL1xuICBhdXRob3JpemF0aW9uRGF0YT86IEF1dGhvcml6YXRpb25EYXRhW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QXV0aG9yaXphdGlvblRva2VuQ29tbWFuZE91dHB1dFxuICBleHRlbmRzIEdldEF1dGhvcml6YXRpb25Ub2tlblJlc3BvbnNlLFxuICBNZXRhZGF0YUJlYXJlciB7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0U2VjcmV0VmFsdWVSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIDxwPlRoZSBBUk4gb3IgbmFtZSBvZiB0aGUgc2VjcmV0IHRvIHJldHJpZXZlLiBUbyByZXRyaWV2ZSBhIHNlY3JldCBmcm9tIGFub3RoZXIgYWNjb3VudCwgeW91IG11c3QgdXNlIGFuIEFSTi48L3A+XG4gICAqICAgICAgICAgIDxwPkZvciBhbiBBUk4sIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBzcGVjaWZ5IGEgY29tcGxldGUgQVJOIHJhdGhlclxuICAgKiAgICAgICB0aGFuIGEgcGFydGlhbCBBUk4uIFNlZSA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlY3JldHNtYW5hZ2VyL2xhdGVzdC91c2VyZ3VpZGUvdHJvdWJsZXNob290Lmh0bWwjQVJOX3NlY3JldG5hbWVoeXBoZW5cIj5GaW5kaW5nIGEgc2VjcmV0IGZyb20gYSBwYXJ0aWFsIEFSTjwvYT4uPC9wPlxuICAgKi9cbiAgU2VjcmV0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIDxwPlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdmVyc2lvbiBvZiB0aGUgc2VjcmV0IHRvIHJldHJpZXZlLiBJZlxuICAgKiAgICAgICB5b3UgaW5jbHVkZSBib3RoIHRoaXMgcGFyYW1ldGVyIGFuZCA8Y29kZT5WZXJzaW9uU3RhZ2U8L2NvZGU+LCB0aGUgdHdvIHBhcmFtZXRlcnMgbXVzdCByZWZlclxuICAgKiAgICAgICB0byB0aGUgc2FtZSBzZWNyZXQgdmVyc2lvbi4gSWYgeW91IGRvbid0IHNwZWNpZnkgZWl0aGVyIGEgPGNvZGU+VmVyc2lvblN0YWdlPC9jb2RlPiBvclxuICAgKiAgICAgICAgIDxjb2RlPlZlcnNpb25JZDwvY29kZT4sIHRoZW4gU2VjcmV0cyBNYW5hZ2VyIHJldHVybnMgdGhlIDxjb2RlPkFXU0NVUlJFTlQ8L2NvZGU+IHZlcnNpb24uPC9wPlxuICAgKiAgICAgICAgICA8cD5UaGlzIHZhbHVlIGlzIHR5cGljYWxseSBhIDxhIGhyZWY9XCJodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9Vbml2ZXJzYWxseV91bmlxdWVfaWRlbnRpZmllclwiPlVVSUQtdHlwZTwvYT4gdmFsdWUgd2l0aFxuICAgKiAgICAgICAzMiBoZXhhZGVjaW1hbCBkaWdpdHMuPC9wPlxuICAgKi9cbiAgVmVyc2lvbklkPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+VGhlIHN0YWdpbmcgbGFiZWwgb2YgdGhlIHZlcnNpb24gb2YgdGhlIHNlY3JldCB0byByZXRyaWV2ZS4gPC9wPlxuICAgKiAgICAgICAgICA8cD5TZWNyZXRzIE1hbmFnZXIgdXNlcyBzdGFnaW5nIGxhYmVscyB0byBrZWVwIHRyYWNrIG9mIGRpZmZlcmVudCB2ZXJzaW9ucyBkdXJpbmcgdGhlIHJvdGF0aW9uIHByb2Nlc3MuXG4gICAqICAgICAgIElmIHlvdSBpbmNsdWRlIGJvdGggdGhpcyBwYXJhbWV0ZXIgYW5kIDxjb2RlPlZlcnNpb25JZDwvY29kZT4sIHRoZSB0d28gcGFyYW1ldGVycyBtdXN0IHJlZmVyXG4gICAqICAgICAgIHRvIHRoZSBzYW1lIHNlY3JldCB2ZXJzaW9uLiBJZiB5b3UgZG9uJ3Qgc3BlY2lmeSBlaXRoZXIgYSA8Y29kZT5WZXJzaW9uU3RhZ2U8L2NvZGU+IG9yXG4gICAqICAgICAgIDxjb2RlPlZlcnNpb25JZDwvY29kZT4sIFNlY3JldHMgTWFuYWdlciByZXR1cm5zIHRoZSA8Y29kZT5BV1NDVVJSRU5UPC9jb2RlPiB2ZXJzaW9uLjwvcD5cbiAgICovXG4gIFZlcnNpb25TdGFnZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRTZWNyZXRWYWx1ZUNvbW1hbmRJbnB1dCBleHRlbmRzIEdldFNlY3JldFZhbHVlUmVxdWVzdCB7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0U2VjcmV0VmFsdWVSZXNwb25zZSB7XG4gIC8qKlxuICAgKiA8cD5UaGUgQVJOIG9mIHRoZSBzZWNyZXQuPC9wPlxuICAgKi9cbiAgQVJOPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+VGhlIGZyaWVuZGx5IG5hbWUgb2YgdGhlIHNlY3JldC48L3A+XG4gICAqL1xuICBOYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+VGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMgdmVyc2lvbiBvZiB0aGUgc2VjcmV0LjwvcD5cbiAgICovXG4gIFZlcnNpb25JZD86IHN0cmluZztcbiAgLyoqXG4gICAqIDxwPlRoZSBkZWNyeXB0ZWQgc2VjcmV0IHZhbHVlLCBpZiB0aGUgc2VjcmV0IHZhbHVlIHdhcyBvcmlnaW5hbGx5IHByb3ZpZGVkIGFzXG4gICAqICAgICAgIGJpbmFyeSBkYXRhIGluIHRoZSBmb3JtIG9mIGEgYnl0ZSBhcnJheS4gV2hlbiB5b3UgcmV0cmlldmUgYSA8Y29kZT5TZWNyZXRCaW5hcnk8L2NvZGU+IHVzaW5nIHRoZSBIVFRQIEFQSSwgdGhlIFB5dGhvbiBTREssIG9yIHRoZSBBbWF6b24gV2ViIFNlcnZpY2VzIENMSSwgdGhlIHZhbHVlIGlzIEJhc2U2NC1lbmNvZGVkLiBPdGhlcndpc2UsIGl0IGlzIG5vdCBlbmNvZGVkLjwvcD5cbiAgICogICAgICAgICAgPHA+SWYgdGhlIHNlY3JldCB3YXMgY3JlYXRlZCBieSB1c2luZyB0aGUgU2VjcmV0cyBNYW5hZ2VyIGNvbnNvbGUsIG9yIGlmIHRoZSBzZWNyZXQgdmFsdWUgd2FzXG4gICAqICAgICAgIG9yaWdpbmFsbHkgcHJvdmlkZWQgYXMgYSBzdHJpbmcsIHRoZW4gdGhpcyBmaWVsZCBpcyBvbWl0dGVkLiBUaGUgc2VjcmV0IHZhbHVlIGFwcGVhcnMgaW5cbiAgICogICAgICAgPGNvZGU+U2VjcmV0U3RyaW5nPC9jb2RlPiBpbnN0ZWFkLjwvcD5cbiAgICogICAgICAgICAgPHA+U2Vuc2l0aXZlOiBUaGlzIGZpZWxkIGNvbnRhaW5zIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiwgc28gdGhlIHNlcnZpY2UgZG9lcyBub3QgaW5jbHVkZSBpdCBpbiBDbG91ZFRyYWlsIGxvZyBlbnRyaWVzLiBJZiB5b3UgY3JlYXRlIHlvdXIgb3duIGxvZyBlbnRyaWVzLCB5b3UgbXVzdCBhbHNvIGF2b2lkIGxvZ2dpbmcgdGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmllbGQuPC9wPlxuICAgKi9cbiAgU2VjcmV0QmluYXJ5PzogVWludDhBcnJheTtcbiAgLyoqXG4gICAqIDxwPlRoZSBkZWNyeXB0ZWQgc2VjcmV0IHZhbHVlLCBpZiB0aGUgc2VjcmV0IHZhbHVlIHdhcyBvcmlnaW5hbGx5IHByb3ZpZGVkIGFzIGEgc3RyaW5nIG9yXG4gICAqICAgICAgIHRocm91Z2ggdGhlIFNlY3JldHMgTWFuYWdlciBjb25zb2xlLjwvcD5cbiAgICogICAgICAgICAgPHA+SWYgdGhpcyBzZWNyZXQgd2FzIGNyZWF0ZWQgYnkgdXNpbmcgdGhlIGNvbnNvbGUsIHRoZW4gU2VjcmV0cyBNYW5hZ2VyIHN0b3JlcyB0aGUgaW5mb3JtYXRpb24gYXMgYVxuICAgKiAgICAgICBKU09OIHN0cnVjdHVyZSBvZiBrZXkvdmFsdWUgcGFpcnMuIDwvcD5cbiAgICogICAgICAgICAgPHA+U2Vuc2l0aXZlOiBUaGlzIGZpZWxkIGNvbnRhaW5zIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiwgc28gdGhlIHNlcnZpY2UgZG9lcyBub3QgaW5jbHVkZSBpdCBpbiBDbG91ZFRyYWlsIGxvZyBlbnRyaWVzLiBJZiB5b3UgY3JlYXRlIHlvdXIgb3duIGxvZyBlbnRyaWVzLCB5b3UgbXVzdCBhbHNvIGF2b2lkIGxvZ2dpbmcgdGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmllbGQuPC9wPlxuICAgKi9cbiAgU2VjcmV0U3RyaW5nPzogc3RyaW5nO1xuICAvKipcbiAgICogPHA+QSBsaXN0IG9mIGFsbCBvZiB0aGUgc3RhZ2luZyBsYWJlbHMgY3VycmVudGx5IGF0dGFjaGVkIHRvIHRoaXMgdmVyc2lvbiBvZiB0aGVcbiAgICogICAgICAgc2VjcmV0LjwvcD5cbiAgICovXG4gIFZlcnNpb25TdGFnZXM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIDxwPlRoZSBkYXRlIGFuZCB0aW1lIHRoYXQgdGhpcyB2ZXJzaW9uIG9mIHRoZSBzZWNyZXQgd2FzIGNyZWF0ZWQuIElmIHlvdSBkb24ndCBzcGVjaWZ5XG4gICAqICAgICAgIHdoaWNoIHZlcnNpb24gaW4gPGNvZGU+VmVyc2lvbklkPC9jb2RlPiBvciA8Y29kZT5WZXJzaW9uU3RhZ2U8L2NvZGU+LCB0aGVuIFNlY3JldHMgTWFuYWdlciB1c2VzIHRoZVxuICAgKiAgICAgICA8Y29kZT5BV1NDVVJSRU5UPC9jb2RlPiB2ZXJzaW9uLjwvcD5cbiAgICovXG4gIENyZWF0ZWREYXRlPzogRGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRTZWNyZXRWYWx1ZUNvbW1hbmRPdXRwdXQgZXh0ZW5kcyBHZXRTZWNyZXRWYWx1ZVJlc3BvbnNlLCBNZXRhZGF0YUJlYXJlciB7XG59XG4iXX0=
package/lib/aws.d.ts DELETED
@@ -1,71 +0,0 @@
1
- import type { AssumeRoleCommandInput } from '@aws-sdk/client-sts';
2
- import type { CompleteMultipartUploadCommandOutput, DescribeImagesCommandInput, DescribeImagesCommandOutput, DescribeRepositoriesCommandInput, DescribeRepositoriesCommandOutput, GetAuthorizationTokenCommandInput, GetAuthorizationTokenCommandOutput, GetBucketEncryptionCommandInput, GetBucketEncryptionCommandOutput, GetBucketLocationCommandInput, GetBucketLocationCommandOutput, GetSecretValueCommandInput, GetSecretValueCommandOutput, ListObjectsV2CommandInput, ListObjectsV2CommandOutput, PutObjectCommandInput } from './aws-types';
3
- export type AssumeRoleAdditionalOptions = Partial<Omit<AssumeRoleCommandInput, 'ExternalId' | 'RoleArn'>>;
4
- export interface IS3Client {
5
- getBucketEncryption(input: GetBucketEncryptionCommandInput): Promise<GetBucketEncryptionCommandOutput>;
6
- getBucketLocation(input: GetBucketLocationCommandInput): Promise<GetBucketLocationCommandOutput>;
7
- listObjectsV2(input: ListObjectsV2CommandInput): Promise<ListObjectsV2CommandOutput>;
8
- upload(input: PutObjectCommandInput): Promise<CompleteMultipartUploadCommandOutput>;
9
- }
10
- export interface IECRClient {
11
- describeImages(input: DescribeImagesCommandInput): Promise<DescribeImagesCommandOutput>;
12
- describeRepositories(input: DescribeRepositoriesCommandInput): Promise<DescribeRepositoriesCommandOutput>;
13
- getAuthorizationToken(input?: GetAuthorizationTokenCommandInput): Promise<GetAuthorizationTokenCommandOutput>;
14
- }
15
- export interface ISecretsManagerClient {
16
- getSecretValue(input: GetSecretValueCommandInput): Promise<GetSecretValueCommandOutput>;
17
- }
18
- /**
19
- * AWS SDK operations required by Asset Publishing
20
- */
21
- export interface IAws {
22
- discoverPartition(): Promise<string>;
23
- discoverDefaultRegion(): Promise<string>;
24
- discoverCurrentAccount(): Promise<Account>;
25
- discoverTargetAccount(options: ClientOptions): Promise<Account>;
26
- s3Client(options: ClientOptions): Promise<IS3Client>;
27
- ecrClient(options: ClientOptions): Promise<IECRClient>;
28
- secretsManagerClient(options: ClientOptions): Promise<ISecretsManagerClient>;
29
- }
30
- export interface ClientOptions {
31
- region?: string;
32
- assumeRoleArn?: string;
33
- assumeRoleExternalId?: string;
34
- assumeRoleAdditionalOptions?: AssumeRoleAdditionalOptions;
35
- quiet?: boolean;
36
- }
37
- /**
38
- * An AWS account
39
- *
40
- * An AWS account always exists in only one partition. Usually we don't care about
41
- * the partition, but when we need to form ARNs we do.
42
- */
43
- export interface Account {
44
- /**
45
- * The account number
46
- */
47
- readonly accountId: string;
48
- /**
49
- * The partition ('aws' or 'aws-cn' or otherwise)
50
- */
51
- readonly partition: string;
52
- }
53
- /**
54
- * AWS client using the AWS SDK for JS with no special configuration
55
- */
56
- export declare class DefaultAwsClient implements IAws {
57
- private readonly profile?;
58
- private account?;
59
- private config;
60
- private readonly mainCredentials;
61
- constructor(profile?: string | undefined);
62
- s3Client(options: ClientOptions): Promise<IS3Client>;
63
- ecrClient(options: ClientOptions): Promise<IECRClient>;
64
- secretsManagerClient(options: ClientOptions): Promise<ISecretsManagerClient>;
65
- discoverPartition(): Promise<string>;
66
- discoverDefaultRegion(): Promise<string>;
67
- discoverCurrentAccount(): Promise<Account>;
68
- discoverTargetAccount(options: ClientOptions): Promise<Account>;
69
- private getAccount;
70
- private awsOptions;
71
- }