2004-10-20 21:06:45 +00:00
< ? php
2007-04-13 12:55:55 +00:00
/* Copyright ( C ) 2004 - 2007 Rodolphe Quiedeville < rodolphe @ quiedeville . org >
2013-06-04 17:36:41 +00:00
* Copyright ( C ) 2004 - 2013 Laurent Destailleur < eldy @ users . sourceforge . net >
2005-11-01 15:58:51 +00:00
* Copyright ( C ) 2005 Simon Tosser < simon @ kornog - computing . com >
2018-10-27 12:43:12 +00:00
* Copyright ( C ) 2005 - 2012 Regis Houssin < regis . houssin @ inodbox . com >
2010-04-21 08:47:58 +00:00
* Copyright ( C ) 2010 Pierre Morin < pierre . morin @ auguria . net >
2010-10-08 16:56:14 +00:00
* Copyright ( C ) 2010 Juanjo Menent < jmenent @ 2 byte . es >
2024-12-15 08:57:48 +00:00
* Copyright ( C ) 2022 Ferran Marcet < fmarcet @ 2 byte . es >
2026-03-26 01:40:24 +00:00
* Copyright ( C ) 2024 - 2026 Frédéric France < frederic . france @ free . fr >
2025-01-18 22:15:39 +00:00
* Copyright ( C ) 2025 MDW < mdeweerd @ users . noreply . github . com >
2004-07-12 09:46:13 +00:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
2013-01-16 14:36:08 +00:00
* the Free Software Foundation ; either version 3 of the License , or
2004-07-12 09:46:13 +00:00
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2019-09-23 19:55:30 +00:00
* along with this program . If not , see < https :// www . gnu . org / licenses />.
* or see https :// www . gnu . org /
2004-07-12 09:46:13 +00:00
*/
2007-04-13 12:55:55 +00:00
/**
2008-11-24 20:09:23 +00:00
* \file htdocs / document . php
* \brief Wrapper to download data files
2010-02-28 14:16:46 +00:00
* \remarks Call of this wrapper is made with URL :
2018-02-13 12:55:36 +00:00
* DOL_URL_ROOT . '/document.php?modulepart=repfichierconcerne&file=relativepathoffile'
* DOL_URL_ROOT . '/document.php?modulepart=logs&file=dolibarr.log'
* DOL_URL_ROOT . '/document.php?hashp=sharekey'
2008-11-24 20:09:23 +00:00
*/
2004-12-28 15:02:48 +00:00
2026-04-28 02:21:39 +00:00
define ( 'MAIN_SECURITY_FORCECSP' , " default-src 'none'; form-action 'none'; frame-ancestors 'self' " );
2023-04-06 14:36:33 +00:00
2018-01-02 21:58:37 +00:00
//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1'); // Not disabled cause need to load personalized language
//if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1'); // Not disabled cause need to load personalized language
2021-02-28 23:19:52 +00:00
if ( ! defined ( 'NOTOKENRENEWAL' )) {
define ( 'NOTOKENRENEWAL' , '1' );
}
if ( ! defined ( 'NOREQUIREMENU' )) {
define ( 'NOREQUIREMENU' , '1' );
}
if ( ! defined ( 'NOREQUIREHTML' )) {
define ( 'NOREQUIREHTML' , '1' );
}
if ( ! defined ( 'NOREQUIREAJAX' )) {
define ( 'NOREQUIREAJAX' , '1' );
}
2018-04-21 10:00:55 +00:00
2017-10-29 23:45:47 +00:00
// For direct external download link, we don't need to load/check we are into a login session
2021-02-28 23:19:52 +00:00
if ( isset ( $_GET [ " hashp " ]) && ! defined ( " NOLOGIN " )) {
if ( ! defined ( " NOLOGIN " )) {
define ( " NOLOGIN " , 1 );
}
if ( ! defined ( " NOCSRFCHECK " )) {
define ( " NOCSRFCHECK " , 1 ); // We accept to go on this page from external web site.
}
if ( ! defined ( " NOIPCHECK " )) {
define ( " NOIPCHECK " , 1 ); // Do not check IP defined into conf $dolibarr_main_restrict_ip
}
2018-01-02 21:58:37 +00:00
}
// Some value of modulepart can be used to get resources that are public so no login are required.
2024-03-28 19:19:28 +00:00
// Keep $_GET here, GETPOST is not available yet
2021-02-28 23:19:52 +00:00
if (( isset ( $_GET [ " modulepart " ]) && $_GET [ " modulepart " ] == 'medias' )) {
if ( ! defined ( " NOLOGIN " )) {
define ( " NOLOGIN " , 1 );
}
if ( ! defined ( " NOCSRFCHECK " )) {
define ( " NOCSRFCHECK " , 1 ); // We accept to go on this page from external web site.
}
if ( ! defined ( " NOIPCHECK " )) {
define ( " NOIPCHECK " , 1 ); // Do not check IP defined into conf $dolibarr_main_restrict_ip
}
2017-10-29 23:45:47 +00:00
}
2009-02-18 17:04:00 +00:00
2026-07-10 12:22:08 +00:00
// For MultiCompany modules, if an entity is set in query parameters (required to point an object because a ref can exists
// in 2 entities), then if user is not already into a session, the user must be loaded on this entity, so permission will
// be the one of this entity.
// Do not use GETPOST here, function is not defined and define must be done before including main.inc.php
$entity = ( ! empty ( $_GET [ 'entity' ]) ? ( int ) $_GET [ 'entity' ] : ( ! empty ( $_POST [ 'entity' ]) ? ( int ) $_POST [ 'entity' ] : 0 ));
2026-07-13 14:11:51 +00:00
if ( $entity > 0 ) {
2026-07-10 12:22:08 +00:00
// An entity was forced on param, so we force the constant to allow master.inc.php to use this entity if not already logged.
// It has no effect if already logged.
define ( " DOLENTITY " , $entity );
}
2026-03-26 00:42:54 +00:00
2011-07-09 00:15:16 +00:00
/**
2013-04-15 13:43:25 +00:00
* Header empty
2011-07-09 00:15:16 +00:00
*
2025-02-12 10:24:02 +00:00
* Note : also called by functions . lib : recordNotFound
*
2024-07-09 17:28:09 +00:00
* @ param string $head Optional head lines
* @ param string $title HTML title
* @ param string $help_url Url links to help page
* Syntax is : For a wiki page : EN : EnglishPage | FR : FrenchPage | ES : SpanishPage | DE : GermanPage
* For other external page : http :// server / url
* @ param string $target Target to use on links
* @ param int $disablejs More content into html header
* @ param int $disablehead More content into html header
2024-10-26 22:33:57 +00:00
* @ param string [] | string $arrayofjs Array of complementary js files
* @ param string [] | string $arrayofcss Array of complementary css files
2024-07-09 17:28:09 +00:00
* @ param string $morequerystring Query string to add to the link " print " to get same parameters ( use only if autodetect fails )
* @ param string $morecssonbody More CSS on body tag . For example 'classforhorizontalscrolloftabs' .
* @ param string $replacemainareaby Replace call to main_area () by a print of this string
* @ param int $disablenofollow Disable the " nofollow " on meta robot header
* @ param int $disablenoindex Disable the " noindex " on meta robot header
2013-04-15 13:43:25 +00:00
* @ return void
2025-01-18 22:15:39 +00:00
* @ phan - suppress PhanRedefineFunction
2011-07-09 00:15:16 +00:00
*/
2024-07-09 17:28:09 +00:00
function llxHeader ( $head = '' , $title = '' , $help_url = '' , $target = '' , $disablejs = 0 , $disablehead = 0 , $arrayofjs = '' , $arrayofcss = '' , $morequerystring = '' , $morecssonbody = '' , $replacemainareaby = '' , $disablenofollow = 0 , $disablenoindex = 0 )
2018-08-15 16:14:02 +00:00
{
}
2013-04-15 13:43:25 +00:00
/**
* Footer empty
*
2025-02-12 10:24:02 +00:00
* Note : also called by functions . lib : recordNotFound
*
2019-06-22 16:06:14 +00:00
* @ ignore
2024-12-16 08:55:42 +00:00
* @ param string $comment A text to add as HTML comment into HTML generated page
* @ param string $zone 'private' ( for private pages ) or 'public' ( for public pages )
* @ param int $disabledoutputofmessages Clear all messages stored into session without displaying them
2013-04-15 13:43:25 +00:00
* @ return void
2025-01-18 22:15:39 +00:00
* @ phan - suppress PhanRedefineFunction
2013-04-15 13:43:25 +00:00
*/
2024-12-16 08:55:42 +00:00
function llxFooter ( $comment = '' , $zone = 'private' , $disabledoutputofmessages = 0 )
2018-08-15 16:14:02 +00:00
{
}
2007-11-19 18:34:53 +00:00
2019-12-06 08:26:49 +00:00
require 'main.inc.php' ; // Load $user and permissions
2024-11-04 22:53:20 +00:00
/**
* @ var Conf $conf
* @ var DoliDB $db
* @ var HookManager $hookmanager
* @ var Translate $langs
* @ var User $user
*/
2025-11-18 14:37:37 +00:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
require_once DOL_DOCUMENT_ROOT . '/core/lib/images.lib.php' ;
2024-11-04 22:53:20 +00:00
2011-04-27 17:10:29 +00:00
$encoding = '' ;
2020-09-16 17:39:50 +00:00
$action = GETPOST ( 'action' , 'aZ09' );
2024-03-28 19:19:28 +00:00
$original_file = GETPOST ( 'file' , 'alphanohtml' );
2019-12-06 08:26:49 +00:00
$hashp = GETPOST ( 'hashp' , 'aZ09' );
$modulepart = GETPOST ( 'modulepart' , 'alpha' );
$urlsource = GETPOST ( 'urlsource' , 'alpha' );
2026-07-10 12:22:08 +00:00
$entity = ( $entity > 0 ? $entity : $conf -> entity );
2011-04-27 17:10:29 +00:00
2011-06-15 11:35:33 +00:00
// Security check
2021-02-28 23:19:52 +00:00
if ( empty ( $modulepart ) && empty ( $hashp )) {
2022-09-09 11:58:54 +00:00
httponly_accessforbidden ( 'Bad link. Bad value for parameter modulepart' , 400 );
2021-02-28 23:19:52 +00:00
}
if ( empty ( $original_file ) && empty ( $hashp )) {
2022-09-09 11:58:54 +00:00
httponly_accessforbidden ( 'Bad link. Missing identification to find file (original_file or hashp)' , 400 );
2021-02-28 23:19:52 +00:00
}
if ( $modulepart == 'fckeditor' ) {
$modulepart = 'medias' ; // For backward compatibility
}
2011-06-15 11:35:33 +00:00
2019-12-06 08:26:49 +00:00
$socid = 0 ;
2021-02-28 23:19:52 +00:00
if ( $user -> socid > 0 ) {
$socid = $user -> socid ;
}
2014-01-30 10:44:31 +00:00
// For some module part, dir may be privates
2021-02-28 23:19:52 +00:00
if ( in_array ( $modulepart , array ( 'facture_paiement' , 'unpaid' ))) {
2024-01-09 12:08:22 +00:00
if ( ! $user -> hasRight ( 'societe' , 'client' , 'voir' )) {
2021-02-28 23:19:52 +00:00
$original_file = 'private/' . $user -> id . '/' . $original_file ; // If user has no permission to see all, output dir is specific to user
}
2014-01-30 10:44:31 +00:00
}
2010-12-18 03:27:01 +00:00
2017-09-21 10:48:07 +00:00
2010-12-18 03:27:01 +00:00
/*
2018-02-13 12:55:36 +00:00
* Actions
2010-12-18 03:27:01 +00:00
*/
2011-04-27 17:10:29 +00:00
// None
2008-08-03 22:50:32 +00:00
2011-04-27 17:10:29 +00:00
2018-02-13 12:55:36 +00:00
2011-04-27 17:10:29 +00:00
/*
* View
*/
2011-04-26 21:06:45 +00:00
2017-09-21 12:02:42 +00:00
// If we have a hash public (hashp), we guess the original_file.
2025-01-18 22:15:39 +00:00
$ecmfile = '' ;
2021-02-28 23:19:52 +00:00
if ( ! empty ( $hashp )) {
2026-03-26 00:42:54 +00:00
if ( GETPOST ( 'type' , 'alpha' ) == 'link' ) {
2025-03-19 15:04:11 +00:00
require_once DOL_DOCUMENT_ROOT . '/core/class/link.class.php' ;
$link = new Link ( $db );
$result = $link -> fetch ( 0 , $hashp );
if ( $result > 0 && ! empty ( $link -> url )) {
2026-03-26 00:42:54 +00:00
if ( preg_match ( '/^(http|dav)/' , $link -> url )) {
header ( 'Location: ' . $link -> url );
exit ;
}
2025-03-19 15:04:11 +00:00
} else {
$langs -> load ( " errors " );
httponly_accessforbidden ( $langs -> trans ( " ErrorLinkNotFoundWithSharedLink " ), 403 , 1 );
2018-12-17 14:35:20 +00:00
}
2025-03-19 15:04:11 +00:00
} else {
include_once DOL_DOCUMENT_ROOT . '/ecm/class/ecmfiles.class.php' ;
$ecmfile = new EcmFiles ( $db );
$result = $ecmfile -> fetch ( 0 , '' , '' , '' , $hashp );
if ( $result > 0 ) {
$tmp = explode ( '/' , $ecmfile -> filepath , 2 ); // $ecmfile->filepath is relative to document directory
// filepath can be 'users/X' or 'X/propale/PR11111'
if ( is_numeric ( $tmp [ 0 ])) { // If first tmp is numeric, it is subdir of company for multicompany, we take next part.
$tmp = explode ( '/' , $tmp [ 1 ], 2 );
}
$moduleparttocheck = $tmp [ 0 ]; // moduleparttocheck is first part of path
if ( $modulepart ) { // Not required, so often not defined, for link using public hashp parameter.
if ( $moduleparttocheck == $modulepart ) {
// We remove first level of directory
$original_file = (( $tmp [ 1 ] ? $tmp [ 1 ] . '/' : '' ) . $ecmfile -> filename ); // this is relative to module dir
//var_dump($original_file); exit;
} else {
httponly_accessforbidden ( 'Bad link. File is from another module part.' , 403 );
}
2020-05-21 13:13:31 +00:00
} else {
2025-03-19 15:04:11 +00:00
$modulepart = $moduleparttocheck ;
$original_file = (( $tmp [ 1 ] ? $tmp [ 1 ] . '/' : '' ) . $ecmfile -> filename ); // this is relative to module dir
2017-11-19 19:44:57 +00:00
}
2025-03-19 15:04:11 +00:00
2025-03-19 15:04:50 +00:00
$entity = $ecmfile -> entity ;
if ( isModEnabled ( 'multicompany' ) && ! empty ( $ecmfile -> src_object_type ) && $ecmfile -> src_object_id > 0 ) {
$object = fetchObjectByElement ( $ecmfile -> src_object_id , $ecmfile -> src_object_type );
if ( is_object ( $object ) && $object -> id > 0 ) {
$entity = $object -> entity ;
}
}
2025-03-19 15:04:11 +00:00
if ( $entity != $conf -> entity ) {
$conf -> entity = $entity ;
$conf -> setValues ( $db );
2026-07-10 12:22:08 +00:00
// Multicompany: Here we are switching entity and later we will check the requested object is in this entity but may be that user is not allowed to log/see entity
// but we don't mind, we are using the public hash to get file.
2025-03-19 13:57:31 +00:00
}
2025-03-19 15:04:11 +00:00
} else {
$langs -> load ( " errors " );
httponly_accessforbidden ( $langs -> trans ( " ErrorFileNotFoundWithSharedLink " ), 403 , 1 );
2025-03-19 13:57:31 +00:00
}
2017-09-21 10:48:07 +00:00
}
}
2018-12-17 17:48:41 +00:00
// Define attachment (attachment=true to force choice popup 'open'/'save as')
$attachment = true ;
2021-02-28 23:19:52 +00:00
if ( preg_match ( '/\.(html|htm)$/i' , $original_file )) {
$attachment = false ;
}
if ( isset ( $_GET [ " attachment " ])) {
2025-01-18 22:15:39 +00:00
$attachment = GETPOST ( " attachment " , 'alpha' ) ? true : false ;
2021-02-28 23:19:52 +00:00
}
2023-11-27 12:26:44 +00:00
if ( getDolGlobalString ( 'MAIN_DISABLE_FORCE_SAVEAS' )) {
2021-02-28 23:19:52 +00:00
$attachment = false ;
}
2018-12-17 17:48:41 +00:00
2018-02-13 12:55:36 +00:00
// Define mime type
2020-10-31 13:32:18 +00:00
$type = 'application/octet-stream' ; // By default
2021-02-28 23:19:52 +00:00
if ( GETPOST ( 'type' , 'alpha' )) {
$type = GETPOST ( 'type' , 'alpha' );
} else {
$type = dol_mimetype ( $original_file );
}
2020-09-16 12:37:05 +00:00
// Security: Force to octet-stream if file is a dangerous file. For example when it is a .noexe file
2020-09-17 18:55:20 +00:00
// We do not force if file is a javascript to be able to get js from website module with <script src="
2020-09-17 19:09:16 +00:00
// Note: Force whatever is $modulepart seems ok.
if ( ! in_array ( $type , array ( 'text/x-javascript' )) && ! dolIsAllowedForPreview ( $original_file )) {
2020-09-16 12:37:05 +00:00
$type = 'application/octet-stream' ;
}
2017-09-21 10:48:07 +00:00
2021-08-23 14:03:34 +00:00
// Security: Delete string ../ or ..\ into $original_file
2021-10-22 08:50:15 +00:00
$original_file = preg_replace ( '/\.\.+/' , '..' , $original_file ); // Replace '... or more' with '..'
2021-08-23 13:47:18 +00:00
$original_file = str_replace ( '../' , '/' , $original_file );
$original_file = str_replace ( '..\\' , '/' , $original_file );
2012-09-07 15:23:16 +00:00
2010-11-07 12:33:32 +00:00
// Security check
2021-02-28 23:19:52 +00:00
if ( empty ( $modulepart )) {
accessforbidden ( 'Bad value for parameter modulepart' );
}
2017-10-29 23:45:47 +00:00
2019-04-21 17:54:30 +00:00
// Check security and set return info with full path of file
2026-03-02 03:25:53 +00:00
$check_access = dol_check_secure_access_document ( $modulepart , $original_file , ( int ) $entity , $user , '' , 'read' );
2013-04-25 08:06:54 +00:00
$accessallowed = $check_access [ 'accessallowed' ];
2013-04-22 13:00:29 +00:00
$sqlprotectagainstexternals = $check_access [ 'sqlprotectagainstexternals' ];
2019-12-06 08:26:49 +00:00
$fullpath_original_file = $check_access [ 'original_file' ]; // $fullpath_original_file is now a full path name
2025-02-26 23:04:29 +00:00
//var_dump($modulepart.' '.$entity.' '.$fullpath_original_file.' '.$original_file.' '.$accessallowed);exit;
2012-04-17 23:01:46 +00:00
2021-02-28 23:19:52 +00:00
if ( ! empty ( $hashp )) {
2019-12-06 08:26:49 +00:00
$accessallowed = 1 ; // When using hashp, link is public so we force $accessallowed
2017-11-19 19:44:57 +00:00
$sqlprotectagainstexternals = '' ;
2020-05-21 13:13:31 +00:00
} else {
2017-10-29 23:45:47 +00:00
// Basic protection (against external users only)
2021-02-28 23:19:52 +00:00
if ( $user -> socid > 0 ) {
if ( $sqlprotectagainstexternals ) {
2017-10-29 23:45:47 +00:00
$resql = $db -> query ( $sqlprotectagainstexternals );
2021-02-28 23:19:52 +00:00
if ( $resql ) {
2019-12-06 08:26:49 +00:00
$num = $db -> num_rows ( $resql );
$i = 0 ;
2021-02-28 23:19:52 +00:00
while ( $i < $num ) {
2017-10-29 23:45:47 +00:00
$obj = $db -> fetch_object ( $resql );
2021-02-28 23:19:52 +00:00
if ( $user -> socid != $obj -> fk_soc ) {
2019-12-06 08:26:49 +00:00
$accessallowed = 0 ;
2017-10-29 23:45:47 +00:00
break ;
}
$i ++ ;
2010-04-21 18:35:40 +00:00
}
}
2007-01-31 17:52:54 +00:00
}
2025-11-19 14:26:59 +00:00
} elseif ( $modulepart == 'ticket' && ! getDolGlobalString ( 'TICKET_EMAIL_MUST_EXISTS' )) {
if ( $sqlprotectagainstexternals ) {
$resql = $db -> query ( $sqlprotectagainstexternals );
if ( $resql ) {
$num = $db -> num_rows ( $resql );
if ( $num > 0 ) {
$accessallowed = 1 ;
}
}
}
2007-01-31 17:52:54 +00:00
}
}
2007-04-12 19:47:50 +00:00
// Security:
2017-09-06 09:39:30 +00:00
// Limit access if permissions are wrong
2021-02-28 23:19:52 +00:00
if ( ! $accessallowed ) {
2009-04-29 20:16:13 +00:00
accessforbidden ();
2005-02-08 12:03:12 +00:00
}
2004-12-28 15:02:48 +00:00
2007-04-12 19:47:50 +00:00
// Security:
2019-09-24 11:30:04 +00:00
// We refuse directory transversal change and pipes in file names
2021-02-28 23:19:52 +00:00
if ( preg_match ( '/\.\./' , $fullpath_original_file ) || preg_match ( '/[<>|]/' , $fullpath_original_file )) {
2017-09-06 09:39:30 +00:00
dol_syslog ( " Refused to deliver file " . $fullpath_original_file );
2020-09-16 14:34:19 +00:00
print " ErrorFileNameInvalid: " . dol_escape_htmltag ( $original_file );
2007-04-12 19:47:50 +00:00
exit ;
}
2009-02-18 17:04:00 +00:00
2012-09-03 15:01:03 +00:00
clearstatcache ();
2006-06-10 18:43:11 +00:00
2017-09-06 09:39:30 +00:00
$filename = basename ( $fullpath_original_file );
2019-09-24 11:30:04 +00:00
$filename = preg_replace ( '/\.noexe$/i' , '' , $filename );
2006-04-27 21:25:56 +00:00
2012-09-03 15:01:03 +00:00
// Output file on browser
2017-09-06 09:39:30 +00:00
dol_syslog ( " document.php download $fullpath_original_file filename= $filename content-type= $type " );
2019-12-06 08:26:49 +00:00
$fullpath_original_file_osencoded = dol_osencode ( $fullpath_original_file ); // New file name encoded in OS encoding charset
2007-01-31 17:52:54 +00:00
2012-09-03 15:01:03 +00:00
// This test if file exists should be useless. We keep it to find bug more easily
2021-02-28 23:19:52 +00:00
if ( ! file_exists ( $fullpath_original_file_osencoded )) {
2017-09-06 09:39:30 +00:00
dol_syslog ( " ErrorFileDoesNotExists: " . $fullpath_original_file );
2025-07-31 19:55:47 +00:00
print $langs -> trans ( " ErrorFileDoesNotExists " ) . ' : ' . dol_escape_htmltag ( $original_file );
2012-09-03 15:01:03 +00:00
exit ;
}
2009-02-18 17:04:00 +00:00
2020-11-03 14:12:56 +00:00
// Hooks
$hookmanager -> initHooks ( array ( 'document' ));
$parameters = array ( 'ecmfile' => $ecmfile , 'modulepart' => $modulepart , 'original_file' => $original_file ,
2024-02-21 23:09:45 +00:00
'entity' => $entity , 'fullpath_original_file' => $fullpath_original_file ,
2020-11-03 14:12:56 +00:00
'filename' => $filename , 'fullpath_original_file_osencoded' => $fullpath_original_file_osencoded );
2023-01-14 11:28:44 +00:00
$object = new stdClass ();
$reshook = $hookmanager -> executeHooks ( 'downloadDocument' , $parameters , $object , $action ); // Note that $action and $object may have been
2020-11-03 14:12:56 +00:00
if ( $reshook < 0 ) {
Qual: Apply automatic phan fixes (deprecations, unneeded imports) (#28154)
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
2024-02-13 20:46:12 +00:00
$errors = $hookmanager -> error . ( is_array ( $hookmanager -> errors ) ? ( ! empty ( $hookmanager -> error ) ? ', ' : '' ) . implode ( ', ' , $hookmanager -> errors ) : '' );
2020-12-01 01:41:19 +00:00
dol_syslog ( " document.php - Errors when executing the hook 'downloadDocument' : " . $errors );
print " ErrorDownloadDocumentHooks: " . $errors ;
2020-11-03 14:12:56 +00:00
exit ;
}
2026-03-02 19:05:50 +00:00
// Set this for test
//$type = 'text/html'; $attachment = -1;
2024-02-21 23:10:04 +00:00
2019-12-02 16:32:06 +00:00
2026-03-02 19:05:50 +00:00
// If we show an invoice, we test if we must regenerate the PDF
if ( $modulepart == 'facture' ) {
$refname = basename ( dirname ( $original_file ) . " / " );
if ( $refname == 'thumbs' || $refname == 'temp' ) {
// If we get the thumbs directory, we must go one step higher. For example original_file='10/thumbs/myfile_small.jpg' -> refname='10'
$refname = basename ( dirname ( dirname ( $original_file )) . " / " );
}
$invoice = fetchObjectByElement ( 0 , $modulepart , $refname );
if ( $original_file == preg_replace ( '/facture\//' , '' , $invoice -> last_main_doc )) {
// We are on the download or print of the main document
if ( $invoice instanceOf Facture && $invoice -> status > Facture :: STATUS_DRAFT ) {
$action = 'DOC_DOWNLOAD' ;
2026-06-16 16:41:45 +00:00
if ( GETPOSTISSET ( 'attachement' ) || GETPOST ( 'preview' )) {
2026-03-02 19:05:50 +00:00
$action = 'DOC_PREVIEW' ;
}
dol_syslog ( " Print for action= " . $action . " . Current counter of this non draft invoice is already " . $invoice -> id . " , so file was already printed, so we regenerate the PDF to add mention DUPLICATA " , LOG_DEBUG );
2026-06-06 17:33:41 +00:00
// $object->pos_print_counter is current value. We increase it here.
2026-06-07 22:53:30 +00:00
if ( $invoice -> status == Facture :: STATUS_CLOSED ) {
2026-06-06 17:33:41 +00:00
// Increase counter by 1
$sql = " UPDATE " . MAIN_DB_PREFIX . " facture SET pos_print_counter = pos_print_counter + 1 " ;
$sql .= " WHERE rowid = " . (( int ) $invoice -> id );
$db -> query ( $sql );
$invoice -> pos_print_counter += 1 ;
//$invoice->update($user, 1); // disabled update, we already did a direct sql update before. We disable trigger here because we already call the trigger $action = DOC_PREVIEW or DOC_DOWNLOAD just after.
}
2026-03-02 19:05:50 +00:00
2026-06-06 17:33:41 +00:00
// When we reach the second print, we must regenerate the document to have the mention duplicata on PDF)
// No need if we are at print 3, 4 or more. The PDF was regenerated when counter was 2,
2026-03-02 19:05:50 +00:00
if ( $invoice -> pos_print_counter == 2 ) {
$outputlangs = new Translate ( '' , $conf );
$outputlangs -> setDefaultLang ( GETPOST ( 'lang' ));
$outputlangs -> loadLangs ( array ( " admin " , " blockedlog " ));
$hidedetails = 0 ;
$hidedesc = 0 ;
$hideref = 0 ;
$moreparams = '' ;
2026-03-26 01:40:24 +00:00
$hidedetails = isset ( $hidedetails ) ? $hidedetails : ( getDolGlobalString ( 'MAIN_GENERATE_DOCUMENTS_HIDE_DETAILS' ) ? 1 : 0 ); // @phpstan-ignore-line as variable $hidedetails is forced
$hidedesc = isset ( $hidedesc ) ? $hidedesc : ( getDolGlobalString ( 'MAIN_GENERATE_DOCUMENTS_HIDE_DESC' ) ? 1 : 0 ); // @phpstan-ignore-line as variable $hidedesc is forced
$hideref = isset ( $hideref ) ? $hideref : ( getDolGlobalString ( 'MAIN_GENERATE_DOCUMENTS_HIDE_REF' ) ? 1 : 0 ); // @phpstan-ignore-line as variable $hideref is forced
$moreparams = isset ( $moreparams ) ? $moreparams : null ; // @phpstan-ignore-line as variable $moreparams is forced
2026-03-02 19:05:50 +00:00
$result = $invoice -> generateDocument ( $invoice -> model_pdf , $outputlangs , $hidedetails , $hidedesc , $hideref , $moreparams );
if ( $result < 0 ) {
dol_syslog ( " Failed to regenerate PDF " , LOG_WARNING );
}
}
// Call trigger
2026-06-16 21:20:00 +00:00
$result = $invoice -> call_trigger ( $action , $user );
if ( $result < 0 ) {
top_httphead ();
http_response_code ( 500 );
print 'Error in trigger: ' . $invoice -> errorsToString ();
exit ;
}
2026-03-02 19:05:50 +00:00
}
}
}
2026-06-16 21:20:00 +00:00
// Permissions are ok and file found, so we return it
top_httphead ( $type );
header ( 'Content-Description: File Transfer' );
if ( $encoding ) {
header ( 'Content-Encoding: ' . $encoding );
}
// Add MIME Content-Disposition from RFC 2183 (inline=automatically displayed, attachment=need user action to open)
if ( $attachment > 0 ) {
header ( 'Content-Disposition: attachment; filename="' . $filename . '"' );
} elseif ( empty ( $attachment )) {
header ( 'Content-Disposition: inline; filename="' . $filename . '"' );
}
// Ajout directives pour resoudre bug IE
header ( 'Cache-Control: Public, must-revalidate' );
header ( 'Pragma: public' );
$readfile = true ;
// on view document, can output images with good orientation according to exif infos
// TODO Why this on document.php and not in viewimage.php ?
if ( ! $attachment && getDolGlobalString ( 'MAIN_USE_EXIF_ROTATION' ) && image_format_supported ( $fullpath_original_file_osencoded ) == 1 ) {
$imgres = correctExifImageOrientation ( $fullpath_original_file_osencoded , null );
$readfile = ! $imgres ;
}
2021-02-28 23:19:52 +00:00
if ( is_object ( $db )) {
$db -> close ();
}
2020-10-03 12:02:53 +00:00
// Send file now
2019-12-06 08:26:49 +00:00
if ( $readfile ) {
header ( 'Content-Length: ' . dol_filesize ( $fullpath_original_file ));
2020-09-16 12:37:05 +00:00
2020-10-03 12:02:53 +00:00
readfileLowMemory ( $fullpath_original_file_osencoded );
2019-12-02 16:32:06 +00:00
}