@colijnit/configurator 1.0.16 → 1.0.18
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/app/builder.d.ts +53 -53
- package/app/components/answers/answer/answer.component.d.ts +11 -11
- package/app/components/answers/answers.component.d.ts +8 -8
- package/app/components/answers/answers.module.d.ts +2 -2
- package/app/components/selections/selections.component.d.ts +22 -22
- package/app/components/selections/selections.module.d.ts +2 -2
- package/app/components/shared/loader/loader.component.d.ts +2 -2
- package/app/components/shared/shared.module.d.ts +2 -2
- package/app/directives/visibility-observer-master.directive.d.ts +9 -9
- package/app/directives/visibility-observer.directive.d.ts +13 -13
- package/app/services/configurator.service.d.ts +22 -22
- package/app/services/image-cache.service.d.ts +10 -10
- package/app/services/locator.service.d.ts +4 -4
- package/bundles/colijnit-configurator.umd.js +2455 -2455
- package/bundles/colijnit-configurator.umd.js.map +1 -1
- package/bundles/colijnit-configurator.umd.min.js +2 -2
- package/bundles/colijnit-configurator.umd.min.js.map +1 -1
- package/colijnit-configurator.d.ts +10 -10
- package/colijnit-configurator.metadata.json +1 -1
- package/esm2015/app/builder.js +477 -477
- package/esm2015/app/components/answers/answer/answer.component.js +66 -61
- package/esm2015/app/components/answers/answers.component.js +40 -37
- package/esm2015/app/components/answers/answers.module.js +28 -28
- package/esm2015/app/components/selections/selections.component.js +128 -108
- package/esm2015/app/components/selections/selections.module.js +22 -22
- package/esm2015/app/components/shared/loader/loader.component.js +12 -12
- package/esm2015/app/components/shared/shared.module.js +20 -20
- package/esm2015/app/directives/visibility-observer-master.directive.js +50 -50
- package/esm2015/app/directives/visibility-observer.directive.js +56 -56
- package/esm2015/app/services/configurator.service.js +94 -94
- package/esm2015/app/services/image-cache.service.js +66 -66
- package/esm2015/app/services/locator.service.js +9 -9
- package/esm2015/colijnit-configurator.js +10 -10
- package/esm2015/helper/variation-helper.js +215 -215
- package/esm2015/model/material.js +10 -10
- package/esm2015/model/variation-settings.js +5 -5
- package/esm2015/model/variation.js +2 -2
- package/esm2015/public_api.js +6 -6
- package/esm2015/utils/asset.utils.js +73 -73
- package/esm2015/utils/file.utils.js +138 -138
- package/esm2015/utils/image.utils.js +51 -51
- package/esm2015/utils/object.utils.js +48 -48
- package/esm2015/utils/scene-utils.js +93 -93
- package/esm2015/utils/threed.utils.js +221 -221
- package/esm2015/utils/variation-utils.js +223 -223
- package/esm5/app/builder.js +591 -591
- package/esm5/app/components/answers/answer/answer.component.js +64 -64
- package/esm5/app/components/answers/answers.component.js +27 -27
- package/esm5/app/components/answers/answers.module.js +31 -31
- package/esm5/app/components/selections/selections.component.js +104 -104
- package/esm5/app/components/selections/selections.module.js +25 -25
- package/esm5/app/components/shared/loader/loader.component.js +15 -15
- package/esm5/app/components/shared/shared.module.js +23 -23
- package/esm5/app/directives/visibility-observer-master.directive.js +63 -63
- package/esm5/app/directives/visibility-observer.directive.js +58 -58
- package/esm5/app/services/configurator.service.js +160 -160
- package/esm5/app/services/image-cache.service.js +69 -69
- package/esm5/app/services/locator.service.js +12 -12
- package/esm5/colijnit-configurator.js +10 -10
- package/esm5/helper/variation-helper.js +267 -267
- package/esm5/model/material.js +12 -12
- package/esm5/model/variation-settings.js +7 -7
- package/esm5/model/variation.js +6 -6
- package/esm5/public_api.js +6 -6
- package/esm5/utils/asset.utils.js +105 -105
- package/esm5/utils/file.utils.js +150 -150
- package/esm5/utils/image.utils.js +55 -55
- package/esm5/utils/object.utils.js +55 -55
- package/esm5/utils/scene-utils.js +97 -97
- package/esm5/utils/threed.utils.js +278 -278
- package/esm5/utils/variation-utils.js +326 -326
- package/fesm2015/colijnit-configurator.js +2016 -1988
- package/fesm2015/colijnit-configurator.js.map +1 -1
- package/fesm5/colijnit-configurator.js +2457 -2457
- package/fesm5/colijnit-configurator.js.map +1 -1
- package/helper/variation-helper.d.ts +14 -14
- package/model/material.d.ts +17 -17
- package/model/variation-settings.d.ts +14 -14
- package/model/variation.d.ts +10 -10
- package/package.json +3 -2
- package/public_api.d.ts +6 -6
- package/utils/asset.utils.d.ts +13 -13
- package/utils/file.utils.d.ts +27 -27
- package/utils/image.utils.d.ts +8 -8
- package/utils/object.utils.d.ts +7 -7
- package/utils/scene-utils.d.ts +7 -7
- package/utils/threed.utils.d.ts +16 -16
- package/utils/variation-utils.d.ts +12 -12
|
@@ -1,224 +1,224 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import * as JSZip from 'jszip';
|
|
3
|
-
import { VariationSettings } from "../model/variation-settings";
|
|
4
|
-
// @dynamic
|
|
5
|
-
export class VariationUtils {
|
|
6
|
-
static LoadVariation(assetPath, fileName) {
|
|
7
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
8
|
-
if (!fileName) {
|
|
9
|
-
return null;
|
|
10
|
-
}
|
|
11
|
-
if (fileName.indexOf('ione3d') < 0) {
|
|
12
|
-
fileName = fileName.concat('.ione3d');
|
|
13
|
-
}
|
|
14
|
-
const id = fileName.substr(0, fileName.lastIndexOf('.ione3d'));
|
|
15
|
-
try {
|
|
16
|
-
if (!assetPath.endsWith('/')) {
|
|
17
|
-
assetPath += '/';
|
|
18
|
-
}
|
|
19
|
-
if (!window.hasOwnProperty('downloadVariation')) {
|
|
20
|
-
console.error('downloadVariation not defined in window global');
|
|
21
|
-
return null;
|
|
22
|
-
}
|
|
23
|
-
const file = yield window.downloadVariation(`${assetPath.replace('https://cdn1.colijn-it.nl/', '')}variation/${fileName}`);
|
|
24
|
-
return yield VariationUtils.GetVariationSettingsFromFile(id, file);
|
|
25
|
-
}
|
|
26
|
-
catch (err) {
|
|
27
|
-
const mute = err;
|
|
28
|
-
return null;
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
// public static GetMaterialFromName(variationFolder: string, material: any): Promise<MeshStandardMaterial> {
|
|
33
|
-
// return new Promise((resolve: Function) => {
|
|
34
|
-
// if (!material) {
|
|
35
|
-
// resolve(null);
|
|
36
|
-
// }
|
|
37
|
-
// if (this.MaterialCache.has(material.name)) {
|
|
38
|
-
// resolve(this.MaterialCache.get(material.name).clone());
|
|
39
|
-
// } else {
|
|
40
|
-
// VariationUtils.LoadVariation(variationFolder, material.name, false).then((settings: VariationSettings) => {
|
|
41
|
-
// if (settings) {
|
|
42
|
-
// AssetUtils.CreateMaterialFromAsset(settings).then((materialObj: Material) => {
|
|
43
|
-
// const materialParams: MeshStandardMaterialParameters = {};
|
|
44
|
-
// materialParams.name = material.name;
|
|
45
|
-
// materialParams.map = materialObj.texture;
|
|
46
|
-
// materialParams.normalMap = materialObj.normal;
|
|
47
|
-
// materialParams.aoMap = materialObj.ao;
|
|
48
|
-
// materialParams.roughnessMap = materialObj.roughness;
|
|
49
|
-
// materialParams.metalnessMap = materialObj.metalness;
|
|
50
|
-
// materialParams.roughness = 1;
|
|
51
|
-
// materialParams.metalness = 1;
|
|
52
|
-
// const pbrMat: MeshStandardMaterial = new MeshStandardMaterial(materialParams);
|
|
53
|
-
// this.MaterialCache.set(material.name, pbrMat);
|
|
54
|
-
// resolve(pbrMat.clone());
|
|
55
|
-
// });
|
|
56
|
-
// } else {
|
|
57
|
-
// resolve(material);
|
|
58
|
-
// }
|
|
59
|
-
// });
|
|
60
|
-
// }
|
|
61
|
-
// });
|
|
62
|
-
// }
|
|
63
|
-
static GetVariationSettingsFromFile(id, compressedFile) {
|
|
64
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
65
|
-
if (!compressedFile) {
|
|
66
|
-
return null;
|
|
67
|
-
}
|
|
68
|
-
const zipContent = yield VariationUtils.GetZipContent(compressedFile);
|
|
69
|
-
const variationSettings = new VariationSettings();
|
|
70
|
-
let index;
|
|
71
|
-
variationSettings.id = id;
|
|
72
|
-
if (zipContent.files['index.json']) {
|
|
73
|
-
const indexFile = yield zipContent.files['index.json'].async('string');
|
|
74
|
-
index = JSON.parse(indexFile);
|
|
75
|
-
}
|
|
76
|
-
if (index) {
|
|
77
|
-
yield VariationUtils.CreateSettingsBasedOnIndex(index, variationSettings, zipContent);
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
yield VariationUtils.CreateSettingsBasedOnFileName(variationSettings, zipContent);
|
|
81
|
-
}
|
|
82
|
-
return variationSettings;
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
static CreateSettingsBasedOnIndex(index, variationSettings, zipContent) {
|
|
86
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
87
|
-
if (index.normalFile) {
|
|
88
|
-
variationSettings.normal = yield VariationUtils.LoadFileContentFromZip(zipContent.files[index.normalFile], index.normalFile);
|
|
89
|
-
variationSettings.normalFilename = index.normalFile;
|
|
90
|
-
}
|
|
91
|
-
if (index.aoFile) {
|
|
92
|
-
variationSettings.ao = yield VariationUtils.LoadFileContentFromZip(zipContent.files[index.aoFile], index.aoFile);
|
|
93
|
-
variationSettings.aoFilename = index.aoFile;
|
|
94
|
-
}
|
|
95
|
-
if (index.metalnessFile) {
|
|
96
|
-
variationSettings.metalness = yield VariationUtils.LoadFileContentFromZip(zipContent.files[index.metalnessFile], index.metalnessFile);
|
|
97
|
-
variationSettings.metalnessFilename = index.metalnessFile;
|
|
98
|
-
}
|
|
99
|
-
if (index.roughnessFile) {
|
|
100
|
-
variationSettings.roughness = yield VariationUtils.LoadFileContentFromZip(zipContent.files[index.roughnessFile], index.roughnessFile);
|
|
101
|
-
variationSettings.roughnessFilename = index.roughnessFile;
|
|
102
|
-
}
|
|
103
|
-
if (index.diffuseFile) {
|
|
104
|
-
variationSettings.texture = yield VariationUtils.LoadFileContentFromZip(zipContent.files[index.diffuseFile], index.diffuseFile);
|
|
105
|
-
variationSettings.textureFilename = index.diffuseFile;
|
|
106
|
-
}
|
|
107
|
-
variationSettings.settings =
|
|
108
|
-
(yield VariationUtils.LoadFileContentFromZip(zipContent.files['repeat.json'], 'repeat.json', false)) || {};
|
|
109
|
-
Object.assign(variationSettings.settings, index.repeat);
|
|
110
|
-
variationSettings.settings.metalness = index.metalness;
|
|
111
|
-
variationSettings.settings.roughness = index.roughness;
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
static CreateSettingsBasedOnFileName(variationSettings, zipContent) {
|
|
115
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
116
|
-
const allLoaded = [];
|
|
117
|
-
for (const fileName in zipContent.files) {
|
|
118
|
-
if (zipContent.files[fileName]) {
|
|
119
|
-
const file = yield zipContent.files[fileName];
|
|
120
|
-
if (file.name.toLowerCase().indexOf('normal') > -1 && this.FileIsImage(file.name)) {
|
|
121
|
-
allLoaded.push(zipContent.files[fileName].async('base64').then((normalFile) => {
|
|
122
|
-
variationSettings.normal = `data:image/${this.GetBase64FileType(file.name)};base64,${normalFile}`;
|
|
123
|
-
variationSettings.normalFilename = fileName;
|
|
124
|
-
}));
|
|
125
|
-
}
|
|
126
|
-
else if (file.name.toLowerCase().indexOf('ao') > -1 && this.FileIsImage(file.name)) {
|
|
127
|
-
allLoaded.push(zipContent.files[fileName].async('base64').then((aoFile) => {
|
|
128
|
-
variationSettings.ao = `data:image/${this.GetBase64FileType(file.name)};base64,${aoFile}`;
|
|
129
|
-
variationSettings.aoFilename = fileName;
|
|
130
|
-
}));
|
|
131
|
-
}
|
|
132
|
-
else if (file.name.toLowerCase().indexOf('metalness') > -1 && this.FileIsImage(file.name)) {
|
|
133
|
-
allLoaded.push(zipContent.files[fileName].async('base64').then((metalnessFile) => {
|
|
134
|
-
variationSettings.metalness = `data:image/${this.GetBase64FileType(file.name)};base64,${metalnessFile}`;
|
|
135
|
-
variationSettings.metalnessFilename = fileName;
|
|
136
|
-
}));
|
|
137
|
-
}
|
|
138
|
-
else if (file.name.toLowerCase().indexOf('roughness') > -1 && this.FileIsImage(file.name)) {
|
|
139
|
-
allLoaded.push(zipContent.files[fileName].async('base64').then((roughnessFile) => {
|
|
140
|
-
variationSettings.roughness = `data:image/${this.GetBase64FileType(file.name)};base64,${roughnessFile}`;
|
|
141
|
-
variationSettings.roughnessFilename = fileName;
|
|
142
|
-
}));
|
|
143
|
-
}
|
|
144
|
-
else if (file.name.toLowerCase().indexOf('diffuse') > -1 && this.FileIsImage(file.name)) {
|
|
145
|
-
allLoaded.push(zipContent.files[fileName].async('base64').then((diffuseFile) => {
|
|
146
|
-
variationSettings.texture = `data:image/${this.GetBase64FileType(file.name)};base64,${diffuseFile}`;
|
|
147
|
-
variationSettings.textureFilename = fileName;
|
|
148
|
-
}));
|
|
149
|
-
}
|
|
150
|
-
else if (file.name.indexOf('.jp') > -1) {
|
|
151
|
-
allLoaded.push(zipContent.files[fileName].async('base64').then((textureFile) => {
|
|
152
|
-
variationSettings.texture = 'data:image/jpeg;base64,' + textureFile;
|
|
153
|
-
variationSettings.textureFilename = fileName;
|
|
154
|
-
}));
|
|
155
|
-
}
|
|
156
|
-
else if (file.name.indexOf('.json') > -1) {
|
|
157
|
-
allLoaded.push(zipContent.files[fileName].async('string').then((settingsFile) => {
|
|
158
|
-
const settingsFileObj = JSON.parse(settingsFile);
|
|
159
|
-
for (const key in settingsFileObj) {
|
|
160
|
-
if (settingsFileObj[key]) {
|
|
161
|
-
variationSettings.settings[key] = settingsFileObj[key];
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}));
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
yield Promise.all(allLoaded);
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
static LoadFileContentFromZip(zip, fileName, base64 = true) {
|
|
172
|
-
return new Promise((resolve) => {
|
|
173
|
-
if (zip && fileName) {
|
|
174
|
-
zip.async(base64 ? 'base64' : 'string').then((fileContent) => {
|
|
175
|
-
if (base64) {
|
|
176
|
-
resolve(`data:image/${this.GetBase64FileType(fileName)};base64,${fileContent}`);
|
|
177
|
-
}
|
|
178
|
-
else {
|
|
179
|
-
resolve(fileContent);
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
else {
|
|
184
|
-
resolve(undefined);
|
|
185
|
-
}
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
static FileIsImage(fileName) {
|
|
189
|
-
const ext = fileName.substring(fileName.lastIndexOf('.') + 1, fileName.length).toLowerCase();
|
|
190
|
-
switch (ext) {
|
|
191
|
-
case 'jpg':
|
|
192
|
-
case 'jpeg':
|
|
193
|
-
case 'png':
|
|
194
|
-
case 'bmp':
|
|
195
|
-
return true;
|
|
196
|
-
default:
|
|
197
|
-
return false;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
static GetBase64FileType(fileName) {
|
|
201
|
-
const ext = fileName.substring(fileName.lastIndexOf('.') + 1, fileName.length).toLowerCase();
|
|
202
|
-
switch (ext) {
|
|
203
|
-
case 'jpg':
|
|
204
|
-
case 'jpeg':
|
|
205
|
-
return 'jpeg';
|
|
206
|
-
case 'png':
|
|
207
|
-
return 'png';
|
|
208
|
-
case 'bmp':
|
|
209
|
-
return 'bmp';
|
|
210
|
-
default:
|
|
211
|
-
return 'jpeg';
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
// Get the content
|
|
215
|
-
static GetZipContent(file) {
|
|
216
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
217
|
-
const jszip = new JSZip();
|
|
218
|
-
const content = yield jszip.loadAsync(file);
|
|
219
|
-
return content;
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
VariationUtils.MaterialCache = new Map();
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import * as JSZip from 'jszip';
|
|
3
|
+
import { VariationSettings } from "../model/variation-settings";
|
|
4
|
+
// @dynamic
|
|
5
|
+
export class VariationUtils {
|
|
6
|
+
static LoadVariation(assetPath, fileName) {
|
|
7
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
8
|
+
if (!fileName) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
if (fileName.indexOf('ione3d') < 0) {
|
|
12
|
+
fileName = fileName.concat('.ione3d');
|
|
13
|
+
}
|
|
14
|
+
const id = fileName.substr(0, fileName.lastIndexOf('.ione3d'));
|
|
15
|
+
try {
|
|
16
|
+
if (!assetPath.endsWith('/')) {
|
|
17
|
+
assetPath += '/';
|
|
18
|
+
}
|
|
19
|
+
if (!window.hasOwnProperty('downloadVariation')) {
|
|
20
|
+
console.error('downloadVariation not defined in window global');
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const file = yield window.downloadVariation(`${assetPath.replace('https://cdn1.colijn-it.nl/', '')}variation/${fileName}`);
|
|
24
|
+
return yield VariationUtils.GetVariationSettingsFromFile(id, file);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
const mute = err;
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
// public static GetMaterialFromName(variationFolder: string, material: any): Promise<MeshStandardMaterial> {
|
|
33
|
+
// return new Promise((resolve: Function) => {
|
|
34
|
+
// if (!material) {
|
|
35
|
+
// resolve(null);
|
|
36
|
+
// }
|
|
37
|
+
// if (this.MaterialCache.has(material.name)) {
|
|
38
|
+
// resolve(this.MaterialCache.get(material.name).clone());
|
|
39
|
+
// } else {
|
|
40
|
+
// VariationUtils.LoadVariation(variationFolder, material.name, false).then((settings: VariationSettings) => {
|
|
41
|
+
// if (settings) {
|
|
42
|
+
// AssetUtils.CreateMaterialFromAsset(settings).then((materialObj: Material) => {
|
|
43
|
+
// const materialParams: MeshStandardMaterialParameters = {};
|
|
44
|
+
// materialParams.name = material.name;
|
|
45
|
+
// materialParams.map = materialObj.texture;
|
|
46
|
+
// materialParams.normalMap = materialObj.normal;
|
|
47
|
+
// materialParams.aoMap = materialObj.ao;
|
|
48
|
+
// materialParams.roughnessMap = materialObj.roughness;
|
|
49
|
+
// materialParams.metalnessMap = materialObj.metalness;
|
|
50
|
+
// materialParams.roughness = 1;
|
|
51
|
+
// materialParams.metalness = 1;
|
|
52
|
+
// const pbrMat: MeshStandardMaterial = new MeshStandardMaterial(materialParams);
|
|
53
|
+
// this.MaterialCache.set(material.name, pbrMat);
|
|
54
|
+
// resolve(pbrMat.clone());
|
|
55
|
+
// });
|
|
56
|
+
// } else {
|
|
57
|
+
// resolve(material);
|
|
58
|
+
// }
|
|
59
|
+
// });
|
|
60
|
+
// }
|
|
61
|
+
// });
|
|
62
|
+
// }
|
|
63
|
+
static GetVariationSettingsFromFile(id, compressedFile) {
|
|
64
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
65
|
+
if (!compressedFile) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
const zipContent = yield VariationUtils.GetZipContent(compressedFile);
|
|
69
|
+
const variationSettings = new VariationSettings();
|
|
70
|
+
let index;
|
|
71
|
+
variationSettings.id = id;
|
|
72
|
+
if (zipContent.files['index.json']) {
|
|
73
|
+
const indexFile = yield zipContent.files['index.json'].async('string');
|
|
74
|
+
index = JSON.parse(indexFile);
|
|
75
|
+
}
|
|
76
|
+
if (index) {
|
|
77
|
+
yield VariationUtils.CreateSettingsBasedOnIndex(index, variationSettings, zipContent);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
yield VariationUtils.CreateSettingsBasedOnFileName(variationSettings, zipContent);
|
|
81
|
+
}
|
|
82
|
+
return variationSettings;
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
static CreateSettingsBasedOnIndex(index, variationSettings, zipContent) {
|
|
86
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
87
|
+
if (index.normalFile) {
|
|
88
|
+
variationSettings.normal = yield VariationUtils.LoadFileContentFromZip(zipContent.files[index.normalFile], index.normalFile);
|
|
89
|
+
variationSettings.normalFilename = index.normalFile;
|
|
90
|
+
}
|
|
91
|
+
if (index.aoFile) {
|
|
92
|
+
variationSettings.ao = yield VariationUtils.LoadFileContentFromZip(zipContent.files[index.aoFile], index.aoFile);
|
|
93
|
+
variationSettings.aoFilename = index.aoFile;
|
|
94
|
+
}
|
|
95
|
+
if (index.metalnessFile) {
|
|
96
|
+
variationSettings.metalness = yield VariationUtils.LoadFileContentFromZip(zipContent.files[index.metalnessFile], index.metalnessFile);
|
|
97
|
+
variationSettings.metalnessFilename = index.metalnessFile;
|
|
98
|
+
}
|
|
99
|
+
if (index.roughnessFile) {
|
|
100
|
+
variationSettings.roughness = yield VariationUtils.LoadFileContentFromZip(zipContent.files[index.roughnessFile], index.roughnessFile);
|
|
101
|
+
variationSettings.roughnessFilename = index.roughnessFile;
|
|
102
|
+
}
|
|
103
|
+
if (index.diffuseFile) {
|
|
104
|
+
variationSettings.texture = yield VariationUtils.LoadFileContentFromZip(zipContent.files[index.diffuseFile], index.diffuseFile);
|
|
105
|
+
variationSettings.textureFilename = index.diffuseFile;
|
|
106
|
+
}
|
|
107
|
+
variationSettings.settings =
|
|
108
|
+
(yield VariationUtils.LoadFileContentFromZip(zipContent.files['repeat.json'], 'repeat.json', false)) || {};
|
|
109
|
+
Object.assign(variationSettings.settings, index.repeat);
|
|
110
|
+
variationSettings.settings.metalness = index.metalness;
|
|
111
|
+
variationSettings.settings.roughness = index.roughness;
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
static CreateSettingsBasedOnFileName(variationSettings, zipContent) {
|
|
115
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
116
|
+
const allLoaded = [];
|
|
117
|
+
for (const fileName in zipContent.files) {
|
|
118
|
+
if (zipContent.files[fileName]) {
|
|
119
|
+
const file = yield zipContent.files[fileName];
|
|
120
|
+
if (file.name.toLowerCase().indexOf('normal') > -1 && this.FileIsImage(file.name)) {
|
|
121
|
+
allLoaded.push(zipContent.files[fileName].async('base64').then((normalFile) => {
|
|
122
|
+
variationSettings.normal = `data:image/${this.GetBase64FileType(file.name)};base64,${normalFile}`;
|
|
123
|
+
variationSettings.normalFilename = fileName;
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
else if (file.name.toLowerCase().indexOf('ao') > -1 && this.FileIsImage(file.name)) {
|
|
127
|
+
allLoaded.push(zipContent.files[fileName].async('base64').then((aoFile) => {
|
|
128
|
+
variationSettings.ao = `data:image/${this.GetBase64FileType(file.name)};base64,${aoFile}`;
|
|
129
|
+
variationSettings.aoFilename = fileName;
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
else if (file.name.toLowerCase().indexOf('metalness') > -1 && this.FileIsImage(file.name)) {
|
|
133
|
+
allLoaded.push(zipContent.files[fileName].async('base64').then((metalnessFile) => {
|
|
134
|
+
variationSettings.metalness = `data:image/${this.GetBase64FileType(file.name)};base64,${metalnessFile}`;
|
|
135
|
+
variationSettings.metalnessFilename = fileName;
|
|
136
|
+
}));
|
|
137
|
+
}
|
|
138
|
+
else if (file.name.toLowerCase().indexOf('roughness') > -1 && this.FileIsImage(file.name)) {
|
|
139
|
+
allLoaded.push(zipContent.files[fileName].async('base64').then((roughnessFile) => {
|
|
140
|
+
variationSettings.roughness = `data:image/${this.GetBase64FileType(file.name)};base64,${roughnessFile}`;
|
|
141
|
+
variationSettings.roughnessFilename = fileName;
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
else if (file.name.toLowerCase().indexOf('diffuse') > -1 && this.FileIsImage(file.name)) {
|
|
145
|
+
allLoaded.push(zipContent.files[fileName].async('base64').then((diffuseFile) => {
|
|
146
|
+
variationSettings.texture = `data:image/${this.GetBase64FileType(file.name)};base64,${diffuseFile}`;
|
|
147
|
+
variationSettings.textureFilename = fileName;
|
|
148
|
+
}));
|
|
149
|
+
}
|
|
150
|
+
else if (file.name.indexOf('.jp') > -1) {
|
|
151
|
+
allLoaded.push(zipContent.files[fileName].async('base64').then((textureFile) => {
|
|
152
|
+
variationSettings.texture = 'data:image/jpeg;base64,' + textureFile;
|
|
153
|
+
variationSettings.textureFilename = fileName;
|
|
154
|
+
}));
|
|
155
|
+
}
|
|
156
|
+
else if (file.name.indexOf('.json') > -1) {
|
|
157
|
+
allLoaded.push(zipContent.files[fileName].async('string').then((settingsFile) => {
|
|
158
|
+
const settingsFileObj = JSON.parse(settingsFile);
|
|
159
|
+
for (const key in settingsFileObj) {
|
|
160
|
+
if (settingsFileObj[key]) {
|
|
161
|
+
variationSettings.settings[key] = settingsFileObj[key];
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
yield Promise.all(allLoaded);
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
static LoadFileContentFromZip(zip, fileName, base64 = true) {
|
|
172
|
+
return new Promise((resolve) => {
|
|
173
|
+
if (zip && fileName) {
|
|
174
|
+
zip.async(base64 ? 'base64' : 'string').then((fileContent) => {
|
|
175
|
+
if (base64) {
|
|
176
|
+
resolve(`data:image/${this.GetBase64FileType(fileName)};base64,${fileContent}`);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
resolve(fileContent);
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
resolve(undefined);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
static FileIsImage(fileName) {
|
|
189
|
+
const ext = fileName.substring(fileName.lastIndexOf('.') + 1, fileName.length).toLowerCase();
|
|
190
|
+
switch (ext) {
|
|
191
|
+
case 'jpg':
|
|
192
|
+
case 'jpeg':
|
|
193
|
+
case 'png':
|
|
194
|
+
case 'bmp':
|
|
195
|
+
return true;
|
|
196
|
+
default:
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
static GetBase64FileType(fileName) {
|
|
201
|
+
const ext = fileName.substring(fileName.lastIndexOf('.') + 1, fileName.length).toLowerCase();
|
|
202
|
+
switch (ext) {
|
|
203
|
+
case 'jpg':
|
|
204
|
+
case 'jpeg':
|
|
205
|
+
return 'jpeg';
|
|
206
|
+
case 'png':
|
|
207
|
+
return 'png';
|
|
208
|
+
case 'bmp':
|
|
209
|
+
return 'bmp';
|
|
210
|
+
default:
|
|
211
|
+
return 'jpeg';
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// Get the content
|
|
215
|
+
static GetZipContent(file) {
|
|
216
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
217
|
+
const jszip = new JSZip();
|
|
218
|
+
const content = yield jszip.loadAsync(file);
|
|
219
|
+
return content;
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
VariationUtils.MaterialCache = new Map();
|
|
224
224
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWF0aW9uLXV0aWxzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvbGlqbml0L2NvbmZpZ3VyYXRvci8iLCJzb3VyY2VzIjpbInV0aWxzL3ZhcmlhdGlvbi11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFHL0IsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFHOUQsV0FBVztBQUNYLE1BQU0sT0FBTyxjQUFjO0lBR2xCLE1BQU0sQ0FBTyxhQUFhLENBQUMsU0FBaUIsRUFBRSxRQUFnQjs7WUFDbkUsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDYixPQUFPLElBQUksQ0FBQzthQUNiO1lBQ0QsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDbEMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDdkM7WUFDRCxNQUFNLEVBQUUsR0FBVyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDdkUsSUFBSTtnQkFDRixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDNUIsU0FBUyxJQUFJLEdBQUcsQ0FBQztpQkFDbEI7Z0JBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsRUFBRTtvQkFDL0MsT0FBTyxDQUFDLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO29CQUNoRSxPQUFPLElBQUksQ0FBQztpQkFDYjtnQkFDRCxNQUFNLElBQUksR0FBUSxNQUFPLE1BQWMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxDQUFDLGFBQWEsUUFBUSxFQUFFLENBQUMsQ0FBQztn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bXBvcnQgKiBhcyBKU1ppcCBmcm9tICdqc3ppcCc7XHJcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtGaWxlVXRpbHN9IGZyb20gXCIuL2ZpbGUudXRpbHNcIjtcclxuaW1wb3J0IHtWYXJpYXRpb25TZXR0aW5nc30gZnJvbSBcIi4uL21vZGVsL3ZhcmlhdGlvbi1zZXR0aW5nc1wiO1xyXG5pbXBvcnQgYXhpb3MgZnJvbSBcImF4aW9zXCI7XHJcblxyXG4vLyBAZHluYW1pY1xyXG5leHBvcnQgY2xhc3MgVmFyaWF0aW9uVXRpbHMge1xyXG4gIHByaXZhdGUgc3RhdGljIE1hdGVyaWFsQ2FjaGU6IE1hcDxzdHJpbmcsIFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgcHVibGljIHN0YXRpYyBhc3luYyBMb2FkVmFyaWF0aW9uKGFzc2V0UGF0aDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxWYXJpYXRpb25TZXR0aW5ncz4ge1xyXG4gICAgaWYgKCFmaWxlTmFtZSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGlmIChmaWxlTmFtZS5pbmRleE9mKCdpb25lM2QnKSA8IDApIHtcclxuICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5jb25jYXQoJy5pb25lM2QnKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGlkOiBzdHJpbmcgPSBmaWxlTmFtZS5zdWJzdHIoMCwgZmlsZU5hbWUubGFzdEluZGV4T2YoJy5pb25lM2QnKSk7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoIWFzc2V0UGF0aC5lbmRzV2l0aCgnLycpKSB7XHJcbiAgICAgICAgYXNzZXRQYXRoICs9ICcvJztcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnZG93bmxvYWRWYXJpYXRpb24nKSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2Rvd25sb2FkVmFyaWF0aW9uIG5vdCBkZWZpbmVkIGluIHdpbmRvdyBnbG9iYWwnKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBmaWxlOiBhbnkgPSBhd2FpdCAod2luZG93IGFzIGFueSkuZG93bmxvYWRWYXJpYXRpb24oYCR7YXNzZXRQYXRoLnJlcGxhY2UoJ2h0dHBzOi8vY2RuMS5jb2xpam4taXQubmwvJywgJycpfXZhcmlhdGlvbi8ke2ZpbGVOYW1lfWApO1xyXG4gICAgICByZXR1cm4gYXdhaXQgVmFyaWF0aW9uVXRpbHMuR2V0VmFyaWF0aW9uU2V0dGluZ3NGcm9tRmlsZShpZCwgZmlsZSk7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc3QgbXV0ZSA9IGVycjtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBwdWJsaWMgc3RhdGljIEdldE1hdGVyaWFsRnJvbU5hbWUodmFyaWF0aW9uRm9sZGVyOiBzdHJpbmcsIG1hdGVyaWFsOiBhbnkpOiBQcm9taXNlPE1lc2hTdGFuZGFyZE1hdGVyaWFsPiB7XHJcbiAgLy8gICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uKSA9PiB7XHJcbiAgLy8gICAgIGlmICghbWF0ZXJpYWwpIHtcclxuICAvLyAgICAgICByZXNvbHZlKG51bGwpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGlmICh0aGlzLk1hdGVyaWFsQ2FjaGUuaGFzKG1hdGVyaWFsLm5hbWUpKSB7XHJcbiAgLy8gICAgICAgcmVzb2x2ZSh0aGlzLk1hdGVyaWFsQ2FjaGUuZ2V0KG1hdGVyaWFsLm5hbWUpLmNsb25lKCkpO1xyXG4gIC8vICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgIFZhcmlhdGlvblV0aWxzLkxvYWRWYXJpYXRpb24odmFyaWF0aW9uRm9sZGVyLCBtYXRlcmlhbC5uYW1lLCBmYWxzZSkudGhlbigoc2V0dGluZ3M6IFZhcmlhdGlvblNldHRpbmdzKSA9PiB7XHJcbiAgLy8gICAgICAgICBpZiAoc2V0dGluZ3MpIHtcclxuICAvLyAgICAgICAgICAgQXNzZXRVdGlscy5DcmVhdGVNYXRlcmlhbEZyb21Bc3NldChzZXR0aW5ncykudGhlbigobWF0ZXJpYWxPYmo6IE1hdGVyaWFsKSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgY29uc3QgbWF0ZXJpYWxQYXJhbXM6IE1lc2hTdGFuZGFyZE1hdGVyaWFsUGFyYW1ldGVycyA9IHt9O1xyXG4gIC8vICAgICAgICAgICAgIG1hdGVyaWFsUGFyYW1zLm5hbWUgPSBtYXRlcmlhbC5uYW1lO1xyXG4gIC8vICAgICAgICAgICAgIG1hdGVyaWFsUGFyYW1zLm1hcCA9IG1hdGVyaWFsT2JqLnRleHR1cmU7XHJcbiAgLy8gICAgICAgICAgICAgbWF0ZXJpYWxQYXJhbXMubm9ybWFsTWFwID0gbWF0ZXJpYWxPYmoubm9ybWFsO1xyXG4gIC8vICAgICAgICAgICAgIG1hdGVyaWFsUGFyYW1zLmFvTWFwID0gbWF0ZXJpYWxPYmouYW87XHJcbiAgLy8gICAgICAgICAgICAgbWF0ZXJpYWxQYXJhbXMucm91Z2huZXNzTWFwID0gbWF0ZXJpYWxPYmoucm91Z2huZXNzO1xyXG4gIC8vICAgICAgICAgICAgIG1hdGVyaWFsUGFyYW1zLm1ldGFsbmVzc01hcCA9IG1hdGVyaWFsT2JqLm1ldGFsbmVzcztcclxuICAvLyAgICAgICAgICAgICBtYXRlcmlhbFBhcmFtcy5yb3VnaG5lc3MgPSAxO1xyXG4gIC8vICAgICAgICAgICAgIG1hdGVyaWFsUGFyYW1zLm1ldGFsbmVzcyA9IDE7XHJcbiAgLy8gICAgICAgICAgICAgY29uc3QgcGJyTWF0OiBNZXNoU3RhbmRhcmRNYXRlcmlhbCA9IG5ldyBNZXNoU3RhbmRhcmRNYXRlcmlhbChtYXRlcmlhbFBhcmFtcyk7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5NYXRlcmlhbENhY2hlLnNldChtYXRlcmlhbC5uYW1lLCBwYnJNYXQpO1xyXG4gIC8vICAgICAgICAgICAgIHJlc29sdmUocGJyTWF0LmNsb25lKCkpO1xyXG4gIC8vICAgICAgICAgICB9KTtcclxuICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICAgIHJlc29sdmUobWF0ZXJpYWwpO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9KTtcclxuICAvLyB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIEdldFZhcmlhdGlvblNldHRpbmdzRnJvbUZpbGUoaWQ6IHN0cmluZywgY29tcHJlc3NlZEZpbGU6IGFueSk6IFByb21pc2U8VmFyaWF0aW9uU2V0dGluZ3M+IHtcclxuICAgIGlmICghY29tcHJlc3NlZEZpbGUpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCB6aXBDb250ZW50ID0gYXdhaXQgVmFyaWF0aW9uVXRpbHMuR2V0WmlwQ29udGVudChjb21wcmVzc2VkRmlsZSk7XHJcbiAgICBjb25zdCB2YXJpYXRpb25TZXR0aW5nczogVmFyaWF0aW9uU2V0dGluZ3MgPSBuZXcgVmFyaWF0aW9uU2V0dGluZ3MoKTtcclxuICAgIGxldCBpbmRleDtcclxuICAgIHZhcmlhdGlvblNldHRpbmdzLmlkID0gaWQ7XHJcblxyXG4gICAgaWYgKHppcENvbnRlbnQuZmlsZXNbJ2luZGV4Lmpzb24nXSkge1xyXG4gICAgICBjb25zdCBpbmRleEZpbGU6IHN0cmluZyA9IGF3YWl0IHppcENvbnRlbnQuZmlsZXNbJ2luZGV4Lmpzb24nXS5hc3luYygnc3RyaW5nJyk7XHJcbiAgICAgIGluZGV4ID0gSlNPTi5wYXJzZShpbmRleEZpbGUpO1xyXG4gICAgfVxyXG4gICAgaWYgKGluZGV4KSB7XHJcbiAgICAgIGF3YWl0IFZhcmlhdGlvblV0aWxzLkNyZWF0ZVNldHRpbmdzQmFzZWRPbkluZGV4KGluZGV4LCB2YXJpYXRpb25TZXR0aW5ncywgemlwQ29udGVudCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhd2FpdCBWYXJpYXRpb25VdGlscy5DcmVhdGVTZXR0aW5nc0Jhc2VkT25GaWxlTmFtZSh2YXJpYXRpb25TZXR0aW5ncywgemlwQ29udGVudCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFyaWF0aW9uU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBDcmVhdGVTZXR0aW5nc0Jhc2VkT25JbmRleChpbmRleDogYW55LCB2YXJpYXRpb25TZXR0aW5nczogVmFyaWF0aW9uU2V0dGluZ3MsIHppcENvbnRlbnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGluZGV4Lm5vcm1hbEZpbGUpIHtcclxuICAgICAgdmFyaWF0aW9uU2V0dGluZ3Mubm9ybWFsID0gYXdhaXQgVmFyaWF0aW9uVXRpbHMuTG9hZEZpbGVDb250ZW50RnJvbVppcCh6aXBDb250ZW50LmZpbGVzW2luZGV4Lm5vcm1hbEZpbGVdLCBpbmRleC5ub3JtYWxGaWxlKTtcclxuICAgICAgdmFyaWF0aW9uU2V0dGluZ3Mubm9ybWFsRmlsZW5hbWUgPSBpbmRleC5ub3JtYWxGaWxlO1xyXG4gICAgfVxyXG4gICAgaWYgKGluZGV4LmFvRmlsZSkge1xyXG4gICAgICB2YXJpYXRpb25TZXR0aW5ncy5hbyA9IGF3YWl0IFZhcmlhdGlvblV0aWxzLkxvYWRGaWxlQ29udGVudEZyb21aaXAoemlwQ29udGVudC5maWxlc1tpbmRleC5hb0ZpbGVdLCBpbmRleC5hb0ZpbGUpO1xyXG4gICAgICB2YXJpYXRpb25TZXR0aW5ncy5hb0ZpbGVuYW1lID0gaW5kZXguYW9GaWxlO1xyXG4gICAgfVxyXG4gICAgaWYgKGluZGV4Lm1ldGFsbmVzc0ZpbGUpIHtcclxuICAgICAgdmFyaWF0aW9uU2V0dGluZ3MubWV0YWxuZXNzID0gYXdhaXQgVmFyaWF0aW9uVXRpbHMuTG9hZEZpbGVDb250ZW50RnJvbVppcCh6aXBDb250ZW50LmZpbGVzW2luZGV4Lm1ldGFsbmVzc0ZpbGVdLCBpbmRleC5tZXRhbG5lc3NGaWxlKTtcclxuICAgICAgdmFyaWF0aW9uU2V0dGluZ3MubWV0YWxuZXNzRmlsZW5hbWUgPSBpbmRleC5tZXRhbG5lc3NGaWxlO1xyXG4gICAgfVxyXG4gICAgaWYgKGluZGV4LnJvdWdobmVzc0ZpbGUpIHtcclxuICAgICAgdmFyaWF0aW9uU2V0dGluZ3Mucm91Z2huZXNzID0gYXdhaXQgVmFyaWF0aW9uVXRpbHMuTG9hZEZpbGVDb250ZW50RnJvbVppcCh6aXBDb250ZW50LmZpbGVzW2luZGV4LnJvdWdobmVzc0ZpbGVdLCBpbmRleC5yb3VnaG5lc3NGaWxlKTtcclxuICAgICAgdmFyaWF0aW9uU2V0dGluZ3Mucm91Z2huZXNzRmlsZW5hbWUgPSBpbmRleC5yb3VnaG5lc3NGaWxlO1xyXG4gICAgfVxyXG4gICAgaWYgKGluZGV4LmRpZmZ1c2VGaWxlKSB7XHJcbiAgICAgIHZhcmlhdGlvblNldHRpbmdzLnRleHR1cmUgPSBhd2FpdCBWYXJpYXRpb25VdGlscy5Mb2FkRmlsZUNvbnRlbnRGcm9tWmlwKHppcENvbnRlbnQuZmlsZXNbaW5kZXguZGlmZnVzZUZpbGVdLCBpbmRleC5kaWZmdXNlRmlsZSk7XHJcbiAgICAgIHZhcmlhdGlvblNldHRpbmdzLnRleHR1cmVGaWxlbmFtZSA9IGluZGV4LmRpZmZ1c2VGaWxlO1xyXG4gICAgfVxyXG4gICAgdmFyaWF0aW9uU2V0dGluZ3Muc2V0dGluZ3MgPVxyXG4gICAgICBhd2FpdCBWYXJpYXRpb25VdGlscy5Mb2FkRmlsZUNvbnRlbnRGcm9tWmlwKHppcENvbnRlbnQuZmlsZXNbJ3JlcGVhdC5qc29uJ10sICdyZXBlYXQuanNvbicsIGZhbHNlKSB8fCB7fTtcclxuICAgIE9iamVjdC5hc3NpZ24odmFyaWF0aW9uU2V0dGluZ3Muc2V0dGluZ3MsIGluZGV4LnJlcGVhdCk7XHJcbiAgICB2YXJpYXRpb25TZXR0aW5ncy5zZXR0aW5ncy5tZXRhbG5lc3MgPSBpbmRleC5tZXRhbG5lc3M7XHJcbiAgICB2YXJpYXRpb25TZXR0aW5ncy5zZXR0aW5ncy5yb3VnaG5lc3MgPSBpbmRleC5yb3VnaG5lc3M7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBDcmVhdGVTZXR0aW5nc0Jhc2VkT25GaWxlTmFtZSh2YXJpYXRpb25TZXR0aW5nczogVmFyaWF0aW9uU2V0dGluZ3MsIHppcENvbnRlbnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYWxsTG9hZGVkOiBQcm9taXNlPFZhcmlhdGlvblNldHRpbmdzPltdID0gW107XHJcbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIGluIHppcENvbnRlbnQuZmlsZXMpIHtcclxuICAgICAgaWYgKHppcENvbnRlbnQuZmlsZXNbZmlsZU5hbWVdKSB7XHJcbiAgICAgICAgY29uc3QgZmlsZTogYW55ID0gYXdhaXQgemlwQ29udGVudC5maWxlc1tmaWxlTmFtZV07XHJcbiAgICAgICAgaWYgKGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ25vcm1hbCcpID4gLTEgJiYgdGhpcy5GaWxlSXNJbWFnZShmaWxlLm5hbWUpKSB7XHJcbiAgICAgICAgICBhbGxMb2FkZWQucHVzaCh6aXBDb250ZW50LmZpbGVzW2ZpbGVOYW1lXS5hc3luYygnYmFzZTY0JykudGhlbigobm9ybWFsRmlsZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLm5vcm1hbCA9IGBkYXRhOmltYWdlLyR7dGhpcy5HZXRCYXNlNjRGaWxlVHlwZShmaWxlLm5hbWUpfTtiYXNlNjQsJHtub3JtYWxGaWxlfWA7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLm5vcm1hbEZpbGVuYW1lID0gZmlsZU5hbWU7XHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChmaWxlLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdhbycpID4gLTEgJiYgdGhpcy5GaWxlSXNJbWFnZShmaWxlLm5hbWUpKSB7XHJcbiAgICAgICAgICBhbGxMb2FkZWQucHVzaCh6aXBDb250ZW50LmZpbGVzW2ZpbGVOYW1lXS5hc3luYygnYmFzZTY0JykudGhlbigoYW9GaWxlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdmFyaWF0aW9uU2V0dGluZ3MuYW8gPSBgZGF0YTppbWFnZS8ke3RoaXMuR2V0QmFzZTY0RmlsZVR5cGUoZmlsZS5uYW1lKX07YmFzZTY0LCR7YW9GaWxlfWA7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLmFvRmlsZW5hbWUgPSBmaWxlTmFtZTtcclxuICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ21ldGFsbmVzcycpID4gLTEgJiYgdGhpcy5GaWxlSXNJbWFnZShmaWxlLm5hbWUpKSB7XHJcbiAgICAgICAgICBhbGxMb2FkZWQucHVzaCh6aXBDb250ZW50LmZpbGVzW2ZpbGVOYW1lXS5hc3luYygnYmFzZTY0JykudGhlbigobWV0YWxuZXNzRmlsZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLm1ldGFsbmVzcyA9IGBkYXRhOmltYWdlLyR7dGhpcy5HZXRCYXNlNjRGaWxlVHlwZShmaWxlLm5hbWUpfTtiYXNlNjQsJHttZXRhbG5lc3NGaWxlfWA7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLm1ldGFsbmVzc0ZpbGVuYW1lID0gZmlsZU5hbWU7XHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChmaWxlLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdyb3VnaG5lc3MnKSA+IC0xICYmIHRoaXMuRmlsZUlzSW1hZ2UoZmlsZS5uYW1lKSkge1xyXG4gICAgICAgICAgYWxsTG9hZGVkLnB1c2goemlwQ29udGVudC5maWxlc1tmaWxlTmFtZV0uYXN5bmMoJ2Jhc2U2NCcpLnRoZW4oKHJvdWdobmVzc0ZpbGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICB2YXJpYXRpb25TZXR0aW5ncy5yb3VnaG5lc3MgPSBgZGF0YTppbWFnZS8ke3RoaXMuR2V0QmFzZTY0RmlsZVR5cGUoZmlsZS5uYW1lKX07YmFzZTY0LCR7cm91Z2huZXNzRmlsZX1gO1xyXG4gICAgICAgICAgICB2YXJpYXRpb25TZXR0aW5ncy5yb3VnaG5lc3NGaWxlbmFtZSA9IGZpbGVOYW1lO1xyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZmlsZS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignZGlmZnVzZScpID4gLTEgJiYgdGhpcy5GaWxlSXNJbWFnZShmaWxlLm5hbWUpKSB7XHJcbiAgICAgICAgICBhbGxMb2FkZWQucHVzaCh6aXBDb250ZW50LmZpbGVzW2ZpbGVOYW1lXS5hc3luYygnYmFzZTY0JykudGhlbigoZGlmZnVzZUZpbGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICB2YXJpYXRpb25TZXR0aW5ncy50ZXh0dXJlID0gYGRhdGE6aW1hZ2UvJHt0aGlzLkdldEJhc2U2NEZpbGVUeXBlKGZpbGUubmFtZSl9O2Jhc2U2NCwke2RpZmZ1c2VGaWxlfWA7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLnRleHR1cmVGaWxlbmFtZSA9IGZpbGVOYW1lO1xyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZmlsZS5uYW1lLmluZGV4T2YoJy5qcCcpID4gLTEpIHtcclxuICAgICAgICAgIGFsbExvYWRlZC5wdXNoKHppcENvbnRlbnQuZmlsZXNbZmlsZU5hbWVdLmFzeW5jKCdiYXNlNjQnKS50aGVuKCh0ZXh0dXJlRmlsZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLnRleHR1cmUgPSAnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwnICsgdGV4dHVyZUZpbGU7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLnRleHR1cmVGaWxlbmFtZSA9IGZpbGVOYW1lO1xyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZmlsZS5uYW1lLmluZGV4T2YoJy5qc29uJykgPiAtMSkge1xyXG4gICAgICAgICAgYWxsTG9hZGVkLnB1c2goemlwQ29udGVudC5maWxlc1tmaWxlTmFtZV0uYXN5bmMoJ3N0cmluZycpLnRoZW4oKHNldHRpbmdzRmlsZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzRmlsZU9iaiA9IEpTT04ucGFyc2Uoc2V0dGluZ3NGaWxlKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc2V0dGluZ3NGaWxlT2JqKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHNldHRpbmdzRmlsZU9ialtrZXldKSB7XHJcbiAgICAgICAgICAgICAgICB2YXJpYXRpb25TZXR0aW5ncy5zZXR0aW5nc1trZXldID0gc2V0dGluZ3NGaWxlT2JqW2tleV07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChhbGxMb2FkZWQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgTG9hZEZpbGVDb250ZW50RnJvbVppcCh6aXA6IGFueSwgZmlsZU5hbWU6IHN0cmluZywgYmFzZTY0OiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uKSA9PiB7XHJcbiAgICAgIGlmICh6aXAgJiYgZmlsZU5hbWUpIHtcclxuICAgICAgICB6aXAuYXN5bmMoYmFzZTY0ID8gJ2Jhc2U2NCcgOiAnc3RyaW5nJykudGhlbigoZmlsZUNvbnRlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGJhc2U2NCkge1xyXG4gICAgICAgICAgICByZXNvbHZlKGBkYXRhOmltYWdlLyR7dGhpcy5HZXRCYXNlNjRGaWxlVHlwZShmaWxlTmFtZSl9O2Jhc2U2NCwke2ZpbGVDb250ZW50fWApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVzb2x2ZShmaWxlQ29udGVudCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIEZpbGVJc0ltYWdlKGZpbGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGV4dDogc3RyaW5nID0gZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxLCBmaWxlTmFtZS5sZW5ndGgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBzd2l0Y2ggKGV4dCkge1xyXG4gICAgICBjYXNlICdqcGcnOlxyXG4gICAgICBjYXNlICdqcGVnJzpcclxuICAgICAgY2FzZSAncG5nJzpcclxuICAgICAgY2FzZSAnYm1wJzpcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBHZXRCYXNlNjRGaWxlVHlwZShmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGV4dDogc3RyaW5nID0gZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxLCBmaWxlTmFtZS5sZW5ndGgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBzd2l0Y2ggKGV4dCkge1xyXG4gICAgICBjYXNlICdqcGcnOlxyXG4gICAgICBjYXNlICdqcGVnJzpcclxuICAgICAgICByZXR1cm4gJ2pwZWcnO1xyXG4gICAgICBjYXNlICdwbmcnOlxyXG4gICAgICAgIHJldHVybiAncG5nJztcclxuICAgICAgY2FzZSAnYm1wJzpcclxuICAgICAgICByZXR1cm4gJ2JtcCc7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICdqcGVnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEdldCB0aGUgY29udGVudFxyXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIEdldFppcENvbnRlbnQoZmlsZSk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBqc3ppcCA9IG5ldyBKU1ppcCgpO1xyXG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGpzemlwLmxvYWRBc3luYyhmaWxlKTtcclxuICAgIHJldHVybiBjb250ZW50O1xyXG4gIH1cclxufVxyXG4iXX0=
|