NotesWhat is notes.io?

Notes brand slogan

Notes - notes.io

FolderSize.CMD V1.02 (C) [email protected] 2008-11-14

フォルダサイズ(フォルダ配下のファイルサイズ総合計)を表示するバッチファイル

1. 目的、用途

フォルダのプロパティページでは、フォルダサイズが表示されます。
コマンドラインのDIRコマンドでは、ファイル一覧が延々と表示された後に
フォルダサイズが表示されるので、ちょっと面倒です。

2. 使用方法

(1) FolderSize.CMD

FolderSize.CMD フォルダ...

ワイルドカード指定可。

JScriptをバッチファイルに組み込んでいます。

@if(0)==(0) ECHO OFF
FOR /D %%0 IN (%*) DO FOR /F %%1 IN ('CScript.exe //NoLogo //E:JScript "%~f0" "%%~f0"') DO ECHO %%1 %%0
GOTO :EOF
@end
var fso=new ActiveXObject('Scripting.FileSystemObject');
if(fso.FolderExists(WScript.Arguments.Item(0))){
var size=fso.GetFolder(WScript.Arguments.Item(0)).Size;
size=size.toLocaleString();
WScript.Echo(size.substr(0,size.length-3));
}

(2) DirSize.CMD

DirSize.CMD フォルダ...

ワイルドカード指定可。

バッチファイルだけでも作れます。

@echo off
setlocal
for /d %%0 in (%*) do (
for /f "tokens=1-3 delims= " %%1 in ('dir /s /a-d %%0') do if %%2==個のファイル set size=%%3
call echo;%%size%% %%0
)
---------------------------------------------------------------------

FolderWatcher.VBS V1.03 (C) [email protected] 2006-12-17

フォルダを監視してファイル/サブフォルダの作成/削除/変更を検出するVBScript

1. 目的、用途

フォルダの監視は、WMIや.NETを使わずとも、比較的簡単に出来そうです。
Shell.FolderViewのEnumDoneイベントを利用します。

2. 使用方法

(1) Windows XP

フォルダを指定して実行するか、ドロップします。

FolderWatcherW.VBS [フォルダ]
FolderWatcherM.VBS [フォルダ]

フォルダを省略すると、テンポラリフォルダを監視します。

FolderWatcherW.VBS は、IEウィンドウを開きます

ファイル/サブフォルダの作成/削除/変更を検出すると、IEウィンドウの末行に表示、
スクロールし、IEウィンドウをアクティブにします。
IEウィンドウがアクティブにできないときは、タスクバーで点滅します。

IEウィンドウを閉じると、フォルダの監視を終了します。

FolderWatcherM.VBS は、「フォルダ監視中」のメッセージを表示します。

ファイル/サブフォルダの作成/削除/変更を検出すると、メッセージを表示します。
CScript.exeで実行した場合は、コンソール/標準出力にメッセージを出力します。

「フォルダ監視中」のメッセージを閉じると、フォルダの監視を終了します。

' FolderWatcherM.VBS V1.02 (C) [email protected] 2006-09-01
' FolderWatcherM.VBS watches folder for changes.
' Usage: FolderWatcher.VBS [folder]

Option Explicit
Dim ix
Dim arg
Dim Folder
Dim Dic
Dim FolderItem
Dim SFV

If WScript.Arguments.Count() Then
arg=WScript.Arguments.Item(0)
Else
arg=CreateObject("Scripting.FileSystemObject").GetSpecialFolder(2).Path
End If
Set ix=CreateObject("InternetExplorer.Application")
ix.Navigate "file://" & arg
Do While ix.Busy Or ix.ReadyState<>4
WScript.Sleep 100
Loop
Set Folder=ix.Document.Folder

Set Dic=CreateObject("Scripting.Dictionary")
For Each FolderItem In Folder.Items()
Dic.Add FolderItem.Path,FolderItem.ModifyDate
Next
Set SFV=CreateObject("Shell.FolderView.1")
SFV.SetFolderView ix.Document
WScript.ConnectObject SFV,"SFV_"

MsgBox arg,vbInformation,"フォルダ監視中"

Sub SFV_EnumDone()
Dim Dic2
Dim Path
'WScript.Echo "EnumDone"
Set Dic2=CreateObject("Scripting.Dictionary")
For Each FolderItem In Folder.Items()
Dic2.Add FolderItem.Path,FolderItem.ModifyDate
If Dic.Exists(FolderItem.Path) Then
If Dic.Item(FolderItem.Path)<>Dic2.Item(FolderItem.Path) Then
WScript.Echo Join(Array(Now,"変更",FolderItem.Path,Dic.Item(FolderItem.Path),Dic2.Item(FolderItem.Path)),vbTab)
End If
Dic.Remove FolderItem.Path
Else
WScript.Echo Join(Array(Now,"作成",FolderItem.Path,Dic2.Item(FolderItem.Path)),vbTab)
End If
Next
For Each Path In Dic.Keys()
WScript.Echo Join(Array(Now,"削除",Path,Dic.Item(Path)),vbTab)
Next
Set Dic=Dic2
End Sub

' FolderWatcherW.VBS V1.02 (C) [email protected] 2006-09-01
' FolderWatcherW.VBS watches folder for changes.
' Usage: FolderWatcherW.VBS [folder]

Option Explicit
Dim ie
Dim ix
Dim arg
Dim Folder
Dim Dic
Dim FolderItem
Dim SFV

If WScript.Arguments.Count() Then
arg=WScript.Arguments.Item(0)
Else
arg=CreateObject("Scripting.FileSystemObject").GetSpecialFolder(2).Path
End If
Set ix=CreateObject("InternetExplorer.Application")
ix.Navigate "file://"&arg
Do While ix.Busy Or ix.ReadyState<>4
WScript.Sleep 100
Loop
Set Folder=ix.Document.Folder

Set ie=CreateObject("InternetExplorer.Application")
ie.AddressBar=False
ie.ToolBar=False
ie.MenuBar=False
ie.StatusBar=False
ie.Navigate "about:blank"
ie.Visible=True
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
ie.Document.Title="フォルダ監視中 - "&arg

Set Dic=CreateObject("Scripting.Dictionary")
For Each FolderItem In Folder.Items()
Dic.Add FolderItem.Path,FolderItem.ModifyDate
Next
Set SFV=CreateObject("Shell.FolderView.1")
SFV.SetFolderView ix.Document
WScript.ConnectObject SFV,"SFV_"

Do While TypeName(ie)="IWebBrowser2"
WScript.Sleep 1000
Loop
'MsgBox "Watch Ended."&" - "&arg,vbInformation,WScript.ScriptName

Sub SFV_EnumDone()
Dim Dic2
Dim Path
'WScript.Echo "EnumDone"
Set Dic2=CreateObject("Scripting.Dictionary")
For Each FolderItem In Folder.Items()
Dic2.Add FolderItem.Path,FolderItem.ModifyDate
If Dic.Exists(FolderItem.Path) Then
If Dic.Item(FolderItem.Path)<>Dic2.Item(FolderItem.Path) Then
ie.Document.body.insertAdjacentText "BeforeEnd",Join(Array(Now,"変更",FolderItem.Path,Dic.Item(FolderItem.Path),Dic2.Item(FolderItem.Path)),vbTab)&vbCrLf
End If
Dic.Remove FolderItem.Path
Else
ie.Document.body.insertAdjacentText "BeforeEnd",Join(Array(Now,"作成",FolderItem.Path,Dic2.Item(FolderItem.Path)),vbTab)&vbCrLf
End If
Next
For Each Path In Dic.Keys()
ie.Document.body.insertAdjacentText "BeforeEnd",Join(Array(Now,"削除",Path,Dic.Item(Path)),vbTab)&vbCrLf
Next
Set Dic=Dic2
ie.Document.parentWindow.scrollBy 0,ie.Document.body.scrollHeight
ie.Visible=True
End Sub
------------------------------------------------
CPowerShell.CMD V1.02 (C) [email protected] 2007-08-28

PowerShellの.PS1ファイルを起動するバッチファイル

1. 目的、用途

PowerShellの外のコマンドラインで.PS1ファイルを起動するのは、
シンタクスが一般の慣行と異なるため、少々厄介です。
特に、引数に長いファイル名を指定する場合が困ります。
そこで、バッチファイルで普通のシンタクスから変換して起動します。
(5) PS5.CMD

PS5.CMDも、PS1ファイルをインクルード(読み込んで、インライン実行)するので、
ExecutionPolicyがRestrictedのままでも、実行できます。

更に、標準入力をパイプやリダイレクトしても読めます。

PS5.CMD PS1ファイル [引数...]

コマンド | PS5.CMD PS1ファイル [引数...]

PS5.CMD PS1ファイル [引数...] < ファイル

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
(SET args=%*)
(SET args=!args:*%1=!)
(SET arg0=%~f1)
ECHO ON
powershell.exe -command "$stdin=@()+$input;if($stdin.length){$stdin=[String]::Join([Char]13+[Char]10,$stdin)}else{$stdin=[System.Console]::In.ReadToEnd()};$nl=[char]13+[char]10;$s=cat $env:arg0;$s='function main{'+[String]::Join($nl,$s)+$nl+'}$stdin|main'+$env:args;iex $s;"
-------------------------------------------------------
PS2CMD.CMD V1.01 (C) [email protected] 2007-09-04

PowerShellスクリプトをバッチファイル化する

1. 目的、用途

PowerShellの.PS1ファイルをそのまま他人に渡しても、それを実行するには、
いろいろと設定が必要で、困ります。
そんなときは、PowerShellスクリプトをバッチファイルにラップするとよいでしょう。
これなら、ExecutionPolicyがRestrictedのままでも、実行できます。

(4) PS2CMD7.CMD / PS2CMD8.CMD

更に、標準入力が使えるようにします。

.PS1ファイルの先頭に6行を加えて、拡張子を.CMDに変えます。

PS2CMD7.CMD 引数... <ファイル

コマンド | PS2CMD7.CMD 引数...

@ECHO OFF
SETLOCAL
(SET args=%*)
(SET arg0=%~f0)
powershell.exe -command "$stdin=@()+$input;if($stdin.length){$stdin=[String]::Join([Char]13+[Char]10,$stdin)}else{$stdin=[System.Console]::In.ReadToEnd()}$s=get-content $env:arg0;$s=$s[([Array]::LastIndexOf($s,'GOTO:EOF')+1)..($s.length-1)];$s='function getargs{$xargs=$args}. getargs '+$env:args+';'+[String]::Join([char]13+[char]10,$s);invoke-expression $s;"
GOTO:EOF
$xargs.gettype()
$xargs.length
$xargs
$stdin

引数は、環境変数args経由、$xargsに取り出しています。
元のスクリプトは、$xargsを参照するように変えます。
標準入力は$stdinで参照するように変えます。

或いは、.PS1ファイルの先頭に6行を加えて、拡張子を.CMDに変えます。

PS2CMD8.CMD 引数... <ファイル

コマンド | PS2CMD8.CMD 引数...

@ECHO OFF
SETLOCAL
(SET args=%*)
(SET arg0=%~f0)
powershell.exe -command "$stdin=@()+$input;if($stdin.length){$stdin=[String]::Join([Char]13+[Char]10,$stdin)}else{$stdin=[System.Console]::In.ReadToEnd()}$s=get-content $env:arg0;$s=$s[([Array]::LastIndexOf($s,'GOTO:EOF')+1)..($s.length-1)]+'';$s='function main {'+[String]::Join([char]13+[char]10,$s)+'}$stdin|main '+$env:args;invoke-expression $s;"
GOTO:EOF
$args.gettype()
$args.length
$args
$input

これは、元のスクリプトを関数に括って呼び出すので、引数を$argsのまま参照できます。
標準入力は$inputのまま参照できます。

@ECHO OFF
SETLOCAL
(SET args=%*)
(SET arg0=%~f0)
powershell.exe -command "$stdin=@()+$input;if($stdin.length){$stdin=[String]::Join([Char]13+[Char]10,$stdin)}else{$stdin=[System.Console]::In.ReadToEnd()}$s=get-content $env:arg0;$s=$s[([Array]::LastIndexOf($s,'GOTO:EOF')+1)..($s.length-1)]+'';$s='function main {'+[String]::Join([char]13+[char]10,$s)+'}$stdin|main '+$env:args;invoke-expression $s;"
GOTO:EOF
$args.gettype()
$args.length
$args
$input
------------------------------------------------------------------
vbs2cmd.CMD V1.05 (C) [email protected] 2007-12-09

VBSファイル、JSファイルをCMDファイルにするテキストヘッダ行

1. 目的、用途

unixに、#!というのがあります。スクリプトファイルの先頭行に#!で始まる、
或るテキスト行を書き加えて、ファイル属性を実行可能に変更すると、
コマンドのように実行できるようになる、というものです。
同様に、Windowsでも、スクリプトファイルの先頭に、或るテキスト行を付加して、
ファイル拡張子をCMDに変更すると、コマンドのように実行できます。

2. 使用方法

(1) js2cmd1.CMD

JSファイルの先頭に以下の1行を追加して、拡張子をCMDに変更します。

@if(0)==(0) CScript.exe //E:JScript //NoLogo "%~f0" %* & GOTO :EOF & @end
/*
JScript コード
*/

JScriptでは、@if(0)が偽なので、@if(0)から@endまで無視されます。

コマンドでは、IF (0) == (0) が真なので、CScript.exe以降が実行され、
GOTO :EOF以降が無視されます。

この1行は、

@if(0)==(0) ECHO OFF
CScript.exe //E:JScript //NoLogo "%~f0" %*
GOTO :EOF
@end
/*
JScript コード
*/

のように複数(4)行に分けて書くことも出来ます。

(2) js2cmd2.CMD

これを利用すると、以下のように、FORコマンドを使用して、
JScriptの標準出力をコマンドスクリプト側で取り出して処理することができます。

@if(0)==(0) ECHO OFF
FOR /F "delims=" %%0 IN ('CScript.exe //E:JScript //NoLogo "%~f0" %*') DO ECHO %%0
GOTO :EOF
@end
/*
JScript コード
*/

(3) vbs2cmd1.CMD

VBSファイルの先頭に以下の1行を追加して、拡張子をCMDに変更します。

REM:&@CScript.exe //E:VBS //NoLogo "%~f0" %* & GOTO :EOF
REM
REM VBScript コード
REM

REMは、VBScriptでもコマンドでもコメントです。

VBScriptでは、1行すべてがコメントです。

コマンドでも、普通は、1行すべてがコメントになりますが、
REM:とすると、複文の行末文字&|)が有効になって複文が書けます。

この方法では、標準出力にコマンドエコーの「REM :」が出力されます。
エコーオフにする@は、VBScriptの構文上、この位置では使えません。

(4) vbs2cmd2.CMD

以下のようにすると、邪魔なコマンドエコーが出なくなります。

@if(0)==(0) ECHO OFF
CScript.exe //E:JScript //NoLogo "%~f0" %*
GOTO :EOF
@end
var SC=new ActiveXObject('ScriptControl');SC.TimeOut=-1;
SC.Language='VBScript';SC.AddObject("WScript",WScript)
SC.AddCode(f.toString().split('rn').slice(1,-1).join('rn'));
function f(){/*
REM
REM VBScript コード
REM
*/}

ScriptControlを使用していますが、2000/XPに標準的に含まれています。
----------------------------------------------------------
CharSetOfText.VBS V1.00 (C) [email protected] 2007-02-07

テキストファイルの文字コードを調べるVBScriptとバッチファイル

1. 目的、用途

IEとhtmlfileはテキストの文字コードを自動判定します。これを利用して、
テキストファイルの文字コードを調べるVBScriptとバッチファイルです。

2. 使用方法

(1) CharSetOfTextByIE.VBS テキストファイル...

テキストファイル(複数可)を指定して実行するか、ドロップします。

IEのウィンドウにファイル内容を表示します。
このとき、ステータスバーに文字コードを表示します。
もし、文字化けしていれば、「表示」「エンコード」を変えてみます。
表示が正しければ、IEを終了します。
このときの文字コードをInputBoxの入力欄に入れて表示します。
これをコピーするなりして利用してください。
InputBoxを閉じるのは、OKでもCancelでも同じです。

IEで表示中は、安全のためデザインモードにしています。
もし、ページを誤って変更すると、終了時に保存ダイアログが表示されます。
そのときは、「いいえ(N)」−「変更を破棄します」を選択してください。

テキストファイルとして文字コードを調べるときは、
その都合で、拡張子が.txt以外の場合、一時的に.txtに変更します。

' CharSetOfText.VBS V1.00 (C) [email protected] 2007-02-07
' CharSetOfText.VBS automatically detects charset of text file by IE.
' Usage: Start CharSetOfText.VBS file...

Option Explicit
Dim fso
Dim Path
Dim File
Dim fRename
Dim ie
Dim CharSet

Set fso=CreateObject("Scripting.FileSystemObject")

For Each Path In WScript.Arguments
Set File=fso.GetFile(Path)
Select Case LCase(fso.GetExtensionName(File.Name))
Case "txt","text"
fRename=vbNo
Case "htm","html"
fRename=MsgBox(File.Name,vbQuestion+vbYesNo,"Open as Text or HTML ? Y as Text, N as HTML")
Case Else
fRename=vbYes
End Select
If fRename=vbYes Then File.Name=File.Name&".txt"
Set ie=WScript.CreateObject("InternetExplorer.Application","IE_")
ie.Visible=True
ie.Navigate File.Path
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
Do While TypeName(ie)="IWebBrowser2"
WScript.Sleep 1000
Loop
If fRename=vbYes Then File.Name=fso.GetBaseName(File.Name)
InputBox File.Path,WScript.ScriptName,CharSet
Next
WScript.Quit

Sub IE_NavigateComplete2(pdisp,url)
If ie.Document.designMode<>"On" Then ie.Document.designMode="On"
End Sub

Sub IE_OnQuit()
CharSet=ie.Document.charset
End Sub

Sub IE_DownloadComplete()
'MsgBox ie.Document.charset,,"DownloadComplete"
ie.Document.parentWindow.status=ie.Document.charset
End Sub
------------------------------------------------------
LoggingUrl.VBS V1.00 (C) [email protected] 2005-08-18

IE/Explorerで表示したページ/フォルダのタイトル/URLを記録/表示するVBScript/HTA

1. 目的、用途

IEやExplorerで表示したページやフォルダのタイトルとURLをファイルに記録し、
ウィンドウに表示します。

2. 使用方法

(1) LoggingUrl.VBS

起動すると、IEを立ち上げます。その後、別のページや
フォルダを開くと、それらのタイトルとURLを日時と共に、
デスクトップの.htmファイル「urllog.htm」に以下の形式で追加書き込みします。
日時 <a href=URL>タイトル</a><br>改行

記録対象は、LoggingUrl.VBSによって立ち上げたIEだけです。
対象のIEが終了すると、終了します。

Windows2000/XPでは、
同時並行して、「urllog.htm」を別のIEで開いて見ることも出来ます。
追加された情報を見るには、「最新の情報に更新」します。

Window98/MEでも、出来ると思いますが、タイミングエラーが発生するかも知れません。

Option Explicit
Dim ie
Dim OnQuit
Dim fso
Dim LogFile
Dim wShell

LogFile="urllog.htm"

Set wShell=CreateObject("WScript.Shell")
Set fso=CreateObject("Scripting.FileSystemObject")
LogFile=fso.BuildPath(wShell.SpecialFolders("Desktop"),LogFile)
If Not fso.FileExists(LogFile) Then
fso.CreateTextFile(LogFile).WriteLine "<meta http-equiv=Content-Type content=""text/html; charset=shift_jis"">"
End If

Set ie=WScript.CreateObject("InternetExplorer.Application","IE_")
ie.StatusText=WScript.ScriptName
ie.Visible=True
Do While Not OnQuit
WScript.Sleep 1000
Loop
WScript.Quit

Sub IE_OnQuit()
OnQuit=True
End Sub

Sub IE_DocumentComplete(pDsip,URL)
Dim Title
Title=GetTitle()
If Title="" Then
If InStr(ie.LocationURL,ie.LocationName) Then
Title=ie.LocationURL
Else
Title=ie.LocationName
End If
End If
If Left(Title,8)="file:///" Then
Title=Mid(Title,9)
Title=Replace(Title,"/","")
Title=Replace(Title,"%20"," ")
End If
fso.OpenTextFile(LogFile,8,True).WriteLine now&" <a href="&ie.LocationURL&">"&Title&"</a><br>"
End Sub

Function GetTitle()
On Error Resume Next
GetTitle=ie.Document.title
ie.Document.parentWindow.defaultStatus=WScript.ScriptName
End Function

(2) UrlLogger.HTA

起動すると、10秒毎に、稼動中のすべてのIEやExplorerをチェックして、
新たなページやフォルダを見つけると、それらのタイトルとURLのリンクを
自身のウィンドウの先頭に追加表示します。
同時に、日時と共に、リンクをデスクトップの.htmファイル「urllog.htm」に
以下の形式で追加書き込みします。
日時 <a href=URL>タイトル</a><br>改行

新たなページやフォルダの判定基準は、起動後の範囲です。
再起動したり、右クリックで、「最新の情報に更新」すると、初期化されます。

<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=shift_jis">
<title>Automatic URL Logger...</title>
<script language=vbscript>
Option Explicit
moveTo 0,0
resizeTo 200,100

Dim LogFile
Sub window_onload()
LogFile="urllog.htm"
LogFile=fso.BuildPath(wShell.SpecialFolders("Desktop"),LogFile)
Call Patrol()
setInterval "Patrol",10000
End Sub

Sub Patrol()
Dim ie
For Each ie In ShellWindows
If dic.Exists(ie.LocationURL) Then
Else
dic.Add ie.LocationURL,1
Call Log(ie)
End If
Next
If document.body.scrollwidth<>document.body.clientwidth Then
resizeBy document.body.scrollwidth-document.body.clientwidth,0
End If
End Sub

Sub Log(ie)
Dim HTML
Dim Title
Title=GetTitle(ie)
If Title="" Then
If InStr(ie.LocationURL,ie.LocationName) Then
Title=ie.LocationURL
Else
Title=ie.LocationName
End If
End If
If Left(Title,8)="file:///" Then
Title=Mid(Title,9)
Title=Replace(Title,"/","")
Title=Replace(Title,"%20"," ")
End If
HTML=" <a href="&ie.LocationURL&">"&Title&"</a><br>"
document.body.insertAdjacentHTML "AfterBegin",HTML
fso.OpenTextFile(LogFile,8,True).WriteLine now& HTML
End Sub

Function GetTitle(ie)
On Error Resume Next
GetTitle=ie.Document.title
End Function
</script>
<hta:application innerborder=none />
</head>
<body style="background:menu;margin:0" nowrap >
<object id=ShellWindows classid=clsid:9BA05972-F6A8-11CF-A442-00A0C90A8F39></object>
<object id=wShell classid=clsid:72C24DD5-D70A-438B-8A42-98424B88AFB8></object>
<object id=fso classid=clsid:0D43FE01-F093-11CF-8940-00A0C9054228></object>
<object id=dic classid=clsid:EE09B103-97E0-11CF-978F-00A02463E06F></object><br>
</body>
</html>
     
 
what is notes.io
 

Notes.io is a web-based application for taking notes. You can take your notes and share with others people. If you like taking long notes, notes.io is designed for you. To date, over 8,000,000,000 notes created and continuing...

With notes.io;

  • * You can take a note from anywhere and any device with internet connection.
  • * You can share the notes in social platforms (YouTube, Facebook, Twitter, instagram etc.).
  • * You can quickly share your contents without website, blog and e-mail.
  • * You don't need to create any Account to share a note. As you wish you can use quick, easy and best shortened notes with sms, websites, e-mail, or messaging services (WhatsApp, iMessage, Telegram, Signal).
  • * Notes.io has fabulous infrastructure design for a short link and allows you to share the note as an easy and understandable link.

Fast: Notes.io is built for speed and performance. You can take a notes quickly and browse your archive.

Easy: Notes.io doesn’t require installation. Just write and share note!

Short: Notes.io’s url just 8 character. You’ll get shorten link of your note when you want to share. (Ex: notes.io/q )

Free: Notes.io works for 12 years and has been free since the day it was started.


You immediately create your first note and start sharing with the ones you wish. If you want to contact us, you can use the following communication channels;


Email: [email protected]

Twitter: http://twitter.com/notesio

Instagram: http://instagram.com/notes.io

Facebook: http://facebook.com/notesio



Regards;
Notes.io Team

     
 
Shortened Note Link
 
 
Looding Image
 
     
 
Long File
 
 

For written notes was greater than 18KB Unable to shorten.

To be smaller than 18KB, please organize your notes, or sign in.