@echo off

mode con:cols=190 lines=60

ECHO.
ECHO                                                                                         ...':cccccc:,...
ECHO                                                                                   .':lxkKXXNWMMMMMMWNXX0kdc,.
ECHO                                                                              .':oOKNWMMMMMMMMMMMMMMMMMMMMMMWKkl,
ECHO                                                                           .;d0NWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNOl.
ECHO                                                                         .:xXWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWKd,
ECHO                                                                        'cx0XWWMMMMMMWNK000OkkkkO0Ok0KNWMMMMMMMMMMMMMNk;
ECHO                                                                       .':dOXWWMMMMWNXXKKNNNXXXXNXKOxolld0NWMMMMMMMMMMMNd.
ECHO                                                                    .':odkOKXWWWWWWWWWMMMMMMMWWNK00KXXKOdccdKWMMMMMMMMMMW0:
ECHO                                                                .,lx0XWMWNKKXXXKKNWMMMMMMWXkl;,......':lkKkccONMWWMMMMMMMMNo.
ECHO                                                               ,xKXKKKOxdddkOOO0XWMMMMMW0c.        .ldl,.,d0xokNMMMMMMMMMMMNo.
ECHO                                                              .ckKK0XX0kxo::ldkKWMMMMMWk.          ,OWMNx. ,xxoxXWMMMMMMMMMMXc
ECHO                                                             .lKWW0l;:loxKXxld0NMMMMMWk.            .;lo:.  'ddcl0WMMMMMMMMMM0'
ECHO                                                            .oXMXl.   ;d:;oolxKWMMMMMX;                      :dc,c0WMMMMMMMMMNl
ECHO                                                           .;kXWx.     .  .;cd0WMMMMM0,                      ,ol'.lXMMMMMMWWWWO.
ECHO                                                           .;l0Nk.        ,::oOXWMMMMK;                      ;oc,.'kNWMMWWWNNN0,
ECHO                                                           ..'o00l.      '::;cxKNWMMMWd.                    .ll;' .oKNWWNNXXK0k,
ECHO                                                           ....:dkxolccodkxc,;lkKNWWMMNd.         .        .cl;'. .cOXNNXXKKOxo'
ECHO                                                            ... .,:ok00KNNKd;,:lk0XNNWWNO:.              .:ol;... .ckKKK0KKXkl,.
ECHO                                                             .....;lolkX0dllc,';cdO0KXXNNXOo;...    ..':lddc'.... .lkOOkOKNXo'.
ECHO                                                               .',c:. .;;. .c:'.';ldkO00KKXXK0OOxdddxkOkdl;...,. .;oxddx0NKo..
ECHO                                                              .';;,.    ..  .::,'',:coxkO00KKKKKKK00Oxoc;'..,;.  .:cccdOKk:.
ECHO                                                             .';dd,     .;'.';:cc:;;;:cldxxkOOOkkxdoc:,''':l:.  ..'',cxxc..
ECHO                                                             'lxOkdodc..:ddxkxl:cdxxdolllok0KK0Odlc::;:lodl'     ....','.
ECHO                                                             .:lloodxxxxkOOOOOko:;:d0XXK00KXXXK0kxxkkkxo:'      .''....
ECHO                                                             .,oko,,;;:cloooolccc;'',;ldk0K0000000Oxo;.       ..''...
ECHO                                                             .;dkc:l:..'''',;;;:::::;'.........':okOko'    .....
ECHO                                                             .':;,cl,..,'..:l:,::,,:;,',,''',coxXWMMMWx.
ECHO                                                               . .:;.';,..,colcl:.':;.';;:;;cdk0XWWWW0;
ECHO                                                                     .....';,''..  .. .. ..';::lxkkxc.
ECHO   ..........................................................................................'',:;,'......................................................................................
ECHO .oKKKKKKOkxkOKKKK0kxxk0KKKK0OkkxxxkkO0KKKKKKKOkkxxkkO0KK0OkxxxkkxxxxxOKKKKKKKK0kxxxkxxxkO0KKKKKKK0Okkxxxkk0KKK0kxxxxxxxxxxkOKKK0OkxxxkkO0KKKKOkxkOKKKK0kxxk0KK0kxxxxxxxxkOK0OkxxxxxxxkO00:
ECHO .kMMMMMXc...oNMMNd...:KMMXx:'.......':OWMMNOc,......':OWK:...........oNMMMMMMWO,.........;xNMMMNkc,.......,dNWO,..........'kWXd;'......'lKMMXl...oNMMNd...:KMWd'........,OW0:.........'l0c
ECHO .kMMMMWx.  .xWMM0,   cXMK:   .',,.    ,0MNo.   .'.    ;KKl,'.    .,,:OWMMMMMMNc   .',..   'OMMXl.  ..,'.   .xWO:,'.   .',,c00;   .''.    lNWk.  .xWMMK,   cXMK;   .,,,,,lKNd.  .','.    ::
ECHO .kMMMMXc   ,KMMWx.  .xWWo.  .dXNWK:   ,KWk.   cKN0,   :XWWNXc   'ONNWWMMMMMMM0,  .lXNK:   '0WWx.  .oXNXo.  .kWWWNO'   cKNNWNl   .kNNd.   oNNl   ,0MMWx.  .xWWk.  .dNNNNNWMK;   :KNNx.   c:
ECHO .kMMMMO'   lNMMNc   ;KMK;   :XMMM0,   lNNo   '0MM0:..'dWMMMK,   lNMMMMMMMMMMWd.  'OMMK,   cNX0c   ,0MMNc   ;KMMMWd.  .xWMMM0,   cXMWx.  ,OW0,   lNMMNc   ,KMNl   ,0MMMMMMWx.  .dWMWd.  'kc
ECHO .kMMMWo.  .kWMMO'  .oNWk.  .dWMMWx.  .OWK,   lNMMWXKKXNMMMWx.  .kWMMMMMMMMMMK:   :XMWx.  .xWOl'   lNMWO'  .oWMMMX:   ;KMMMWx.  .kWMMX0OOKWWd.  .kWMMO'   lNM0,   cNMMMMMMXc   ,0MMX:   cKl
ECHO .kMMMX;   ,OXXKo.  '0MNl   '0MMMX:   :XWk.   ;ONWMMMMMMMMMXc   :KMMMMMMMMMMWk.  .dWMXc   ,0Wo'.  .kWMNo.  'OMMMMO.   oNMMMXc   :XMMMMMMMMMX:   ,OXXKo.  .kWWd.  .oKXXXWMM0'   lNMWk.  .xNl
ECHO .kMMWk.    .....   cXM0,   cXMMWk.  .dWWO'    .,cxKWMMMMMMO'  .dWMMMMMMMMMMNc   ,0WWO'   oNX:    ;KWW0,   :XMMMNo.  .OMMMMO'  .dWMMMMMMMMWk.    .....   cXMX:    ....;OWWd.  .l00x,   ;KWl
ECHO .kMMNl    .....   .xWWd.  .kWMMNl   '0MMWKd:.     .:0WMMMWo.  '0MMMMMMMMMMM0'   .;::.   ;KWk.    .;::,   .xWMMMK;   :XMMMWo.  '0MMMMMMMMMNl    .....   .xWMO'   .....:KMX:     ..    ;OWWl
ECHO .kMM0,   :0XXO:   ,KMX:   :XMMM0,   cXMMMMMWXkl.    oNMMMK;   cNMMMMMMMMMMWd.        ..lKWNl             ,0MMMWk.  .dWMMMK;   cXMMMMMMMMMK,   :0XX0:   ,KMNo.  .xKXXXNWMO.   .,.   .dXWMWl
ECHO .kMWx.  .xWMMO'   lNMO'  .dWMMWx.  .xWMMMMMMMMNo.  .kWMMWk.  .xWMMMMMMMMMMX:   'oddxk0XWMMK,    :xkkl.   lNMMMNl   ,0MMMWk.  .xWMMMMMMMMWx.  .xWMMK,   lNMK;   :XMMMMMMNo   'ONo.  ;KMMMWl
ECHO .kMXc   ,KMMWo.  .OWWo.  '0MMMXc   ,KWNKKKXWMMX:   :XMMMXc   ,KMMMMMMMMMMMO.  .oWMMMMMMMMWx.   .kMMWd.  .kWMMM0,   lNMMMXc   ;KMMNKKKXWMNc   ,KMMWd.  .kWWk.  .dWMMMMMMK;   cXWx.  '0MMMWl
ECHO .kMO'   lNMMK;   ;KMK;   cXMMWO'   oNNo...cXMWO.  .dWMMMO'   lNMMMMMMMMMMNo   'OMMMMMMMMMNc    :XMMX:   ;KMMMWd.  .OWMMMO'   lNMNd...:KW0'   lNMMK;   ;KMNl   ,0MMMMMMWk.  .xWWk.  .kMMMWl
ECHO .kWo.  .OWMWk.  .dWMO'   'oddl,   'OWX:   .cdl'   ;KMMMWo.  .kWMMMMMMMMMMK;   :XMMMMMMMMMO'   .dWMWO.  .oNMMMX:   :XMMMWx.   ,odc.  .oNWd.  .kWMWk.  .dWM0,   'ldddxKWNc   ,0MMO.  .kWMMWl
ECHO .kK;   cXMMNl   '0MMKc.         .;OWMNd.        .:0WMMMK;   :XMMMMMMMMMMWx.  .dWMMMMMMMMWd.   '0MMNo   'OMMMMO'  .dWMMMWO;         .oXMK;   ;KMMNl   'OMWx.        .xW0,  .oNMM0'  .xWMMWl
ECHO .kNxllo0WMMWOolokWMMMNOdllllllox0NMMMMWKxollllox0NMMMMMXxllo0WMMMMMMMMMMWKdllxXMMMMMMMMMWOolookNMMWOollkNMMMMKdllxXMMMMMWXOdllllldkXWMMNxllo0WMMWOollkNMW0ollllllllxXMKdllxXMMMXxlldKWMMWl
ECHO .cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx          BY /DEV/NULL          xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ECHO.
ECHO Checking..

setlocal DisableDelayedExpansion
set COMMENTED_LINE=# ADOBE PATCH "%~nx0".
setlocal EnableDelayedExpansion

set LOCAL_ADDRESS=127.0.0.1
set BLOCKED_ADDRESSES="ic.adobe.io" "52.6.155.20" "52.10.49.85" "23.22.30.141" "34.215.42.13" "52.84.156.37" "65.8.207.109" "3.220.11.113" "3.221.72.231" "3.216.32.253" "3.208.248.199" "3.219.243.226" "13.227.103.57" "34.192.151.90" "34.237.241.83" "44.240.189.42" "52.20.222.155" "52.208.86.132" "54.208.86.132" "63.140.38.120" "63.140.38.160" "63.140.38.169" "63.140.38.219" "wip.adobe.com" "adobeereg.com" "18.228.243.121" "18.230.164.221" "54.156.135.114" "54.221.228.134" "54.224.241.105" "100.24.211.130" "162.247.242.20" "wip1.adobe.com" "wip2.adobe.com" "wip3.adobe.com" "wip4.adobe.com" "3dns.adobe.com" "ereg.adobe.com" "199.232.114.137" "bam.nr-data.net" "practivate.adobe" "ood.opsource.net" "crl.verisign.net" "3dns-1.adobe.com" "3dns-2.adobe.com" "3dns-3.adobe.com" "3dns-4.adobe.com" "hl2rcv.adobe.com" "genuine.adobe.com" "www.adobeereg.com" "ereg.wip.adobe.com" "activate.adobe.com" "adobe-dns.adobe.com" "ereg.wip1.adobe.com" "ereg.wip2.adobe.com" "ereg.wip3.adobe.com" "ereg.wip4.adobe.com" "agsupdate.adobe.com" "cc-api-data.adobe.io" "practivate.adobe.ntp" "practivate.adobe.ipp" "practivate.adobe.com" "adobe-dns-1.adobe.com" "adobe-dns-2.adobe.com" "adobe-dns-3.adobe.com" "adobe-dns-4.adobe.com" "lm.licenses.adobe.com" "hlrcv.stage.adobe.com" "prod.adobegenuine.com" "practivate.adobe.newoa" "activate.wip.adobe.com" "activate-sea.adobe.com" "uds.licenses.adobe.com" "k.sni.global.fastly.net" "activate-sjc0.adobe.com" "activate.wip1.adobe.com" "activate.wip2.adobe.com" "activate.wip3.adobe.com" "activate.wip4.adobe.com" "na1r.services.adobe.com" "lmlicenses.wip4.adobe.com" "na2m-pr.licenses.adobe.com" "wwis-dubc1-vip60.adobe.com" "workflow-ui-prod.licensingstack.com"
set "HOST_FILE=%WINDIR%\system32\drivers\etc\hosts"


::echo:
::echo add in your hosts file:
::for %%A in (!BLOCKED_ADDRESSES!) do (
::    echo !LOCAL_ADDRESS! %%~A
::)

>NUL 2>&1 OPENFILES
if not %errorlevel%==0 (
    echo:
    ECHO ERROR: Administrator not detected.
    ECHO You need to 'Run as Administrator'^^!
    ECHO:
    ECHO Righ-Click and 'Run as Administrator'
    ECHO:
    ECHO:
    ECHO:
    goto :END
)

ECHO Administrator detected.
ECHO:
ECHO Hosts file : "!HOST_FILE!"
ECHO:
call :CHECK_FILE_ATTRIBUTES HOST_FILE || (
    goto :END
)
call :CHECK_FILE_NEWLINE HOST_FILE || (
    >>"!HOST_FILE!" (
        echo:
    ) || (
        goto :WRITING_FAILURE
    )
)
if defined start_counter (
    set start_counter=
)
set /a blocked_addresses[#]=0, number_of_lines_after_commented_line=0
for %%A in (!BLOCKED_ADDRESSES!) do (
    set /a blocked_addresses[#]+=1
)
for /f "usebackqdelims=" %%A in ("%WINDIR%\system32\drivers\etc\hosts") do (
    if defined start_counter (
        set /a number_of_lines_after_commented_line+=1
    )
    if "%%A"=="%COMMENTED_LINE%" (
        set /a start_counter=1, number_of_lines_after_commented_line=0
    )
)
if !number_of_lines_after_commented_line! leq !blocked_addresses[#]! (
    set commented_entry=1
)
for %%A in (!BLOCKED_ADDRESSES!) do (
    ECHO Adding to the hosts file: !LOCAL_ADDRESS! %%~A
    >NUL FINDSTR /ixc:"!LOCAL_ADDRESS! %%~A" "!HOST_FILE!" && (
        >"!HOST_FILE!.tmp" (
            findstr /ixvc:"!LOCAL_ADDRESS! %%~A" "!HOST_FILE!"
        ) || (
            goto :WRITING_FAILURE
        )
        for /l %%. in (1,1,100000) do rem
        move /y "!HOST_FILE!.tmp" "!HOST_FILE!" || (
            goto :WRITING_FAILURE
        )
    )
    if not defined commented_entry (
        set commented_entry=1
        >>"!HOST_FILE!" (
            echo %COMMENTED_LINE%
        ) || (
            goto :WRITING_FAILURE
        )
    )
    >>"!HOST_FILE!" (
        ECHO !LOCAL_ADDRESS! %%~A
    ) || (
        goto :WRITING_FAILURE
    )
)
ECHO:
ECHO Patching is completed.
ECHO Check hosts file if you want to see the result.
ECHO:

:END
PAUSE
ENDLOCAL
exit /b 0

:WRITING_FAILURE
call :CHECK_FILE_ATTRIBUTES HOST_FILE && (
    echo ERROR: Something went wrong and the script could not write in your hosts file.
)
goto :END

:CHECK_FILE_ATTRIBUTES
call :GET_FILE_ATTRIBUTES %1
if defined attributes (
    if not "!attributes:R=!"=="!attributes!" (
        echo Cannot write in "!%1!" because it is in read-only.
        exit /b 1
    )
)
exit /b 0

:GET_FILE_ATTRIBUTES
if not exist "!%1!" (
    exit /b
)
for %%A in ("!%1!") do (
    set "attributes=%%~aA"
)
for /f "delims=" %%A in ('2^>nul attrib "!%1!"') do (
    set "_attributes=%%A"
)
for /f "tokens=1*delims=:" %%A in ("$!_attributes!") do (
    if not "%%B"=="" (
        set "_attributes=%%A"
        set "_attributes=!_attributes:~1,-1!"
        if defined _attributes (
            set "attributes=!attributes!!_attributes!"
        )
    )
    if defined _attributes (
        set _attributes=
    )
)
if defined attributes (
    for %%A in (-," ") do (
        if defined attributes (
            set "attributes=!attributes:%%~A=!"
        )
    )
    if defined attributes (
        for /f "delims==" %%A in ('2^>nul set attribute_[') do (
            set %%A=
        )
        for /l %%A in (0,1,51) do (
            for %%B in ("!attributes:~%%A,1!") do (
                if not "%%~B"=="" (
                    for %%C in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
                        if /i "%%C"=="%%~B" (
                            if not defined attribute_[%%C] (
                                set attribute_[%%C]=1
                                if defined _attributes (
                                    if "!_attributes:%%C=!"=="!_attributes!" (
                                        set "_attributes=!_attributes!%%C"
                                    )
                                ) else (
                                    set "_attributes=%%C"
                                )
                            )
                        )
                    )
                )
            )
        )
        set "attributes=!_attributes!"
    )
)
exit /b

:CHECK_FILE_NEWLINE
if not exist "!%1!" (
    exit /b 0
)
<"!%1!" >nul (
    for %%A in ("!%1!") do (
        for /l %%. in (2 1 %%~zA) do (
            pause
        )
        set /p write_newline=
    )
)
if defined write_newline (
    set write_newline=
    exit /b 1
)
exit /b 0
