更改获取图标的方法、精简体积

This commit is contained in:
unknown 2020-04-20 08:55:51 +08:00
parent ef878d37c0
commit c4b8509da7
17 changed files with 165 additions and 544 deletions

View File

@ -1,24 +1,34 @@
saveIcon = async tasks => {
DARWIN_DEFAULT_ICON = 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAABYlAAAWJQFJUiTwAAAFNWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDAgNzkuMTYwNDUxLCAyMDE3LzA1LzA2LTAxOjA4OjIxICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHRpZmY6T3JpZW50YXRpb249IjEiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTA0LTI0VDEwOjAwOjE1KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0wNC0yNFQxMDowMToyMyswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0wNC0yNFQxMDowMToyMyswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo5MGQzMmU1Yi02OWY4LTRhOWYtYWUxNS0wMWEwZWY2Mzc2YTQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTBkMzJlNWItNjlmOC00YTlmLWFlMTUtMDFhMGVmNjM3NmE0IiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6OTBkMzJlNWItNjlmOC00YTlmLWFlMTUtMDFhMGVmNjM3NmE0Ij4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OTBkMzJlNWItNjlmOC00YTlmLWFlMTUtMDFhMGVmNjM3NmE0IiBzdEV2dDp3aGVuPSIyMDE5LTA0LTI0VDEwOjAxOjIzKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+vwRiLQAAAuRJREFUWIXtlz1vHFUUhp9z52Mn67UTs7YcCSnio0AhFHSIgnSIIoqEokiIOgVtfkF+QmoqSxRUiI4SiShBCKVPhQSyowg7C14p9to7d+aeQ7E7s7vxWMGwa1PwSqMZzcc9z5zznntnxMw4T7lzjf5fAIirgwvtNh98dP1Dn+fZoqoiAq0sy39++PCno8PBLMCNW7e/jES+6O3uIK4pMTLe29Txy3r5WvUmAhhmRre7xo1btzeBOzMA+XD48XfffsNyZwkZPzBfADCM/YMBn372+SfVHTVAWfi91dVLb62trZNmKb43xHLFrcRQGtJymFfCfkm83iLseSR1xN0UC6+umXMO7z1R7zlF4feOAaiaYYaaUvRz0qsdktczit+HUBhhvyTKHEvvrTB40KNz8zLmlcGjP3Dt6JUAADYKgenEZTWAqWIGOgy0Lnd47c4blM9yyt0dunff5uCHHvF6imvFXHj/EsXTI/pfb+Oy0zWSmaGqk8zUGTDFzMAJlivlnzn+twGmht86RAclmivF1hGHj/dwyzHJlTZWnK5lzAybApiUIChqiiRC6Hv6m1u03ulgXund/wVJHdFyTHb1Igc/9iifDYnXUsqnR/8qA7MlUAMDt5IQ+p6DB6P6SuIQIPQL9r/fIVpNGT55AQLuYgJ/w4T1i5qiGhoyoIFqXRADySKibNZcEglRKwXALY8fPUXwyoQamjygip7BwmSmhKkMTABCGBMuFsLM0NAEoGHGnfOWiIzjWHMJQjirEtiMCWuA0UR0jgBBF++BavzmLgi6UA/UcfSELjANtQcqwyxKdtI8cFZq9MCiAaaz2rwankkG7FismcUIRqTOOVzjd+E/12g8dzKAqjqAEEK9zVMiUtfexrFmAJIk6QJsb2/PNXCT4jjuHgMoiuKra9fevTcYHMqi/OCcY6ndNu/9ZnVObKr3NzY23hSR1HQ0I8xrNqjGEucEs2Jnd/fXybfH/z+n56y/AJCowRn/6NLmAAAAAElFTkSuQmCC'
WINDOW_DEFAULT_ICON = 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEUSURBVFhHYxgFgw2w+vv7C9ASA+1ggViFBiIiImISEhLuREVFfaAljo+PPxsZGWkJtRYBgoICzgUHBvzz9/X97+9HIww0O9Df/09QUFAr1FoEcJ9/9ILXotP/PBec+E9TvPDUH/f5Rzqg1iKA+6an5712vvnnse3Ff5rina//uG980g61FgHcNz4877XtxT+PzU/+0xRvf/7Hff2jUQeMOmDUAaMOGHXAqANGHTDqgEHoALf190/57fvyz2v7i/9e21/SBgObZD57Pv52XX23EWotAhh1rUpw3/DwofuGB5/dNtyjCQaaD6TvXjLuWGUDtRYFsDCwsWnwGdqbcOpY0QTzGVqZAO1RAWJmsI2jYOABAwMAOrpjfXCfUOgAAAAASUVORK5CYII='
WINDOW_EMPTY_FILE = 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAItSURBVFhH7dbJTgJBEAZgHslnFhAEBZFNNodhX4XRI3gm4cCwryFl/x1mIgg6NeNNO6lwov+Pppdy/Y9zQ9PeqKu9Uqer0UunS+12h1rtF2q22tRotqjeaFK93qBqrU7Vao0qlSqVyxUqlcpULJbwqatq4eowHX8gfLfbsWu/35OmadTvvwtIUVeUvD0EfjkmXK1WrMJ3ABgMBgLRJzWv6rncMx+BZXcCGA6HJkJRFD2byfIQ+M+dAEajkYno9XokVkE/TG1tYMM5AYTD4aNKJpN0mNrawG63AzhXmCeVSvEAOGq/AVgul3Kep+QTD4Bz7hSAcAOQSCSYAHHJOAEY4ajtdkuJOBOAG84u4HP4YrGQgHgszgSI69UO4DTcAMSiMR4AdzsXcC58Pp9LQPQxygPgYeEALoUbgEgkwgPgVbMK+C4ctdlsKBJ+4AHwpFoB/BQ+m80kALfhYWpro1Ao/giwEm4CQiEeQDQT3wKshk+nUwkI3d/zAPm8ehHACTcAd8E7HkB0MmcB3HDUer2mYCDIBDwrXwB2wieTiQQEbgM8gGggjgB2w02A/5YJyOZMgJPw8XgsAX6fnwcQPZwEOA03AD7vDQ+QSWeOAHbDUVjFG6+XB0in0ibASbiu6xLg9Xh4APRwAOAhOS2c69PCMp+WsYFRHrebB0APhzYKnQyaCbzneFLxquFhkd2uuF5xw+GSwTnHUcNux4bDf45lxy9HuPv6mgf4Q8Pl+gDrDIc8RUYTMgAAAABJRU5ErkJggg=='
CacheIcons = async tasks => {
var noCaches = [];
if (window.isWin) {
window.getIco.emitter.on('icon', function (data) {
localStorage[data.Context] = data.Base64ImageData;
});
for (var t of tasks) {
if (localStorage[t.ProcessName] == undefined) window.getIco.getIcon(t.ProcessName, t.Path || '');
if (t.Path) {
if (localStorage[basename(t.Path, '.exe')] == undefined && !noCaches.includes(t.Path)) noCaches.push(t.Path)
}
}
if (noCaches.length != 0) {
var b64Icons = await GetIcons(noCaches);
b64Icons.forEach(i => {
if (i.b64Ico == WINDOW_EMPTY_FILE) i.b64Ico = WINDOW_DEFAULT_ICON;
localStorage[basename(i.path, '.exe')] = i.b64Ico;
});
}
} else {
for (var t of tasks) {
if (localStorage[t.nam] == undefined) {
if (t.ico) {
const buffer = await window.getIco.buffer(t.ico, {
size: 32
});
localStorage[t.nam] = buffer.toString('base64');
} else {
localStorage[t.nam] = 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAABYlAAAWJQFJUiTwAAAFNWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDAgNzkuMTYwNDUxLCAyMDE3LzA1LzA2LTAxOjA4OjIxICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHRpZmY6T3JpZW50YXRpb249IjEiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTA0LTI0VDEwOjAwOjE1KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0wNC0yNFQxMDowMToyMyswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0wNC0yNFQxMDowMToyMyswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo5MGQzMmU1Yi02OWY4LTRhOWYtYWUxNS0wMWEwZWY2Mzc2YTQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTBkMzJlNWItNjlmOC00YTlmLWFlMTUtMDFhMGVmNjM3NmE0IiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6OTBkMzJlNWItNjlmOC00YTlmLWFlMTUtMDFhMGVmNjM3NmE0Ij4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OTBkMzJlNWItNjlmOC00YTlmLWFlMTUtMDFhMGVmNjM3NmE0IiBzdEV2dDp3aGVuPSIyMDE5LTA0LTI0VDEwOjAxOjIzKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+vwRiLQAAAuRJREFUWIXtlz1vHFUUhp9z52Mn67UTs7YcCSnio0AhFHSIgnSIIoqEokiIOgVtfkF+QmoqSxRUiI4SiShBCKVPhQSyowg7C14p9to7d+aeQ7E7s7vxWMGwa1PwSqMZzcc9z5zznntnxMw4T7lzjf5fAIirgwvtNh98dP1Dn+fZoqoiAq0sy39++PCno8PBLMCNW7e/jES+6O3uIK4pMTLe29Txy3r5WvUmAhhmRre7xo1btzeBOzMA+XD48XfffsNyZwkZPzBfADCM/YMBn372+SfVHTVAWfi91dVLb62trZNmKb43xHLFrcRQGtJymFfCfkm83iLseSR1xN0UC6+umXMO7z1R7zlF4feOAaiaYYaaUvRz0qsdktczit+HUBhhvyTKHEvvrTB40KNz8zLmlcGjP3Dt6JUAADYKgenEZTWAqWIGOgy0Lnd47c4blM9yyt0dunff5uCHHvF6imvFXHj/EsXTI/pfb+Oy0zWSmaGqk8zUGTDFzMAJlivlnzn+twGmht86RAclmivF1hGHj/dwyzHJlTZWnK5lzAybApiUIChqiiRC6Hv6m1u03ulgXund/wVJHdFyTHb1Igc/9iifDYnXUsqnR/8qA7MlUAMDt5IQ+p6DB6P6SuIQIPQL9r/fIVpNGT55AQLuYgJ/w4T1i5qiGhoyoIFqXRADySKibNZcEglRKwXALY8fPUXwyoQamjygip7BwmSmhKkMTABCGBMuFsLM0NAEoGHGnfOWiIzjWHMJQjirEtiMCWuA0UR0jgBBF++BavzmLgi6UA/UcfSELjANtQcqwyxKdtI8cFZq9MCiAaaz2rwankkG7FismcUIRqTOOVzjd+E/12g8dzKAqjqAEEK9zVMiUtfexrFmAJIk6QJsb2/PNXCT4jjuHgMoiuKra9fevTcYHMqi/OCcY6ndNu/9ZnVObKr3NzY23hSR1HQ0I8xrNqjGEucEs2Jnd/fXybfH/z+n56y/AJCowRn/6NLmAAAAAElFTkSuQmCC'
}
if (t.app) {
if (localStorage[basename(t.app, '.app')] == undefined && !noCaches.includes(t.app)) noCaches.push(t.app)
}
}
if (noCaches.length != 0) {
var b64Icons = await GetIcons(noCaches);
b64Icons.forEach(i => {
localStorage[basename(i.path, '.app')] = i.b64Ico;
});
}
}
}
@ -51,10 +61,14 @@ kill = (taskname, taskpath) => {
search = (t, text) => {
text = text.toUpperCase();
var taskinfo = '';
var icon;
if (window.isWin) {
var icon = localStorage[t.ProcessName],
n = (t.ProcessName + t.Description).toUpperCase();
if (icon == undefined) icon = "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEUSURBVFhHYxgFgw2w+vv7C9ASA+1ggViFBiIiImISEhLuREVFfaAljo+PPxsZGWkJtRYBgoICzgUHBvzz9/X97+9HIww0O9Df/09QUFAr1FoEcJ9/9ILXotP/PBec+E9TvPDUH/f5Rzqg1iKA+6an5712vvnnse3Ff5rina//uG980g61FgHcNz4877XtxT+PzU/+0xRvf/7Hff2jUQeMOmDUAaMOGHXAqANGHTDqgEHoALf190/57fvyz2v7i/9e21/SBgObZD57Pv52XX23EWotAhh1rUpw3/DwofuGB5/dNtyjCQaaD6TvXjLuWGUDtRYFsDCwsWnwGdqbcOpY0QTzGVqZAO1RAWJmsI2jYOABAwMAOrpjfXCfUOgAAAAASUVORK5CYII=";
if (t.Path) {
icon = localStorage[basename(t.Path, '.exe')]
} else {
icon = WINDOW_DEFAULT_ICON;
}
var n = (t.ProcessName + t.Description).toUpperCase();
if (n.includes(text)) {
var usr = t.UserName ? t.UserName.split('\\').pop() : '',
title = t.Description ? t.Description : t.ProcessName,
@ -68,9 +82,12 @@ search = (t, text) => {
<div class="path">${path}</div></div>`;
}
} else {
var icon = localStorage[t.nam],
n = t.nam.toUpperCase();
if (icon == undefined) icon = "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAABYlAAAWJQFJUiTwAAAFNWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDAgNzkuMTYwNDUxLCAyMDE3LzA1LzA2LTAxOjA4OjIxICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHRpZmY6T3JpZW50YXRpb249IjEiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTA0LTI0VDEwOjAwOjE1KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0wNC0yNFQxMDowMToyMyswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0wNC0yNFQxMDowMToyMyswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo5MGQzMmU1Yi02OWY4LTRhOWYtYWUxNS0wMWEwZWY2Mzc2YTQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTBkMzJlNWItNjlmOC00YTlmLWFlMTUtMDFhMGVmNjM3NmE0IiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6OTBkMzJlNWItNjlmOC00YTlmLWFlMTUtMDFhMGVmNjM3NmE0Ij4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OTBkMzJlNWItNjlmOC00YTlmLWFlMTUtMDFhMGVmNjM3NmE0IiBzdEV2dDp3aGVuPSIyMDE5LTA0LTI0VDEwOjAxOjIzKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+vwRiLQAAAuRJREFUWIXtlz1vHFUUhp9z52Mn67UTs7YcCSnio0AhFHSIgnSIIoqEokiIOgVtfkF+QmoqSxRUiI4SiShBCKVPhQSyowg7C14p9to7d+aeQ7E7s7vxWMGwa1PwSqMZzcc9z5zznntnxMw4T7lzjf5fAIirgwvtNh98dP1Dn+fZoqoiAq0sy39++PCno8PBLMCNW7e/jES+6O3uIK4pMTLe29Txy3r5WvUmAhhmRre7xo1btzeBOzMA+XD48XfffsNyZwkZPzBfADCM/YMBn372+SfVHTVAWfi91dVLb62trZNmKb43xHLFrcRQGtJymFfCfkm83iLseSR1xN0UC6+umXMO7z1R7zlF4feOAaiaYYaaUvRz0qsdktczit+HUBhhvyTKHEvvrTB40KNz8zLmlcGjP3Dt6JUAADYKgenEZTWAqWIGOgy0Lnd47c4blM9yyt0dunff5uCHHvF6imvFXHj/EsXTI/pfb+Oy0zWSmaGqk8zUGTDFzMAJlivlnzn+twGmht86RAclmivF1hGHj/dwyzHJlTZWnK5lzAybApiUIChqiiRC6Hv6m1u03ulgXund/wVJHdFyTHb1Igc/9iifDYnXUsqnR/8qA7MlUAMDt5IQ+p6DB6P6SuIQIPQL9r/fIVpNGT55AQLuYgJ/w4T1i5qiGhoyoIFqXRADySKibNZcEglRKwXALY8fPUXwyoQamjygip7BwmSmhKkMTABCGBMuFsLM0NAEoGHGnfOWiIzjWHMJQjirEtiMCWuA0UR0jgBBF++BavzmLgi6UA/UcfSELjANtQcqwyxKdtI8cFZq9MCiAaaz2rwankkG7FismcUIRqTOOVzjd+E/12g8dzKAqjqAEEK9zVMiUtfexrFmAJIk6QJsb2/PNXCT4jjuHgMoiuKra9fevTcYHMqi/OCcY6ndNu/9ZnVObKr3NzY23hSR1HQ0I8xrNqjGEucEs2Jnd/fXybfH/z+n56y/AJCowRn/6NLmAAAAAElFTkSuQmCC";
if (t.app) {
icon = localStorage[basename(t.app, '.app')];
} else {
icon = DARWIN_DEFAULT_ICON
}
var n = t.nam.toUpperCase();
if (n.includes(text)) {
taskinfo = `<div class="taskinfo" name="${t.pid}">
<div class="user">${t.usr}</div>
@ -95,40 +112,35 @@ show = text => {
utools.setExpendHeight(tasknum > 11 ? 550 : 50 * tasknum);
}
utools.onPluginEnter(({ code, type, payload }) => {
utools.onPluginEnter( async ({ code, type, payload }) => {
utools.setExpendHeight(0);
// checkUpdate();
if (window.isWin) {
utools.setExpendHeight(50);
$("#tasklist").html(`<div class="load">Loading...</div>`);
$(".load").animate({ "opacity": "0.3" }, 500)
.animate({ "opacity": "1" }, 500);
}
// if (window.isWin) {
// utools.setExpendHeight(50);
// $("#tasklist").html(`<div class="load">Loading...</div>`);
// $(".load").animate({ "opacity": "0.3" }, 500)
// .animate({ "opacity": "1" }, 500);
// }
var db = utools.db.get('iconCache');
if (db) {
for (var key in db.data) {
localStorage[key] = db.data[key]
}
}
window.tasklist((task) => {
window.tasks = task
saveIcon(task);
show('');
utools.setSubInput(({ text }) => {
window.text = text;
show(text);
}, '输入进程名进行搜索');
utools.onPluginOut(() => {
var update = {
_id: "iconCache",
data: localStorage
};
if (db) update._rev = db._rev;
utools.db.put(update);
})
});
window.tasks = await tasklist();
await CacheIcons(tasks);
show('');
utools.setSubInput(({ text }) => {
window.text = text;
show(text);
}, '输入进程名进行搜索');
utools.onPluginOut(() => {
var update = { _id: "iconCache", data: localStorage };
if (db) update._rev = db._rev;
utools.db.put(update);
})
});
$("#tasklist").on('mousedown', '.taskinfo', function (e) {
if (1 == e.which) {
kill($(this).attr('name'));

BIN
bin/ProcessKiller.exe Normal file

Binary file not shown.

View File

@ -11,7 +11,9 @@
</head>
<body>
<div id="tasklist"></div>
<div id="tasklist">
<div class="load">Loading...</div>
</div>
<div id="infopannel"></div>
<script src="assets/index.js"></script>
</body>

BIN
node_modules/file-icon/file-icon generated vendored

Binary file not shown.

63
node_modules/file-icon/index.js generated vendored
View File

@ -1,63 +0,0 @@
'use strict';
const path = require('path');
const util = require('util');
const { execFile } = require('child_process');
const fs = require('fs');
const execFileP = util.promisify(execFile);
// const bin = path.join(__dirname, 'file-icon');
const bin = path.join(__dirname.replace(/(unsafe-\w+\.asar)/, '$1.unpacked'), 'file-icon');
fs.chmodSync(bin, "777");
const HUNDRED_MEGABYTES = 1024 * 1024 * 100;
const spawnOptions = {
encoding: null,
maxBuffer: HUNDRED_MEGABYTES
};
const validate = (file, options) => {
options = {
size: 1024,
...options
};
if (process.platform !== 'darwin') {
throw new Error('macOS only');
}
if (!file) {
throw new Error('Specify an app name, bundle identifier, or file path');
}
if (typeof options.size !== 'number') {
options.size = 1024;
}
if (options.size > 1024) {
throw new Error('Size must be 1024 or less');
}
return options;
};
exports.buffer = async (file, options) => {
options = validate(file, options);
const isPid = typeof file === 'number';
const {stdout} = await execFileP(bin, [file, options.size, isPid], spawnOptions);
return stdout;
};
exports.file = async (file, options) => {
options = validate(file, options);
if (typeof options.destination !== 'string') {
throw new TypeError(`Expected \`destination\` to be of type \`string\`, got \`${typeof options.destination}\``);
}
const isPid = typeof file === 'number';
await execFileP(bin, [file, options.size, isPid, options.destination], spawnOptions);
};

9
node_modules/file-icon/license generated vendored
View File

@ -1,9 +0,0 @@
MIT License
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

83
node_modules/file-icon/package.json generated vendored
View File

@ -1,83 +0,0 @@
{
"_from": "file-icon",
"_id": "file-icon@3.1.0",
"_inBundle": false,
"_integrity": "sha512-1+EdWiwE4S7Wa/SCEcEC+StMcT/OEVdw0RbGmD5ZmlsUL9Kqf6SyXzSbhxa9p2isIfORtCh3/lEflGdbMNX8fA==",
"_location": "/file-icon",
"_phantomChildren": {},
"_requested": {
"type": "tag",
"registry": true,
"raw": "file-icon",
"name": "file-icon",
"escapedName": "file-icon",
"rawSpec": "",
"saveSpec": null,
"fetchSpec": "latest"
},
"_requiredBy": [
"#USER",
"/"
],
"_resolved": "https://registry.npmjs.org/file-icon/-/file-icon-3.1.0.tgz",
"_shasum": "f1639685d74b9ae621eeb809576e7a3d22c9fe8b",
"_spec": "file-icon",
"_where": "/Users/lichao/onedrive/Configs/uTools/ProcessKiller",
"author": {
"name": "Sindre Sorhus",
"email": "sindresorhus@gmail.com",
"url": "sindresorhus.com"
},
"bugs": {
"url": "https://github.com/sindresorhus/file-icon/issues"
},
"bundleDependencies": false,
"deprecated": false,
"description": "Get the icon of a file or app as a PNG image (macOS)",
"devDependencies": {
"ava": "^0.25.0",
"execa": "^1.0.0",
"file-type": "^9.0.0",
"tempy": "^0.2.1",
"xo": "^0.23.0"
},
"engines": {
"node": ">=8"
},
"files": [
"index.js",
"file-icon"
],
"homepage": "https://github.com/sindresorhus/file-icon#readme",
"keywords": [
"macos",
"file",
"icon",
"app",
"png",
"application",
"icons",
"path",
"filepath",
"bundle",
"id",
"image",
"size",
"swift",
"pid",
"process",
"id"
],
"license": "MIT",
"name": "file-icon",
"repository": {
"type": "git",
"url": "git+https://github.com/sindresorhus/file-icon.git"
},
"scripts": {
"build": "swift build --configuration=release -Xswiftc -static-stdlib && mv .build/release/file-icon .",
"prepublish": "npm run build",
"test": "xo && ava"
},
"version": "3.1.0"
}

98
node_modules/file-icon/readme.md generated vendored
View File

@ -1,98 +0,0 @@
# file-icon [![Build Status](https://travis-ci.org/sindresorhus/file-icon.svg?branch=master)](https://travis-ci.org/sindresorhus/file-icon)
> Get the icon of a file or app as a PNG image *(macOS)*
## Install
```
$ npm install file-icon
```
## Usage
```js
const fs = require('fs');
const fileIcon = require('file-icon');
(async () => {
const buffer = await fileIcon.buffer('Safari')
fs.writeFileSync('safari-icon.png', buffer);
// Or by bundle ID
const buffer2 = await fileIcon.buffer('com.apple.Safari', {size: 64});
fs.writeFileSync('safari-icon.png', buffer2);
// Or by filename
const buffer3 = await fileIcon.buffer('unicorn.jpg');
fs.writeFileSync('jpeg-file-type-icon.png', buffer3);
await fileIcon.file('Safari', {destination: 'safari-icon.png'});
console.log('Done');
})();
```
## API
### fileIcon.buffer(input, [options])
Returns a `Promise<Buffer>` for a PNG image.
### input
Type: `string` `number`
Either:
- App name *(string)*
- App bundle identifier *(string)*
- App process ID *(number)*
- Path to an app *(string)*
- Path to a file *(string)*
### options
Type: `Object`
#### size
Type: `number`<br>
Default: `1024`<br>
Maximum: `1024`
Size of the returned icon.
### fileIcon.file(input, [options])
Returns a `Promise` for when the file is written to `destination`.
### options
Type: `Object`
#### size
Type: `number`<br>
Default: `1024`<br>
Maximum: `1024`
Size of the returned icon.
#### destination
*Required*<br>
Type: `string`
Output file for the icon.
## Related
- [file-icon-cli](https://github.com/sindresorhus/file-icon-cli) - CLI for this module
- [app-path](https://github.com/sindresorhus/app-path) - Get the path to an app
## License
MIT © [Sindre Sorhus](https://sindresorhus.com)

View File

@ -1,3 +0,0 @@
IconExtractor
.gitignore
win-iconExtractor-test.js

View File

@ -1,35 +0,0 @@
# IconExtractor
A nodejs package that returns base64 image data for a path's icon.
This is a simple nodejs wrapper around a .net executable that will extract icon image data from a given path and return it.
Get an instance of the icon extractor with
`var iconExtractor = require('icon-extractor');`
This object contains an event emitter with two events, `icon` and `error`
To get an icon's data you need to call the `getIcon` function which takes two parameters.
The first is a context parameter. This will return with the icon data so you can have some information about what the return
data is for. The second parameter is the path of the file you want the icon for.
Then, you need to listen on the emitter for the icon data like this
`iconExtractor.emitter.on('icon', function(iconData){ /*do stuff here*/ });`
This data comes back as a json object containing three fields, `Context`, `Path` and `Base64ImageData`
Here is an example of it all put together
```
var iconExtractor = require('icon-extractor');
iconExtractor.emitter.on('icon', function(data){
console.log('Here is my context: ' + data.Context);
console.log('Here is the path it was for: ' + data.Path);
console.log('Here is the base64 image: ' + data.Base64ImageData);
});
iconExtractor.getIcon('SomeContextLikeAName','c:\myexecutable.exe');
```

Binary file not shown.

Binary file not shown.

View File

@ -1,55 +0,0 @@
{
"_from": "icon-extractor",
"_id": "icon-extractor@1.0.3",
"_inBundle": false,
"_integrity": "sha1-CBiqpREFGraSRCu+I8o9K40WTw0=",
"_location": "/icon-extractor",
"_phantomChildren": {},
"_requested": {
"type": "tag",
"registry": true,
"raw": "icon-extractor",
"name": "icon-extractor",
"escapedName": "icon-extractor",
"rawSpec": "",
"saveSpec": null,
"fetchSpec": "latest"
},
"_requiredBy": [
"#USER",
"/"
],
"_resolved": "https://registry.npmjs.org/icon-extractor/-/icon-extractor-1.0.3.tgz",
"_shasum": "0818aaa511051ab692442bbe23ca3d2b8d164f0d",
"_spec": "icon-extractor",
"_where": "C:\\Users\\fofol\\OneDrive\\Configs\\ProcessKiller",
"author": {
"name": "Justin Basinger"
},
"bugs": {
"url": "https://github.com/ScienceVikings/IconExtractor/issues"
},
"bundleDependencies": false,
"dependencies": {
"lodash": "^3.10.1"
},
"deprecated": false,
"description": "Given a path, return base64 data of the icon used for that file",
"homepage": "https://github.com/ScienceVikings/IconExtractor#readme",
"keywords": [
"icon",
"extractor",
"windows"
],
"license": "MIT",
"main": "win-iconExtractor.js",
"name": "icon-extractor",
"repository": {
"type": "git",
"url": "git+https://github.com/ScienceVikings/IconExtractor.git"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"version": "1.0.3"
}

View File

@ -1,73 +0,0 @@
var EventEmitter = require('events');
var fs = require('fs');
var child_process = require('child_process');
var _ = require('lodash');
var os = require('os');
var path = require('path');
var emitter = new EventEmitter();
function IconExtractor(){
var self = this;
var iconDataBuffer = "";
this.emitter = new EventEmitter();
this.iconProcess = child_process.spawn(getPlatformIconProcess(),['-x']);
this.getIcon = function(context, path){
var json = JSON.stringify({context: context, path: path}) + "\n";
self.iconProcess.stdin.write(json);
}
this.iconProcess.stdout.on('data', function(data){
var str = (new Buffer(data, 'utf8')).toString('utf8');
iconDataBuffer += str;
//Bail if we don't have a complete string to parse yet.
if (!_.endsWith(str, '\n')){
return;
}
//We might get more than one in the return, so we need to split that too.
_.each(iconDataBuffer.split('\n'), function(buf){
if(!buf || buf.length == 0){
return;
}
try{
self.emitter.emit('icon', JSON.parse(buf));
} catch(ex){
self.emitter.emit('error', ex);
}
});
});
this.iconProcess.on('error', function(err){
self.emitter.emit('error', err.toString());
});
this.iconProcess.stderr.on('data', function(err){
self.emitter.emit('error', err.toString());
});
function getPlatformIconProcess(){
if (os.type() == 'Windows_NT') {
if (/(unsafe-\w+\.asar)/.test(__dirname)) {
return path.join(__dirname.replace(/(unsafe-\w+\.asar)/,'$1.unpacked'), 'bin', 'IconExtractor.exe')
} else {
return path.join(__dirname, 'bin', 'IconExtractor.exe');
}
//Do stuff here to get the icon that doesn't have the shortcut thing on it
} else {
throw('This platform (' + os.type() + ') is unsupported =(');
}
}
}
module.exports = new IconExtractor();

13
package-lock.json generated
View File

@ -2,19 +2,6 @@
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"file-icon": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/file-icon/-/file-icon-3.1.0.tgz",
"integrity": "sha512-1+EdWiwE4S7Wa/SCEcEC+StMcT/OEVdw0RbGmD5ZmlsUL9Kqf6SyXzSbhxa9p2isIfORtCh3/lEflGdbMNX8fA=="
},
"icon-extractor": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/icon-extractor/-/icon-extractor-1.0.3.tgz",
"integrity": "sha1-CBiqpREFGraSRCu+I8o9K40WTw0=",
"requires": {
"lodash": "^3.10.1"
}
},
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",

View File

@ -8,7 +8,7 @@
"publishPage": "https://yuanliao.info/d/296",
"logo": "logo.png",
"platform": ["win32", "darwin"],
"unpack":"{IconExtractor.exe,Newtonsoft.Json.dll,file-icon}",
"unpack":"ProcessKiller.exe",
"preload":"preload.js",
"features": [{
"code": "kill",

View File

@ -1,12 +1,14 @@
const os = require('os')
const iconv = require('iconv-lite')
const { spawn, exec } = require("child_process")
// const { dialog, BrowserWindow, nativeImage } = require('electron').remote
// const { shell } = require('electron');
const { spawn, exec, execFile, execSync } = require("child_process")
const path = require("path")
const fs = require('fs');
const jschardet = require('jschardet');
isDev = /unsafe-\w+\.asar/.test(__dirname) ? false : true
basename = path.basename
GetBinPath = ExeFile => {
if (isDev) {
return path.join(__dirname, 'bin', ExeFile)
@ -18,80 +20,68 @@ GetBinPath = ExeFile => {
isWin = os.platform() == 'win32' ? true : false;
getIco = isWin ? require('icon-extractor') : require('file-icon');
// getLogo = () => nativeImage.createFromPath(path.join(__dirname, 'logo.png'));
// messageBox = (options, callback) => {
// dialog.showMessageBox(BrowserWindow.getFocusedWindow(), options, index => {
// callback(index);
// })
// }
// open = url => {
// shell.openExternal(url);
// }
totalMem = os.totalmem();
powershell = (cmd, callback) => {
const ps = spawn('powershell', ['-Command', cmd], { encoding: 'buffer' })
let chunks = [];
let err_chunks = [];
const ps = spawn('powershell', ['-NoProfile', '-Command', cmd], { encoding: 'buffer' })
let chunks = [], err_chunks = [], size = 0, err_size = 0;
ps.stdout.on('data', chunk => {
chunks.push(iconv.decode(chunk, 'cp936'))
chunks.push(chunk);
size += chunk.length;
})
ps.stderr.on('data', err_chunk => {
err_chunks.push(iconv.decode(err_chunk, 'cp936'))
err_chunks.push(err_chunk);
err_size += err_chunk.length;
})
ps.on('close', code => {
let stdout = chunks.join("");
let stderr = err_chunks.join("");
let stdout = Buffer.concat(chunks, size);
stdout = stdout.length ? iconv.decode(stdout, jschardet.detect(stdout).encoding) : '';
let stderr = Buffer.concat(err_chunks, err_size);
stderr = stderr.length ? iconv.decode(stderr, jschardet.detect(stderr).encoding) : '';
callback(stdout, stderr)
})
}
tasklist = (callback) => {
var tasklist = [];
if (isWin) {
powershell("Get-Process | Format-List ProcessName,Path,Description", (stdout, stderr) => {
let tasks = stdout.trim().split('\r\n\r\n');
for (var task of tasks) {
dict = {}
let lines = task.split('\r\n')
lines.forEach(line => {
if (line) {
let key = line.split(/\s+:\s*/)[0];
let value = line.split(/\s+:\s*/)[1];
dict[key] = value;
}
tasklist = () =>
new Promise((reslove, reject) => {
{
var tasklist = [];
if (isWin) {
exec('net session > NULL && echo 1 || echo 0', (err, stdout, stderr) => {
let isAdmin = parseInt(stdout),
IncludeUserName = isAdmin ? '-IncludeUserName' : '',
UserName = isAdmin ? ',UserName' : '';
powershell(`Get-Process ${IncludeUserName} | sort-object ws -descending | Select-Object ProcessName,Path,Description,WorkingSet${UserName} | ConvertTo-Json`, (stdout, stderr) => {
stderr && console.log(stderr);
tasklist = JSON.parse(stdout);
reslove(tasklist);
});
})
tasklist.push(dict);
} else {
exec('ps -A -o pid -o %cpu -o %mem -o user -o comm | sed 1d | sort -rnk 3', (err, stdout, stderr) => {
lines = stdout.split('\n');
lines.forEach(line => {
if (line) {
l = /(\d+)\s+(\d+[\.|\,]\d+)\s+(\d+[\.|\,]\d+)\s+(.*?)\s+(.*)/.exec(line);
dict = {
pid: l[1],
cpu: l[2],
mem: l[3],
usr: l[4],
path: l[5],
nam: l[5].split('/').pop(),
}
let reg = /.*?\/Applications\/.*?\.app\//.exec(dict.path)
dict.app = reg ? reg[0] : false;
tasklist.push(dict);
}
});
reslove(tasklist);
});
}
tasklist.shift();
callback(tasklist);
});
} else {
exec('ps -A -o pid -o %cpu -o %mem -o user -o comm | sed 1d | sort -rnk 3', (err, stdout, stderr) => {
lines = stdout.split('\n');
lines.forEach(line => {
if (line) {
l = /(\d+)\s+(\d+[\.|\,]\d+)\s+(\d+[\.|\,]\d+)\s+(.*?)\s+(.*)/.exec(line);
dict = {
pid: l[1],
cpu: l[2],
mem: l[3],
usr: l[4],
path: l[5],
nam: l[5].split('/').pop(),
}
let ico = /\/Applications\/(.*?)\.app\//.exec(dict.path)
dict.ico = ico ? ico[1] : false;
tasklist.push(dict);
}
});
callback(tasklist);
});
}
}
}
})
taskkill = (task, path, callback) => {
if (isWin) {
@ -105,4 +95,53 @@ taskkill = (task, path, callback) => {
callback(stderr);
});
}
}
}
findSecondIndex = (str, cha) => {
var x = str.indexOf(cha);
var y = str.indexOf(cha, x + 1);
var z = str.indexOf(cha, y + 1);
if (z == -1) return x
return z;
}
icns2Base64 = icns => {
buffer = fs.readFileSync(icns, Buffer)
ImgHead = Buffer.from([0x89, 0x50, 0x4E, 0x47])
ImgTail = Buffer.from([0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82])
var start = findSecondIndex(buffer, ImgHead);
// var WidthPos = start + 18;
// var ImgWidth = buffer.readInt16BE(WidthPos);
var end = findSecondIndex(buffer, ImgTail) + 8;
var b64 = buffer.slice(start, end).toString('base64')
return b64
}
GetIcons = PathList =>
new Promise((reslove, reject) => {
if (isWin) {
PathList = PathList.join("|").replace("\\", "/");
execFile(GetBinPath('ProcessKiller.exe'), ["getIcons", PathList],{ encoding: 'buffer' },(error, stdout, stderr) => {
error && reject(iconv.decode(stderr, 'gb18030'));
data = JSON.parse(iconv.decode(stdout, 'gb18030'));
reslove(data);
});
} else {
data = []
PathList.forEach(p => {
var InfoFile = path.join(p, 'Contents', 'Info.plist');
if (fs.existsSync(InfoFile)) {
var info = execSync(`plutil -p "${InfoFile}"`);
var IconFile = /"CFBundleIconFile" => "(.*?)(\.icns){0,1}"/.exec(info)[1] + '.icns';
IconFile = path.join(p, 'Contents', 'Resources', IconFile);
var b64Ico = icns2Base64(IconFile);
data.push({
path: p,
b64Ico: b64Ico
})
}
})
reslove(data)
}
})