Cerrar la ventana automáticamente después de que se cierra el diálogo de impresión


86

Tengo una pestaña abierta cuando el usuario hace clic en un botón. En el onloadtengo que abrir el cuadro de diálogo de impresión, pero el usuario me preguntó si era posible que después de enviar a la impresora para imprimir, si la pestaña podía cerrarse. No estoy seguro de si esto se puede hacer. He intentado usarlo setTimeout();, pero no es un período de tiempo definido, ya que el usuario puede distraerse y tener que volver a abrir la pestaña. ¿Hay alguna forma de lograr esto?



Respuestas:


113

si intenta cerrar la ventana justo después de la llamada a print (), puede cerrar la ventana inmediatamente y print () no funcionará. Esto es lo que no debes hacer :

window.open();
...
window.print();
window.close();

Esta solución funcionará en Firefox, porque en la llamada print (), espera hasta que se imprime y luego continúa procesando javascript y cierra () la ventana. IE fallará con esto porque llama a la función close () sin esperar a que finalice la llamada a print (). La ventana emergente se cerrará antes de que finalice la impresión.

Una forma de resolverlo es utilizando el evento "onafterprint", pero no se lo recomiendo porque estos eventos solo funcionan en IE.

La mejor manera es cerrar la ventana emergente una vez que se cierra el cuadro de diálogo de impresión (la impresión está terminada o cancelada). En este momento, la ventana emergente se enfocará y puede usar el evento "onfocus" para cerrar la ventana emergente.

Para hacer esto, simplemente inserte este código incrustado de JavaScript en su ventana emergente:

<script type="text/javascript">
window.print();
window.onfocus=function(){ window.close();}
</script>

Espero que esto ayude ;-)

Actualizar:

Para los nuevos navegadores Chrome, es posible que se cierre demasiado pronto, consulte aquí . Implementé este cambio y funciona para todos los navegadores actuales: 29/2/16

        setTimeout(function () { window.print(); }, 500);
        window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }

Por lo que vale, esto parece fallar en IE8. La ventana se cierra inmediatamente antes de que aparezca el cuadro de diálogo de impresión.
Heath

15
esto no parece funcionar para Chrome en este punto, ya que Chrome maneja la impresión internamente, la ventana no perderá el foco cuando se cargue el cuadro de diálogo de impresión y, por lo tanto, no recuperará el foco cuando finalice la impresión. ¿Alguna forma de hacer que esto funcione para Chrome?
jlbriggs

6
A partir de febrero de 2016, esta y NINGUNA de las otras respuestas basadas en focus () ya funcionan en Chrome. La única solución funcional es la de @noamtcohen (lamentablemente con un recuento de votos muy bajo).
Jpsy

2
Creo que la última versión de Chrome no muestra el cuadro de diálogo de impresión hasta que se cargan las imágenes de la página, pero está ejecutando el cierre antes, por lo que la página se cierra antes de que se cargue (el cuadro de diálogo de impresión nunca se muestra). Para arreglarwindow.onload = function () { window.print(); setTimeout(window.close, 500); };
Brian Leishman

4
La solución anterior ya no funciona, agregue el detector de eventos onafterprint para cerrar la ventana window.onafterprint = function () {window.close ()};
Rahat Hameed

91

Esto es lo que se me ocurrió, no sé por qué hay un pequeño retraso antes del cierre.

 window.print();
 setTimeout(window.close, 0);

1
Es interesante que esta respuesta de baja calificación sea actualmente la correcta. A partir de febrero de 2016, ninguna de las respuestas basadas en focus () ya funciona en Chrome. Esta solución funciona en FF, Chrome y Safari en Windows y OS X, IE9 +, Android Chrome e IOS Safari. Solo experimentamos diálogos de confirmación en IE antiguos. Todos los demás cierran sin problemas.
Jpsy

6
A partir del 17 de marzo, esto no me funcionó exactamente como en Chrome (56), pero agregar algo de tiempo al tiempo de espera funcionó. window.print (); setTimeout (ventana.close, 500);
jAC

Como mencionó jAC, esto necesitaba más tiempo para que funcionara. En el mío, 10 ms no fue suficiente, pero 100 sí. Parece ser una cuestión de cuánto tiempo lleva renderizar la vista previa de impresión. Con el mío configurado en 10 ms, solo imprimió una versión parcialmente renderizada de la página. Con 100 lo tengo todo.
Jacob Ewing

1
Para expandir eso, ~ parece ~ que el tiempo de espera se pausa una vez que la ventana de impresión está completamente renderizada (en Chrome en una macbook de todos modos), y el resto se cuenta después de que se cierra la ventana.
Jacob Ewing

1
No necesitas el 0, es el predeterminado
Brian Leishman

14

Sólo:

window.print();
window.close();

Funciona.


2
Esto no me funciona de manera confiable en Chrome. A veces funciona, pero a veces la ventana se cierra inmediatamente antes de que aparezca el cuadro de diálogo de impresión. Puedo evitar que eso suceda aumentando el tiempo de espera a 5000, pero a veces la ventana tarda hasta 5 segundos en cerrarse después de imprimir. No estoy exactamente seguro de lo que está sucediendo aquí, pero no parece probable que sea robusto en diferentes navegadores.
speedarius

1
Como se menciona a continuación, la solución completa entre navegadores es más compleja.
Eric

1
No olvide la: Scripts may close only the windows that were opened by it.advertencia.
Cas Bloem

La solución anterior ya no funciona, agregue el detector de eventos en la impresión posterior para cerrar la ventana. window.onafterprint = function(){ window.close()};
Rahat Hameed

12

Solo quiero escribir lo que he hecho y lo que me ha funcionado (ya que nada de lo que intenté funcionó).

Tuve el problema de que IE cerraba las ventanas antes de que apareciera el cuadro de diálogo de impresión.

Después de muchas pruebas y pruebas de error, esto es lo que me puse a trabajar:

var w = window.open();
w.document.write($('#data').html()); //only part of the page to print, using jquery
w.document.close(); //this seems to be the thing doing the trick
w.focus();
w.print();
w.close();

Esto parece funcionar en todos los navegadores.


parecía funcionar. ya no lo hace, publicaré mi código a continuación.
Remco

10

Este código funcionó perfectamente para mí:

<body onload="window.print()" onfocus="window.close()">

Cuando la página se abre, abre el cuadro de diálogo de impresión automáticamente y después de imprimir o cancelar, cierra la ventana.

Espero eso ayude,


esta dosis no funciona si ha abierto pdf para imprimir, no html o jsp, ¿dónde puedo poner el cuerpo de carga?
Shareef

9

Seguro que esto se resuelve fácilmente haciendo esto:

      <script type="text/javascript">
         window.print();
         window.onafterprint = window.close();
      </script>

O si quieres hacer algo como, por ejemplo, ve a la página anterior.

    <script type="text/javascript">
        window.print();
        window.onafterprint = back;

        function back() {
            window.history.back();
        }
    </script>

window.close ();
Mustafa

Nota: window.onafterprint = window.close();debe ser window.onafterprint = window.close;El primero asigna el resultado de window.close()a onafterprint. Esto hará window.close()que se ejecute inmediatamente cuando se establezca el controlador y no se ejecutará nada cuando se genere el onafterprintevento. Este último lo asigna window.closecomo controlador de eventos, que es lo que queremos.
Kei

Además, en algunos navegadores, la ejecución del código se detiene window.print();hasta que se cierra el cuadro de diálogo de impresión. Cuando esto sucede, es posible que el onafterprintevento se genere antes de que onafterprintse asigne. Por lo tanto, sería mejor window.onafterprint = window.close;que viniera antes window.print();. De lo contrario, el enfoque utilizado en esta respuesta funciona mejor que los basados ​​en onfocus o setTimeout sugeridos por las otras respuestas.
Kei

8

Esta es una solución de navegador cruzado ya probada en Chrome, Firefox, Opera en 2016/05.

Tenga en cuenta que Microsoft Edge tiene un error que no cierra la ventana si se cancela la impresión. Enlace relacionado

var url = 'http://...';
var printWindow = window.open(url, '_blank');
printWindow.onload = function() {
    var isIE = /(MSIE|Trident\/|Edge\/)/i.test(navigator.userAgent);
    if (isIE) {

        printWindow.print();
        setTimeout(function () { printWindow.close(); }, 100);

    } else {

        setTimeout(function () {
            printWindow.print();
            var ival = setInterval(function() {
                printWindow.close();
                clearInterval(ival);
            }, 200);
        }, 500);
    }
}

7

Usando Chrome He intentado durante un tiempo para conseguir la window.onfocus=function() { window.close(); }y el <body ... onfocus="window.close()"> de trabajo. Mis resultados:

  1. Había cerrado mi diálogo impreso, no pasó nada.
  2. Cambié de ventana / pestañas en mi navegador, todavía nada.
  3. cambió de nuevo a mi primera ventana / pestaña y luego se disparó el evento window.onfocus cerrando la ventana.

También probé, lo <body onload="window.print(); window.close()" >que resultó en el cierre de la ventana antes de que pudiera hacer clic en cualquier cosa en el diálogo de impresión.

No pude usar ninguno de esos. Entonces usé un poco de Jquery para monitorear el estado del documento y este código me funciona.

<script type="text/javascript">
    var document_focus = false; // var we use to monitor document focused status.
    // Now our event handlers.
    $(document).focus(function() { document_focus = true; });
    $(document).ready(function() { window.print(); });
    setInterval(function() { if (document_focus === true) { window.close(); }  }, 500);
</script>

Solo asegúrese de haber incluido jquery y luego copie / pegue esto en el html que está imprimiendo. Si el usuario ha impreso, guardado como PDF o cancelado el trabajo de impresión, la ventana / pestaña se autodestruirá. Nota: Solo he probado esto en Chrome.

Editar

Como señaló Jypsy en los comentarios, el estado de enfoque del documento no es necesario. Simplemente puede usar la respuesta de noamtcohen, cambié mi código a eso y funciona.


Esta solución hace que la ventana original se cuelgue si el usuario cierra la ventana emergente con la "X" en la esquina en lugar de seleccionar Cancelar o Imprimir. El mismo problema que la solución de Juan, que @JFK señaló originalmente.
Clayton

El javascript anterior no debe colocarse en el html que se imprime, ya sea que se abra en una ventana emergente o, como yo, en una nueva pestaña. Por lo tanto, este javascript no tiene ningún efecto en la ventana original.
Nado11

5

Esta funciona para mí:

<script>window.onload= function () { window.print();window.close();   }  </script>

5

Lo siguiente funcionó para mí:

function print_link(link) {
    var mywindow = window.open(link, 'title', 'height=500,width=500');   
    mywindow.onload = function() { mywindow.print(); mywindow.close(); }
}

5

Simplemente envuelva window.close por el controlador de eventos onafterprint, funcionó para mí

printWindow.print();
printWindow.onafterprint = () => printWindow.close();

Requiere Safari v12
Paul Brady

4

Esto funciona bien en Chrome 59:

window.print();
window.onmousemove = function() {
  window.close();
}

4

Probé muchas cosas que no funcionaron. Lo único que funcionó para mí fue:

window.print();
window.onafterprint = function () {
    window.close();
}

probado en cromo.


Odio lo mucho que funciona
Franz Justin Buenaventura

3

La siguiente solución funciona para las versiones más recientes de IE9, IE8, Chrome y FF a partir del 10 de marzo de 2014. El escenario es el siguiente: estás en una ventana (A), donde haces clic en un botón / enlace para iniciar el proceso de impresión, luego se abre una nueva ventana (B) con el contenido a imprimir, el diálogo de impresión se muestra inmediatamente, y puede cancelar o imprimir, y luego la nueva ventana (B) se cierra automáticamente.

El siguiente código lo permite. Este código javascript debe colocarse en el html para la ventana A (no para la ventana B):

/**
 * Opens a new window for the given URL, to print its contents. Then closes the window.
 */
function openPrintWindow(url, name, specs) {
  var printWindow = window.open(url, name, specs);
    var printAndClose = function() {
        if (printWindow.document.readyState == 'complete') {
            clearInterval(sched);
            printWindow.print();
            printWindow.close();
        }
    }
    var sched = setInterval(printAndClose, 200);
};

El botón / enlace para iniciar el proceso simplemente tiene que invocar esta función, como en:

openPrintWindow('http://www.google.com', 'windowTitle', 'width=820,height=600');

Funciona en Chrome siempre que el usuario imprima o cancele la operación, PERO si el usuario cierra la ventana (B), la ventana (A) se cuelga (¿dije en Chrome?). Pruebe (en Chrome) jsfiddle.net/qy6QV/2/show y cierre la ventana. Luego intenta recargarlo ... colgado.
JFK

2
<!doctype html>
<html>
<script>
 window.print();
 </script>
<?php   
date_default_timezone_set('Asia/Kolkata');
include 'db.php'; 
$tot=0; 
$id=$_GET['id'];
    $sqlinv="SELECT * FROM `sellform` WHERE `id`='$id' ";
    $resinv=mysqli_query($conn,$sqlinv);
    $rowinv=mysqli_fetch_array($resinv);
?>
        <table width="100%">
           <tr>
                <td style='text-align:center;font-sie:1px'>Veg/NonVeg</td>  
            </tr>
            <tr>
                <th style='text-align:center;font-sie:4px'><b>HARYALI<b></th>  
            </tr>   
            <tr>
                <td style='text-align:center;font-sie:1px'>Ac/NonAC</td>  
            </tr>
            <tr>
                <td style='text-align:center;font-sie:1px'>B S Yedurappa Marg,Near Junne Belgaon Naka,P B Road,Belgaum - 590003</td>  
            </tr>
        </table>
        <br>    
        <table width="100%">
           <tr>
                <td style='text-align:center;font-sie:1'>-----------------------------------------------</td>  
            </tr>
        </table>

        <table  width="100%" cellspacing='6' cellpadding='0'>

            <tr>
                <th style='text-align:center;font-sie:1px'>ITEM</th>
                <th style='text-align:center;font-sie:1px'>QTY</th>
                <th style='text-align:center;font-sie:1px'>RATE</th>
                <th style='text-align:center;font-sie:1px'>PRICE</th>
                <th style='text-align:center;font-sie:1px' >TOTAL</th>
            </tr>

            <?php
            $sqlitems="SELECT * FROM `sellitems` WHERE `invoice`='$rowinv[0]'";
            $resitems=mysqli_query($conn,$sqlitems);
            while($rowitems=mysqli_fetch_array($resitems)){
            $sqlitems1="SELECT iname FROM `itemmaster` where icode='$rowitems[2]'";
            $resitems1=mysqli_query($conn,$sqlitems1);
            $rowitems1=mysqli_fetch_array($resitems1);
            echo "<tr>
                <td style='text-align:center;font-sie:3px'  >$rowitems1[0]</td>
                <td style='text-align:center;font-sie:3px' >$rowitems[5]</td>
                <td style='text-align:center;font-sie:3px' >".number_format($rowitems[4],2)."</td>
                <td style='text-align:center;font-sie:3px' >".number_format($rowitems[6],2)."</td>
                <td style='text-align:center;font-sie:3px' >".number_format($rowitems[7],2)."</td>
              </tr>";
                $tot=$tot+$rowitems[7];
            }

            echo "<tr>
                <th style='text-align:right;font-sie:1px' colspan='4'>GRAND TOTAL</th>
                <th style='text-align:center;font-sie:1px' >".number_format($tot,2)."</th>
                </tr>";
            ?>
        </table>
     <table width="100%">
           <tr>
                <td style='text-align:center;font-sie:1px'>-----------------------------------------------</td>  
            </tr>
        </table>
        <br>
        <table width="100%">
            <tr>
                <th style='text-align:center;font-sie:1px'>Thank you Visit Again</th>  
            </tr>
        </table>
<script>
window.close();
</script>
</html>

Imprima y cierre la ventana de nueva pestaña con php y javascript con un solo clic


1

Esto funcionó mejor para mí al inyectar el HTML en la ventana emergente como <body onload="window.print()"... Lo anterior funciona para IE, Chrome y FF (en Mac) pero no FF en Windows.

https://stackoverflow.com/a/11782214/1322092

var html = '<html><head><title></title>'+
               '<link rel="stylesheet" href="css/mycss.css" type="text/css" />'+
               '</head><body onload="window.focus(); window.print(); window.close()">'+
               data+
               '</body></html>';

1

Esto es lo que hago ...

Habilite la ventana para que se imprima y se cierre en función de un parámetro de consulta.

Requiere jQuery. Se puede hacer en _Layout o en una página maestra para trabajar con todas las páginas.

La idea es pasar un parámetro en la URL que le indique a la página que se imprima y se cierre, si el parámetro está configurado, el evento jQuery "ready" imprime la ventana, y luego, cuando la página está completamente cargada (después de imprimir), el "onload" se llama que cierra la ventana. Todos estos pasos aparentemente adicionales son esperar a que la ventana se imprima antes de cerrarse.

En el cuerpo html agregue y onload el evento que llama a printAndCloseOnLoad (). En este ejemplo, estamos usando cshtm, también podría usar javascript para obtener param.

<body onload="sccPrintAndCloseOnLoad('@Request.QueryString["PrintAndClose"]');">

En el javascript agregue la función.

function printAndCloseOnLoad(printAndClose) {
    if (printAndClose) {
        // close self without prompting
        window.open('', '_self', ''); window.close();
    }
}

Y evento listo para jQuery.

$(document).ready(function () {
    if (window.location.search.indexOf("PrintAndClose=") > 0)
        print();
});

Ahora, cuando abra cualquier URL, simplemente agregue el parámetro de cadena de consulta "PrintAndClose = true" y se imprimirá y cerrará.


1

Para mí, mi solución final fue una combinación de varias respuestas:

    var newWindow = window.open();
    newWindow.document.open();
    newWindow.document.write('<html><link rel="stylesheet" href="css/normalize-3.0.2.css" type="text/css" />'
            + '<link rel="stylesheet" href="css/default.css" type="text/css" />'
            + '<link rel="stylesheet" media="print" href="css/print.css" type="text/css" />');

    newWindow.document.write('<body onload="window.print();" onfocus="window.setTimeout(function() { window.close(); }, 100);">');
    newWindow.document.write(document.getElementById(<ID>).innerHTML);
    newWindow.document.write('</body></html>');
    newWindow.document.close();
    newWindow.focus();

1

Esto es lo que funcionó para mí (2018/02). Necesitaba una solicitud por separado porque mi impresión aún no estaba en la pantalla. Basado en algunas de las excelentes respuestas anteriores, por las cuales les agradezco a todos, noté:

  • w.onloaddebe no ser puesto delante w.document.write(data).
    Parece extraño porque querrías colocar el anzuelo de antemano. Mi conjetura: el gancho ya está disparado al abrir la ventana sin contenido. Dado que está disparado, no volverá a disparar. Pero, cuando todavía se está procesando con un nuevo document.write(), se llamará al gancho cuando el procesamiento haya finalizado.
  • w.document.close()todavía se requiere. De lo contrario, no pasa nada.

Probé esto en Chrome 64.0, IE11 (11.248), Edge 41.16299 (edgeHTML 16.16299), FF 58.0.1. Se quejarán de las ventanas emergentes, pero se imprime.

function on_request_print() {
  $.get('/some/page.html')
    .done(function(data) {
      console.log('data ready ' + data.length);
      var w = window.open();
      w.document.write(data);
      w.onload = function() {
        console.log('on.load fired')
        w.focus();
        w.print();
        w.close();
      }
      console.log('written data')
      //this seems to be the thing doing the trick
      w.document.close();
      console.log('document closed')
    })
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
</script>
<a onclick="on_request_print();">Print rapportage</a>

1
const printHtml = async (html) => {
    const printable = window.open('', '_blank', 'fullscreen=no');
    printable.document.open();
    printable.document.write(`<html><body onload="window.print()">${html}</body></html>`);
    await printable.print();
    printable.close();
};

Aquí está mi solución ES2016.


1
Hola Stuart, ¡y bienvenido a Stack Overflow! ¿Podría explicar por qué este código funciona para ayudar más al OP y a otros usuarios? ¡Gracias!
brezo

1

Esto funciona para mí perfectamente @holger, sin embargo, lo modifiqué y me queda mejor, la ventana ahora aparece y se cierra inmediatamente después de presionar el botón de imprimir o cancelar.

function printcontent()
{ 
var disp_setting="toolbar=yes,location=no,directories=yes,menubar=yes,"; 
disp_setting+="scrollbars=yes,width=300, height=350, left=50, top=25"; 
var content_vlue = document.getElementById("content").innerHTML; 
var w = window.open("","", disp_setting);
w.document.write(content_vlue); //only part of the page to print, using jquery
w.document.close(); //this seems to be the thing doing the trick
w.focus();
w.print();
w.close();
}"

1

jquery:

$(document).ready(function(){ 
  window.print();
  setTimeout(function(){ 
             window.close();
  }, 3000);
});

0

IE tenía (¿tiene?) Los eventos onbeforeprinty onafterprint: podría esperar eso, pero solo funcionaría en IE (que puede o no estar bien).

Alternativamente, puede intentar esperar a que el foco regrese a la ventana desde el cuadro de diálogo de impresión y cerrarlo. Amazon Web Services hace esto en sus cuadros de diálogo de impresión de facturas: presiona el botón de impresión, abre la vista fácil de imprimir e inmediatamente abre el cuadro de diálogo de la impresora. Si presiona imprimir o cancela, el cuadro de diálogo de impresión se cierra y luego la vista fácil de imprimir se cierra inmediatamente.


0

Es muy complicado conseguir que este tipo de cosas funcionen en todos los navegadores.

Originalmente estaba buscando hacer el mismo tipo de cosas: abrir una nueva página diseñada para imprimir, imprimirla usando JS y luego cerrarla nuevamente. Esto fue una pesadilla.

Al final, opté por simplemente hacer clic en la página imprimible y luego usar el JS a continuación para iniciar una impresión, luego redirigirme a donde quería ir cuando termine (con una variable establecida en PHP en este caso).

He probado esto en Chrome y Firefox en OSX y Windows, e IE11-8, y funciona en todos (aunque IE8 se congelará un poco si en realidad no tienes una impresora instalada).

Feliz caza (impresión).

<script type="text/javascript">

   window.print(); //this triggers the print

   setTimeout("closePrintView()", 3000); //delay required for IE to realise what's going on

   window.onafterprint = closePrintView(); //this is the thing that makes it work i

   function closePrintView() { //this function simply runs something you want it to do

      document.location.href = "'.$referralurl.'"; //in this instance, I'm doing a re-direct

   }

</script>

0

solo usa este script java

 function PrintDiv() {
    var divContents = document.getElementById("ReportDiv").innerHTML;
    var printWindow = window.open('', '', 'height=200,width=400');
    printWindow.document.write('</head><body >');
    printWindow.document.write(divContents);
    printWindow.document.write('</body></html>');
    printWindow.document.close();
    printWindow.print();
    printWindow.close();
}

se cerrará la ventana después de hacer clic en el botón enviar o cancelar


0

En IE11, el evento onfocus se llama dos veces, por lo que se solicita al usuario dos veces que cierre la ventana. Esto se puede prevenir con un ligero cambio:

<script type="text/javascript">
  var isClosed = false;
  window.print();
  window.onfocus = function() {
    if(isClosed) { // Work around IE11 calling window.close twice
      return;
    }
    window.close();
    isClosed = true;
  }
</script>

0

Esto funcionó para mí en FF 36, Chrome 41 e IE 11. Incluso si cancela la impresión, e incluso si cierra el cuadro de diálogo de impresión con la "X" superior derecha.

var newWindow=window.open(); 
newWindow.document.open();
newWindow.document.write('<HTML><BODY>Hi!</BODY></HTML>'); //add your content
newWindow.document.close();
newWindow.print();      

newWindow.onload = function(e){ newWindow.close(); }; //works in IE & FF but not chrome 

//adding script to new document below makes it work in chrome 
//but alone it sometimes failed in FF
//using both methods together works in all 3 browsers
var script   = newWindow.document.createElement("script");
script.type  = "text/javascript";
script.text  = "window.close();";
newWindow.document.body.appendChild(script);

0
setTimeout(function () { window.print(); }, 500);
        window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }

Funciona perfectamente para mí. Espero eso ayude


0

Esto me funciona en Chrome (no lo he probado en otros)

$(function(){
    window.print();
    $("body").hover(function(){
        window.close();
    });
});

0

Probé esto y funciona

var popupWin = window.open('', 'PrintWindow', 
'width=650,height=650,location=no,left=200px');
popupWin.document.write(data[0].xmldata);
popupWin.print();
popupWin.close();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.