stream-chat-angular 5.3.2 → 5.4.1
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/assets/i18n/en.d.ts +4 -0
- package/assets/version.d.ts +1 -1
- package/esm2020/assets/i18n/en.mjs +5 -1
- package/esm2020/assets/version.mjs +2 -2
- package/esm2020/lib/attachment-list/attachment-list.component.mjs +4 -4
- package/esm2020/lib/attachment-preview-list/attachment-preview-list.component.mjs +5 -5
- package/esm2020/lib/attachment.service.mjs +60 -10
- package/esm2020/lib/channel-list/channel-list.component.mjs +3 -3
- package/esm2020/lib/channel-preview/channel-preview.component.mjs +1 -1
- package/esm2020/lib/file-utils.mjs +35 -0
- package/esm2020/lib/format-duration.mjs +16 -0
- package/esm2020/lib/icon/icon-placeholder/icon-placeholder.component.mjs +28 -0
- package/esm2020/lib/icon/icon.component.mjs +1 -1
- package/esm2020/lib/icon/icon.module.mjs +37 -0
- package/esm2020/lib/{loading-indicator → icon/loading-indicator}/loading-indicator.component.mjs +1 -1
- package/esm2020/lib/{loading-indicator-placeholder → icon/loading-indicator-placeholder}/loading-indicator-placeholder.component.mjs +2 -2
- package/esm2020/lib/is-safari.mjs +2 -0
- package/esm2020/lib/message/message.component.mjs +6 -6
- package/esm2020/lib/message-input/message-input-config.service.mjs +6 -1
- package/esm2020/lib/message-input/message-input.component.mjs +57 -14
- package/esm2020/lib/message-input/voice-recorder.service.mjs +27 -0
- package/esm2020/lib/message-list/message-list.component.mjs +9 -9
- package/esm2020/lib/modal/modal.component.mjs +1 -1
- package/esm2020/lib/paginated-list/paginated-list.component.mjs +1 -1
- package/esm2020/lib/stream-chat.module.mjs +21 -35
- package/esm2020/lib/thread/thread.component.mjs +1 -1
- package/esm2020/lib/types.mjs +1 -1
- package/esm2020/lib/voice-recorder/amplitude-recorder.service.mjs +119 -0
- package/esm2020/lib/voice-recorder/audio-recorder.service.mjs +79 -0
- package/esm2020/lib/voice-recorder/media-recorder.mjs +190 -0
- package/esm2020/lib/voice-recorder/mp3-transcoder.mjs +61 -0
- package/esm2020/lib/voice-recorder/transcoder.service.mjs +121 -0
- package/esm2020/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.mjs +35 -0
- package/esm2020/lib/voice-recorder/voice-recorder.component.mjs +80 -0
- package/esm2020/lib/voice-recorder/voice-recorder.module.mjs +34 -0
- package/esm2020/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +4 -75
- package/esm2020/lib/voice-recording/voice-recording.component.mjs +4 -15
- package/esm2020/lib/voice-recording/voice-recording.module.mjs +21 -0
- package/esm2020/lib/wave-form-sampler.mjs +72 -0
- package/esm2020/public-api.mjs +18 -5
- package/fesm2015/stream-chat-angular.mjs +1055 -145
- package/fesm2015/stream-chat-angular.mjs.map +1 -1
- package/fesm2020/stream-chat-angular.mjs +1006 -140
- package/fesm2020/stream-chat-angular.mjs.map +1 -1
- package/lib/attachment.service.d.ts +7 -1
- package/lib/file-utils.d.ts +9 -0
- package/lib/format-duration.d.ts +1 -0
- package/lib/{icon-placeholder → icon/icon-placeholder}/icon-placeholder.component.d.ts +3 -3
- package/lib/icon/icon.component.d.ts +1 -1
- package/lib/icon/icon.module.d.ts +11 -0
- package/lib/{loading-indicator-placeholder → icon/loading-indicator-placeholder}/loading-indicator-placeholder.component.d.ts +1 -1
- package/lib/is-safari.d.ts +1 -0
- package/lib/message-input/message-input-config.service.d.ts +5 -0
- package/lib/message-input/message-input.component.d.ts +19 -5
- package/lib/message-input/voice-recorder.service.d.ts +19 -0
- package/lib/message-list/message-list.component.d.ts +0 -1
- package/lib/stream-chat.module.d.ts +20 -24
- package/lib/types.d.ts +11 -1
- package/lib/voice-recorder/amplitude-recorder.service.d.ts +71 -0
- package/lib/voice-recorder/audio-recorder.service.d.ts +46 -0
- package/lib/voice-recorder/media-recorder.d.ts +46 -0
- package/lib/voice-recorder/mp3-transcoder.d.ts +1 -0
- package/lib/voice-recorder/transcoder.service.d.ts +40 -0
- package/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.d.ts +21 -0
- package/lib/voice-recorder/voice-recorder.component.d.ts +30 -0
- package/lib/voice-recorder/voice-recorder.module.d.ts +12 -0
- package/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.d.ts +0 -7
- package/lib/voice-recording/voice-recording.component.d.ts +0 -1
- package/lib/voice-recording/voice-recording.module.d.ts +11 -0
- package/lib/wave-form-sampler.d.ts +1 -0
- package/package.json +8 -1
- package/public-api.d.ts +17 -4
- package/src/assets/assets/icons/stream-chat-icons.eot +0 -0
- package/src/assets/assets/icons/stream-chat-icons.svg +4 -0
- package/src/assets/assets/icons/stream-chat-icons.ttf +0 -0
- package/src/assets/assets/icons/stream-chat-icons.woff +0 -0
- package/src/assets/assets/icons/stream-chat-icons.woff2 +0 -0
- package/src/assets/i18n/en.ts +6 -0
- package/src/assets/styles/css/index.css +1 -1
- package/src/assets/styles/css/index.layout.css +1 -1
- package/src/assets/styles/scss/AudioRecorder/AudioRecorder-layout.scss +64 -14
- package/src/assets/styles/scss/AudioRecorder/AudioRecorder-theme.scss +11 -1
- package/src/assets/styles/scss/Icon/Icon-layout.scss +6 -1
- package/src/assets/styles/scss/MessageInput/MessageInput-layout.scss +1 -0
- package/src/assets/styles/scss/MessageInput/MessageInput-theme.scss +1 -0
- package/src/assets/version.ts +1 -1
- package/esm2020/lib/icon-placeholder/icon-placeholder.component.mjs +0 -28
- package/esm2020/lib/is-image-file.mjs +0 -5
- package/lib/is-image-file.d.ts +0 -1
- /package/lib/{loading-indicator → icon/loading-indicator}/loading-indicator.component.d.ts +0 -0
package/assets/i18n/en.d.ts
CHANGED
|
@@ -102,5 +102,9 @@ export declare const en: {
|
|
|
102
102
|
Edited: string;
|
|
103
103
|
'Error playing audio': string;
|
|
104
104
|
'Copy text': string;
|
|
105
|
+
'Please grant permission to use microhpone': string;
|
|
106
|
+
'Error starting recording': string;
|
|
107
|
+
'An error has occurred during recording': string;
|
|
108
|
+
'Media recording not supported': string;
|
|
105
109
|
};
|
|
106
110
|
};
|
package/assets/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "5.
|
|
1
|
+
export declare const version = "5.4.1";
|
|
@@ -102,6 +102,10 @@ export const en = {
|
|
|
102
102
|
Edited: 'Edited',
|
|
103
103
|
'Error playing audio': 'Error playing audio',
|
|
104
104
|
'Copy text': 'Copy text',
|
|
105
|
+
'Please grant permission to use microhpone': 'Please grant permission to use microhpone',
|
|
106
|
+
'Error starting recording': 'Error starting recording',
|
|
107
|
+
'An error has occurred during recording': 'An error has occurred during recording',
|
|
108
|
+
'Media recording not supported': 'Media recording not supported',
|
|
105
109
|
},
|
|
106
110
|
};
|
|
107
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9hc3NldHMvaTE4bi9lbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUc7SUFDaEIsVUFBVSxFQUFFO1FBQ1YsU0FBUyxFQUFFLFNBQVM7UUFDcEIsY0FBYyxFQUFFLGNBQWM7UUFDOUIsTUFBTSxFQUFFLFFBQVE7UUFDaEIsaUJBQWlCLEVBQUUsaUJBQWlCO1FBQ3BDLEtBQUssRUFBRSxPQUFPO1FBQ2Qsb0JBQW9CLEVBQUUsb0JBQW9CO1FBQzFDLG1CQUFtQixFQUFFLG1CQUFtQjtRQUN4Qyx5Q0FBeUMsRUFDdkMseUNBQXlDO1FBQzNDLE1BQU0sRUFBRSxRQUFRO1FBQ2hCLFNBQVMsRUFBRSxXQUFXO1FBQ3RCLGNBQWMsRUFBRSxjQUFjO1FBQzlCLDZCQUE2QixFQUFFLDZCQUE2QjtRQUM1RCxnQkFBZ0IsRUFBRSxnQkFBZ0I7UUFDbEMsa0JBQWtCLEVBQUUsa0JBQWtCO1FBQ3RDLG1CQUFtQixFQUFFLG1CQUFtQjtRQUN4QywwREFBMEQsRUFDeEQseURBQXlEO1FBQzNELHdCQUF3QixFQUFFLHdCQUF3QjtRQUNsRCx5QkFBeUIsRUFBRSx5QkFBeUI7UUFDcEQseUJBQXlCLEVBQUUseUJBQXlCO1FBQ3BELHVCQUF1QixFQUFFLHVCQUF1QjtRQUNoRCw0QkFBNEIsRUFBRSw0QkFBNEI7UUFDMUQsMkJBQTJCLEVBQUUsMkJBQTJCO1FBQ3hELHNCQUFzQixFQUFFLG1DQUFtQztRQUMzRCxrREFBa0QsRUFDaEQsc0VBQXNFO1FBQ3hFLCtDQUErQyxFQUM3Qyw0REFBNEQ7UUFDOUQsMkJBQTJCLEVBQUUsMkJBQTJCO1FBQ3hELGdCQUFnQixFQUFFLDBCQUEwQjtRQUM1QywyQkFBMkIsRUFBRSwyQkFBMkI7UUFDeEQsSUFBSSxFQUFFLE1BQU07UUFDWixnQkFBZ0Is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IHtcbiAgICAnMSByZXBseSc6ICcxIHJlcGx5JyxcbiAgICAnQXR0YWNoIGZpbGVzJzogJ0F0dGFjaCBmaWxlcycsXG4gICAgQ2FuY2VsOiAnQ2FuY2VsJyxcbiAgICAnQ2hhbm5lbCBNaXNzaW5nJzogJ0NoYW5uZWwgTWlzc2luZycsXG4gICAgQ2xvc2U6ICdDbG9zZScsXG4gICAgJ0Nsb3NlIGVtb2ppIHBpY2tlcic6ICdDbG9zZSBlbW9qaSBwaWNrZXInLFxuICAgICdDb21tYW5kcyBtYXRjaGluZyc6ICdDb21tYW5kcyBtYXRjaGluZycsXG4gICAgJ0Nvbm5lY3Rpb24gZmFpbHVyZSwgcmVjb25uZWN0aW5nIG5vdy4uLic6XG4gICAgICAnQ29ubmVjdGlvbiBmYWlsdXJlLCByZWNvbm5lY3Rpbmcgbm93Li4uJyxcbiAgICBEZWxldGU6ICdEZWxldGUnLFxuICAgIERlbGl2ZXJlZDogJ0RlbGl2ZXJlZCcsXG4gICAgJ0VkaXQgTWVzc2FnZSc6ICdFZGl0IE1lc3NhZ2UnLFxuICAgICdFZGl0IG1lc3NhZ2UgcmVxdWVzdCBmYWlsZWQnOiAnRWRpdCBtZXNzYWdlIHJlcXVlc3QgZmFpbGVkJyxcbiAgICAnRW1vamkgbWF0Y2hpbmcnOiAnRW1vamkgbWF0Y2hpbmcnLFxuICAgICdFbXB0eSBtZXNzYWdlLi4uJzogJ0VtcHR5IG1lc3NhZ2UuLi4nLFxuICAgICdFcnJvciBhZGRpbmcgZmxhZyc6ICdFcnJvciBhZGRpbmcgZmxhZycsXG4gICAgJ0Vycm9yIGNvbm5lY3RpbmcgdG8gY2hhdCwgcmVmcmVzaCB0aGUgcGFnZSB0byB0cnkgYWdhaW4uJzpcbiAgICAgICdFcnJvciBjb25uZWN0aW5nIHRvIGNoYXQsIHJlZnJlc2ggdGhlIHBhZ2UgdG8gdHJ5IGFnYWluJyxcbiAgICAnRXJyb3IgZGVsZXRpbmcgbWVzc2FnZSc6ICdFcnJvciBkZWxldGluZyBtZXNzYWdlJyxcbiAgICAnRXJyb3IgbG9hZGluZyByZWFjdGlvbnMnOiAnRXJyb3IgbG9hZGluZyByZWFjdGlvbnMnLFxuICAgICdFcnJvciBtdXRpbmcgYSB1c2VyIC4uLic6ICdFcnJvciBtdXRpbmcgYSB1c2VyIC4uLicsXG4gICAgJ0Vycm9yIHBpbm5pbmcgbWVzc2FnZSc6ICdFcnJvciBwaW5uaW5nIG1lc3NhZ2UnLFxuICAgICdFcnJvciByZW1vdmluZyBtZXNzYWdlIHBpbic6ICdFcnJvciByZW1vdmluZyBtZXNzYWdlIHBpbicsXG4gICAgJ0Vycm9yIHVubXV0aW5nIGEgdXNlciAuLi4nOiAnRXJyb3IgdW5tdXRpbmcgYSB1c2VyIC4uLicsXG4gICAgJ0Vycm9yIHVwbG9hZGluZyBmaWxlJzogJ0Vycm9yIHVwbG9hZGluZyBmaWxlIFwie3sgbmFtZSB9fVwiJyxcbiAgICAnRXJyb3IgdXBsb2FkaW5nIGZpbGUsIG1heGltdW0gZmlsZSBzaXplIGV4Y2VlZGVkJzpcbiAgICAgICdFcnJvciB1cGxvYWRpbmcgXCJ7eyBuYW1lIH19XCIsIG1heGltdW0gZmlsZSBzaXplIHt7IGxpbWl0IH19IGV4Y2VlZGVkJyxcbiAgICAnRXJyb3IgdXBsb2FkaW5nIGZpbGUsIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkJzpcbiAgICAgICdFcnJvciB1cGxvYWRpbmcgXCJ7eyBuYW1lIH19XCIsIHR5cGUge3sgZXh0IH19IG5vdCBzdXBwb3J0ZWQnLFxuICAgICdFcnJvciBkZWxldGluZyBhdHRhY2htZW50JzogJ0Vycm9yIGRlbGV0aW5nIGF0dGFjaG1lbnQnLFxuICAgICdFcnJvciDCtyBVbnNlbnQnOiBcIk1lc3NhZ2UgY291bGRuJ3QgYmUgc2VudFwiLFxuICAgICdFcnJvcjoge3sgZXJyb3JNZXNzYWdlIH19JzogJ0Vycm9yOiB7eyBlcnJvck1lc3NhZ2UgfX0nLFxuICAgIEZsYWc6ICdGbGFnJyxcbiAgICAnTWVzc2FnZSBGYWlsZWQnOiAnTWVzc2FnZSBGYWlsZWQnLFxuICAgICdNZXNzYWdlIEZhaWxlZCDCtyBVbmF1dGhvcml6ZWQnOiAnVW5hdXRob3JpemVkIHRvIHNlbmQgbWVzc2FnZScsXG4gICAgJ01lc3NhZ2UgRmFpbGVkIMK3IENsaWNrIHRvIHRyeSBhZ2Fpbic6XG4gICAgICBcIk1lc3NhZ2UgY291bGRuJ3QgYmUgc2VudCwgY2xpY2sgdG8gdHJ5IGFnYWluXCIsXG4gICAgJ01lc3NhZ2UgZGVsZXRlZCc6ICdNZXNzYWdlIGRlbGV0ZWQnLFxuICAgICdNZXNzYWdlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBmbGFnZ2VkJzpcbiAgICAgICdNZXNzYWdlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBmbGFnZ2VkJyxcbiAgICAnTWVzc2FnZSBwaW5uZWQnOiAnTWVzc2FnZSBwaW5uZWQnLFxuICAgICdNZXNzYWdlIHVucGlubmVkJzogJ01lc3NhZ2UgdW5waW5uZWQnLFxuICAgIE11dGU6ICdNdXRlJyxcbiAgICBOZXc6ICdOZXcnLFxuICAgICdOZXcgTWVzc2FnZXMhJzogJ05ldyBNZXNzYWdlcyEnLFxuICAgICdObyByZXN1bHRzIGZvdW5kJzogJ05vIHJlc3VsdHMgZm91bmQnLFxuICAgICdOb3RoaW5nIHlldC4uLic6ICdOb3RoaW5nIHlldC4uLicsXG4gICAgJ09ubHkgdmlzaWJsZSB0byB5b3UnOiAnT25seSB2aXNpYmxlIHRvIHlvdScsXG4gICAgJ09wZW4gZW1vamkgcGlja2VyJzogJ09wZW4gZW1vamkgcGlja2VyJyxcbiAgICAnUGVvcGxlIG1hdGNoaW5nJzogJ1Blb3BsZSBtYXRjaGluZycsXG4gICAgJ1BpY2sgeW91ciBlbW9qaSc6ICdQaWNrIHlvdXIgZW1vamknLFxuICAgIFBpbjogJ1BpbicsXG4gICAgJ1Bpbm5lZCBieSc6ICdQaW5uZWQgYnknLFxuICAgIFJlcGx5OiAnUXVvdGUgUmVwbHknLFxuICAgICdSZXBseSB0byBNZXNzYWdlJzogJ1JlcGx5IHRvIE1lc3NhZ2UnLFxuICAgIFNlYXJjaDogJ1NlYXJjaCcsXG4gICAgJ1NlYXJjaGluZy4uLic6ICdTZWFyY2hpbmcuLi4nLFxuICAgIFNlbmQ6ICdTZW5kJyxcbiAgICAnU2VuZCBtZXNzYWdlIHJlcXVlc3QgZmFpbGVkJzogJ1NlbmQgbWVzc2FnZSByZXF1ZXN0IGZhaWxlZCcsXG4gICAgJ1NlbmRpbmcuLi4nOiAnU2VuZGluZy4uLicsXG4gICAgJ1Nsb3cgTW9kZSBPTic6ICdTbG93IE1vZGUgT04nLFxuICAgICdTdGFydCBvZiBhIG5ldyB0aHJlYWQnOiAnU3RhcnQgb2YgYSBuZXcgdGhyZWFkJyxcbiAgICAnVGhpcyBtZXNzYWdlIHdhcyBkZWxldGVkLi4uJzogJ1RoaXMgbWVzc2FnZSB3YXMgZGVsZXRlZC4uLicsXG4gICAgVGhyZWFkOiAnVGhyZWFkIHJlcGx5JyxcbiAgICAnVHlwZSB5b3VyIG1lc3NhZ2UnOiAnVHlwZSB5b3VyIG1lc3NhZ2UnLFxuICAgIFVubXV0ZTogJ1VubXV0ZScsXG4gICAgVW5waW46ICdVbnBpbicsXG4gICAgJ1dhaXQgdW50aWwgYWxsIGF0dGFjaG1lbnRzIGhhdmUgdXBsb2FkZWQnOlxuICAgICAgJ1dhaXQgdW50aWwgYWxsIGF0dGFjaG1lbnRzIGhhdmUgdXBsb2FkZWQnLFxuICAgICdZb3UgaGF2ZSBubyBjaGFubmVscyBjdXJyZW50bHknOiAnWW91IGhhdmUgbm8gY2hhbm5lbHMgY3VycmVudGx5JyxcbiAgICBcIllvdSd2ZSByZWFjaGVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxlc1wiOlxuICAgICAgXCJZb3UndmUgcmVhY2hlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgZmlsZXNcIixcbiAgICBsaXZlOiAnbGl2ZScsXG4gICAgJ3RoaXMgY29udGVudCBjb3VsZCBub3QgYmUgZGlzcGxheWVkJzpcbiAgICAgICd0aGlzIGNvbnRlbnQgY291bGQgbm90IGJlIGRpc3BsYXllZCcsXG4gICAgJ3t7IGNvbW1hU2VwYXJhdGVkVXNlcnMgfX0gYW5kIHt7IG1vcmVDb3VudCB9fSBtb3JlJzpcbiAgICAgICd7eyBjb21tYVNlcGFyYXRlZFVzZXJzIH19IGFuZCB7eyBtb3JlQ291bnQgfX0gbW9yZScsXG4gICAgJ3t7IGNvbW1hU2VwYXJhdGVkVXNlcnMgfX0sIGFuZCB7eyBsYXN0VXNlciB9fSc6XG4gICAgICAne3sgY29tbWFTZXBhcmF0ZWRVc2VycyB9fSwgYW5kIHt7IGxhc3RVc2VyIH19JyxcbiAgICAne3sgZmlyc3RVc2VyIH19IGFuZCB7eyBzZWNvbmRVc2VyIH19JzpcbiAgICAgICd7eyBmaXJzdFVzZXIgfX0gYW5kIHt7IHNlY29uZFVzZXIgfX0nLFxuICAgICd7eyBpbWFnZUNvdW50IH19IG1vcmUnOiAne3sgaW1hZ2VDb3VudCB9fSBtb3JlJyxcbiAgICAne3sgbWVtYmVyQ291bnQgfX0gbWVtYmVycyc6ICd7eyBtZW1iZXJDb3VudCB9fSBtZW1iZXJzJyxcbiAgICAne3sgcmVwbHlDb3VudCB9fSByZXBsaWVzJzogJ3t7IHJlcGx5Q291bnQgfX0gcmVwbGllcycsXG4gICAgJ3t7IHVzZXIgfX0gaGFzIGJlZW4gbXV0ZWQnOiAne3sgdXNlciB9fSBoYXMgYmVlbiBtdXRlZCcsXG4gICAgJ3t7IHVzZXIgfX0gaGFzIGJlZW4gdW5tdXRlZCc6ICd7eyB1c2VyIH19IGhhcyBiZWVuIHVubXV0ZWQnLFxuICAgICd7eyB3YXRjaGVyQ291bnQgfX0gb25saW5lJzogJ3t7IHdhdGNoZXJDb3VudCB9fSBvbmxpbmUnLFxuICAgICfwn4+ZIEF0dGFjaG1lbnQuLi4nOiAn8J+PmSBBdHRhY2htZW50Li4uJyxcbiAgICAnQ29ubmVjdGlvbiBlcnJvcic6ICdDb25uZWN0aW9uIGVycm9yJyxcbiAgICAnTG9hZCBtb3JlJzogJ0xvYWQgbW9yZScsXG4gICAgZmFpbGVkOiAnZmFpbGVkJyxcbiAgICByZXRyeTogJ3JldHJ5JyxcbiAgICB0ZXN0OiAnc3VjY2VzcycsXG4gICAgJ1NlbmRpbmcgbGlua3MgaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBjb252ZXJzYXRpb24nOlxuICAgICAgJ1NlbmRpbmcgbGlua3MgaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBjb252ZXJzYXRpb24nLFxuICAgIFwiWW91IGNhbid0IHNlbmQgbWVzc2FnZXMgaW4gdGhpcyBjaGFubmVsXCI6XG4gICAgICBcIllvdSBjYW4ndCBzZW5kIG1lc3NhZ2VzIGluIHRoaXMgY2hhbm5lbFwiLFxuICAgIFwiWW91IGNhbid0IHNlbmQgdGhyZWFkIHJlcGxpZXMgaW4gdGhpcyBjaGFubmVsXCI6XG4gICAgICBcIllvdSBjYW4ndCBzZW5kIHRocmVhZCByZXBsaWVzIGluIHRoaXMgY2hhbm5lbFwiLFxuICAgICdNZXNzYWdlIG5vdCBmb3VuZCc6ICdNZXNzYWdlIG5vdCBmb3VuZCcsXG4gICAgJ05vIGNoYXRzIGhlcmUgeWV04oCmJzogJ05vIGNoYXRzIGhlcmUgeWV04oCmJyxcbiAgICAndXNlciBpcyB0eXBpbmcnOiAne3sgdXNlciB9fSBpcyB0eXBpbmcnLFxuICAgICd1c2VycyBhcmUgdHlwaW5nJzogJ3t7IHVzZXJzIH19IGFyZSB0eXBpbmcnLFxuICAgICdFcnJvciBsb2FkaW5nIGNoYW5uZWxzJzogJ0Vycm9yIGxvYWRpbmcgY2hhbm5lbHMnLFxuICAgICdTZWUgb3JpZ2luYWwgKGF1dG9tYXRpY2FsbHkgdHJhbnNsYXRlZCknOlxuICAgICAgJ1NlZSBvcmlnaW5hbCAoYXV0b21hdGljYWxseSB0cmFuc2xhdGVkKScsXG4gICAgJ1NlZSB0cmFuc2xhdGlvbic6ICdTZWUgdHJhbnNsYXRpb24nLFxuICAgICdNYXJrIGFzIHVucmVhZCc6ICdNYXJrIGFzIHVucmVhZCcsXG4gICAgJ0Vycm9yIG1hcmtpbmcgbWVzc2FnZSBhcyB1bnJlYWQnOiAnRXJyb3IgbWFya2luZyBtZXNzYWdlIGFzIHVucmVhZCcsXG4gICAgJ0Vycm9yLCBvbmx5IHRoZSBmaXJzdCB7e2NvdW50fX0gbWVzc2FnZSBjYW4gYmUgbWFya2VkIGFzIHVucmVhZCc6XG4gICAgICAnRXJyb3IsIG9ubHkgdGhlIGZpcnN0IHt7Y291bnR9fSBtZXNzYWdlIGNhbiBiZSBtYXJrZWQgYXMgdW5yZWFkJyxcbiAgICAnVW5yZWFkIG1lc3NhZ2VzJzogJ1VucmVhZCBtZXNzYWdlcycsXG4gICAgJ3t7Y291bnR9fSB1bnJlYWQgbWVzc2FnZXMnOiAne3tjb3VudH19IHVucmVhZCBtZXNzYWdlcycsXG4gICAgJ3t7Y291bnR9fSB1bnJlYWQgbWVzc2FnZSc6ICd7e2NvdW50fX0gdW5yZWFkIG1lc3NhZ2UnLFxuICAgICdUaGlzIG1lc3NhZ2UgZGlkIG5vdCBtZWV0IG91ciBjb250ZW50IGd1aWRlbGluZXMnOlxuICAgICAgJ1RoaXMgbWVzc2FnZSBkaWQgbm90IG1lZXQgb3VyIGNvbnRlbnQgZ3VpZGVsaW5lcycsXG4gICAgJ1NlbmQgQW55d2F5JzogJ1NlbmQgQW55d2F5JyxcbiAgICBFZGl0ZWQ6ICdFZGl0ZWQnLFxuICAgICdFcnJvciBwbGF5aW5nIGF1ZGlvJzogJ0Vycm9yIHBsYXlpbmcgYXVkaW8nLFxuICAgICdDb3B5IHRleHQnOiAnQ29weSB0ZXh0JyxcbiAgfSxcbn07XG4iXX0=
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9hc3NldHMvaTE4bi9lbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUc7SUFDaEIsVUFBVSxFQUFFO1FBQ1YsU0FBUyxFQUFFLFNBQVM7UUFDcEIsY0FBYyxFQUFFLGNBQWM7UUFDOUIsTUFBTSxFQUFFLFFBQVE7UUFDaEIsaUJBQWlCLEVBQUUsaUJBQWlCO1FBQ3BDLEtBQUssRUFBRSxPQUFPO1FBQ2Qsb0JBQW9CLEVBQUUsb0JBQW9CO1FBQzFDLG1CQUFtQixFQUFFLG1CQUFtQjtRQUN4Qyx5Q0FBeUMsRUFDdkMseUNBQXlDO1FBQzNDLE1BQU0sRUFBRSxRQUFRO1FBQ2hCLFNBQVMsRUFBRSxXQUFXO1FBQ3RCLGNBQWMsRUFBRSxjQUFjO1FBQzlCLDZCQUE2QixFQUFFLDZCQUE2QjtRQUM1RCxnQkFBZ0IsRUFBRSxnQkFBZ0I7UUFDbEMsa0JBQWtCLEVBQUUsa0JBQWtCO1FBQ3RDLG1CQUFtQixFQUFFLG1CQUFtQjtRQUN4QywwREFBMEQsRUFDeEQseURBQXlEO1FBQzNELHdCQUF3QixFQUFFLHdCQUF3QjtRQUNsRCx5QkFBeUIsRUFBRSx5QkFBeUI7UUFDcEQseUJBQXlCLEVBQUUseUJBQXlCO1FBQ3BELHVCQUF1QixFQUFFLHVCQUF1QjtRQUNoRCw0QkFBNEIsRUFBRSw0QkFBNEI7UUFDMUQsMkJBQTJCLEVBQUUsMkJBQTJCO1FBQ3hELHNCQUFzQixFQUFFLG1DQUFtQztRQUMzRCxrREFBa0QsRUFDaEQsc0VBQXNFO1FBQ3hFLCtDQUErQyxFQUM3Qyw0REFBNEQ7UUFDOUQsMkJBQTJCLEVBQUUsMkJBQTJCO1FBQ3hELGdCQUFnQixFQUFFLDBCQUEwQjtRQUM1QywyQkFBMkIsRUFBRSwyQkFBMkI7UUFDeEQsSUFBSSxFQUFFLE1BQU07UUFDWixnQkFBZ0Is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d0NBQXdDO1FBQzFDLCtCQUErQixFQUFFLCtCQUErQjtLQUNqRTtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgZW4gPSB7XG4gIHN0cmVhbUNoYXQ6IHtcbiAgICAnMSByZXBseSc6ICcxIHJlcGx5JyxcbiAgICAnQXR0YWNoIGZpbGVzJzogJ0F0dGFjaCBmaWxlcycsXG4gICAgQ2FuY2VsOiAnQ2FuY2VsJyxcbiAgICAnQ2hhbm5lbCBNaXNzaW5nJzogJ0NoYW5uZWwgTWlzc2luZycsXG4gICAgQ2xvc2U6ICdDbG9zZScsXG4gICAgJ0Nsb3NlIGVtb2ppIHBpY2tlcic6ICdDbG9zZSBlbW9qaSBwaWNrZXInLFxuICAgICdDb21tYW5kcyBtYXRjaGluZyc6ICdDb21tYW5kcyBtYXRjaGluZycsXG4gICAgJ0Nvbm5lY3Rpb24gZmFpbHVyZSwgcmVjb25uZWN0aW5nIG5vdy4uLic6XG4gICAgICAnQ29ubmVjdGlvbiBmYWlsdXJlLCByZWNvbm5lY3Rpbmcgbm93Li4uJyxcbiAgICBEZWxldGU6ICdEZWxldGUnLFxuICAgIERlbGl2ZXJlZDogJ0RlbGl2ZXJlZCcsXG4gICAgJ0VkaXQgTWVzc2FnZSc6ICdFZGl0IE1lc3NhZ2UnLFxuICAgICdFZGl0IG1lc3NhZ2UgcmVxdWVzdCBmYWlsZWQnOiAnRWRpdCBtZXNzYWdlIHJlcXVlc3QgZmFpbGVkJyxcbiAgICAnRW1vamkgbWF0Y2hpbmcnOiAnRW1vamkgbWF0Y2hpbmcnLFxuICAgICdFbXB0eSBtZXNzYWdlLi4uJzogJ0VtcHR5IG1lc3NhZ2UuLi4nLFxuICAgICdFcnJvciBhZGRpbmcgZmxhZyc6ICdFcnJvciBhZGRpbmcgZmxhZycsXG4gICAgJ0Vycm9yIGNvbm5lY3RpbmcgdG8gY2hhdCwgcmVmcmVzaCB0aGUgcGFnZSB0byB0cnkgYWdhaW4uJzpcbiAgICAgICdFcnJvciBjb25uZWN0aW5nIHRvIGNoYXQsIHJlZnJlc2ggdGhlIHBhZ2UgdG8gdHJ5IGFnYWluJyxcbiAgICAnRXJyb3IgZGVsZXRpbmcgbWVzc2FnZSc6ICdFcnJvciBkZWxldGluZyBtZXNzYWdlJyxcbiAgICAnRXJyb3IgbG9hZGluZyByZWFjdGlvbnMnOiAnRXJyb3IgbG9hZGluZyByZWFjdGlvbnMnLFxuICAgICdFcnJvciBtdXRpbmcgYSB1c2VyIC4uLic6ICdFcnJvciBtdXRpbmcgYSB1c2VyIC4uLicsXG4gICAgJ0Vycm9yIHBpbm5pbmcgbWVzc2FnZSc6ICdFcnJvciBwaW5uaW5nIG1lc3NhZ2UnLFxuICAgICdFcnJvciByZW1vdmluZyBtZXNzYWdlIHBpbic6ICdFcnJvciByZW1vdmluZyBtZXNzYWdlIHBpbicsXG4gICAgJ0Vycm9yIHVubXV0aW5nIGEgdXNlciAuLi4nOiAnRXJyb3IgdW5tdXRpbmcgYSB1c2VyIC4uLicsXG4gICAgJ0Vycm9yIHVwbG9hZGluZyBmaWxlJzogJ0Vycm9yIHVwbG9hZGluZyBmaWxlIFwie3sgbmFtZSB9fVwiJyxcbiAgICAnRXJyb3IgdXBsb2FkaW5nIGZpbGUsIG1heGltdW0gZmlsZSBzaXplIGV4Y2VlZGVkJzpcbiAgICAgICdFcnJvciB1cGxvYWRpbmcgXCJ7eyBuYW1lIH19XCIsIG1heGltdW0gZmlsZSBzaXplIHt7IGxpbWl0IH19IGV4Y2VlZGVkJyxcbiAgICAnRXJyb3IgdXBsb2FkaW5nIGZpbGUsIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkJzpcbiAgICAgICdFcnJvciB1cGxvYWRpbmcgXCJ7eyBuYW1lIH19XCIsIHR5cGUge3sgZXh0IH19IG5vdCBzdXBwb3J0ZWQnLFxuICAgICdFcnJvciBkZWxldGluZyBhdHRhY2htZW50JzogJ0Vycm9yIGRlbGV0aW5nIGF0dGFjaG1lbnQnLFxuICAgICdFcnJvciDCtyBVbnNlbnQnOiBcIk1lc3NhZ2UgY291bGRuJ3QgYmUgc2VudFwiLFxuICAgICdFcnJvcjoge3sgZXJyb3JNZXNzYWdlIH19JzogJ0Vycm9yOiB7eyBlcnJvck1lc3NhZ2UgfX0nLFxuICAgIEZsYWc6ICdGbGFnJyxcbiAgICAnTWVzc2FnZSBGYWlsZWQnOiAnTWVzc2FnZSBGYWlsZWQnLFxuICAgICdNZXNzYWdlIEZhaWxlZCDCtyBVbmF1dGhvcml6ZWQnOiAnVW5hdXRob3JpemVkIHRvIHNlbmQgbWVzc2FnZScsXG4gICAgJ01lc3NhZ2UgRmFpbGVkIMK3IENsaWNrIHRvIHRyeSBhZ2Fpbic6XG4gICAgICBcIk1lc3NhZ2UgY291bGRuJ3QgYmUgc2VudCwgY2xpY2sgdG8gdHJ5IGFnYWluXCIsXG4gICAgJ01lc3NhZ2UgZGVsZXRlZCc6ICdNZXNzYWdlIGRlbGV0ZWQnLFxuICAgICdNZXNzYWdlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBmbGFnZ2VkJzpcbiAgICAgICdNZXNzYWdlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBmbGFnZ2VkJyxcbiAgICAnTWVzc2FnZSBwaW5uZWQnOiAnTWVzc2FnZSBwaW5uZWQnLFxuICAgICdNZXNzYWdlIHVucGlubmVkJzogJ01lc3NhZ2UgdW5waW5uZWQnLFxuICAgIE11dGU6ICdNdXRlJyxcbiAgICBOZXc6ICdOZXcnLFxuICAgICdOZXcgTWVzc2FnZXMhJzogJ05ldyBNZXNzYWdlcyEnLFxuICAgICdObyByZXN1bHRzIGZvdW5kJzogJ05vIHJlc3VsdHMgZm91bmQnLFxuICAgICdOb3RoaW5nIHlldC4uLic6ICdOb3RoaW5nIHlldC4uLicsXG4gICAgJ09ubHkgdmlzaWJsZSB0byB5b3UnOiAnT25seSB2aXNpYmxlIHRvIHlvdScsXG4gICAgJ09wZW4gZW1vamkgcGlja2VyJzogJ09wZW4gZW1vamkgcGlja2VyJyxcbiAgICAnUGVvcGxlIG1hdGNoaW5nJzogJ1Blb3BsZSBtYXRjaGluZycsXG4gICAgJ1BpY2sgeW91ciBlbW9qaSc6ICdQaWNrIHlvdXIgZW1vamknLFxuICAgIFBpbjogJ1BpbicsXG4gICAgJ1Bpbm5lZCBieSc6ICdQaW5uZWQgYnknLFxuICAgIFJlcGx5OiAnUXVvdGUgUmVwbHknLFxuICAgICdSZXBseSB0byBNZXNzYWdlJzogJ1JlcGx5IHRvIE1lc3NhZ2UnLFxuICAgIFNlYXJjaDogJ1NlYXJjaCcsXG4gICAgJ1NlYXJjaGluZy4uLic6ICdTZWFyY2hpbmcuLi4nLFxuICAgIFNlbmQ6ICdTZW5kJyxcbiAgICAnU2VuZCBtZXNzYWdlIHJlcXVlc3QgZmFpbGVkJzogJ1NlbmQgbWVzc2FnZSByZXF1ZXN0IGZhaWxlZCcsXG4gICAgJ1NlbmRpbmcuLi4nOiAnU2VuZGluZy4uLicsXG4gICAgJ1Nsb3cgTW9kZSBPTic6ICdTbG93IE1vZGUgT04nLFxuICAgICdTdGFydCBvZiBhIG5ldyB0aHJlYWQnOiAnU3RhcnQgb2YgYSBuZXcgdGhyZWFkJyxcbiAgICAnVGhpcyBtZXNzYWdlIHdhcyBkZWxldGVkLi4uJzogJ1RoaXMgbWVzc2FnZSB3YXMgZGVsZXRlZC4uLicsXG4gICAgVGhyZWFkOiAnVGhyZWFkIHJlcGx5JyxcbiAgICAnVHlwZSB5b3VyIG1lc3NhZ2UnOiAnVHlwZSB5b3VyIG1lc3NhZ2UnLFxuICAgIFVubXV0ZTogJ1VubXV0ZScsXG4gICAgVW5waW46ICdVbnBpbicsXG4gICAgJ1dhaXQgdW50aWwgYWxsIGF0dGFjaG1lbnRzIGhhdmUgdXBsb2FkZWQnOlxuICAgICAgJ1dhaXQgdW50aWwgYWxsIGF0dGFjaG1lbnRzIGhhdmUgdXBsb2FkZWQnLFxuICAgICdZb3UgaGF2ZSBubyBjaGFubmVscyBjdXJyZW50bHknOiAnWW91IGhhdmUgbm8gY2hhbm5lbHMgY3VycmVudGx5JyxcbiAgICBcIllvdSd2ZSByZWFjaGVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxlc1wiOlxuICAgICAgXCJZb3UndmUgcmVhY2hlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgZmlsZXNcIixcbiAgICBsaXZlOiAnbGl2ZScsXG4gICAgJ3RoaXMgY29udGVudCBjb3VsZCBub3QgYmUgZGlzcGxheWVkJzpcbiAgICAgICd0aGlzIGNvbnRlbnQgY291bGQgbm90IGJlIGRpc3BsYXllZCcsXG4gICAgJ3t7IGNvbW1hU2VwYXJhdGVkVXNlcnMgfX0gYW5kIHt7IG1vcmVDb3VudCB9fSBtb3JlJzpcbiAgICAgICd7eyBjb21tYVNlcGFyYXRlZFVzZXJzIH19IGFuZCB7eyBtb3JlQ291bnQgfX0gbW9yZScsXG4gICAgJ3t7IGNvbW1hU2VwYXJhdGVkVXNlcnMgfX0sIGFuZCB7eyBsYXN0VXNlciB9fSc6XG4gICAgICAne3sgY29tbWFTZXBhcmF0ZWRVc2VycyB9fSwgYW5kIHt7IGxhc3RVc2VyIH19JyxcbiAgICAne3sgZmlyc3RVc2VyIH19IGFuZCB7eyBzZWNvbmRVc2VyIH19JzpcbiAgICAgICd7eyBmaXJzdFVzZXIgfX0gYW5kIHt7IHNlY29uZFVzZXIgfX0nLFxuICAgICd7eyBpbWFnZUNvdW50IH19IG1vcmUnOiAne3sgaW1hZ2VDb3VudCB9fSBtb3JlJyxcbiAgICAne3sgbWVtYmVyQ291bnQgfX0gbWVtYmVycyc6ICd7eyBtZW1iZXJDb3VudCB9fSBtZW1iZXJzJyxcbiAgICAne3sgcmVwbHlDb3VudCB9fSByZXBsaWVzJzogJ3t7IHJlcGx5Q291bnQgfX0gcmVwbGllcycsXG4gICAgJ3t7IHVzZXIgfX0gaGFzIGJlZW4gbXV0ZWQnOiAne3sgdXNlciB9fSBoYXMgYmVlbiBtdXRlZCcsXG4gICAgJ3t7IHVzZXIgfX0gaGFzIGJlZW4gdW5tdXRlZCc6ICd7eyB1c2VyIH19IGhhcyBiZWVuIHVubXV0ZWQnLFxuICAgICd7eyB3YXRjaGVyQ291bnQgfX0gb25saW5lJzogJ3t7IHdhdGNoZXJDb3VudCB9fSBvbmxpbmUnLFxuICAgICfwn4+ZIEF0dGFjaG1lbnQuLi4nOiAn8J+PmSBBdHRhY2htZW50Li4uJyxcbiAgICAnQ29ubmVjdGlvbiBlcnJvcic6ICdDb25uZWN0aW9uIGVycm9yJyxcbiAgICAnTG9hZCBtb3JlJzogJ0xvYWQgbW9yZScsXG4gICAgZmFpbGVkOiAnZmFpbGVkJyxcbiAgICByZXRyeTogJ3JldHJ5JyxcbiAgICB0ZXN0OiAnc3VjY2VzcycsXG4gICAgJ1NlbmRpbmcgbGlua3MgaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBjb252ZXJzYXRpb24nOlxuICAgICAgJ1NlbmRpbmcgbGlua3MgaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBjb252ZXJzYXRpb24nLFxuICAgIFwiWW91IGNhbid0IHNlbmQgbWVzc2FnZXMgaW4gdGhpcyBjaGFubmVsXCI6XG4gICAgICBcIllvdSBjYW4ndCBzZW5kIG1lc3NhZ2VzIGluIHRoaXMgY2hhbm5lbFwiLFxuICAgIFwiWW91IGNhbid0IHNlbmQgdGhyZWFkIHJlcGxpZXMgaW4gdGhpcyBjaGFubmVsXCI6XG4gICAgICBcIllvdSBjYW4ndCBzZW5kIHRocmVhZCByZXBsaWVzIGluIHRoaXMgY2hhbm5lbFwiLFxuICAgICdNZXNzYWdlIG5vdCBmb3VuZCc6ICdNZXNzYWdlIG5vdCBmb3VuZCcsXG4gICAgJ05vIGNoYXRzIGhlcmUgeWV04oCmJzogJ05vIGNoYXRzIGhlcmUgeWV04oCmJyxcbiAgICAndXNlciBpcyB0eXBpbmcnOiAne3sgdXNlciB9fSBpcyB0eXBpbmcnLFxuICAgICd1c2VycyBhcmUgdHlwaW5nJzogJ3t7IHVzZXJzIH19IGFyZSB0eXBpbmcnLFxuICAgICdFcnJvciBsb2FkaW5nIGNoYW5uZWxzJzogJ0Vycm9yIGxvYWRpbmcgY2hhbm5lbHMnLFxuICAgICdTZWUgb3JpZ2luYWwgKGF1dG9tYXRpY2FsbHkgdHJhbnNsYXRlZCknOlxuICAgICAgJ1NlZSBvcmlnaW5hbCAoYXV0b21hdGljYWxseSB0cmFuc2xhdGVkKScsXG4gICAgJ1NlZSB0cmFuc2xhdGlvbic6ICdTZWUgdHJhbnNsYXRpb24nLFxuICAgICdNYXJrIGFzIHVucmVhZCc6ICdNYXJrIGFzIHVucmVhZCcsXG4gICAgJ0Vycm9yIG1hcmtpbmcgbWVzc2FnZSBhcyB1bnJlYWQnOiAnRXJyb3IgbWFya2luZyBtZXNzYWdlIGFzIHVucmVhZCcsXG4gICAgJ0Vycm9yLCBvbmx5IHRoZSBmaXJzdCB7e2NvdW50fX0gbWVzc2FnZSBjYW4gYmUgbWFya2VkIGFzIHVucmVhZCc6XG4gICAgICAnRXJyb3IsIG9ubHkgdGhlIGZpcnN0IHt7Y291bnR9fSBtZXNzYWdlIGNhbiBiZSBtYXJrZWQgYXMgdW5yZWFkJyxcbiAgICAnVW5yZWFkIG1lc3NhZ2VzJzogJ1VucmVhZCBtZXNzYWdlcycsXG4gICAgJ3t7Y291bnR9fSB1bnJlYWQgbWVzc2FnZXMnOiAne3tjb3VudH19IHVucmVhZCBtZXNzYWdlcycsXG4gICAgJ3t7Y291bnR9fSB1bnJlYWQgbWVzc2FnZSc6ICd7e2NvdW50fX0gdW5yZWFkIG1lc3NhZ2UnLFxuICAgICdUaGlzIG1lc3NhZ2UgZGlkIG5vdCBtZWV0IG91ciBjb250ZW50IGd1aWRlbGluZXMnOlxuICAgICAgJ1RoaXMgbWVzc2FnZSBkaWQgbm90IG1lZXQgb3VyIGNvbnRlbnQgZ3VpZGVsaW5lcycsXG4gICAgJ1NlbmQgQW55d2F5JzogJ1NlbmQgQW55d2F5JyxcbiAgICBFZGl0ZWQ6ICdFZGl0ZWQnLFxuICAgICdFcnJvciBwbGF5aW5nIGF1ZGlvJzogJ0Vycm9yIHBsYXlpbmcgYXVkaW8nLFxuICAgICdDb3B5IHRleHQnOiAnQ29weSB0ZXh0JyxcbiAgICAnUGxlYXNlIGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIG1pY3JvaHBvbmUnOlxuICAgICAgJ1BsZWFzZSBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSBtaWNyb2hwb25lJyxcbiAgICAnRXJyb3Igc3RhcnRpbmcgcmVjb3JkaW5nJzogJ0Vycm9yIHN0YXJ0aW5nIHJlY29yZGluZycsXG4gICAgJ0FuIGVycm9yIGhhcyBvY2N1cnJlZCBkdXJpbmcgcmVjb3JkaW5nJzpcbiAgICAgICdBbiBlcnJvciBoYXMgb2NjdXJyZWQgZHVyaW5nIHJlY29yZGluZycsXG4gICAgJ01lZGlhIHJlY29yZGluZyBub3Qgc3VwcG9ydGVkJzogJ01lZGlhIHJlY29yZGluZyBub3Qgc3VwcG9ydGVkJyxcbiAgfSxcbn07XG4iXX0=
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const version = '5.
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
export const version = '5.4.1';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2Fzc2V0cy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgdmVyc2lvbiA9ICc1LjQuMSc7XG4iXX0=
|
|
@@ -6,9 +6,9 @@ import * as i1 from "../custom-templates.service";
|
|
|
6
6
|
import * as i2 from "../channel.service";
|
|
7
7
|
import * as i3 from "../attachment-configuration.service";
|
|
8
8
|
import * as i4 from "@angular/common";
|
|
9
|
-
import * as i5 from "../
|
|
10
|
-
import * as i6 from "../icon-placeholder/icon-placeholder.component";
|
|
11
|
-
import * as i7 from "../
|
|
9
|
+
import * as i5 from "../voice-recording/voice-recording.component";
|
|
10
|
+
import * as i6 from "../icon/icon-placeholder/icon-placeholder.component";
|
|
11
|
+
import * as i7 from "../modal/modal.component";
|
|
12
12
|
import * as i8 from "@ngx-translate/core";
|
|
13
13
|
/**
|
|
14
14
|
* The `AttachmentList` component displays the attachments of a message
|
|
@@ -182,7 +182,7 @@ export class AttachmentListComponent {
|
|
|
182
182
|
}
|
|
183
183
|
}
|
|
184
184
|
AttachmentListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: AttachmentListComponent, deps: [{ token: i1.CustomTemplatesService }, { token: i2.ChannelService }, { token: i3.AttachmentConfigurationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
185
|
-
AttachmentListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: AttachmentListComponent, selector: "stream-attachment-list", inputs: { messageId: "messageId", parentMessageId: "parentMessageId", attachments: "attachments" }, outputs: { imageModalStateChange: "imageModalStateChange" }, host: { properties: { "class": "this.class" } }, viewQueries: [{ propertyName: "modalContent", first: true, predicate: ["modalContent"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"orderedAttachments.length > 0\" class=\"str-chat__attachment-list\">\n <ng-container\n *ngFor=\"let attachment of orderedAttachments; trackBy: trackByUrl\"\n >\n <div\n data-testclass=\"attachment-container\"\n class=\"str-chat__message-attachment str-chat__message-attachment--{{\n attachment.type\n }} str-chat__message-attachment-dynamic-size\"\n [class.str-chat__message-attachment--card]=\"isCard(attachment)\"\n [class.str-chat-angular__message-attachment-file-single]=\"\n isFile(attachment)\n \"\n [class.str-chat__message-attachment--voice-recording]=\"\n isVoiceMessage(attachment)\n \"\n [class.str-chat__message-attachment-with-actions]=\"\n attachment.actions && attachment.actions.length > 0\n \"\n [class.str-chat__message-attachment--svg-image]=\"isSvg(attachment)\"\n >\n <ng-container *ngIf=\"isImage(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.imageAttachmentTemplate$ | async) ||\n defaultImage;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultImage let-attachmentContext=\"attachment\">\n <img\n #imgElement\n class=\"str-chat__message-attachment--img\"\n data-testclass=\"image\"\n [src]=\"\n getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).url\n \"\n [alt]=\"attachmentContext?.fallback\"\n [ngStyle]=\"{\n height: getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).height,\n width: getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).width,\n '--original-height': getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).originalHeight,\n '--original-width': getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).originalWidth\n }\"\n (click)=\"openImageModal([attachmentContext])\"\n (keyup.enter)=\"openImageModal([attachmentContext])\"\n />\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isGallery(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.galleryAttachmentTemplate$ | async) ||\n defaultGallery;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultGallery let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__gallery\"\n data-testid=\"image-gallery\"\n [class.str-chat__gallery--square]=\"\n (attachmentContext?.images)!.length > 3\n \"\n [class.str-chat__gallery-two-rows]=\"\n (attachmentContext?.images)!.length > 2\n \"\n >\n <ng-container\n *ngFor=\"\n let galleryImage of attachmentContext.images;\n let index = index;\n let isLast = last;\n trackBy: trackByImageUrl\n \"\n >\n <button\n *ngIf=\"index < 3 || (index === 3 && isLast)\"\n class=\"str-chat__gallery-image\"\n data-testclass=\"gallery-image\"\n [class.str-chat__message-attachment--svg-image]=\"\n isSvg(galleryImage)\n \"\n (click)=\"openImageModal(attachmentContext.images!, index)\"\n (keyup.enter)=\"openImageModal(attachmentContext.images!, index)\"\n >\n <img\n #imgElement\n fetchpriority=\"low\"\n loading=\"lazy\"\n [src]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).url\n \"\n [alt]=\"galleryImage.fallback\"\n [style.--original-height]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).originalHeight\n \"\n [style.--original-width]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).originalWidth\n \"\n [ngStyle]=\"{\n height: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).height,\n width: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).width\n }\"\n />\n </button>\n <button\n *ngIf=\"index === 3 && !isLast\"\n #element\n class=\"str-chat__gallery-placeholder\"\n data-testclass=\"gallery-image\"\n data-testid=\"more-image-button\"\n [class.str-chat__message-attachment--svg-image]=\"\n isSvg(galleryImage)\n \"\n [ngStyle]=\"{\n 'background-image':\n 'url(' +\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).url +\n ')',\n height: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).height,\n width: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).width,\n '--original-height': getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).originalHeight,\n '--original-width': getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).originalWidth\n }\"\n (click)=\"openImageModal(attachmentContext.images!, index)\"\n (keyup.enter)=\"openImageModal(attachmentContext.images!, index)\"\n >\n <p\n [innerHTML]=\"\n 'streamChat.{{ imageCount }} more'\n | translate\n : { imageCount: attachmentContext!.images!.length - 4 }\n \"\n ></p>\n </button>\n </ng-container>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isVideo(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.videoAttachmentTemplate$ | async) ||\n defaultVideo;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultVideo let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__player-wrapper\"\n data-testclass=\"video-attachment-parent\"\n [style.--original-height]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .originalHeight\n \"\n [style.--original-width]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .originalWidth\n \"\n [ngStyle]=\"{\n height: getVideoAttachmentConfiguration(\n attachmentContext,\n videoElement\n ).height,\n width: getVideoAttachmentConfiguration(\n attachmentContext,\n videoElement\n ).width\n }\"\n >\n <video\n #videoElement\n class=\"str-chat__video-angular\"\n controls\n data-testclass=\"video-attachment\"\n [src]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .url\n \"\n [poster]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .thumbUrl\n \"\n ></video>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isFile(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.fileAttachmentTemplate$ | async) ||\n defaultFile;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultFile let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__message-attachment-file--item str-chat-angular__message-attachment-file-single\"\n >\n <stream-icon-placeholder\n class=\"str-chat__attachment-type-icon\"\n icon=\"unspecified-filetype\"\n ></stream-icon-placeholder>\n <div class=\"str-chat__message-attachment-file--item-text\">\n <a\n class=\"str-chat__message-attachment-file--item-first-row\"\n data-testclass=\"file-link\"\n target=\"_blank\"\n href=\"{{ attachmentContext.asset_url }}\"\n >\n <div\n data-testclass=\"file-title\"\n class=\"str-chat__message-attachment-file--item-name\"\n >\n {{ attachmentContext.title }}\n </div>\n <stream-icon-placeholder\n class=\"str-chat__message-attachment-download-icon\"\n icon=\"download\"\n ></stream-icon-placeholder>\n </a>\n <span\n *ngIf=\"hasFileSize(attachmentContext)\"\n class=\"str-chat__message-attachment-file--item-size\"\n data-testclass=\"size\"\n >{{ getFileSize(attachmentContext) }}</span\n >\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isVoiceMessage(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.voiceRecordingAttachmentTemplate$\n | async) || defaultRecording;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultRecording>\n <stream-voice-recording\n data-testclass=\"voice-recording\"\n [attachment]=\"attachment\"\n ></stream-voice-recording>\n </ng-template>\n </ng-container>\n <ng-container\n *ngIf=\"\n isCard(attachment) &&\n getCardAttachmentConfiguration(attachment) as attachmentConfiguration\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.cardAttachmentTemplate$ | async) ||\n defaultCard;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultCard let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__message-attachment-card str-chat__message-attachment-card--{{\n attachmentContext.type\n }}\"\n >\n <div\n *ngIf=\"attachmentConfiguration.url\"\n class=\"str-chat__message-attachment-card--header\"\n >\n <img\n fetchpriority=\"low\"\n loading=\"lazy\"\n data-testclass=\"card-img\"\n alt=\"{{ attachmentConfiguration.url }}\"\n src=\"{{ attachmentConfiguration.url }}\"\n [ngStyle]=\"{\n height: attachmentConfiguration.height,\n width: attachmentConfiguration.width\n }\"\n />\n </div>\n <div class=\"str-chat__message-attachment-card--content\">\n <div class=\"str-chat__message-attachment-card--flex\">\n <div\n *ngIf=\"attachmentContext.title\"\n data-testclass=\"card-title\"\n class=\"str-chat__message-attachment-card--title\"\n >\n {{ attachmentContext.title }}\n </div>\n <div\n *ngIf=\"attachmentContext.text\"\n class=\"str-chat__message-attachment-card--text\"\n data-testclass=\"card-text\"\n >\n {{ attachmentContext.text }}\n </div>\n <a\n *ngIf=\"\n attachmentContext.title_link ||\n attachmentContext.og_scrape_url\n \"\n class=\"str-chat__message-attachment-card--url\"\n data-testclass=\"url-link\"\n noopener\n noreferrer\n target=\"_blank\"\n href=\"{{\n attachmentContext.title_link ||\n attachmentContext.og_scrape_url\n }}\"\n >\n {{\n trimUrl(\n attachmentContext.title_link ||\n attachmentContext.og_scrape_url\n )\n }}\n </a>\n </div>\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"attachment.actions && attachment.actions.length > 0\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.attachmentActionsTemplate$ | async) ||\n defaultActions;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultActions let-attachmentContext=\"attachment\">\n <div class=\"str-chat__message-attachment-actions\">\n <div class=\"str-chat__message-attachment-actions-form\">\n <button\n *ngFor=\"\n let action of attachmentContext.actions;\n trackBy: trackByActionValue\n \"\n data-testclass=\"attachment-action\"\n class=\"str-chat__message-attachment-actions-button str-chat__message-attachment-actions-button--{{\n action.style\n }}\"\n (click)=\"sendAction(action)\"\n (keyup.enter)=\"sendAction(action)\"\n >\n {{ action.text }}\n </button>\n </div>\n </div>\n </ng-template>\n </ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"imagesToView && imagesToView.length > 0\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.modalTemplate$ | async) || defaultModal;\n context: getModalContext()\n \"\n ></ng-container>\n </ng-container>\n</div>\n\n<ng-template\n #defaultModal\n let-isOpen=\"isOpen\"\n let-isOpenChangeHandler=\"isOpenChangeHandler\"\n let-content=\"content\"\n>\n <stream-modal\n class=\"stream-chat-angular__image-modal-host\"\n [isOpen]=\"isOpen\"\n [content]=\"content\"\n (isOpenChange)=\"isOpenChangeHandler($event)\"\n >\n </stream-modal>\n</ng-template>\n\n<ng-template #modalContent>\n <div class=\"stream-chat-angular__image-modal str-chat__image-carousel\">\n <img\n #imgElement\n class=\"stream-chat-angular__image-modal-image str-chat__image-carousel-image\"\n data-testid=\"modal-image\"\n [src]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).url\n \"\n [style.--original-height]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).originalHeight\n \"\n [style.--original-width]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).originalWidth\n \"\n [alt]=\"imagesToView[imagesToViewCurrentIndex].fallback\"\n [ngStyle]=\"{\n width: getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).width,\n height: getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).height\n }\"\n />\n <div>\n <button\n class=\"stream-chat-angular__image-modal-stepper str-chat__image-carousel-stepper str-chat__image-carousel-stepper-prev\"\n data-testid=\"image-modal-prev\"\n type=\"button\"\n [ngStyle]=\"{\n visibility: isImageModalPrevButtonVisible ? 'visible' : 'hidden'\n }\"\n (click)=\"stepImages(-1)\"\n (keyup.enter)=\"stepImages(-1)\"\n >\n <stream-icon-placeholder icon=\"arrow-left\"></stream-icon-placeholder>\n </button>\n <button\n class=\"stream-chat-angular__image-modal-stepper str-chat__image-carousel-stepper str-chat__image-carousel-stepper-next\"\n type=\"button\"\n data-testid=\"image-modal-next\"\n [ngStyle]=\"{\n visibility: isImageModalNextButtonVisible ? 'visible' : 'hidden'\n }\"\n (click)=\"stepImages(1)\"\n (keyup.enter)=\"stepImages(1)\"\n >\n <stream-icon-placeholder icon=\"arrow-right\"></stream-icon-placeholder>\n </button>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i5.ModalComponent, selector: "stream-modal", inputs: ["isOpen", "content"], outputs: ["isOpenChange"] }, { kind: "component", type: i6.IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon"] }, { kind: "component", type: i7.VoiceRecordingComponent, selector: "stream-voice-recording", inputs: ["attachment"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }] });
|
|
185
|
+
AttachmentListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: AttachmentListComponent, selector: "stream-attachment-list", inputs: { messageId: "messageId", parentMessageId: "parentMessageId", attachments: "attachments" }, outputs: { imageModalStateChange: "imageModalStateChange" }, host: { properties: { "class": "this.class" } }, viewQueries: [{ propertyName: "modalContent", first: true, predicate: ["modalContent"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"orderedAttachments.length > 0\" class=\"str-chat__attachment-list\">\n <ng-container\n *ngFor=\"let attachment of orderedAttachments; trackBy: trackByUrl\"\n >\n <div\n data-testclass=\"attachment-container\"\n class=\"str-chat__message-attachment str-chat__message-attachment--{{\n attachment.type\n }} str-chat__message-attachment-dynamic-size\"\n [class.str-chat__message-attachment--card]=\"isCard(attachment)\"\n [class.str-chat-angular__message-attachment-file-single]=\"\n isFile(attachment)\n \"\n [class.str-chat__message-attachment--voice-recording]=\"\n isVoiceMessage(attachment)\n \"\n [class.str-chat__message-attachment-with-actions]=\"\n attachment.actions && attachment.actions.length > 0\n \"\n [class.str-chat__message-attachment--svg-image]=\"isSvg(attachment)\"\n >\n <ng-container *ngIf=\"isImage(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.imageAttachmentTemplate$ | async) ||\n defaultImage;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultImage let-attachmentContext=\"attachment\">\n <img\n #imgElement\n class=\"str-chat__message-attachment--img\"\n data-testclass=\"image\"\n [src]=\"\n getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).url\n \"\n [alt]=\"attachmentContext?.fallback\"\n [ngStyle]=\"{\n height: getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).height,\n width: getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).width,\n '--original-height': getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).originalHeight,\n '--original-width': getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).originalWidth\n }\"\n (click)=\"openImageModal([attachmentContext])\"\n (keyup.enter)=\"openImageModal([attachmentContext])\"\n />\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isGallery(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.galleryAttachmentTemplate$ | async) ||\n defaultGallery;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultGallery let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__gallery\"\n data-testid=\"image-gallery\"\n [class.str-chat__gallery--square]=\"\n (attachmentContext?.images)!.length > 3\n \"\n [class.str-chat__gallery-two-rows]=\"\n (attachmentContext?.images)!.length > 2\n \"\n >\n <ng-container\n *ngFor=\"\n let galleryImage of attachmentContext.images;\n let index = index;\n let isLast = last;\n trackBy: trackByImageUrl\n \"\n >\n <button\n *ngIf=\"index < 3 || (index === 3 && isLast)\"\n class=\"str-chat__gallery-image\"\n data-testclass=\"gallery-image\"\n [class.str-chat__message-attachment--svg-image]=\"\n isSvg(galleryImage)\n \"\n (click)=\"openImageModal(attachmentContext.images!, index)\"\n (keyup.enter)=\"openImageModal(attachmentContext.images!, index)\"\n >\n <img\n #imgElement\n fetchpriority=\"low\"\n loading=\"lazy\"\n [src]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).url\n \"\n [alt]=\"galleryImage.fallback\"\n [style.--original-height]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).originalHeight\n \"\n [style.--original-width]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).originalWidth\n \"\n [ngStyle]=\"{\n height: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).height,\n width: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).width\n }\"\n />\n </button>\n <button\n *ngIf=\"index === 3 && !isLast\"\n #element\n class=\"str-chat__gallery-placeholder\"\n data-testclass=\"gallery-image\"\n data-testid=\"more-image-button\"\n [class.str-chat__message-attachment--svg-image]=\"\n isSvg(galleryImage)\n \"\n [ngStyle]=\"{\n 'background-image':\n 'url(' +\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).url +\n ')',\n height: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).height,\n width: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).width,\n '--original-height': getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).originalHeight,\n '--original-width': getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).originalWidth\n }\"\n (click)=\"openImageModal(attachmentContext.images!, index)\"\n (keyup.enter)=\"openImageModal(attachmentContext.images!, index)\"\n >\n <p\n [innerHTML]=\"\n 'streamChat.{{ imageCount }} more'\n | translate\n : { imageCount: attachmentContext!.images!.length - 4 }\n \"\n ></p>\n </button>\n </ng-container>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isVideo(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.videoAttachmentTemplate$ | async) ||\n defaultVideo;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultVideo let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__player-wrapper\"\n data-testclass=\"video-attachment-parent\"\n [style.--original-height]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .originalHeight\n \"\n [style.--original-width]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .originalWidth\n \"\n [ngStyle]=\"{\n height: getVideoAttachmentConfiguration(\n attachmentContext,\n videoElement\n ).height,\n width: getVideoAttachmentConfiguration(\n attachmentContext,\n videoElement\n ).width\n }\"\n >\n <video\n #videoElement\n class=\"str-chat__video-angular\"\n controls\n data-testclass=\"video-attachment\"\n [src]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .url\n \"\n [poster]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .thumbUrl\n \"\n ></video>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isFile(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.fileAttachmentTemplate$ | async) ||\n defaultFile;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultFile let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__message-attachment-file--item str-chat-angular__message-attachment-file-single\"\n >\n <stream-icon-placeholder\n class=\"str-chat__attachment-type-icon\"\n icon=\"unspecified-filetype\"\n ></stream-icon-placeholder>\n <div class=\"str-chat__message-attachment-file--item-text\">\n <a\n class=\"str-chat__message-attachment-file--item-first-row\"\n data-testclass=\"file-link\"\n target=\"_blank\"\n href=\"{{ attachmentContext.asset_url }}\"\n >\n <div\n data-testclass=\"file-title\"\n class=\"str-chat__message-attachment-file--item-name\"\n >\n {{ attachmentContext.title }}\n </div>\n <stream-icon-placeholder\n class=\"str-chat__message-attachment-download-icon\"\n icon=\"download\"\n ></stream-icon-placeholder>\n </a>\n <span\n *ngIf=\"hasFileSize(attachmentContext)\"\n class=\"str-chat__message-attachment-file--item-size\"\n data-testclass=\"size\"\n >{{ getFileSize(attachmentContext) }}</span\n >\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isVoiceMessage(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.voiceRecordingAttachmentTemplate$\n | async) || defaultRecording;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultRecording>\n <stream-voice-recording\n data-testclass=\"voice-recording\"\n [attachment]=\"attachment\"\n ></stream-voice-recording>\n </ng-template>\n </ng-container>\n <ng-container\n *ngIf=\"\n isCard(attachment) &&\n getCardAttachmentConfiguration(attachment) as attachmentConfiguration\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.cardAttachmentTemplate$ | async) ||\n defaultCard;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultCard let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__message-attachment-card str-chat__message-attachment-card--{{\n attachmentContext.type\n }}\"\n >\n <div\n *ngIf=\"attachmentConfiguration.url\"\n class=\"str-chat__message-attachment-card--header\"\n >\n <img\n fetchpriority=\"low\"\n loading=\"lazy\"\n data-testclass=\"card-img\"\n alt=\"{{ attachmentConfiguration.url }}\"\n src=\"{{ attachmentConfiguration.url }}\"\n [ngStyle]=\"{\n height: attachmentConfiguration.height,\n width: attachmentConfiguration.width\n }\"\n />\n </div>\n <div class=\"str-chat__message-attachment-card--content\">\n <div class=\"str-chat__message-attachment-card--flex\">\n <div\n *ngIf=\"attachmentContext.title\"\n data-testclass=\"card-title\"\n class=\"str-chat__message-attachment-card--title\"\n >\n {{ attachmentContext.title }}\n </div>\n <div\n *ngIf=\"attachmentContext.text\"\n class=\"str-chat__message-attachment-card--text\"\n data-testclass=\"card-text\"\n >\n {{ attachmentContext.text }}\n </div>\n <a\n *ngIf=\"\n attachmentContext.title_link ||\n attachmentContext.og_scrape_url\n \"\n class=\"str-chat__message-attachment-card--url\"\n data-testclass=\"url-link\"\n noopener\n noreferrer\n target=\"_blank\"\n href=\"{{\n attachmentContext.title_link ||\n attachmentContext.og_scrape_url\n }}\"\n >\n {{\n trimUrl(\n attachmentContext.title_link ||\n attachmentContext.og_scrape_url\n )\n }}\n </a>\n </div>\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"attachment.actions && attachment.actions.length > 0\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.attachmentActionsTemplate$ | async) ||\n defaultActions;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultActions let-attachmentContext=\"attachment\">\n <div class=\"str-chat__message-attachment-actions\">\n <div class=\"str-chat__message-attachment-actions-form\">\n <button\n *ngFor=\"\n let action of attachmentContext.actions;\n trackBy: trackByActionValue\n \"\n data-testclass=\"attachment-action\"\n class=\"str-chat__message-attachment-actions-button str-chat__message-attachment-actions-button--{{\n action.style\n }}\"\n (click)=\"sendAction(action)\"\n (keyup.enter)=\"sendAction(action)\"\n >\n {{ action.text }}\n </button>\n </div>\n </div>\n </ng-template>\n </ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"imagesToView && imagesToView.length > 0\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.modalTemplate$ | async) || defaultModal;\n context: getModalContext()\n \"\n ></ng-container>\n </ng-container>\n</div>\n\n<ng-template\n #defaultModal\n let-isOpen=\"isOpen\"\n let-isOpenChangeHandler=\"isOpenChangeHandler\"\n let-content=\"content\"\n>\n <stream-modal\n class=\"stream-chat-angular__image-modal-host\"\n [isOpen]=\"isOpen\"\n [content]=\"content\"\n (isOpenChange)=\"isOpenChangeHandler($event)\"\n >\n </stream-modal>\n</ng-template>\n\n<ng-template #modalContent>\n <div class=\"stream-chat-angular__image-modal str-chat__image-carousel\">\n <img\n #imgElement\n class=\"stream-chat-angular__image-modal-image str-chat__image-carousel-image\"\n data-testid=\"modal-image\"\n [src]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).url\n \"\n [style.--original-height]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).originalHeight\n \"\n [style.--original-width]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).originalWidth\n \"\n [alt]=\"imagesToView[imagesToViewCurrentIndex].fallback\"\n [ngStyle]=\"{\n width: getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).width,\n height: getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).height\n }\"\n />\n <div>\n <button\n class=\"stream-chat-angular__image-modal-stepper str-chat__image-carousel-stepper str-chat__image-carousel-stepper-prev\"\n data-testid=\"image-modal-prev\"\n type=\"button\"\n [ngStyle]=\"{\n visibility: isImageModalPrevButtonVisible ? 'visible' : 'hidden'\n }\"\n (click)=\"stepImages(-1)\"\n (keyup.enter)=\"stepImages(-1)\"\n >\n <stream-icon-placeholder icon=\"arrow-left\"></stream-icon-placeholder>\n </button>\n <button\n class=\"stream-chat-angular__image-modal-stepper str-chat__image-carousel-stepper str-chat__image-carousel-stepper-next\"\n type=\"button\"\n data-testid=\"image-modal-next\"\n [ngStyle]=\"{\n visibility: isImageModalNextButtonVisible ? 'visible' : 'hidden'\n }\"\n (click)=\"stepImages(1)\"\n (keyup.enter)=\"stepImages(1)\"\n >\n <stream-icon-placeholder icon=\"arrow-right\"></stream-icon-placeholder>\n </button>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i5.VoiceRecordingComponent, selector: "stream-voice-recording", inputs: ["attachment"] }, { kind: "component", type: i6.IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon"] }, { kind: "component", type: i7.ModalComponent, selector: "stream-modal", inputs: ["isOpen", "content"], outputs: ["isOpenChange"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }] });
|
|
186
186
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: AttachmentListComponent, decorators: [{
|
|
187
187
|
type: Component,
|
|
188
188
|
args: [{ selector: 'stream-attachment-list', template: "<div *ngIf=\"orderedAttachments.length > 0\" class=\"str-chat__attachment-list\">\n <ng-container\n *ngFor=\"let attachment of orderedAttachments; trackBy: trackByUrl\"\n >\n <div\n data-testclass=\"attachment-container\"\n class=\"str-chat__message-attachment str-chat__message-attachment--{{\n attachment.type\n }} str-chat__message-attachment-dynamic-size\"\n [class.str-chat__message-attachment--card]=\"isCard(attachment)\"\n [class.str-chat-angular__message-attachment-file-single]=\"\n isFile(attachment)\n \"\n [class.str-chat__message-attachment--voice-recording]=\"\n isVoiceMessage(attachment)\n \"\n [class.str-chat__message-attachment-with-actions]=\"\n attachment.actions && attachment.actions.length > 0\n \"\n [class.str-chat__message-attachment--svg-image]=\"isSvg(attachment)\"\n >\n <ng-container *ngIf=\"isImage(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.imageAttachmentTemplate$ | async) ||\n defaultImage;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultImage let-attachmentContext=\"attachment\">\n <img\n #imgElement\n class=\"str-chat__message-attachment--img\"\n data-testclass=\"image\"\n [src]=\"\n getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).url\n \"\n [alt]=\"attachmentContext?.fallback\"\n [ngStyle]=\"{\n height: getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).height,\n width: getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).width,\n '--original-height': getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).originalHeight,\n '--original-width': getImageAttachmentConfiguration(\n attachmentContext,\n 'single',\n imgElement\n ).originalWidth\n }\"\n (click)=\"openImageModal([attachmentContext])\"\n (keyup.enter)=\"openImageModal([attachmentContext])\"\n />\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isGallery(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.galleryAttachmentTemplate$ | async) ||\n defaultGallery;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultGallery let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__gallery\"\n data-testid=\"image-gallery\"\n [class.str-chat__gallery--square]=\"\n (attachmentContext?.images)!.length > 3\n \"\n [class.str-chat__gallery-two-rows]=\"\n (attachmentContext?.images)!.length > 2\n \"\n >\n <ng-container\n *ngFor=\"\n let galleryImage of attachmentContext.images;\n let index = index;\n let isLast = last;\n trackBy: trackByImageUrl\n \"\n >\n <button\n *ngIf=\"index < 3 || (index === 3 && isLast)\"\n class=\"str-chat__gallery-image\"\n data-testclass=\"gallery-image\"\n [class.str-chat__message-attachment--svg-image]=\"\n isSvg(galleryImage)\n \"\n (click)=\"openImageModal(attachmentContext.images!, index)\"\n (keyup.enter)=\"openImageModal(attachmentContext.images!, index)\"\n >\n <img\n #imgElement\n fetchpriority=\"low\"\n loading=\"lazy\"\n [src]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).url\n \"\n [alt]=\"galleryImage.fallback\"\n [style.--original-height]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).originalHeight\n \"\n [style.--original-width]=\"\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).originalWidth\n \"\n [ngStyle]=\"{\n height: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).height,\n width: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n imgElement\n ).width\n }\"\n />\n </button>\n <button\n *ngIf=\"index === 3 && !isLast\"\n #element\n class=\"str-chat__gallery-placeholder\"\n data-testclass=\"gallery-image\"\n data-testid=\"more-image-button\"\n [class.str-chat__message-attachment--svg-image]=\"\n isSvg(galleryImage)\n \"\n [ngStyle]=\"{\n 'background-image':\n 'url(' +\n getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).url +\n ')',\n height: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).height,\n width: getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).width,\n '--original-height': getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).originalHeight,\n '--original-width': getImageAttachmentConfiguration(\n galleryImage,\n 'gallery',\n element\n ).originalWidth\n }\"\n (click)=\"openImageModal(attachmentContext.images!, index)\"\n (keyup.enter)=\"openImageModal(attachmentContext.images!, index)\"\n >\n <p\n [innerHTML]=\"\n 'streamChat.{{ imageCount }} more'\n | translate\n : { imageCount: attachmentContext!.images!.length - 4 }\n \"\n ></p>\n </button>\n </ng-container>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isVideo(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.videoAttachmentTemplate$ | async) ||\n defaultVideo;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultVideo let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__player-wrapper\"\n data-testclass=\"video-attachment-parent\"\n [style.--original-height]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .originalHeight\n \"\n [style.--original-width]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .originalWidth\n \"\n [ngStyle]=\"{\n height: getVideoAttachmentConfiguration(\n attachmentContext,\n videoElement\n ).height,\n width: getVideoAttachmentConfiguration(\n attachmentContext,\n videoElement\n ).width\n }\"\n >\n <video\n #videoElement\n class=\"str-chat__video-angular\"\n controls\n data-testclass=\"video-attachment\"\n [src]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .url\n \"\n [poster]=\"\n getVideoAttachmentConfiguration(attachmentContext, videoElement)\n .thumbUrl\n \"\n ></video>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isFile(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.fileAttachmentTemplate$ | async) ||\n defaultFile;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultFile let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__message-attachment-file--item str-chat-angular__message-attachment-file-single\"\n >\n <stream-icon-placeholder\n class=\"str-chat__attachment-type-icon\"\n icon=\"unspecified-filetype\"\n ></stream-icon-placeholder>\n <div class=\"str-chat__message-attachment-file--item-text\">\n <a\n class=\"str-chat__message-attachment-file--item-first-row\"\n data-testclass=\"file-link\"\n target=\"_blank\"\n href=\"{{ attachmentContext.asset_url }}\"\n >\n <div\n data-testclass=\"file-title\"\n class=\"str-chat__message-attachment-file--item-name\"\n >\n {{ attachmentContext.title }}\n </div>\n <stream-icon-placeholder\n class=\"str-chat__message-attachment-download-icon\"\n icon=\"download\"\n ></stream-icon-placeholder>\n </a>\n <span\n *ngIf=\"hasFileSize(attachmentContext)\"\n class=\"str-chat__message-attachment-file--item-size\"\n data-testclass=\"size\"\n >{{ getFileSize(attachmentContext) }}</span\n >\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"isVoiceMessage(attachment)\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.voiceRecordingAttachmentTemplate$\n | async) || defaultRecording;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultRecording>\n <stream-voice-recording\n data-testclass=\"voice-recording\"\n [attachment]=\"attachment\"\n ></stream-voice-recording>\n </ng-template>\n </ng-container>\n <ng-container\n *ngIf=\"\n isCard(attachment) &&\n getCardAttachmentConfiguration(attachment) as attachmentConfiguration\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.cardAttachmentTemplate$ | async) ||\n defaultCard;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultCard let-attachmentContext=\"attachment\">\n <div\n class=\"str-chat__message-attachment-card str-chat__message-attachment-card--{{\n attachmentContext.type\n }}\"\n >\n <div\n *ngIf=\"attachmentConfiguration.url\"\n class=\"str-chat__message-attachment-card--header\"\n >\n <img\n fetchpriority=\"low\"\n loading=\"lazy\"\n data-testclass=\"card-img\"\n alt=\"{{ attachmentConfiguration.url }}\"\n src=\"{{ attachmentConfiguration.url }}\"\n [ngStyle]=\"{\n height: attachmentConfiguration.height,\n width: attachmentConfiguration.width\n }\"\n />\n </div>\n <div class=\"str-chat__message-attachment-card--content\">\n <div class=\"str-chat__message-attachment-card--flex\">\n <div\n *ngIf=\"attachmentContext.title\"\n data-testclass=\"card-title\"\n class=\"str-chat__message-attachment-card--title\"\n >\n {{ attachmentContext.title }}\n </div>\n <div\n *ngIf=\"attachmentContext.text\"\n class=\"str-chat__message-attachment-card--text\"\n data-testclass=\"card-text\"\n >\n {{ attachmentContext.text }}\n </div>\n <a\n *ngIf=\"\n attachmentContext.title_link ||\n attachmentContext.og_scrape_url\n \"\n class=\"str-chat__message-attachment-card--url\"\n data-testclass=\"url-link\"\n noopener\n noreferrer\n target=\"_blank\"\n href=\"{{\n attachmentContext.title_link ||\n attachmentContext.og_scrape_url\n }}\"\n >\n {{\n trimUrl(\n attachmentContext.title_link ||\n attachmentContext.og_scrape_url\n )\n }}\n </a>\n </div>\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"attachment.actions && attachment.actions.length > 0\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.attachmentActionsTemplate$ | async) ||\n defaultActions;\n context: getAttachmentContext(attachment)\n \"\n ></ng-container>\n <ng-template #defaultActions let-attachmentContext=\"attachment\">\n <div class=\"str-chat__message-attachment-actions\">\n <div class=\"str-chat__message-attachment-actions-form\">\n <button\n *ngFor=\"\n let action of attachmentContext.actions;\n trackBy: trackByActionValue\n \"\n data-testclass=\"attachment-action\"\n class=\"str-chat__message-attachment-actions-button str-chat__message-attachment-actions-button--{{\n action.style\n }}\"\n (click)=\"sendAction(action)\"\n (keyup.enter)=\"sendAction(action)\"\n >\n {{ action.text }}\n </button>\n </div>\n </div>\n </ng-template>\n </ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"imagesToView && imagesToView.length > 0\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.modalTemplate$ | async) || defaultModal;\n context: getModalContext()\n \"\n ></ng-container>\n </ng-container>\n</div>\n\n<ng-template\n #defaultModal\n let-isOpen=\"isOpen\"\n let-isOpenChangeHandler=\"isOpenChangeHandler\"\n let-content=\"content\"\n>\n <stream-modal\n class=\"stream-chat-angular__image-modal-host\"\n [isOpen]=\"isOpen\"\n [content]=\"content\"\n (isOpenChange)=\"isOpenChangeHandler($event)\"\n >\n </stream-modal>\n</ng-template>\n\n<ng-template #modalContent>\n <div class=\"stream-chat-angular__image-modal str-chat__image-carousel\">\n <img\n #imgElement\n class=\"stream-chat-angular__image-modal-image str-chat__image-carousel-image\"\n data-testid=\"modal-image\"\n [src]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).url\n \"\n [style.--original-height]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).originalHeight\n \"\n [style.--original-width]=\"\n getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).originalWidth\n \"\n [alt]=\"imagesToView[imagesToViewCurrentIndex].fallback\"\n [ngStyle]=\"{\n width: getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).width,\n height: getCarouselImageAttachmentConfiguration(\n imagesToView[imagesToViewCurrentIndex],\n imgElement\n ).height\n }\"\n />\n <div>\n <button\n class=\"stream-chat-angular__image-modal-stepper str-chat__image-carousel-stepper str-chat__image-carousel-stepper-prev\"\n data-testid=\"image-modal-prev\"\n type=\"button\"\n [ngStyle]=\"{\n visibility: isImageModalPrevButtonVisible ? 'visible' : 'hidden'\n }\"\n (click)=\"stepImages(-1)\"\n (keyup.enter)=\"stepImages(-1)\"\n >\n <stream-icon-placeholder icon=\"arrow-left\"></stream-icon-placeholder>\n </button>\n <button\n class=\"stream-chat-angular__image-modal-stepper str-chat__image-carousel-stepper str-chat__image-carousel-stepper-next\"\n type=\"button\"\n data-testid=\"image-modal-next\"\n [ngStyle]=\"{\n visibility: isImageModalNextButtonVisible ? 'visible' : 'hidden'\n }\"\n (click)=\"stepImages(1)\"\n (keyup.enter)=\"stepImages(1)\"\n >\n <stream-icon-placeholder icon=\"arrow-right\"></stream-icon-placeholder>\n </button>\n </div>\n </div>\n</ng-template>\n" }]
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
import * as i1 from "@angular/common";
|
|
4
|
-
import * as i2 from "../icon-placeholder/icon-placeholder.component";
|
|
5
|
-
import * as i3 from "../loading-indicator-placeholder/loading-indicator-placeholder.component";
|
|
4
|
+
import * as i2 from "../icon/icon-placeholder/icon-placeholder.component";
|
|
5
|
+
import * as i3 from "../icon/loading-indicator-placeholder/loading-indicator-placeholder.component";
|
|
6
6
|
/**
|
|
7
7
|
* The `AttachmentPreviewList` component displays a preview of the attachments uploaded to a message. Users can delete attachments using the preview component, or retry upload if it failed previously.
|
|
8
8
|
*/
|
|
@@ -28,10 +28,10 @@ export class AttachmentPreviewListComponent {
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
AttachmentPreviewListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: AttachmentPreviewListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
31
|
-
AttachmentPreviewListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: AttachmentPreviewListComponent, selector: "stream-attachment-preview-list", inputs: { attachmentUploads$: "attachmentUploads$" }, outputs: { retryAttachmentUpload: "retryAttachmentUpload", deleteAttachment: "deleteAttachment" }, ngImport: i0, template: "<div\n *ngIf=\"(attachmentUploads$ | async)?.length\"\n class=\"str-chat__attachment-preview-list\"\n>\n <div class=\"str-chat__attachment-list-scroll-container\">\n <ng-container\n *ngFor=\"\n let attachmentUpload of attachmentUploads$ | async;\n trackBy: trackByFile\n \"\n >\n <div\n *ngIf=\"attachmentUpload.type === 'image'\"\n class=\"str-chat__attachment-preview-image\"\n data-testclass=\"attachment-image-preview\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n deleteButton;\n context: { attachmentUpload: attachmentUpload }\n \"\n ></ng-container>\n <div\n *ngIf=\"attachmentUpload.state === 'uploading'\"\n class=\"str-chat__attachment-preview-image-loading\"\n >\n <stream-loading-indicator-placeholder\n data-testclass=\"loading-indicator\"\n ></stream-loading-indicator-placeholder>\n </div>\n <ng-container\n *ngTemplateOutlet=\"\n retryButton;\n context: { attachmentUpload: attachmentUpload }\n \"\n ></ng-container>\n <img\n *ngIf=\"attachmentUpload.url || attachmentUpload.previewUri\"\n class=\"str-chat__attachment-preview-thumbnail\"\n data-testclass=\"attachment-image\"\n src=\"{{\n attachmentUpload.url\n ? attachmentUpload.url\n : attachmentUpload.previewUri\n }}\"\n alt=\"{{ attachmentUpload.file.name }}\"\n />\n </div>\n <div\n *ngIf=\"\n attachmentUpload.type === 'file'
|
|
31
|
+
AttachmentPreviewListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: AttachmentPreviewListComponent, selector: "stream-attachment-preview-list", inputs: { attachmentUploads$: "attachmentUploads$" }, outputs: { retryAttachmentUpload: "retryAttachmentUpload", deleteAttachment: "deleteAttachment" }, ngImport: i0, template: "<div\n *ngIf=\"(attachmentUploads$ | async)?.length\"\n class=\"str-chat__attachment-preview-list\"\n>\n <div class=\"str-chat__attachment-list-scroll-container\">\n <ng-container\n *ngFor=\"\n let attachmentUpload of attachmentUploads$ | async;\n trackBy: trackByFile\n \"\n >\n <div\n *ngIf=\"attachmentUpload.type === 'image'\"\n class=\"str-chat__attachment-preview-image\"\n data-testclass=\"attachment-image-preview\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n deleteButton;\n context: { attachmentUpload: attachmentUpload }\n \"\n ></ng-container>\n <div\n *ngIf=\"attachmentUpload.state === 'uploading'\"\n class=\"str-chat__attachment-preview-image-loading\"\n >\n <stream-loading-indicator-placeholder\n data-testclass=\"loading-indicator\"\n ></stream-loading-indicator-placeholder>\n </div>\n <ng-container\n *ngTemplateOutlet=\"\n retryButton;\n context: { attachmentUpload: attachmentUpload }\n \"\n ></ng-container>\n <img\n *ngIf=\"attachmentUpload.url || attachmentUpload.previewUri\"\n class=\"str-chat__attachment-preview-thumbnail\"\n data-testclass=\"attachment-image\"\n src=\"{{\n attachmentUpload.url\n ? attachmentUpload.url\n : attachmentUpload.previewUri\n }}\"\n alt=\"{{ attachmentUpload.file.name }}\"\n />\n </div>\n <div\n *ngIf=\"\n attachmentUpload.type === 'file' ||\n attachmentUpload.type === 'video' ||\n attachmentUpload.type === 'voiceRecording'\n \"\n class=\"str-chat__attachment-preview-file str-chat__attachment-preview-type-{{\n attachmentUpload.type\n }}\"\n data-testclass=\"attachment-file-preview\"\n >\n <stream-icon-placeholder\n class=\"str-chat__attachment-preview-file-icon\"\n icon=\"unspecified-filetype\"\n ></stream-icon-placeholder>\n\n <div class=\"str-chat__attachment-preview-file-end\">\n <div\n class=\"str-chat__attachment-preview-file-name\"\n title=\"{{ attachmentUpload.file.name }}\"\n >\n {{ attachmentUpload.file.name }}\n </div>\n <a\n *ngIf=\"attachmentUpload.state === 'success'\"\n class=\"str-chat__attachment-preview-file-download\"\n data-testclass=\"file-download-link\"\n download\n href=\"{{ attachmentUpload.url }}\"\n (click)=\"attachmentUpload.url ? null : $event.preventDefault()\"\n (keyup.enter)=\"\n attachmentUpload.url ? null : $event.preventDefault()\n \"\n >\n <stream-icon-placeholder icon=\"download\"></stream-icon-placeholder>\n </a>\n <stream-loading-indicator-placeholder\n *ngIf=\"attachmentUpload.state === 'uploading'\"\n data-testclass=\"loading-indicator\"\n ></stream-loading-indicator-placeholder>\n </div>\n <ng-container\n *ngTemplateOutlet=\"\n deleteButton;\n context: { attachmentUpload: attachmentUpload }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n retryButton;\n context: { attachmentUpload: attachmentUpload }\n \"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n</div>\n\n<ng-template #deleteButton let-attachmentUpload=\"attachmentUpload\">\n <div\n class=\"str-chat__attachment-preview-delete\"\n data-testclass=\"file-delete\"\n role=\"button\"\n (click)=\"attachmentDeleted(attachmentUpload)\"\n (keyup.enter)=\"attachmentDeleted(attachmentUpload)\"\n >\n <stream-icon-placeholder icon=\"close\"></stream-icon-placeholder>\n </div>\n</ng-template>\n\n<ng-template #retryButton let-attachmentUpload=\"attachmentUpload\">\n <div\n *ngIf=\"attachmentUpload.state === 'error'\"\n data-testclass=\"upload-retry\"\n class=\"str-chat__attachment-preview-error str-chat__attachment-preview-error-{{\n attachmentUpload.type === 'image' ? 'image' : 'file'\n }}\"\n (click)=\"attachmentUploadRetried(attachmentUpload.file)\"\n (keyup.enter)=\"attachmentUploadRetried(attachmentUpload.file)\"\n >\n <stream-icon-placeholder icon=\"retry\"></stream-icon-placeholder>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon"] }, { kind: "component", type: i3.LoadingIndicatorPlaceholderComponent, selector: "stream-loading-indicator-placeholder" }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] });
|
|
32
32
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: AttachmentPreviewListComponent, decorators: [{
|
|
33
33
|
type: Component,
|
|
34
|
-
args: [{ selector: 'stream-attachment-preview-list', template: "<div\n *ngIf=\"(attachmentUploads$ | async)?.length\"\n class=\"str-chat__attachment-preview-list\"\n>\n <div class=\"str-chat__attachment-list-scroll-container\">\n <ng-container\n *ngFor=\"\n let attachmentUpload of attachmentUploads$ | async;\n trackBy: trackByFile\n \"\n >\n <div\n *ngIf=\"attachmentUpload.type === 'image'\"\n class=\"str-chat__attachment-preview-image\"\n data-testclass=\"attachment-image-preview\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n deleteButton;\n context: { attachmentUpload: attachmentUpload }\n \"\n ></ng-container>\n <div\n *ngIf=\"attachmentUpload.state === 'uploading'\"\n class=\"str-chat__attachment-preview-image-loading\"\n >\n <stream-loading-indicator-placeholder\n data-testclass=\"loading-indicator\"\n ></stream-loading-indicator-placeholder>\n </div>\n <ng-container\n *ngTemplateOutlet=\"\n retryButton;\n context: { attachmentUpload: attachmentUpload }\n \"\n ></ng-container>\n <img\n *ngIf=\"attachmentUpload.url || attachmentUpload.previewUri\"\n class=\"str-chat__attachment-preview-thumbnail\"\n data-testclass=\"attachment-image\"\n src=\"{{\n attachmentUpload.url\n ? attachmentUpload.url\n : attachmentUpload.previewUri\n }}\"\n alt=\"{{ attachmentUpload.file.name }}\"\n />\n </div>\n <div\n *ngIf=\"\n attachmentUpload.type === 'file'
|
|
34
|
+
args: [{ selector: 'stream-attachment-preview-list', template: "<div\n *ngIf=\"(attachmentUploads$ | async)?.length\"\n class=\"str-chat__attachment-preview-list\"\n>\n <div class=\"str-chat__attachment-list-scroll-container\">\n <ng-container\n *ngFor=\"\n let attachmentUpload of attachmentUploads$ | async;\n trackBy: trackByFile\n \"\n >\n <div\n *ngIf=\"attachmentUpload.type === 'image'\"\n class=\"str-chat__attachment-preview-image\"\n data-testclass=\"attachment-image-preview\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n deleteButton;\n context: { attachmentUpload: attachmentUpload }\n \"\n ></ng-container>\n <div\n *ngIf=\"attachmentUpload.state === 'uploading'\"\n class=\"str-chat__attachment-preview-image-loading\"\n >\n <stream-loading-indicator-placeholder\n data-testclass=\"loading-indicator\"\n ></stream-loading-indicator-placeholder>\n </div>\n <ng-container\n *ngTemplateOutlet=\"\n retryButton;\n context: { attachmentUpload: attachmentUpload }\n \"\n ></ng-container>\n <img\n *ngIf=\"attachmentUpload.url || attachmentUpload.previewUri\"\n class=\"str-chat__attachment-preview-thumbnail\"\n data-testclass=\"attachment-image\"\n src=\"{{\n attachmentUpload.url\n ? attachmentUpload.url\n : attachmentUpload.previewUri\n }}\"\n alt=\"{{ attachmentUpload.file.name }}\"\n />\n </div>\n <div\n *ngIf=\"\n attachmentUpload.type === 'file' ||\n attachmentUpload.type === 'video' ||\n attachmentUpload.type === 'voiceRecording'\n \"\n class=\"str-chat__attachment-preview-file str-chat__attachment-preview-type-{{\n attachmentUpload.type\n }}\"\n data-testclass=\"attachment-file-preview\"\n >\n <stream-icon-placeholder\n class=\"str-chat__attachment-preview-file-icon\"\n icon=\"unspecified-filetype\"\n ></stream-icon-placeholder>\n\n <div class=\"str-chat__attachment-preview-file-end\">\n <div\n class=\"str-chat__attachment-preview-file-name\"\n title=\"{{ attachmentUpload.file.name }}\"\n >\n {{ attachmentUpload.file.name }}\n </div>\n <a\n *ngIf=\"attachmentUpload.state === 'success'\"\n class=\"str-chat__attachment-preview-file-download\"\n data-testclass=\"file-download-link\"\n download\n href=\"{{ attachmentUpload.url }}\"\n (click)=\"attachmentUpload.url ? null : $event.preventDefault()\"\n (keyup.enter)=\"\n attachmentUpload.url ? null : $event.preventDefault()\n \"\n >\n <stream-icon-placeholder icon=\"download\"></stream-icon-placeholder>\n </a>\n <stream-loading-indicator-placeholder\n *ngIf=\"attachmentUpload.state === 'uploading'\"\n data-testclass=\"loading-indicator\"\n ></stream-loading-indicator-placeholder>\n </div>\n <ng-container\n *ngTemplateOutlet=\"\n deleteButton;\n context: { attachmentUpload: attachmentUpload }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n retryButton;\n context: { attachmentUpload: attachmentUpload }\n \"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n</div>\n\n<ng-template #deleteButton let-attachmentUpload=\"attachmentUpload\">\n <div\n class=\"str-chat__attachment-preview-delete\"\n data-testclass=\"file-delete\"\n role=\"button\"\n (click)=\"attachmentDeleted(attachmentUpload)\"\n (keyup.enter)=\"attachmentDeleted(attachmentUpload)\"\n >\n <stream-icon-placeholder icon=\"close\"></stream-icon-placeholder>\n </div>\n</ng-template>\n\n<ng-template #retryButton let-attachmentUpload=\"attachmentUpload\">\n <div\n *ngIf=\"attachmentUpload.state === 'error'\"\n data-testclass=\"upload-retry\"\n class=\"str-chat__attachment-preview-error str-chat__attachment-preview-error-{{\n attachmentUpload.type === 'image' ? 'image' : 'file'\n }}\"\n (click)=\"attachmentUploadRetried(attachmentUpload.file)\"\n (keyup.enter)=\"attachmentUploadRetried(attachmentUpload.file)\"\n >\n <stream-icon-placeholder icon=\"retry\"></stream-icon-placeholder>\n </div>\n</ng-template>\n" }]
|
|
35
35
|
}], ctorParameters: function () { return []; }, propDecorators: { attachmentUploads$: [{
|
|
36
36
|
type: Input
|
|
37
37
|
}], retryAttachmentUpload: [{
|
|
@@ -39,4 +39,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImpor
|
|
|
39
39
|
}], deleteAttachment: [{
|
|
40
40
|
type: Output
|
|
41
41
|
}] } });
|
|
42
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC1wcmV2aWV3LWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL2F0dGFjaG1lbnQtcHJldmlldy1saXN0L2F0dGFjaG1lbnQtcHJldmlldy1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9hdHRhY2htZW50LXByZXZpZXctbGlzdC9hdHRhY2htZW50LXByZXZpZXctbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7OztBQUl2RTs7R0FFRztBQU1ILE1BQU0sT0FBTyw4QkFBOEI7SUFjekM7UUFUQTs7V0FFRztRQUNnQiwwQkFBcUIsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ3BFOztXQUVHO1FBQ2dCLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFvQixDQUFDO0lBRTVELENBQUM7SUFFaEIsdUJBQXVCLENBQUMsSUFBVTtRQUNoQyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxNQUF3QjtRQUN4QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxXQUFXLENBQUMsQ0FBUyxFQUFFLElBQXNCO1FBQzNDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDOzsySEExQlUsOEJBQThCOytHQUE5Qiw4QkFBOEIsK05DWjNDLHVnSkFtSUE7MkZEdkhhLDhCQUE4QjtrQkFMMUMsU0FBUzsrQkFDRSxnQ0FBZ0M7MEVBUWpDLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFJYSxxQkFBcUI7c0JBQXZDLE1BQU07Z0JBSVksZ0JBQWdCO3NCQUFsQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEF0dGFjaG1lbnRVcGxvYWQgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIGBBdHRhY2htZW50UHJldmlld0xpc3RgIGNvbXBvbmVudCBkaXNwbGF5cyBhIHByZXZpZXcgb2YgdGhlIGF0dGFjaG1lbnRzIHVwbG9hZGVkIHRvIGEgbWVzc2FnZS4gVXNlcnMgY2FuIGRlbGV0ZSBhdHRhY2htZW50cyB1c2luZyB0aGUgcHJldmlldyBjb21wb25lbnQsIG9yIHJldHJ5IHVwbG9hZCBpZiBpdCBmYWlsZWQgcHJldmlvdXNseS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3RyZWFtLWF0dGFjaG1lbnQtcHJldmlldy1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2F0dGFjaG1lbnQtcHJldmlldy1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXSxcbn0pXG5leHBvcnQgY2xhc3MgQXR0YWNobWVudFByZXZpZXdMaXN0Q29tcG9uZW50IHtcbiAgLyoqXG4gICAqIEEgc3RyZWFtIHRoYXQgZW1pdHMgdGhlIGN1cnJlbnQgZmlsZSB1cGxvYWRzIGFuZCB0aGVpciBzdGF0ZXNcbiAgICovXG4gIEBJbnB1dCgpIGF0dGFjaG1lbnRVcGxvYWRzJDogT2JzZXJ2YWJsZTxBdHRhY2htZW50VXBsb2FkW10+IHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogQW4gb3V0cHV0IHRvIG5vdGlmeSB0aGUgcGFyZW50IGNvbXBvbmVudCBpZiB0aGUgdXNlciB0cmllcyB0byByZXRyeSBhIGZhaWxlZCB1cGxvYWRcbiAgICovXG4gIEBPdXRwdXQoKSByZWFkb25seSByZXRyeUF0dGFjaG1lbnRVcGxvYWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGU+KCk7XG4gIC8qKlxuICAgKiBBbiBvdXRwdXQgdG8gbm90aWZ5IHRoZSBwYXJlbnQgY29tcG9uZW50IGlmIHRoZSB1c2VyIHdhbnRzIHRvIGRlbGV0ZSBhIGZpbGVcbiAgICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBkZWxldGVBdHRhY2htZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxBdHRhY2htZW50VXBsb2FkPigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBhdHRhY2htZW50VXBsb2FkUmV0cmllZChmaWxlOiBGaWxlKSB7XG4gICAgdGhpcy5yZXRyeUF0dGFjaG1lbnRVcGxvYWQuZW1pdChmaWxlKTtcbiAgfVxuXG4gIGF0dGFjaG1lbnREZWxldGVkKHVwbG9hZDogQXR0YWNobWVudFVwbG9hZCkge1xuICAgIHRoaXMuZGVsZXRlQXR0YWNobWVudC5lbWl0KHVwbG9hZCk7XG4gIH1cblxuICB0cmFja0J5RmlsZShfOiBudW1iZXIsIGl0ZW06IEF0dGFjaG1lbnRVcGxvYWQpIHtcbiAgICByZXR1cm4gaXRlbS5maWxlO1xuICB9XG59XG4iLCI8ZGl2XG4gICpuZ0lmPVwiKGF0dGFjaG1lbnRVcGxvYWRzJCB8IGFzeW5jKT8ubGVuZ3RoXCJcbiAgY2xhc3M9XCJzdHItY2hhdF9fYXR0YWNobWVudC1wcmV2aWV3LWxpc3RcIlxuPlxuICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX2F0dGFjaG1lbnQtbGlzdC1zY3JvbGwtY29udGFpbmVyXCI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nRm9yPVwiXG4gICAgICAgIGxldCBhdHRhY2htZW50VXBsb2FkIG9mIGF0dGFjaG1lbnRVcGxvYWRzJCB8IGFzeW5jO1xuICAgICAgICB0cmFja0J5OiB0cmFja0J5RmlsZVxuICAgICAgXCJcbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiYXR0YWNobWVudFVwbG9hZC50eXBlID09PSAnaW1hZ2UnXCJcbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fYXR0YWNobWVudC1wcmV2aWV3LWltYWdlXCJcbiAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJhdHRhY2htZW50LWltYWdlLXByZXZpZXdcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgIGRlbGV0ZUJ1dHRvbjtcbiAgICAgICAgICAgIGNvbnRleHQ6IHsgYXR0YWNobWVudFVwbG9hZDogYXR0YWNobWVudFVwbG9hZCB9XG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJhdHRhY2htZW50VXBsb2FkLnN0YXRlID09PSAndXBsb2FkaW5nJ1wiXG4gICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fYXR0YWNobWVudC1wcmV2aWV3LWltYWdlLWxvYWRpbmdcIlxuICAgICAgICA+XG4gICAgICAgICAgPHN0cmVhbS1sb2FkaW5nLWluZGljYXRvci1wbGFjZWhvbGRlclxuICAgICAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJsb2FkaW5nLWluZGljYXRvclwiXG4gICAgICAgICAgPjwvc3RyZWFtLWxvYWRpbmctaW5kaWNhdG9yLXBsYWNlaG9sZGVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICByZXRyeUJ1dHRvbjtcbiAgICAgICAgICAgIGNvbnRleHQ6IHsgYXR0YWNobWVudFVwbG9hZDogYXR0YWNobWVudFVwbG9hZCB9XG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8aW1nXG4gICAgICAgICAgKm5nSWY9XCJhdHRhY2htZW50VXBsb2FkLnVybCB8fCBhdHRhY2htZW50VXBsb2FkLnByZXZpZXdVcmlcIlxuICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2F0dGFjaG1lbnQtcHJldmlldy10aHVtYm5haWxcIlxuICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwiYXR0YWNobWVudC1pbWFnZVwiXG4gICAgICAgICAgc3JjPVwie3tcbiAgICAgICAgICAgIGF0dGFjaG1lbnRVcGxvYWQudXJsXG4gICAgICAgICAgICAgID8gYXR0YWNobWVudFVwbG9hZC51cmxcbiAgICAgICAgICAgICAgOiBhdHRhY2htZW50VXBsb2FkLnByZXZpZXdVcmlcbiAgICAgICAgICB9fVwiXG4gICAgICAgICAgYWx0PVwie3sgYXR0YWNobWVudFVwbG9hZC5maWxlLm5hbWUgfX1cIlxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgYXR0YWNobWVudFVwbG9hZC50eXBlID09PSAnZmlsZScgfHxcbiAgICAgICAgICBhdHRhY2htZW50VXBsb2FkLnR5cGUgPT09ICd2aWRlbycgfHxcbiAgICAgICAgICBhdHRhY2htZW50VXBsb2FkLnR5cGUgPT09ICd2b2ljZVJlY29yZGluZydcbiAgICAgICAgXCJcbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fYXR0YWNobWVudC1wcmV2aWV3LWZpbGUgc3RyLWNoYXRfX2F0dGFjaG1lbnQtcHJldmlldy10eXBlLXt7XG4gICAgICAgICAgYXR0YWNobWVudFVwbG9hZC50eXBlXG4gICAgICAgIH19XCJcbiAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJhdHRhY2htZW50LWZpbGUtcHJldmlld1wiXG4gICAgICA+XG4gICAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlclxuICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2F0dGFjaG1lbnQtcHJldmlldy1maWxlLWljb25cIlxuICAgICAgICAgIGljb249XCJ1bnNwZWNpZmllZC1maWxldHlwZVwiXG4gICAgICAgID48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fYXR0YWNobWVudC1wcmV2aWV3LWZpbGUtZW5kXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fYXR0YWNobWVudC1wcmV2aWV3LWZpbGUtbmFtZVwiXG4gICAgICAgICAgICB0aXRsZT1cInt7IGF0dGFjaG1lbnRVcGxvYWQuZmlsZS5uYW1lIH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBhdHRhY2htZW50VXBsb2FkLmZpbGUubmFtZSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxhXG4gICAgICAgICAgICAqbmdJZj1cImF0dGFjaG1lbnRVcGxvYWQuc3RhdGUgPT09ICdzdWNjZXNzJ1wiXG4gICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19hdHRhY2htZW50LXByZXZpZXctZmlsZS1kb3dubG9hZFwiXG4gICAgICAgICAgICBkYXRhLXRlc3RjbGFzcz1cImZpbGUtZG93bmxvYWQtbGlua1wiXG4gICAgICAgICAgICBkb3dubG9hZFxuICAgICAgICAgICAgaHJlZj1cInt7IGF0dGFjaG1lbnRVcGxvYWQudXJsIH19XCJcbiAgICAgICAgICAgIChjbGljayk9XCJhdHRhY2htZW50VXBsb2FkLnVybCA/IG51bGwgOiAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiXG4gICAgICAgICAgICAgIGF0dGFjaG1lbnRVcGxvYWQudXJsID8gbnVsbCA6ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlciBpY29uPVwiZG93bmxvYWRcIj48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8c3RyZWFtLWxvYWRpbmctaW5kaWNhdG9yLXBsYWNlaG9sZGVyXG4gICAgICAgICAgICAqbmdJZj1cImF0dGFjaG1lbnRVcGxvYWQuc3RhdGUgPT09ICd1cGxvYWRpbmcnXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwibG9hZGluZy1pbmRpY2F0b3JcIlxuICAgICAgICAgID48L3N0cmVhbS1sb2FkaW5nLWluZGljYXRvci1wbGFjZWhvbGRlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgZGVsZXRlQnV0dG9uO1xuICAgICAgICAgICAgY29udGV4dDogeyBhdHRhY2htZW50VXBsb2FkOiBhdHRhY2htZW50VXBsb2FkIH1cbiAgICAgICAgICBcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgcmV0cnlCdXR0b247XG4gICAgICAgICAgICBjb250ZXh0OiB7IGF0dGFjaG1lbnRVcGxvYWQ6IGF0dGFjaG1lbnRVcGxvYWQgfVxuICAgICAgICAgIFwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2RlbGV0ZUJ1dHRvbiBsZXQtYXR0YWNobWVudFVwbG9hZD1cImF0dGFjaG1lbnRVcGxvYWRcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwic3RyLWNoYXRfX2F0dGFjaG1lbnQtcHJldmlldy1kZWxldGVcIlxuICAgIGRhdGEtdGVzdGNsYXNzPVwiZmlsZS1kZWxldGVcIlxuICAgIHJvbGU9XCJidXR0b25cIlxuICAgIChjbGljayk9XCJhdHRhY2htZW50RGVsZXRlZChhdHRhY2htZW50VXBsb2FkKVwiXG4gICAgKGtleXVwLmVudGVyKT1cImF0dGFjaG1lbnREZWxldGVkKGF0dGFjaG1lbnRVcGxvYWQpXCJcbiAgPlxuICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlciBpY29uPVwiY2xvc2VcIj48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcmV0cnlCdXR0b24gbGV0LWF0dGFjaG1lbnRVcGxvYWQ9XCJhdHRhY2htZW50VXBsb2FkXCI+XG4gIDxkaXZcbiAgICAqbmdJZj1cImF0dGFjaG1lbnRVcGxvYWQuc3RhdGUgPT09ICdlcnJvcidcIlxuICAgIGRhdGEtdGVzdGNsYXNzPVwidXBsb2FkLXJldHJ5XCJcbiAgICBjbGFzcz1cInN0ci1jaGF0X19hdHRhY2htZW50LXByZXZpZXctZXJyb3Igc3RyLWNoYXRfX2F0dGFjaG1lbnQtcHJldmlldy1lcnJvci17e1xuICAgICAgYXR0YWNobWVudFVwbG9hZC50eXBlID09PSAnaW1hZ2UnID8gJ2ltYWdlJyA6ICdmaWxlJ1xuICAgIH19XCJcbiAgICAoY2xpY2spPVwiYXR0YWNobWVudFVwbG9hZFJldHJpZWQoYXR0YWNobWVudFVwbG9hZC5maWxlKVwiXG4gICAgKGtleXVwLmVudGVyKT1cImF0dGFjaG1lbnRVcGxvYWRSZXRyaWVkKGF0dGFjaG1lbnRVcGxvYWQuZmlsZSlcIlxuICA+XG4gICAgPHN0cmVhbS1pY29uLXBsYWNlaG9sZGVyIGljb249XCJyZXRyeVwiPjwvc3RyZWFtLWljb24tcGxhY2Vob2xkZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|