@gammarers/aws-cloudfront-access-log-relocater 0.0.2 → 0.1.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.
- package/.jsii +151 -4
- package/API.md +126 -1
- package/lib/index.d.ts +14 -1
- package/lib/index.js +48 -3
- package/lib/resources/relocate-state-machine.d.ts +18 -0
- package/lib/resources/relocate-state-machine.js +140 -0
- package/package.json +1 -1
package/.jsii
CHANGED
|
@@ -3690,6 +3690,100 @@
|
|
|
3690
3690
|
}
|
|
3691
3691
|
},
|
|
3692
3692
|
"types": {
|
|
3693
|
+
"@gammarers/aws-cloudfront-access-log-relocater.AccessLogDestination": {
|
|
3694
|
+
"assembly": "@gammarers/aws-cloudfront-access-log-relocater",
|
|
3695
|
+
"datatype": true,
|
|
3696
|
+
"docs": {
|
|
3697
|
+
"stability": "stable"
|
|
3698
|
+
},
|
|
3699
|
+
"fqn": "@gammarers/aws-cloudfront-access-log-relocater.AccessLogDestination",
|
|
3700
|
+
"kind": "interface",
|
|
3701
|
+
"locationInModule": {
|
|
3702
|
+
"filename": "src/index.ts",
|
|
3703
|
+
"line": 19
|
|
3704
|
+
},
|
|
3705
|
+
"name": "AccessLogDestination",
|
|
3706
|
+
"properties": [
|
|
3707
|
+
{
|
|
3708
|
+
"abstract": true,
|
|
3709
|
+
"docs": {
|
|
3710
|
+
"stability": "stable"
|
|
3711
|
+
},
|
|
3712
|
+
"immutable": true,
|
|
3713
|
+
"locationInModule": {
|
|
3714
|
+
"filename": "src/index.ts",
|
|
3715
|
+
"line": 20
|
|
3716
|
+
},
|
|
3717
|
+
"name": "bucket",
|
|
3718
|
+
"type": {
|
|
3719
|
+
"fqn": "aws-cdk-lib.aws_s3.IBucket"
|
|
3720
|
+
}
|
|
3721
|
+
},
|
|
3722
|
+
{
|
|
3723
|
+
"abstract": true,
|
|
3724
|
+
"docs": {
|
|
3725
|
+
"stability": "stable"
|
|
3726
|
+
},
|
|
3727
|
+
"immutable": true,
|
|
3728
|
+
"locationInModule": {
|
|
3729
|
+
"filename": "src/index.ts",
|
|
3730
|
+
"line": 21
|
|
3731
|
+
},
|
|
3732
|
+
"name": "objectPrefix",
|
|
3733
|
+
"type": {
|
|
3734
|
+
"primitive": "string"
|
|
3735
|
+
}
|
|
3736
|
+
}
|
|
3737
|
+
],
|
|
3738
|
+
"symbolId": "src/index:AccessLogDestination"
|
|
3739
|
+
},
|
|
3740
|
+
"@gammarers/aws-cloudfront-access-log-relocater.AccessLogSource": {
|
|
3741
|
+
"assembly": "@gammarers/aws-cloudfront-access-log-relocater",
|
|
3742
|
+
"datatype": true,
|
|
3743
|
+
"docs": {
|
|
3744
|
+
"stability": "stable"
|
|
3745
|
+
},
|
|
3746
|
+
"fqn": "@gammarers/aws-cloudfront-access-log-relocater.AccessLogSource",
|
|
3747
|
+
"kind": "interface",
|
|
3748
|
+
"locationInModule": {
|
|
3749
|
+
"filename": "src/index.ts",
|
|
3750
|
+
"line": 7
|
|
3751
|
+
},
|
|
3752
|
+
"name": "AccessLogSource",
|
|
3753
|
+
"properties": [
|
|
3754
|
+
{
|
|
3755
|
+
"abstract": true,
|
|
3756
|
+
"docs": {
|
|
3757
|
+
"stability": "stable"
|
|
3758
|
+
},
|
|
3759
|
+
"immutable": true,
|
|
3760
|
+
"locationInModule": {
|
|
3761
|
+
"filename": "src/index.ts",
|
|
3762
|
+
"line": 8
|
|
3763
|
+
},
|
|
3764
|
+
"name": "bucket",
|
|
3765
|
+
"type": {
|
|
3766
|
+
"fqn": "aws-cdk-lib.aws_s3.IBucket"
|
|
3767
|
+
}
|
|
3768
|
+
},
|
|
3769
|
+
{
|
|
3770
|
+
"abstract": true,
|
|
3771
|
+
"docs": {
|
|
3772
|
+
"stability": "stable"
|
|
3773
|
+
},
|
|
3774
|
+
"immutable": true,
|
|
3775
|
+
"locationInModule": {
|
|
3776
|
+
"filename": "src/index.ts",
|
|
3777
|
+
"line": 9
|
|
3778
|
+
},
|
|
3779
|
+
"name": "objectPrefix",
|
|
3780
|
+
"type": {
|
|
3781
|
+
"primitive": "string"
|
|
3782
|
+
}
|
|
3783
|
+
}
|
|
3784
|
+
],
|
|
3785
|
+
"symbolId": "src/index:AccessLogSource"
|
|
3786
|
+
},
|
|
3693
3787
|
"@gammarers/aws-cloudfront-access-log-relocater.CloudFrontAccessLogRelocater": {
|
|
3694
3788
|
"assembly": "@gammarers/aws-cloudfront-access-log-relocater",
|
|
3695
3789
|
"base": "constructs.Construct",
|
|
@@ -3703,7 +3797,7 @@
|
|
|
3703
3797
|
},
|
|
3704
3798
|
"locationInModule": {
|
|
3705
3799
|
"filename": "src/index.ts",
|
|
3706
|
-
"line":
|
|
3800
|
+
"line": 31
|
|
3707
3801
|
},
|
|
3708
3802
|
"parameters": [
|
|
3709
3803
|
{
|
|
@@ -3717,18 +3811,71 @@
|
|
|
3717
3811
|
"type": {
|
|
3718
3812
|
"primitive": "string"
|
|
3719
3813
|
}
|
|
3814
|
+
},
|
|
3815
|
+
{
|
|
3816
|
+
"name": "props",
|
|
3817
|
+
"type": {
|
|
3818
|
+
"fqn": "@gammarers/aws-cloudfront-access-log-relocater.CloudFrontAccessLogRelocaterProps"
|
|
3819
|
+
}
|
|
3720
3820
|
}
|
|
3721
3821
|
]
|
|
3722
3822
|
},
|
|
3723
3823
|
"kind": "class",
|
|
3724
3824
|
"locationInModule": {
|
|
3725
3825
|
"filename": "src/index.ts",
|
|
3726
|
-
"line":
|
|
3826
|
+
"line": 30
|
|
3727
3827
|
},
|
|
3728
3828
|
"name": "CloudFrontAccessLogRelocater",
|
|
3729
3829
|
"symbolId": "src/index:CloudFrontAccessLogRelocater"
|
|
3830
|
+
},
|
|
3831
|
+
"@gammarers/aws-cloudfront-access-log-relocater.CloudFrontAccessLogRelocaterProps": {
|
|
3832
|
+
"assembly": "@gammarers/aws-cloudfront-access-log-relocater",
|
|
3833
|
+
"datatype": true,
|
|
3834
|
+
"docs": {
|
|
3835
|
+
"stability": "stable"
|
|
3836
|
+
},
|
|
3837
|
+
"fqn": "@gammarers/aws-cloudfront-access-log-relocater.CloudFrontAccessLogRelocaterProps",
|
|
3838
|
+
"kind": "interface",
|
|
3839
|
+
"locationInModule": {
|
|
3840
|
+
"filename": "src/index.ts",
|
|
3841
|
+
"line": 25
|
|
3842
|
+
},
|
|
3843
|
+
"name": "CloudFrontAccessLogRelocaterProps",
|
|
3844
|
+
"properties": [
|
|
3845
|
+
{
|
|
3846
|
+
"abstract": true,
|
|
3847
|
+
"docs": {
|
|
3848
|
+
"stability": "stable"
|
|
3849
|
+
},
|
|
3850
|
+
"immutable": true,
|
|
3851
|
+
"locationInModule": {
|
|
3852
|
+
"filename": "src/index.ts",
|
|
3853
|
+
"line": 27
|
|
3854
|
+
},
|
|
3855
|
+
"name": "accessLogDestination",
|
|
3856
|
+
"type": {
|
|
3857
|
+
"fqn": "@gammarers/aws-cloudfront-access-log-relocater.AccessLogDestination"
|
|
3858
|
+
}
|
|
3859
|
+
},
|
|
3860
|
+
{
|
|
3861
|
+
"abstract": true,
|
|
3862
|
+
"docs": {
|
|
3863
|
+
"stability": "stable"
|
|
3864
|
+
},
|
|
3865
|
+
"immutable": true,
|
|
3866
|
+
"locationInModule": {
|
|
3867
|
+
"filename": "src/index.ts",
|
|
3868
|
+
"line": 26
|
|
3869
|
+
},
|
|
3870
|
+
"name": "accessLogSource",
|
|
3871
|
+
"type": {
|
|
3872
|
+
"fqn": "@gammarers/aws-cloudfront-access-log-relocater.AccessLogSource"
|
|
3873
|
+
}
|
|
3874
|
+
}
|
|
3875
|
+
],
|
|
3876
|
+
"symbolId": "src/index:CloudFrontAccessLogRelocaterProps"
|
|
3730
3877
|
}
|
|
3731
3878
|
},
|
|
3732
|
-
"version": "0.0
|
|
3733
|
-
"fingerprint": "
|
|
3879
|
+
"version": "0.1.0",
|
|
3880
|
+
"fingerprint": "V7Hf+Hsr5oJEhvsH/WFl1nlzYUhKO2MA+Olz884GiEs="
|
|
3734
3881
|
}
|
package/API.md
CHANGED
|
@@ -9,13 +9,14 @@
|
|
|
9
9
|
```typescript
|
|
10
10
|
import { CloudFrontAccessLogRelocater } from '@gammarers/aws-cloudfront-access-log-relocater'
|
|
11
11
|
|
|
12
|
-
new CloudFrontAccessLogRelocater(scope: Construct, id: string)
|
|
12
|
+
new CloudFrontAccessLogRelocater(scope: Construct, id: string, props: CloudFrontAccessLogRelocaterProps)
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
| **Name** | **Type** | **Description** |
|
|
16
16
|
| --- | --- | --- |
|
|
17
17
|
| <code><a href="#@gammarers/aws-cloudfront-access-log-relocater.CloudFrontAccessLogRelocater.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
|
|
18
18
|
| <code><a href="#@gammarers/aws-cloudfront-access-log-relocater.CloudFrontAccessLogRelocater.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
|
|
19
|
+
| <code><a href="#@gammarers/aws-cloudfront-access-log-relocater.CloudFrontAccessLogRelocater.Initializer.parameter.props">props</a></code> | <code><a href="#@gammarers/aws-cloudfront-access-log-relocater.CloudFrontAccessLogRelocaterProps">CloudFrontAccessLogRelocaterProps</a></code> | *No description.* |
|
|
19
20
|
|
|
20
21
|
---
|
|
21
22
|
|
|
@@ -31,6 +32,12 @@ new CloudFrontAccessLogRelocater(scope: Construct, id: string)
|
|
|
31
32
|
|
|
32
33
|
---
|
|
33
34
|
|
|
35
|
+
##### `props`<sup>Required</sup> <a name="props" id="@gammarers/aws-cloudfront-access-log-relocater.CloudFrontAccessLogRelocater.Initializer.parameter.props"></a>
|
|
36
|
+
|
|
37
|
+
- *Type:* <a href="#@gammarers/aws-cloudfront-access-log-relocater.CloudFrontAccessLogRelocaterProps">CloudFrontAccessLogRelocaterProps</a>
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
34
41
|
#### Methods <a name="Methods" id="Methods"></a>
|
|
35
42
|
|
|
36
43
|
| **Name** | **Description** |
|
|
@@ -94,6 +101,124 @@ The tree node.
|
|
|
94
101
|
---
|
|
95
102
|
|
|
96
103
|
|
|
104
|
+
## Structs <a name="Structs" id="Structs"></a>
|
|
105
|
+
|
|
106
|
+
### AccessLogDestination <a name="AccessLogDestination" id="@gammarers/aws-cloudfront-access-log-relocater.AccessLogDestination"></a>
|
|
107
|
+
|
|
108
|
+
#### Initializer <a name="Initializer" id="@gammarers/aws-cloudfront-access-log-relocater.AccessLogDestination.Initializer"></a>
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
import { AccessLogDestination } from '@gammarers/aws-cloudfront-access-log-relocater'
|
|
112
|
+
|
|
113
|
+
const accessLogDestination: AccessLogDestination = { ... }
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
#### Properties <a name="Properties" id="Properties"></a>
|
|
117
|
+
|
|
118
|
+
| **Name** | **Type** | **Description** |
|
|
119
|
+
| --- | --- | --- |
|
|
120
|
+
| <code><a href="#@gammarers/aws-cloudfront-access-log-relocater.AccessLogDestination.property.bucket">bucket</a></code> | <code>aws-cdk-lib.aws_s3.IBucket</code> | *No description.* |
|
|
121
|
+
| <code><a href="#@gammarers/aws-cloudfront-access-log-relocater.AccessLogDestination.property.objectPrefix">objectPrefix</a></code> | <code>string</code> | *No description.* |
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
##### `bucket`<sup>Required</sup> <a name="bucket" id="@gammarers/aws-cloudfront-access-log-relocater.AccessLogDestination.property.bucket"></a>
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
public readonly bucket: IBucket;
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
- *Type:* aws-cdk-lib.aws_s3.IBucket
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
##### `objectPrefix`<sup>Required</sup> <a name="objectPrefix" id="@gammarers/aws-cloudfront-access-log-relocater.AccessLogDestination.property.objectPrefix"></a>
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
public readonly objectPrefix: string;
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
- *Type:* string
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
### AccessLogSource <a name="AccessLogSource" id="@gammarers/aws-cloudfront-access-log-relocater.AccessLogSource"></a>
|
|
146
|
+
|
|
147
|
+
#### Initializer <a name="Initializer" id="@gammarers/aws-cloudfront-access-log-relocater.AccessLogSource.Initializer"></a>
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
import { AccessLogSource } from '@gammarers/aws-cloudfront-access-log-relocater'
|
|
151
|
+
|
|
152
|
+
const accessLogSource: AccessLogSource = { ... }
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
#### Properties <a name="Properties" id="Properties"></a>
|
|
156
|
+
|
|
157
|
+
| **Name** | **Type** | **Description** |
|
|
158
|
+
| --- | --- | --- |
|
|
159
|
+
| <code><a href="#@gammarers/aws-cloudfront-access-log-relocater.AccessLogSource.property.bucket">bucket</a></code> | <code>aws-cdk-lib.aws_s3.IBucket</code> | *No description.* |
|
|
160
|
+
| <code><a href="#@gammarers/aws-cloudfront-access-log-relocater.AccessLogSource.property.objectPrefix">objectPrefix</a></code> | <code>string</code> | *No description.* |
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
##### `bucket`<sup>Required</sup> <a name="bucket" id="@gammarers/aws-cloudfront-access-log-relocater.AccessLogSource.property.bucket"></a>
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
public readonly bucket: IBucket;
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
- *Type:* aws-cdk-lib.aws_s3.IBucket
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
##### `objectPrefix`<sup>Required</sup> <a name="objectPrefix" id="@gammarers/aws-cloudfront-access-log-relocater.AccessLogSource.property.objectPrefix"></a>
|
|
175
|
+
|
|
176
|
+
```typescript
|
|
177
|
+
public readonly objectPrefix: string;
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
- *Type:* string
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
### CloudFrontAccessLogRelocaterProps <a name="CloudFrontAccessLogRelocaterProps" id="@gammarers/aws-cloudfront-access-log-relocater.CloudFrontAccessLogRelocaterProps"></a>
|
|
185
|
+
|
|
186
|
+
#### Initializer <a name="Initializer" id="@gammarers/aws-cloudfront-access-log-relocater.CloudFrontAccessLogRelocaterProps.Initializer"></a>
|
|
187
|
+
|
|
188
|
+
```typescript
|
|
189
|
+
import { CloudFrontAccessLogRelocaterProps } from '@gammarers/aws-cloudfront-access-log-relocater'
|
|
190
|
+
|
|
191
|
+
const cloudFrontAccessLogRelocaterProps: CloudFrontAccessLogRelocaterProps = { ... }
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
#### Properties <a name="Properties" id="Properties"></a>
|
|
195
|
+
|
|
196
|
+
| **Name** | **Type** | **Description** |
|
|
197
|
+
| --- | --- | --- |
|
|
198
|
+
| <code><a href="#@gammarers/aws-cloudfront-access-log-relocater.CloudFrontAccessLogRelocaterProps.property.accessLogDestination">accessLogDestination</a></code> | <code><a href="#@gammarers/aws-cloudfront-access-log-relocater.AccessLogDestination">AccessLogDestination</a></code> | *No description.* |
|
|
199
|
+
| <code><a href="#@gammarers/aws-cloudfront-access-log-relocater.CloudFrontAccessLogRelocaterProps.property.accessLogSource">accessLogSource</a></code> | <code><a href="#@gammarers/aws-cloudfront-access-log-relocater.AccessLogSource">AccessLogSource</a></code> | *No description.* |
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
##### `accessLogDestination`<sup>Required</sup> <a name="accessLogDestination" id="@gammarers/aws-cloudfront-access-log-relocater.CloudFrontAccessLogRelocaterProps.property.accessLogDestination"></a>
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
public readonly accessLogDestination: AccessLogDestination;
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
- *Type:* <a href="#@gammarers/aws-cloudfront-access-log-relocater.AccessLogDestination">AccessLogDestination</a>
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
##### `accessLogSource`<sup>Required</sup> <a name="accessLogSource" id="@gammarers/aws-cloudfront-access-log-relocater.CloudFrontAccessLogRelocaterProps.property.accessLogSource"></a>
|
|
214
|
+
|
|
215
|
+
```typescript
|
|
216
|
+
public readonly accessLogSource: AccessLogSource;
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
- *Type:* <a href="#@gammarers/aws-cloudfront-access-log-relocater.AccessLogSource">AccessLogSource</a>
|
|
220
|
+
|
|
221
|
+
---
|
|
97
222
|
|
|
98
223
|
|
|
99
224
|
|
package/lib/index.d.ts
CHANGED
|
@@ -1,4 +1,17 @@
|
|
|
1
|
+
import * as s3 from 'aws-cdk-lib/aws-s3';
|
|
1
2
|
import { Construct } from 'constructs';
|
|
3
|
+
export interface AccessLogSource {
|
|
4
|
+
readonly bucket: s3.IBucket;
|
|
5
|
+
readonly objectPrefix: string;
|
|
6
|
+
}
|
|
7
|
+
export interface AccessLogDestination {
|
|
8
|
+
readonly bucket: s3.IBucket;
|
|
9
|
+
readonly objectPrefix: string;
|
|
10
|
+
}
|
|
11
|
+
export interface CloudFrontAccessLogRelocaterProps {
|
|
12
|
+
readonly accessLogSource: AccessLogSource;
|
|
13
|
+
readonly accessLogDestination: AccessLogDestination;
|
|
14
|
+
}
|
|
2
15
|
export declare class CloudFrontAccessLogRelocater extends Construct {
|
|
3
|
-
constructor(scope: Construct, id: string);
|
|
16
|
+
constructor(scope: Construct, id: string, props: CloudFrontAccessLogRelocaterProps);
|
|
4
17
|
}
|
package/lib/index.js
CHANGED
|
@@ -3,13 +3,58 @@ var _a;
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.CloudFrontAccessLogRelocater = void 0;
|
|
5
5
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const events = require("aws-cdk-lib/aws-events");
|
|
7
|
+
const targets = require("aws-cdk-lib/aws-events-targets");
|
|
6
8
|
const constructs_1 = require("constructs");
|
|
9
|
+
const relocate_state_machine_1 = require("./resources/relocate-state-machine");
|
|
7
10
|
class CloudFrontAccessLogRelocater extends constructs_1.Construct {
|
|
8
|
-
constructor(scope, id) {
|
|
11
|
+
constructor(scope, id, props) {
|
|
9
12
|
super(scope, id);
|
|
13
|
+
// 👇 relocate state machine(bukect object copy & delete)
|
|
14
|
+
const machine = new relocate_state_machine_1.RelocatorStateMachine(this, 'RelocatorStateMachine', {
|
|
15
|
+
accessLogSource: props.accessLogSource,
|
|
16
|
+
accessLogDestination: props.accessLogDestination,
|
|
17
|
+
});
|
|
18
|
+
// 👇 access log created event catch rule
|
|
19
|
+
new events.Rule(this, 'EventRule', {
|
|
20
|
+
// ruleName: `hac-cloudfront-log-output-${props.random}-event-rule`,
|
|
21
|
+
description: 'event rule.',
|
|
22
|
+
eventPattern: {
|
|
23
|
+
source: ['aws.s3'],
|
|
24
|
+
detailType: ['Object Created'],
|
|
25
|
+
detail: {
|
|
26
|
+
bucket: {
|
|
27
|
+
name: [props.accessLogSource.bucket.bucketName],
|
|
28
|
+
},
|
|
29
|
+
object: {
|
|
30
|
+
key: [
|
|
31
|
+
{
|
|
32
|
+
wildcard: `${props.accessLogSource.objectPrefix}/*.gz`,
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
targets: [
|
|
39
|
+
new targets.SfnStateMachine(machine, {
|
|
40
|
+
input: events.RuleTargetInput.fromObject({
|
|
41
|
+
event: events.EventField.fromPath('$'),
|
|
42
|
+
params: {
|
|
43
|
+
accessLogDestination: {
|
|
44
|
+
bucketName: props.accessLogDestination.bucket.bucketName,
|
|
45
|
+
objectPrifix: props.accessLogDestination.objectPrefix,
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
}),
|
|
49
|
+
}),
|
|
50
|
+
],
|
|
51
|
+
});
|
|
52
|
+
// input: events.RuleTargetInput.fromObject({
|
|
53
|
+
// event: events.RuleTargetInput.fromEventPath('$'),
|
|
54
|
+
// customKey: 'customValue',
|
|
10
55
|
}
|
|
11
56
|
}
|
|
12
57
|
exports.CloudFrontAccessLogRelocater = CloudFrontAccessLogRelocater;
|
|
13
58
|
_a = JSII_RTTI_SYMBOL_1;
|
|
14
|
-
CloudFrontAccessLogRelocater[_a] = { fqn: "@gammarers/aws-cloudfront-access-log-relocater.CloudFrontAccessLogRelocater", version: "0.0
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
59
|
+
CloudFrontAccessLogRelocater[_a] = { fqn: "@gammarers/aws-cloudfront-access-log-relocater.CloudFrontAccessLogRelocater", version: "0.1.0" };
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxpREFBaUQ7QUFDakQsMERBQTBEO0FBRTFELDJDQUF1QztBQUN2QywrRUFBMkU7QUF5QjNFLE1BQWEsNEJBQTZCLFNBQVEsc0JBQVM7SUFDekQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF3QztRQUNoRixLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLHlEQUF5RDtRQUN6RCxNQUFNLE9BQU8sR0FBRyxJQUFJLDhDQUFxQixDQUFDLElBQUksRUFBRSx1QkFBdUIsRUFBRTtZQUN2RSxlQUFlLEVBQUUsS0FBSyxDQUFDLGVBQWU7WUFDdEMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLG9CQUFvQjtTQUNqRCxDQUFDLENBQUM7UUFFSCx5Q0FBeUM7UUFDekMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUU7WUFDakMsb0VBQW9FO1lBQ3BFLFdBQVcsRUFBRSxhQUFhO1lBQzFCLFlBQVksRUFBRTtnQkFDWixNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBQ2xCLFVBQVUsRUFBRSxDQUFDLGdCQUFnQixDQUFDO2dCQUM5QixNQUFNLEVBQUU7b0JBQ04sTUFBTSxFQUFFO3dCQUNOLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztxQkFDaEQ7b0JBQ0QsTUFBTSxFQUFFO3dCQUNOLEdBQUcsRUFBRTs0QkFDSDtnQ0FDRSxRQUFRLEVBQUUsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDLFlBQVksT0FBTzs2QkFDdkQ7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7YUFDRjtZQUNELE9BQU8sRUFBRTtnQkFDUCxJQUFJLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFO29CQUNuQyxLQUFLLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUM7d0JBQ3ZDLEtBQUssRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7d0JBQ3RDLE1BQU0sRUFBRTs0QkFDTixvQkFBb0IsRUFBRTtnQ0FDcEIsVUFBVSxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsVUFBVTtnQ0FDeEQsWUFBWSxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZOzZCQUN0RDt5QkFDRjtxQkFDRixDQUFDO2lCQUNILENBQUM7YUFDSDtTQUNGLENBQUMsQ0FBQztRQUNILCtDQUErQztRQUMvQyxvREFBb0Q7UUFDcEQsNEJBQTRCO0lBQzlCLENBQUM7O0FBL0NILG9FQWdEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGV2ZW50cyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZXZlbnRzJztcbmltcG9ydCAqIGFzIHRhcmdldHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IFJlbG9jYXRvclN0YXRlTWFjaGluZSB9IGZyb20gJy4vcmVzb3VyY2VzL3JlbG9jYXRlLXN0YXRlLW1hY2hpbmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFjY2Vzc0xvZ1NvdXJjZSB7XG4gIHJlYWRvbmx5IGJ1Y2tldDogczMuSUJ1Y2tldDtcbiAgcmVhZG9ubHkgb2JqZWN0UHJlZml4OiBzdHJpbmc7XG59XG5cbi8vIGV4cG9ydCBlbnVtIFBhcnRpdGlvbmluZ0Zvcm1hdFR5cGUge1xuLy8gICAvKiogeXl5eS9tbS9kZCAqL1xuLy8gICBISUVSQVJDSElDQUxfREFURV9QQVJUSVRJT05JTkdfRk9STUFULCBEZWZhdWx0XG4vLyAgIC8qKiB5PXl5eXkvbT1tbS9kPWRkICovXG4vLyAgIEtFWV9WQUxVRV9EQVRFX1BBUlRJVElPTklOR19GT1JNQVQsIEhpdmUgVHlwZVxuLy8gfVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjY2Vzc0xvZ0Rlc3RpbmF0aW9uIHtcbiAgcmVhZG9ubHkgYnVja2V0OiBzMy5JQnVja2V0O1xuICByZWFkb25seSBvYmplY3RQcmVmaXg6IHN0cmluZztcbiAgLy8gcmVhZG9ubHkgcGFydGl0aW9uaW5nRm9ybWF0VHlwZTogUGFydGl0aW9uaW5nRm9ybWF0VHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEZyb250QWNjZXNzTG9nUmVsb2NhdGVyUHJvcHMge1xuICByZWFkb25seSBhY2Nlc3NMb2dTb3VyY2U6IEFjY2Vzc0xvZ1NvdXJjZTtcbiAgcmVhZG9ubHkgYWNjZXNzTG9nRGVzdGluYXRpb246IEFjY2Vzc0xvZ0Rlc3RpbmF0aW9uO1xufVxuXG5leHBvcnQgY2xhc3MgQ2xvdWRGcm9udEFjY2Vzc0xvZ1JlbG9jYXRlciBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDbG91ZEZyb250QWNjZXNzTG9nUmVsb2NhdGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgLy8g8J+RhyByZWxvY2F0ZSBzdGF0ZSBtYWNoaW5lKGJ1a2VjdCBvYmplY3QgY29weSAmIGRlbGV0ZSlcbiAgICBjb25zdCBtYWNoaW5lID0gbmV3IFJlbG9jYXRvclN0YXRlTWFjaGluZSh0aGlzLCAnUmVsb2NhdG9yU3RhdGVNYWNoaW5lJywge1xuICAgICAgYWNjZXNzTG9nU291cmNlOiBwcm9wcy5hY2Nlc3NMb2dTb3VyY2UsXG4gICAgICBhY2Nlc3NMb2dEZXN0aW5hdGlvbjogcHJvcHMuYWNjZXNzTG9nRGVzdGluYXRpb24sXG4gICAgfSk7XG5cbiAgICAvLyDwn5GHIGFjY2VzcyBsb2cgY3JlYXRlZCBldmVudCBjYXRjaCBydWxlXG4gICAgbmV3IGV2ZW50cy5SdWxlKHRoaXMsICdFdmVudFJ1bGUnLCB7XG4gICAgICAvLyBydWxlTmFtZTogYGhhYy1jbG91ZGZyb250LWxvZy1vdXRwdXQtJHtwcm9wcy5yYW5kb219LWV2ZW50LXJ1bGVgLFxuICAgICAgZGVzY3JpcHRpb246ICdldmVudCBydWxlLicsXG4gICAgICBldmVudFBhdHRlcm46IHtcbiAgICAgICAgc291cmNlOiBbJ2F3cy5zMyddLFxuICAgICAgICBkZXRhaWxUeXBlOiBbJ09iamVjdCBDcmVhdGVkJ10sXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIGJ1Y2tldDoge1xuICAgICAgICAgICAgbmFtZTogW3Byb3BzLmFjY2Vzc0xvZ1NvdXJjZS5idWNrZXQuYnVja2V0TmFtZV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvYmplY3Q6IHtcbiAgICAgICAgICAgIGtleTogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd2lsZGNhcmQ6IGAke3Byb3BzLmFjY2Vzc0xvZ1NvdXJjZS5vYmplY3RQcmVmaXh9LyouZ3pgLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRhcmdldHM6IFtcbiAgICAgICAgbmV3IHRhcmdldHMuU2ZuU3RhdGVNYWNoaW5lKG1hY2hpbmUsIHtcbiAgICAgICAgICBpbnB1dDogZXZlbnRzLlJ1bGVUYXJnZXRJbnB1dC5mcm9tT2JqZWN0KHtcbiAgICAgICAgICAgIGV2ZW50OiBldmVudHMuRXZlbnRGaWVsZC5mcm9tUGF0aCgnJCcpLFxuICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgIGFjY2Vzc0xvZ0Rlc3RpbmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgYnVja2V0TmFtZTogcHJvcHMuYWNjZXNzTG9nRGVzdGluYXRpb24uYnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgb2JqZWN0UHJpZml4OiBwcm9wcy5hY2Nlc3NMb2dEZXN0aW5hdGlvbi5vYmplY3RQcmVmaXgsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgLy8gICBpbnB1dDogZXZlbnRzLlJ1bGVUYXJnZXRJbnB1dC5mcm9tT2JqZWN0KHtcbiAgICAvLyBldmVudDogZXZlbnRzLlJ1bGVUYXJnZXRJbnB1dC5mcm9tRXZlbnRQYXRoKCckJyksXG4gICAgLy8gY3VzdG9tS2V5OiAnY3VzdG9tVmFsdWUnLFxuICB9XG59Il19
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as s3 from 'aws-cdk-lib/aws-s3';
|
|
2
|
+
import * as sfn from 'aws-cdk-lib/aws-stepfunctions';
|
|
3
|
+
import { Construct } from 'constructs';
|
|
4
|
+
export interface AccessLogSource {
|
|
5
|
+
readonly bucket: s3.IBucket;
|
|
6
|
+
readonly objectPrefix: string;
|
|
7
|
+
}
|
|
8
|
+
export interface AccessLogDestination {
|
|
9
|
+
readonly bucket: s3.IBucket;
|
|
10
|
+
readonly objectPrefix: string;
|
|
11
|
+
}
|
|
12
|
+
export interface RelocatorStateMachineProps extends sfn.StateMachineProps {
|
|
13
|
+
readonly accessLogSource: AccessLogSource;
|
|
14
|
+
readonly accessLogDestination: AccessLogDestination;
|
|
15
|
+
}
|
|
16
|
+
export declare class RelocatorStateMachine extends sfn.StateMachine {
|
|
17
|
+
constructor(scope: Construct, id: string, props: RelocatorStateMachineProps);
|
|
18
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RelocatorStateMachine = void 0;
|
|
4
|
+
// import { Stack } from 'aws-cdk-lib';
|
|
5
|
+
// import * as sns from 'aws-cdk-lib/aws-sns';
|
|
6
|
+
const iam = require("aws-cdk-lib/aws-iam");
|
|
7
|
+
const sfn = require("aws-cdk-lib/aws-stepfunctions");
|
|
8
|
+
const tasks = require("aws-cdk-lib/aws-stepfunctions-tasks");
|
|
9
|
+
class RelocatorStateMachine extends sfn.StateMachine {
|
|
10
|
+
constructor(scope, id, props) {
|
|
11
|
+
super(scope, id, {
|
|
12
|
+
...props,
|
|
13
|
+
role: new iam.Role(scope, 'StateMachineRole', {
|
|
14
|
+
// roleName: `StepFunctionsExecutionRoleForS3Copy-${props.envName}`,
|
|
15
|
+
// description: "An IAM role for Step Functions to access AWS services",
|
|
16
|
+
assumedBy: new iam.ServicePrincipal('states.amazonaws.com'),
|
|
17
|
+
inlinePolicies: {
|
|
18
|
+
'copy-object-policy': new iam.PolicyDocument({
|
|
19
|
+
statements: [
|
|
20
|
+
new iam.PolicyStatement({
|
|
21
|
+
effect: iam.Effect.ALLOW,
|
|
22
|
+
actions: [
|
|
23
|
+
's3:GetObject',
|
|
24
|
+
's3:ListBucket',
|
|
25
|
+
],
|
|
26
|
+
resources: [
|
|
27
|
+
`${props.accessLogSource.bucket.bucketArn}/*`,
|
|
28
|
+
],
|
|
29
|
+
}),
|
|
30
|
+
new iam.PolicyStatement({
|
|
31
|
+
effect: iam.Effect.ALLOW,
|
|
32
|
+
actions: [
|
|
33
|
+
's3:PutObject',
|
|
34
|
+
's3:ListBucket',
|
|
35
|
+
],
|
|
36
|
+
resources: [
|
|
37
|
+
`${props.accessLogDestination.bucket.bucketArn}/*`,
|
|
38
|
+
],
|
|
39
|
+
}),
|
|
40
|
+
],
|
|
41
|
+
}),
|
|
42
|
+
'delete-object-policy': new iam.PolicyDocument({
|
|
43
|
+
statements: [
|
|
44
|
+
new iam.PolicyStatement({
|
|
45
|
+
effect: iam.Effect.ALLOW,
|
|
46
|
+
actions: [
|
|
47
|
+
's3:DeleteObject',
|
|
48
|
+
's3:ListBucket',
|
|
49
|
+
],
|
|
50
|
+
resources: [
|
|
51
|
+
`${props.accessLogSource.bucket.bucketArn}/*`,
|
|
52
|
+
],
|
|
53
|
+
}),
|
|
54
|
+
],
|
|
55
|
+
}),
|
|
56
|
+
},
|
|
57
|
+
}),
|
|
58
|
+
definitionBody: (() => {
|
|
59
|
+
// Get Source Bucket & objectKey
|
|
60
|
+
const getSourceBucketObject = new sfn.Pass(scope, 'GetSourceBucketObject', {
|
|
61
|
+
comment: 'Get Source Bucket Object Key with Split Object Key',
|
|
62
|
+
resultPath: '$.Result.Source',
|
|
63
|
+
parameters: {
|
|
64
|
+
BucketName: sfn.JsonPath.stringAt('$.event.detail.bucket.name'),
|
|
65
|
+
ObjectKey: sfn.JsonPath.stringAt('$.event.detail.object.key'),
|
|
66
|
+
SplitObjectLayers: sfn.JsonPath.stringSplit(sfn.JsonPath.stringAt('$.event.detail.object.key'), '/'),
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
const getSourceSplitObjectsLength = new sfn.Pass(scope, 'GetSourceSplitObjectsLength', {
|
|
70
|
+
resultPath: '$.Result.Source.SplitObjectLayer',
|
|
71
|
+
parameters: {
|
|
72
|
+
Length: sfn.JsonPath.arrayLength(sfn.JsonPath.stringAt('$.Result.Source.SplitObjectLayers')),
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
getSourceBucketObject.next(getSourceSplitObjectsLength);
|
|
76
|
+
const getSplitObjectFilenameIndex = new sfn.Pass(scope, 'GetSplitObjectFilenameIndex', {
|
|
77
|
+
resultPath: '$.Result.Source.Target.SplitObjectLayer',
|
|
78
|
+
parameters: {
|
|
79
|
+
Index: sfn.JsonPath.mathAdd(sfn.JsonPath.numberAt('$.Result.Source.SplitObjectLayer.Length'), -1),
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
getSourceSplitObjectsLength.next(getSplitObjectFilenameIndex);
|
|
83
|
+
const getSourceFilename = new sfn.Pass(scope, 'GetSourceFilename', {
|
|
84
|
+
resultPath: '$.Result.Source.Target.File',
|
|
85
|
+
parameters: {
|
|
86
|
+
Filename: sfn.JsonPath.arrayGetItem(sfn.JsonPath.stringAt('$.Result.Source.SplitObjectLayers'), sfn.JsonPath.numberAt('$.Result.Source.Target.SplitObjectLayer.Index')),
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
getSplitObjectFilenameIndex.next(getSourceFilename);
|
|
90
|
+
const getLogFilenameAttribute = new sfn.Pass(scope, 'GetLogFilenameAttribute', {
|
|
91
|
+
resultPath: '$.Result.Source.Target.File.Attribute',
|
|
92
|
+
parameters: {
|
|
93
|
+
DateHour: sfn.JsonPath.arrayGetItem(sfn.JsonPath.stringSplit(sfn.JsonPath.stringAt('$.Result.Source.Target.File.Filename'), '.'), 1),
|
|
94
|
+
DistributionId: sfn.JsonPath.arrayGetItem(sfn.JsonPath.stringSplit(sfn.JsonPath.stringAt('$.Result.Source.Target.File.Filename'), '.'), 0),
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
getSourceFilename.next(getLogFilenameAttribute);
|
|
98
|
+
const getDateFromFilenameAttribute = new sfn.Pass(scope, 'GetDateFromFilenameAttribute', {
|
|
99
|
+
resultPath: '$.Result.Date',
|
|
100
|
+
parameters: {
|
|
101
|
+
Year: sfn.JsonPath.arrayGetItem(sfn.JsonPath.stringSplit(sfn.JsonPath.stringAt('$.Result.Source.Target.File.Attribute.DateHour'), '-'), 0),
|
|
102
|
+
Month: sfn.JsonPath.arrayGetItem(sfn.JsonPath.stringSplit(sfn.JsonPath.stringAt('$.Result.Source.Target.File.Attribute.DateHour'), '-'), 1),
|
|
103
|
+
Day: sfn.JsonPath.arrayGetItem(sfn.JsonPath.stringSplit(sfn.JsonPath.stringAt('$.Result.Source.Target.File.Attribute.DateHour'), '-'), 2),
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
getLogFilenameAttribute.next(getDateFromFilenameAttribute);
|
|
107
|
+
// object cooy
|
|
108
|
+
const copyObjectTask = new tasks.CallAwsService(scope, 'CopyObjectTask', {
|
|
109
|
+
iamResources: [`${props.accessLogSource.bucket.bucketArn}/*`],
|
|
110
|
+
service: 's3',
|
|
111
|
+
action: 'copyObject',
|
|
112
|
+
parameters: {
|
|
113
|
+
CopySource: sfn.JsonPath.format('{}/{}', sfn.JsonPath.stringAt('$.Result.Source.BucketName'), sfn.JsonPath.stringAt('$.Result.Source.ObjectKey')),
|
|
114
|
+
Bucket: props.accessLogDestination.bucket.bucketName,
|
|
115
|
+
Key: sfn.JsonPath.format(`${props.accessLogDestination.objectPrefix}/{}/{}/{}/{}/{}`, sfn.JsonPath.stringAt('$.Result.Source.Target.File.Attribute.DistributionId'), sfn.JsonPath.stringAt('$.Result.Date.Year'), sfn.JsonPath.stringAt('$.Result.Date.Month'), sfn.JsonPath.stringAt('$.Result.Date.Day'), sfn.JsonPath.stringAt('$.Result.Source.Target.File.Filename')),
|
|
116
|
+
},
|
|
117
|
+
resultPath: '$.Result.CopyObject',
|
|
118
|
+
});
|
|
119
|
+
getDateFromFilenameAttribute.next(copyObjectTask);
|
|
120
|
+
// object delete
|
|
121
|
+
const deleteObjectTask = new tasks.CallAwsService(scope, 'DeleteObjectTask', {
|
|
122
|
+
iamResources: [`${props.accessLogSource.bucket.bucketArn}/*`],
|
|
123
|
+
service: 's3',
|
|
124
|
+
action: 'deleteObject',
|
|
125
|
+
parameters: {
|
|
126
|
+
Bucket: sfn.JsonPath.stringAt('$.Result.Source.BucketName'),
|
|
127
|
+
Key: sfn.JsonPath.stringAt('$.Result.Source.ObjectKey'),
|
|
128
|
+
},
|
|
129
|
+
resultPath: '$.Result.CopyObject',
|
|
130
|
+
});
|
|
131
|
+
copyObjectTask.next(deleteObjectTask);
|
|
132
|
+
const succeed = new sfn.Succeed(scope, 'Succeed');
|
|
133
|
+
deleteObjectTask.next(succeed);
|
|
134
|
+
return sfn.DefinitionBody.fromChainable(getSourceBucketObject);
|
|
135
|
+
})(),
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
exports.RelocatorStateMachine = RelocatorStateMachine;
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsb2NhdGUtc3RhdGUtbWFjaGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXNvdXJjZXMvcmVsb2NhdGUtc3RhdGUtbWFjaGluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1Q0FBdUM7QUFDdkMsOENBQThDO0FBQzlDLDJDQUEyQztBQUUzQyxxREFBcUQ7QUFDckQsNkRBQTZEO0FBbUI3RCxNQUFhLHFCQUFzQixTQUFRLEdBQUcsQ0FBQyxZQUFZO0lBQ3pELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBaUM7UUFDekUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixHQUFHLEtBQUs7WUFDUixJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxrQkFBa0IsRUFBRTtnQkFDNUMsb0VBQW9FO2dCQUNwRSx3RUFBd0U7Z0JBQ3hFLFNBQVMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQztnQkFDM0QsY0FBYyxFQUFFO29CQUNkLG9CQUFvQixFQUFFLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQzt3QkFDM0MsVUFBVSxFQUFFOzRCQUNWLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztnQ0FDdEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSztnQ0FDeEIsT0FBTyxFQUFFO29DQUNQLGNBQWM7b0NBQ2QsZUFBZTtpQ0FDaEI7Z0NBQ0QsU0FBUyxFQUFFO29DQUNULEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJO2lDQUM5Qzs2QkFDRixDQUFDOzRCQUNGLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztnQ0FDdEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSztnQ0FDeEIsT0FBTyxFQUFFO29DQUNQLGNBQWM7b0NBQ2QsZUFBZTtpQ0FDaEI7Z0NBQ0QsU0FBUyxF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LDRCQUE0QixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFFbEQsZ0JBQWdCO2dCQUNoQixNQUFNLGdCQUFnQixHQUFHLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLEVBQUU7b0JBQzNFLFlBQVksRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLENBQUM7b0JBQzdELE9BQU8sRUFBRSxJQUFJO29CQUNiLE1BQU0sRUFBRSxjQUFjO29CQUN0QixVQUFVLEVBQUU7d0JBQ1YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLDRCQUE0QixDQUFDO3dCQUMzRCxHQUFHLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsMkJBQTJCLENBQUM7cUJBQ3hEO29CQUNELFVBQVUsRUFBRSxxQkFBcUI7aUJBQ2xDLENBQUMsQ0FBQztnQkFDSCxjQUFjLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBRXRDLE1BQU0sT0FBTyxHQUFnQixJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUUvRCxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRS9CLE9BQU8sR0FBRyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUNqRSxDQUFDLENBQUMsRUFBRTtTQUNMLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQXBKRCxzREFvSkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQgeyBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbi8vIGltcG9ydCAqIGFzIHNucyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc25zJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgKiBhcyBzZm4gZnJvbSAnYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMnO1xuaW1wb3J0ICogYXMgdGFza3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMtdGFza3MnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWNjZXNzTG9nU291cmNlIHtcbiAgcmVhZG9ubHkgYnVja2V0OiBzMy5JQnVja2V0O1xuICByZWFkb25seSBvYmplY3RQcmVmaXg6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY2Nlc3NMb2dEZXN0aW5hdGlvbiB7XG4gIHJlYWRvbmx5IGJ1Y2tldDogczMuSUJ1Y2tldDtcbiAgcmVhZG9ubHkgb2JqZWN0UHJlZml4OiBzdHJpbmc7XG4gIC8vIHJlYWRvbmx5IHBhcnRpdGlvbmluZ0Zvcm1hdFR5cGU6IFBhcnRpdGlvbmluZ0Zvcm1hdFR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVsb2NhdG9yU3RhdGVNYWNoaW5lUHJvcHMgZXh0ZW5kcyBzZm4uU3RhdGVNYWNoaW5lUHJvcHMge1xuICByZWFkb25seSBhY2Nlc3NMb2dTb3VyY2U6IEFjY2Vzc0xvZ1NvdXJjZTtcbiAgcmVhZG9ubHkgYWNjZXNzTG9nRGVzdGluYXRpb246IEFjY2Vzc0xvZ0Rlc3RpbmF0aW9uO1xufVxuXG5leHBvcnQgY2xhc3MgUmVsb2NhdG9yU3RhdGVNYWNoaW5lIGV4dGVuZHMgc2ZuLlN0YXRlTWFjaGluZSB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBSZWxvY2F0b3JTdGF0ZU1hY2hpbmVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICByb2xlOiBuZXcgaWFtLlJvbGUoc2NvcGUsICdTdGF0ZU1hY2hpbmVSb2xlJywge1xuICAgICAgICAvLyByb2xlTmFtZTogYFN0ZXBGdW5jdGlvbnNFeGVjdXRpb25Sb2xlRm9yUzNDb3B5LSR7cHJvcHMuZW52TmFtZX1gLFxuICAgICAgICAvLyBkZXNjcmlwdGlvbjogXCJBbiBJQU0gcm9sZSBmb3IgU3RlcCBGdW5jdGlvbnMgdG8gYWNjZXNzIEFXUyBzZXJ2aWNlc1wiLFxuICAgICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnc3RhdGVzLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgICAnY29weS1vYmplY3QtcG9saWN5JzogbmV3IGlhbS5Qb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICAgJ3MzOkdldE9iamVjdCcsXG4gICAgICAgICAgICAgICAgICAnczM6TGlzdEJ1Y2tldCcsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICAgICAgICAgIGAke3Byb3BzLmFjY2Vzc0xvZ1NvdXJjZS5idWNrZXQuYnVja2V0QXJufS8qYCxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgICAnczM6UHV0T2JqZWN0JyxcbiAgICAgICAgICAgICAgICAgICdzMzpMaXN0QnVja2V0JyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgICAgICAgICAgYCR7cHJvcHMuYWNjZXNzTG9nRGVzdGluYXRpb24uYnVja2V0LmJ1Y2tldEFybn0vKmAsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgICdkZWxldGUtb2JqZWN0LXBvbGljeSc6IG5ldyBpYW0uUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgICdzMzpEZWxldGVPYmplY3QnLFxuICAgICAgICAgICAgICAgICAgJ3MzOkxpc3RCdWNrZXQnLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgICAgICAgICBgJHtwcm9wcy5hY2Nlc3NMb2dTb3VyY2UuYnVja2V0LmJ1Y2tldEFybn0vKmAsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBkZWZpbml0aW9uQm9keTogKCgpID0+IHtcblxuICAgICAgICAvLyBHZXQgU291cmNlIEJ1Y2tldCAmIG9iamVjdEtleVxuICAgICAgICBjb25zdCBnZXRTb3VyY2VCdWNrZXRPYmplY3QgPSBuZXcgc2ZuLlBhc3Moc2NvcGUsICdHZXRTb3VyY2VCdWNrZXRPYmplY3QnLCB7XG4gICAgICAgICAgY29tbWVudDogJ0dldCBTb3VyY2UgQnVja2V0IE9iamVjdCBLZXkgd2l0aCBTcGxpdCBPYmplY3QgS2V5JyxcbiAgICAgICAgICByZXN1bHRQYXRoOiAnJC5SZXN1bHQuU291cmNlJyxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBCdWNrZXROYW1lOiBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuZXZlbnQuZGV0YWlsLmJ1Y2tldC5uYW1lJyksXG4gICAgICAgICAgICBPYmplY3RLZXk6IHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5ldmVudC5kZXRhaWwub2JqZWN0LmtleScpLFxuICAgICAgICAgICAgU3BsaXRPYmplY3RMYXllcnM6IHNmbi5Kc29uUGF0aC5zdHJpbmdTcGxpdChzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuZXZlbnQuZGV0YWlsLm9iamVjdC5rZXknKSwgJy8nKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZ2V0U291cmNlU3BsaXRPYmplY3RzTGVuZ3RoID0gbmV3IHNmbi5QYXNzKHNjb3BlLCAnR2V0U291cmNlU3BsaXRPYmplY3RzTGVuZ3RoJywge1xuICAgICAgICAgIHJlc3VsdFBhdGg6ICckLlJlc3VsdC5Tb3VyY2UuU3BsaXRPYmplY3RMYXllcicsXG4gICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgTGVuZ3RoOiBzZm4uSnNvblBhdGguYXJyYXlMZW5ndGgoc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLlJlc3VsdC5Tb3VyY2UuU3BsaXRPYmplY3RMYXllcnMnKSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGdldFNvdXJjZUJ1Y2tldE9iamVjdC5uZXh0KGdldFNvdXJjZVNwbGl0T2JqZWN0c0xlbmd0aCk7XG5cbiAgICAgICAgY29uc3QgZ2V0U3BsaXRPYmplY3RGaWxlbmFtZUluZGV4ID0gbmV3IHNmbi5QYXNzKHNjb3BlLCAnR2V0U3BsaXRPYmplY3RGaWxlbmFtZUluZGV4Jywge1xuICAgICAgICAgIHJlc3VsdFBhdGg6ICckLlJlc3VsdC5Tb3VyY2UuVGFyZ2V0LlNwbGl0T2JqZWN0TGF5ZXInLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgIEluZGV4OiBzZm4uSnNvblBhdGgubWF0aEFkZChzZm4uSnNvblBhdGgubnVtYmVyQXQoJyQuUmVzdWx0LlNvdXJjZS5TcGxpdE9iamVjdExheWVyLkxlbmd0aCcpLCAtMSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGdldFNvdXJjZVNwbGl0T2JqZWN0c0xlbmd0aC5uZXh0KGdldFNwbGl0T2JqZWN0RmlsZW5hbWVJbmRleCk7XG5cbiAgICAgICAgY29uc3QgZ2V0U291cmNlRmlsZW5hbWUgPSBuZXcgc2ZuLlBhc3Moc2NvcGUsICdHZXRTb3VyY2VGaWxlbmFtZScsIHtcbiAgICAgICAgICByZXN1bHRQYXRoOiAnJC5SZXN1bHQuU291cmNlLlRhcmdldC5GaWxlJyxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBGaWxlbmFtZTogc2ZuLkpzb25QYXRoLmFycmF5R2V0SXRlbShzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuUmVzdWx0LlNvdXJjZS5TcGxpdE9iamVjdExheWVycycpLCBzZm4uSnNvblBhdGgubnVtYmVyQXQoJyQuUmVzdWx0LlNvdXJjZS5UYXJnZXQuU3BsaXRPYmplY3RMYXllci5JbmRleCcpKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgZ2V0U3BsaXRPYmplY3RGaWxlbmFtZUluZGV4Lm5leHQoZ2V0U291cmNlRmlsZW5hbWUpO1xuXG4gICAgICAgIGNvbnN0IGdldExvZ0ZpbGVuYW1lQXR0cmlidXRlID0gbmV3IHNmbi5QYXNzKHNjb3BlLCAnR2V0TG9nRmlsZW5hbWVBdHRyaWJ1dGUnLCB7XG4gICAgICAgICAgcmVzdWx0UGF0aDogJyQuUmVzdWx0LlNvdXJjZS5UYXJnZXQuRmlsZS5BdHRyaWJ1dGUnLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgIERhdGVIb3VyOiBzZm4uSnNvblBhdGguYXJyYXlHZXRJdGVtKHNmbi5Kc29uUGF0aC5zdHJpbmdTcGxpdChzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuUmVzdWx0LlNvdXJjZS5UYXJnZXQuRmlsZS5GaWxlbmFtZScpLCAnLicpLCAxKSxcbiAgICAgICAgICAgIERpc3RyaWJ1dGlvbklkOiBzZm4uSnNvblBhdGguYXJyYXlHZXRJdGVtKHNmbi5Kc29uUGF0aC5zdHJpbmdTcGxpdChzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuUmVzdWx0LlNvdXJjZS5UYXJnZXQuRmlsZS5GaWxlbmFtZScpLCAnLicpLCAwKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgZ2V0U291cmNlRmlsZW5hbWUubmV4dChnZXRMb2dGaWxlbmFtZUF0dHJpYnV0ZSk7XG5cbiAgICAgICAgY29uc3QgZ2V0RGF0ZUZyb21GaWxlbmFtZUF0dHJpYnV0ZSA9IG5ldyBzZm4uUGFzcyhzY29wZSwgJ0dldERhdGVGcm9tRmlsZW5hbWVBdHRyaWJ1dGUnLCB7XG4gICAgICAgICAgcmVzdWx0UGF0aDogJyQuUmVzdWx0LkRhdGUnLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgIFllYXI6IHNmbi5Kc29uUGF0aC5hcnJheUdldEl0ZW0oc2ZuLkpzb25QYXRoLnN0cmluZ1NwbGl0KHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5SZXN1bHQuU291cmNlLlRhcmdldC5GaWxlLkF0dHJpYnV0ZS5EYXRlSG91cicpLCAnLScpLCAwKSxcbiAgICAgICAgICAgIE1vbnRoOiBzZm4uSnNvblBhdGguYXJyYXlHZXRJdGVtKHNmbi5Kc29uUGF0aC5zdHJpbmdTcGxpdChzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuUmVzdWx0LlNvdXJjZS5UYXJnZXQuRmlsZS5BdHRyaWJ1dGUuRGF0ZUhvdXInKSwgJy0nKSwgMSksXG4gICAgICAgICAgICBEYXk6IHNmbi5Kc29uUGF0aC5hcnJheUdldEl0ZW0oc2ZuLkpzb25QYXRoLnN0cmluZ1NwbGl0KHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5SZXN1bHQuU291cmNlLlRhcmdldC5GaWxlLkF0dHJpYnV0ZS5EYXRlSG91cicpLCAnLScpLCAyKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgZ2V0TG9nRmlsZW5hbWVBdHRyaWJ1dGUubmV4dChnZXREYXRlRnJvbUZpbGVuYW1lQXR0cmlidXRlKTtcblxuICAgICAgICAvLyBvYmplY3QgY29veVxuICAgICAgICBjb25zdCBjb3B5T2JqZWN0VGFzayA9IG5ldyB0YXNrcy5DYWxsQXdzU2VydmljZShzY29wZSwgJ0NvcHlPYmplY3RUYXNrJywge1xuICAgICAgICAgIGlhbVJlc291cmNlczogW2Ake3Byb3BzLmFjY2Vzc0xvZ1NvdXJjZS5idWNrZXQuYnVja2V0QXJufS8qYF0sXG4gICAgICAgICAgc2VydmljZTogJ3MzJyxcbiAgICAgICAgICBhY3Rpb246ICdjb3B5T2JqZWN0JyxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBDb3B5U291cmNlOiBzZm4uSnNvblBhdGguZm9ybWF0KCd7fS97fScsXG4gICAgICAgICAgICAgIHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5SZXN1bHQuU291cmNlLkJ1Y2tldE5hbWUnKSxcbiAgICAgICAgICAgICAgc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLlJlc3VsdC5Tb3VyY2UuT2JqZWN0S2V5JyksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgQnVja2V0OiBwcm9wcy5hY2Nlc3NMb2dEZXN0aW5hdGlvbi5idWNrZXQuYnVja2V0TmFtZSxcbiAgICAgICAgICAgIEtleTogc2ZuLkpzb25QYXRoLmZvcm1hdChgJHtwcm9wcy5hY2Nlc3NMb2dEZXN0aW5hdGlvbi5vYmplY3RQcmVmaXh9L3t9L3t9L3t9L3t9L3t9YCxcbiAgICAgICAgICAgICAgc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLlJlc3VsdC5Tb3VyY2UuVGFyZ2V0LkZpbGUuQXR0cmlidXRlLkRpc3RyaWJ1dGlvbklkJyksXG4gICAgICAgICAgICAgIHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5SZXN1bHQuRGF0ZS5ZZWFyJyksXG4gICAgICAgICAgICAgIHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5SZXN1bHQuRGF0ZS5Nb250aCcpLFxuICAgICAgICAgICAgICBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuUmVzdWx0LkRhdGUuRGF5JyksXG4gICAgICAgICAgICAgIHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5SZXN1bHQuU291cmNlLlRhcmdldC5GaWxlLkZpbGVuYW1lJyksXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzdWx0UGF0aDogJyQuUmVzdWx0LkNvcHlPYmplY3QnLFxuICAgICAgICB9KTtcbiAgICAgICAgZ2V0RGF0ZUZyb21GaWxlbmFtZUF0dHJpYnV0ZS5uZXh0KGNvcHlPYmplY3RUYXNrKTtcblxuICAgICAgICAvLyBvYmplY3QgZGVsZXRlXG4gICAgICAgIGNvbnN0IGRlbGV0ZU9iamVjdFRhc2sgPSBuZXcgdGFza3MuQ2FsbEF3c1NlcnZpY2Uoc2NvcGUsICdEZWxldGVPYmplY3RUYXNrJywge1xuICAgICAgICAgIGlhbVJlc291cmNlczogW2Ake3Byb3BzLmFjY2Vzc0xvZ1NvdXJjZS5idWNrZXQuYnVja2V0QXJufS8qYF0sXG4gICAgICAgICAgc2VydmljZTogJ3MzJyxcbiAgICAgICAgICBhY3Rpb246ICdkZWxldGVPYmplY3QnLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgIEJ1Y2tldDogc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLlJlc3VsdC5Tb3VyY2UuQnVja2V0TmFtZScpLFxuICAgICAgICAgICAgS2V5OiBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuUmVzdWx0LlNvdXJjZS5PYmplY3RLZXknKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc3VsdFBhdGg6ICckLlJlc3VsdC5Db3B5T2JqZWN0JyxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvcHlPYmplY3RUYXNrLm5leHQoZGVsZXRlT2JqZWN0VGFzayk7XG5cbiAgICAgICAgY29uc3Qgc3VjY2VlZDogc2ZuLlN1Y2NlZWQgPSBuZXcgc2ZuLlN1Y2NlZWQoc2NvcGUsICdTdWNjZWVkJyk7XG5cbiAgICAgICAgZGVsZXRlT2JqZWN0VGFzay5uZXh0KHN1Y2NlZWQpO1xuXG4gICAgICAgIHJldHVybiBzZm4uRGVmaW5pdGlvbkJvZHkuZnJvbUNoYWluYWJsZShnZXRTb3VyY2VCdWNrZXRPYmplY3QpO1xuICAgICAgfSkoKSxcbiAgICB9KTtcbiAgfVxufSJdfQ==
|